Files
2026-06-03 13:59:53 +02:00

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 }