197 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt %s -passes=ipsccp -S | FileCheck %s3 4declare i1 @cond()5declare void @use(i1)6 7define internal {i64, i64} @struct1() {8; CHECK-LABEL: @struct1(9; CHECK-NEXT: [[C:%.*]] = call i1 @cond()10; CHECK-NEXT: br i1 [[C]], label [[TRUE:%.*]], label [[FALSE:%.*]]11; CHECK: true:12; CHECK-NEXT: br label [[EXIT:%.*]]13; CHECK: false:14; CHECK-NEXT: br label [[EXIT]]15; CHECK: exit:16; CHECK-NEXT: [[R:%.*]] = phi { i64, i64 } [ { i64 20, i64 200 }, [[TRUE]] ], [ { i64 30, i64 300 }, [[FALSE]] ]17; CHECK-NEXT: ret { i64, i64 } [[R]]18;19 %c = call i1 @cond()20 br i1 %c, label %true, label %false21 22true:23 %s.1 = insertvalue {i64, i64} undef, i64 20, 024 %s.2 = insertvalue {i64, i64} %s.1, i64 200, 125 br label %exit26 27false:28 %s.3 = insertvalue {i64, i64} poison, i64 30, 029 %s.4 = insertvalue {i64, i64} %s.3, i64 300, 130 br label %exit31 32exit:33 %r = phi {i64, i64} [ %s.2, %true], [ %s.4, %false ]34 ret {i64, i64} %r35}36 37define void @struct1_caller() {38; CHECK-LABEL: @struct1_caller(39; CHECK-NEXT: [[S:%.*]] = call { i64, i64 } @struct1()40; CHECK-NEXT: [[V1:%.*]] = extractvalue { i64, i64 } [[S]], 041; CHECK-NEXT: [[V2:%.*]] = extractvalue { i64, i64 } [[S]], 142; CHECK-NEXT: call void @use(i1 true)43; CHECK-NEXT: call void @use(i1 true)44; CHECK-NEXT: [[T_3:%.*]] = icmp eq i64 [[V1]], 2045; CHECK-NEXT: call void @use(i1 [[T_3]])46; CHECK-NEXT: call void @use(i1 true)47; CHECK-NEXT: call void @use(i1 true)48; CHECK-NEXT: [[T_6:%.*]] = icmp eq i64 [[V2]], 30049; CHECK-NEXT: call void @use(i1 [[T_6]])50; CHECK-NEXT: ret void51;52 %s = call {i64, i64} @struct1()53 %v1 = extractvalue {i64, i64} %s, 054 %v2 = extractvalue {i64, i64} %s, 155 56 %t.1 = icmp ne i64 %v1, 1057 call void @use(i1 %t.1)58 %t.2 = icmp ult i64 %v1, 10059 call void @use(i1 %t.2)60 %t.3 = icmp eq i64 %v1, 2061 call void @use(i1 %t.3)62 %t.4 = icmp ne i64 %v2, 063 call void @use(i1 %t.4)64 %t.5 = icmp ult i64 %v2, 30165 call void @use(i1 %t.5)66 %t.6 = icmp eq i64 %v2, 30067 call void @use(i1 %t.6)68 69 ret void70}71 72define internal {i64, i64} @struct2() {73; CHECK-LABEL: @struct2(74; CHECK-NEXT: [[C:%.*]] = call i1 @cond()75; CHECK-NEXT: br i1 [[C]], label [[TRUE:%.*]], label [[FALSE:%.*]]76; CHECK: true:77; CHECK-NEXT: br label [[EXIT:%.*]]78; CHECK: false:79; CHECK-NEXT: br label [[EXIT]]80; CHECK: exit:81; CHECK-NEXT: [[V1:%.*]] = phi i64 [ 20, [[TRUE]] ], [ 30, [[FALSE]] ]82; CHECK-NEXT: [[V2:%.*]] = phi i64 [ 200, [[TRUE]] ], [ 300, [[FALSE]] ]83; CHECK-NEXT: [[S_1:%.*]] = insertvalue { i64, i64 } poison, i64 [[V1]], 084; CHECK-NEXT: [[S_2:%.*]] = insertvalue { i64, i64 } [[S_1]], i64 [[V2]], 185; CHECK-NEXT: ret { i64, i64 } [[S_2]]86;87 %c = call i1 @cond()88 br i1 %c, label %true, label %false89 90true:91 br label %exit92 93false:94 br label %exit95 96exit:97 %v1 = phi i64 [ 20, %true ], [ 30, %false ]98 %v2 = phi i64 [ 200, %true ], [ 300, %false ]99 %s.1 = insertvalue {i64, i64} poison, i64 %v1, 0100 %s.2 = insertvalue {i64, i64} %s.1, i64 %v2, 1101 ret {i64, i64} %s.2102}103 104define void @struct2_caller() {105; CHECK-LABEL: @struct2_caller(106; CHECK-NEXT: [[S:%.*]] = call { i64, i64 } @struct2()107; CHECK-NEXT: [[V1:%.*]] = extractvalue { i64, i64 } [[S]], 0108; CHECK-NEXT: [[V2:%.*]] = extractvalue { i64, i64 } [[S]], 1109; CHECK-NEXT: call void @use(i1 true)110; CHECK-NEXT: call void @use(i1 true)111; CHECK-NEXT: call void @use(i1 true)112; CHECK-NEXT: call void @use(i1 true)113; CHECK-NEXT: call void @use(i1 false)114; CHECK-NEXT: call void @use(i1 false)115; CHECK-NEXT: call void @use(i1 false)116; CHECK-NEXT: call void @use(i1 false)117; CHECK-NEXT: [[C_1:%.*]] = icmp eq i64 [[V1]], 25118; CHECK-NEXT: call void @use(i1 [[C_1]])119; CHECK-NEXT: [[C_2:%.*]] = icmp ult i64 [[V1]], 25120; CHECK-NEXT: call void @use(i1 [[C_2]])121; CHECK-NEXT: [[C_3:%.*]] = icmp eq i64 [[V2]], 250122; CHECK-NEXT: call void @use(i1 [[C_3]])123; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i64 [[V2]], 250124; CHECK-NEXT: call void @use(i1 [[C_4]])125; CHECK-NEXT: ret void126;127 %s = call {i64, i64} @struct2()128 %v1 = extractvalue {i64, i64} %s, 0129 %v2 = extractvalue {i64, i64} %s, 1130 131 %t.1 = icmp ne i64 %v1, 10132 call void @use(i1 %t.1)133 %t.2 = icmp ult i64 %v1, 100134 call void @use(i1 %t.2)135 %t.3 = icmp ne i64 %v2, 0136 call void @use(i1 %t.3)137 %t.4 = icmp ult i64 %v2, 301138 call void @use(i1 %t.4)139 140 %f.1 = icmp eq i64 %v1, 10141 call void @use(i1 %f.1)142 %f.2 = icmp ult i64 %v1, 19143 call void @use(i1 %f.2)144 %f.3 = icmp eq i64 %v2, 50145 call void @use(i1 %f.3)146 %f.4 = icmp ugt i64 %v2, 301147 call void @use(i1 %f.4)148 149 %c.1 = icmp eq i64 %v1, 25150 call void @use(i1 %c.1)151 %c.2 = icmp ult i64 %v1, 25152 call void @use(i1 %c.2)153 %c.3 = icmp eq i64 %v2, 250154 call void @use(i1 %c.3)155 %c.4 = icmp ugt i64 %v2, 250156 call void @use(i1 %c.4)157 158 ret void159}160 161%"phi_type" = type {i64, i64}162 163define internal %"phi_type" @test(i32 %input) {164; CHECK-LABEL: @test(165; CHECK-NEXT: br label [[COND_TRUE_I:%.*]]166; CHECK: cond.true.i:167; CHECK-NEXT: br label [[COND_END_I:%.*]]168; CHECK: cond.end.i:169; CHECK-NEXT: ret [[PHI_TYPE:%.*]] poison170;171 %cmp.cond = icmp eq i32 %input, 1172 br i1 %cmp.cond, label %cond.true.i, label %cond.false.i173 174cond.true.i:175 %r1.tmp = insertvalue %"phi_type" poison, i64 1, 0176 %r1.tmp.2 = insertvalue %"phi_type" %r1.tmp, i64 2, 1177 br label %cond.end.i178 179cond.false.i:180 %r2.tmp = insertvalue %"phi_type" poison, i64 3, 0181 %r2.tmp.2 = insertvalue %"phi_type" %r2.tmp, i64 4, 1182 br label %cond.end.i183 184cond.end.i:185 %retval = phi %"phi_type" [ %r1.tmp.2, %cond.true.i ], [ %r2.tmp.2, %cond.false.i ]186 ret %"phi_type" %retval187}188 189define %"phi_type" @test2() {190; CHECK-LABEL: @test2(191; CHECK-NEXT: [[CALL_1:%.*]] = tail call fastcc [[PHI_TYPE:%.*]] @[[TEST:[a-zA-Z0-9_$\"\\.-]*[a-zA-Z_$\"\\.-][a-zA-Z0-9_$\"\\.-]*]](i32 noundef 1)192; CHECK-NEXT: ret [[PHI_TYPE]] { i64 1, i64 2 }193;194 %call.1 = tail call fastcc noundef %"phi_type" @test(i32 noundef 1)195 ret %"phi_type" %call.1196}197