brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · 0f45b38 Raw
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