mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
45 lines
1.7 KiB
LLVM
45 lines
1.7 KiB
LLVM
;
|
|
; This file is distributed under the MIT License. See LICENSE.md for details.
|
|
;
|
|
|
|
; RUN: %root/bin/revng opt %s -remove-extractvalues | %root/bin/revng opt -enable-new-pm=1 -O2 -S | FileCheck %s
|
|
; Test that all extractvalues are converted to an opaque function call that is
|
|
; not optimized away by the O2 pipeline
|
|
|
|
%0 = type { i64, i32, i16, i8}
|
|
; CHECK: %0 = type { i64, i32, i16, i8 }
|
|
|
|
; Function Attrs: noinline optnone
|
|
declare dso_local %0 @helper_returns_struct() local_unnamed_addr #0
|
|
; CHECK: declare dso_local %0 @helper_returns_struct() local_unnamed_addr #0
|
|
|
|
; Function Attrs: noinline optnone
|
|
declare dso_local %0 @save_i64() local_unnamed_addr #0
|
|
|
|
; Function Attrs: noinline optnone
|
|
declare dso_local %0 @save_i32() local_unnamed_addr #0
|
|
|
|
; Function Attrs: noinline optnone
|
|
declare dso_local %0 @save_i16() local_unnamed_addr #0
|
|
|
|
; Function Attrs: noinline optnone
|
|
declare dso_local %0 @save_i8() local_unnamed_addr #0
|
|
|
|
; Function Attrs: noreturn
|
|
define void @f() local_unnamed_addr #1 {
|
|
newFuncRoot:
|
|
%0 = call %0 @helper_returns_struct()
|
|
%1 = extractvalue %0 %0, 0 ; CHECK: tail call i64 @{{OpaqueExtractvalue.[0-9]+|OpaqueExtractvalue}}(%0 %0, i64 0)
|
|
%2 = extractvalue %0 %0, 1 ; CHECK-NEXT: tail call i32 @{{OpaqueExtractvalue.[0-9]+|OpaqueExtractvalue}}(%0 %0, i64 1)
|
|
%3 = extractvalue %0 %0, 2 ; CHECK-NEXT: tail call i16 @{{OpaqueExtractvalue.[0-9]+|OpaqueExtractvalue}}(%0 %0, i64 2)
|
|
%4 = extractvalue %0 %0, 3 ; CHECK-NEXT: tail call i8 @{{OpaqueExtractvalue.[0-9]+|OpaqueExtractvalue}}(%0 %0, i64 3)
|
|
call void @save_i64(i64 %1)
|
|
call void @save_i32(i32 %2)
|
|
call void @save_i16(i16 %3)
|
|
call void @save_i8(i8 %4)
|
|
unreachable
|
|
}
|
|
|
|
attributes #0 = { noinline optnone }
|
|
attributes #1 = { noreturn }
|