77 lines · plain
1; RUN: opt -S -passes=mergefunc < %s | FileCheck %s2 3target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"4 5%A = type { double }6; the intermediary struct causes A_arr and B_arr to be different types7%A_struct = type { %A }8%A_arr = type { [1 x %A_struct] }9 10%B = type { double }11%B_struct = type { %B }12%B_arr = type { [1 x %B_struct] }13 14; conversion between C_arr and D_arr is possible, but requires ptrcast15%C = type { i64 }16%C_struct = type { %C }17%C_arr = type { [1 x %C_struct] }18 19%D = type { ptr }20%D_struct = type { %D }21%D_arr = type { [1 x %D_struct] }22 23declare void @noop()24 25define %A_arr @a() {26; CHECK-LABEL: define %A_arr @a() {27; CHECK-NEXT: call void @noop()28; CHECK-NEXT: ret %A_arr zeroinitializer29;30 call void @noop()31 ret %A_arr zeroinitializer32}33 34define %C_arr @c() {35; CHECK-LABEL: define %C_arr @c() {36; CHECK-NEXT: call void @noop()37; CHECK-NEXT: ret %C_arr zeroinitializer38;39 call void @noop()40 ret %C_arr zeroinitializer41}42 43define %B_arr @b() {44; CHECK-LABEL: define %B_arr @b() {45; CHECK-NEXT: [[TMP1:%.*]] = tail call %A_arr @a46; CHECK-NEXT: [[TMP2:%.*]] = extractvalue %A_arr [[TMP1]], 047; CHECK-NEXT: [[TMP3:%.*]] = extractvalue [1 x %A_struct] [[TMP2]], 048; CHECK-NEXT: [[TMP4:%.*]] = extractvalue %A_struct [[TMP3]], 049; CHECK-NEXT: [[TMP5:%.*]] = extractvalue %A [[TMP4]], 050; CHECK-NEXT: [[TMP6:%.*]] = insertvalue %B poison, double [[TMP5]], 051; CHECK-NEXT: [[TMP7:%.*]] = insertvalue %B_struct poison, %B [[TMP6]], 052; CHECK-NEXT: [[TMP8:%.*]] = insertvalue [1 x %B_struct] poison, %B_struct [[TMP7]], 053; CHECK-NEXT: [[TMP9:%.*]] = insertvalue %B_arr poison, [1 x %B_struct] [[TMP8]], 054; CHECK-NEXT: ret %B_arr [[TMP9]]55;56 call void @noop()57 ret %B_arr zeroinitializer58}59 60define %D_arr @d() {61; CHECK-LABEL: define %D_arr @d() {62; CHECK-NEXT: [[TMP1:%.*]] = tail call %C_arr @c63; CHECK-NEXT: [[TMP2:%.*]] = extractvalue %C_arr [[TMP1]], 064; CHECK-NEXT: [[TMP3:%.*]] = extractvalue [1 x %C_struct] [[TMP2]], 065; CHECK-NEXT: [[TMP4:%.*]] = extractvalue %C_struct [[TMP3]], 066; CHECK-NEXT: [[TMP5:%.*]] = extractvalue %C [[TMP4]], 067; CHECK-NEXT: [[TMP10:%.*]] = inttoptr i64 [[TMP5]] to ptr68; CHECK-NEXT: [[TMP6:%.*]] = insertvalue %D poison, ptr [[TMP10]], 069; CHECK-NEXT: [[TMP7:%.*]] = insertvalue %D_struct poison, %D [[TMP6]], 070; CHECK-NEXT: [[TMP8:%.*]] = insertvalue [1 x %D_struct] poison, %D_struct [[TMP7]], 071; CHECK-NEXT: [[TMP9:%.*]] = insertvalue %D_arr poison, [1 x %D_struct] [[TMP8]], 072; CHECK-NEXT: ret %D_arr [[TMP9]]73;74 call void @noop()75 ret %D_arr zeroinitializer76}77