1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
; RUN: opt -S -passes=mergefunc < %s | FileCheck %s
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
%A = type { double }
; the intermediary struct causes A_arr and B_arr to be different types
%A_struct = type { %A }
%A_arr = type { [1 x %A_struct] }
%B = type { double }
%B_struct = type { %B }
%B_arr = type { [1 x %B_struct] }
; conversion between C_arr and D_arr is possible, but requires ptrcast
%C = type { i64 }
%C_struct = type { %C }
%C_arr = type { [1 x %C_struct] }
%D = type { ptr }
%D_struct = type { %D }
%D_arr = type { [1 x %D_struct] }
declare void @noop()
define %A_arr @a() {
; CHECK-LABEL: define %A_arr @a() {
; CHECK-NEXT: call void @noop()
; CHECK-NEXT: ret %A_arr zeroinitializer
;
call void @noop()
ret %A_arr zeroinitializer
}
define %C_arr @c() {
; CHECK-LABEL: define %C_arr @c() {
; CHECK-NEXT: call void @noop()
; CHECK-NEXT: ret %C_arr zeroinitializer
;
call void @noop()
ret %C_arr zeroinitializer
}
define %B_arr @b() {
; CHECK-LABEL: define %B_arr @b() {
; CHECK-NEXT: [[TMP1:%.*]] = tail call %A_arr @a
; CHECK-NEXT: [[TMP2:%.*]] = extractvalue %A_arr [[TMP1]], 0
; CHECK-NEXT: [[TMP3:%.*]] = extractvalue [1 x %A_struct] [[TMP2]], 0
; CHECK-NEXT: [[TMP4:%.*]] = extractvalue %A_struct [[TMP3]], 0
; CHECK-NEXT: [[TMP5:%.*]] = extractvalue %A [[TMP4]], 0
; CHECK-NEXT: [[TMP6:%.*]] = insertvalue %B poison, double [[TMP5]], 0
; CHECK-NEXT: [[TMP7:%.*]] = insertvalue %B_struct poison, %B [[TMP6]], 0
; CHECK-NEXT: [[TMP8:%.*]] = insertvalue [1 x %B_struct] poison, %B_struct [[TMP7]], 0
; CHECK-NEXT: [[TMP9:%.*]] = insertvalue %B_arr poison, [1 x %B_struct] [[TMP8]], 0
; CHECK-NEXT: ret %B_arr [[TMP9]]
;
call void @noop()
ret %B_arr zeroinitializer
}
define %D_arr @d() {
; CHECK-LABEL: define %D_arr @d() {
; CHECK-NEXT: [[TMP1:%.*]] = tail call %C_arr @c
; CHECK-NEXT: [[TMP2:%.*]] = extractvalue %C_arr [[TMP1]], 0
; CHECK-NEXT: [[TMP3:%.*]] = extractvalue [1 x %C_struct] [[TMP2]], 0
; CHECK-NEXT: [[TMP4:%.*]] = extractvalue %C_struct [[TMP3]], 0
; CHECK-NEXT: [[TMP5:%.*]] = extractvalue %C [[TMP4]], 0
; CHECK-NEXT: [[TMP10:%.*]] = inttoptr i64 [[TMP5]] to ptr
; CHECK-NEXT: [[TMP6:%.*]] = insertvalue %D poison, ptr [[TMP10]], 0
; CHECK-NEXT: [[TMP7:%.*]] = insertvalue %D_struct poison, %D [[TMP6]], 0
; CHECK-NEXT: [[TMP8:%.*]] = insertvalue [1 x %D_struct] poison, %D_struct [[TMP7]], 0
; CHECK-NEXT: [[TMP9:%.*]] = insertvalue %D_arr poison, [1 x %D_struct] [[TMP8]], 0
; CHECK-NEXT: ret %D_arr [[TMP9]]
;
call void @noop()
ret %D_arr zeroinitializer
}
|