brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.9 KiB · 90ca39a Raw
484 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2 3; RUN: opt -passes=instcombine -S %s | FileCheck %s4 5declare { i32, i1 } @llvm.usub.with.overflow.i32(i32, i32)6 7define i32 @test1(i32 %a, i32 %b) {8; CHECK-LABEL: @test1(9; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp ult i32 [[A:%.*]], [[B:%.*]]10; CHECK-NEXT:    br i1 [[COND_NOT]], label [[BB3:%.*]], label [[BB1:%.*]]11; CHECK:       bb1:12; CHECK-NEXT:    br i1 false, label [[BB2:%.*]], label [[BB3]]13; CHECK:       bb2:14; CHECK-NEXT:    ret i32 poison15; CHECK:       bb3:16; CHECK-NEXT:    ret i32 017;18  %cond = icmp uge i32 %a, %b19  br i1 %cond, label %bb1, label %bb320 21bb1:22  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)23  %r1 = extractvalue { i32, i1 } %sub1, 024  %c1 = extractvalue { i32, i1 } %sub1, 125  br i1 %c1, label %bb2, label %bb326 27bb2:28  ret i32 %r129 30bb3:31  ret i32 032}33 34define i32 @test2(i32 %a, i32 %b) {35; CHECK-LABEL: @test2(36; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp ult i32 [[A:%.*]], [[B:%.*]]37; CHECK-NEXT:    br i1 [[COND_NOT]], label [[BB3:%.*]], label [[BB1:%.*]]38; CHECK:       bb1:39; CHECK-NEXT:    br i1 false, label [[BB3]], label [[BB2:%.*]]40; CHECK:       bb2:41; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i32 [[A]], [[B]]42; CHECK-NEXT:    ret i32 [[SUB1]]43; CHECK:       bb3:44; CHECK-NEXT:    ret i32 045;46  %cond = icmp uge i32 %a, %b47  br i1 %cond, label %bb1, label %bb348 49bb1:50  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)51  %r1 = extractvalue { i32, i1 } %sub1, 052  %c1 = extractvalue { i32, i1 } %sub1, 153  br i1 %c1, label %bb3, label %bb254 55bb2:56  ret i32 %r157 58bb3:59  ret i32 060}61 62 63define i32 @test3(i32 %a, i32 %b) {64; CHECK-LABEL: @test3(65; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i32 [[A:%.*]], [[B:%.*]]66; CHECK-NEXT:    br i1 [[COND]], label [[BB1:%.*]], label [[BB3:%.*]]67; CHECK:       bb1:68; CHECK-NEXT:    br i1 false, label [[BB2:%.*]], label [[BB3]]69; CHECK:       bb2:70; CHECK-NEXT:    ret i32 poison71; CHECK:       bb3:72; CHECK-NEXT:    ret i32 073;74  %cond = icmp ugt i32 %a, %b75  br i1 %cond, label %bb1, label %bb376 77bb1:78  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)79  %r1 = extractvalue { i32, i1 } %sub1, 080  %c1 = extractvalue { i32, i1 } %sub1, 181  br i1 %c1, label %bb2, label %bb382 83bb2:84  ret i32 %r185 86bb3:87  ret i32 088}89 90define i32 @test4(i32 %a, i32 %b) {91; CHECK-LABEL: @test4(92; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i32 [[A:%.*]], [[B:%.*]]93; CHECK-NEXT:    br i1 [[COND]], label [[BB1:%.*]], label [[BB3:%.*]]94; CHECK:       bb1:95; CHECK-NEXT:    br i1 false, label [[BB3]], label [[BB2:%.*]]96; CHECK:       bb2:97; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i32 [[A]], [[B]]98; CHECK-NEXT:    ret i32 [[SUB1]]99; CHECK:       bb3:100; CHECK-NEXT:    ret i32 0101;102  %cond = icmp ugt i32 %a, %b103  br i1 %cond, label %bb1, label %bb3104 105bb1:106  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)107  %r1 = extractvalue { i32, i1 } %sub1, 0108  %c1 = extractvalue { i32, i1 } %sub1, 1109  br i1 %c1, label %bb3, label %bb2110 111bb2:112  ret i32 %r1113 114bb3:115  ret i32 0116}117 118 119define i32 @test5(i32 %a, i32 %b) {120; CHECK-LABEL: @test5(121; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]122; CHECK-NEXT:    br i1 [[COND]], label [[BB1:%.*]], label [[BB3:%.*]]123; CHECK:       bb1:124; CHECK-NEXT:    br i1 false, label [[BB3]], label [[BB2:%.*]]125; CHECK:       bb2:126; CHECK-NEXT:    ret i32 0127; CHECK:       bb3:128; CHECK-NEXT:    ret i32 0129;130  %cond = icmp eq i32 %a, %b131  br i1 %cond, label %bb1, label %bb3132 133bb1:134  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)135  %r1 = extractvalue { i32, i1 } %sub1, 0136  %c1 = extractvalue { i32, i1 } %sub1, 1137  br i1 %c1, label %bb3, label %bb2138 139bb2:140  ret i32 %r1141 142bb3:143  ret i32 0144}145 146define i32 @test6(i32 %a, i32 %b) {147; CHECK-LABEL: @test6(148; CHECK-NEXT:    [[COND:%.*]] = icmp ult i32 [[A:%.*]], [[B:%.*]]149; CHECK-NEXT:    br i1 [[COND]], label [[BB1:%.*]], label [[BB3:%.*]]150; CHECK:       bb1:151; CHECK-NEXT:    br i1 true, label [[BB3]], label [[BB2:%.*]]152; CHECK:       bb2:153; CHECK-NEXT:    ret i32 poison154; CHECK:       bb3:155; CHECK-NEXT:    ret i32 0156;157  %cond = icmp ult i32 %a, %b158  br i1 %cond, label %bb1, label %bb3159 160bb1:161  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)162  %r1 = extractvalue { i32, i1 } %sub1, 0163  %c1 = extractvalue { i32, i1 } %sub1, 1164  br i1 %c1, label %bb3, label %bb2165 166bb2:167  ret i32 %r1168 169bb3:170  ret i32 0171}172 173define i32 @test7(i32 %a, i32 %b) {174; CHECK-LABEL: @test7(175; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]176; CHECK-NEXT:    br i1 [[COND]], label [[BB1:%.*]], label [[BB3:%.*]]177; CHECK:       bb1:178; CHECK-NEXT:    [[SUB1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[A]], i32 [[B]])179; CHECK-NEXT:    [[C1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 1180; CHECK-NEXT:    br i1 [[C1]], label [[BB3]], label [[BB2:%.*]]181; CHECK:       bb2:182; CHECK-NEXT:    [[R1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 0183; CHECK-NEXT:    ret i32 [[R1]]184; CHECK:       bb3:185; CHECK-NEXT:    ret i32 0186;187  %cond = icmp slt i32 %a, %b188  br i1 %cond, label %bb1, label %bb3189 190bb1:191  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)192  %r1 = extractvalue { i32, i1 } %sub1, 0193  %c1 = extractvalue { i32, i1 } %sub1, 1194  br i1 %c1, label %bb3, label %bb2195 196bb2:197  ret i32 %r1198 199bb3:200  ret i32 0201}202 203define i32 @test8(i32 %a, i32 %b) {204; CHECK-LABEL: @test8(205; CHECK-NEXT:    [[COND_NOT:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]206; CHECK-NEXT:    br i1 [[COND_NOT]], label [[BB3:%.*]], label [[BB1:%.*]]207; CHECK:       bb1:208; CHECK-NEXT:    [[SUB1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[A]], i32 [[B]])209; CHECK-NEXT:    [[C1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 1210; CHECK-NEXT:    br i1 [[C1]], label [[BB3]], label [[BB2:%.*]]211; CHECK:       bb2:212; CHECK-NEXT:    [[R1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 0213; CHECK-NEXT:    ret i32 [[R1]]214; CHECK:       bb3:215; CHECK-NEXT:    ret i32 0216;217  %cond = icmp ne i32 %a, %b218  br i1 %cond, label %bb1, label %bb3219 220bb1:221  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)222  %r1 = extractvalue { i32, i1 } %sub1, 0223  %c1 = extractvalue { i32, i1 } %sub1, 1224  br i1 %c1, label %bb3, label %bb2225 226bb2:227  ret i32 %r1228 229bb3:230  ret i32 0231}232 233define i32 @test9(i32 %a, i32 %b, i1 %cond2) {234; CHECK-LABEL: @test9(235; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i32 [[A:%.*]], [[B:%.*]]236; CHECK-NEXT:    [[AND:%.*]] = and i1 [[COND]], [[COND2:%.*]]237; CHECK-NEXT:    br i1 [[AND]], label [[BB1:%.*]], label [[BB3:%.*]]238; CHECK:       bb1:239; CHECK-NEXT:    br i1 false, label [[BB3]], label [[BB2:%.*]]240; CHECK:       bb2:241; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i32 [[A]], [[B]]242; CHECK-NEXT:    ret i32 [[SUB1]]243; CHECK:       bb3:244; CHECK-NEXT:    ret i32 0245;246  %cond = icmp ugt i32 %a, %b247  %and = and i1 %cond, %cond2248  br i1 %and, label %bb1, label %bb3249 250bb1:251  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)252  %r1 = extractvalue { i32, i1 } %sub1, 0253  %c1 = extractvalue { i32, i1 } %sub1, 1254  br i1 %c1, label %bb3, label %bb2255 256bb2:257  ret i32 %r1258 259bb3:260  ret i32 0261}262 263define i32 @test9_logical(i32 %a, i32 %b, i1 %cond2) {264; CHECK-LABEL: @test9_logical(265; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i32 [[A:%.*]], [[B:%.*]]266; CHECK-NEXT:    [[AND:%.*]] = select i1 [[COND]], i1 [[COND2:%.*]], i1 false267; CHECK-NEXT:    br i1 [[AND]], label [[BB1:%.*]], label [[BB3:%.*]]268; CHECK:       bb1:269; CHECK-NEXT:    br i1 false, label [[BB3]], label [[BB2:%.*]]270; CHECK:       bb2:271; CHECK-NEXT:    [[SUB1:%.*]] = sub nuw i32 [[A]], [[B]]272; CHECK-NEXT:    ret i32 [[SUB1]]273; CHECK:       bb3:274; CHECK-NEXT:    ret i32 0275;276  %cond = icmp ugt i32 %a, %b277  %and = select i1 %cond, i1 %cond2, i1 false278  br i1 %and, label %bb1, label %bb3279 280bb1:281  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)282  %r1 = extractvalue { i32, i1 } %sub1, 0283  %c1 = extractvalue { i32, i1 } %sub1, 1284  br i1 %c1, label %bb3, label %bb2285 286bb2:287  ret i32 %r1288 289bb3:290  ret i32 0291}292 293define i32 @test10(i32 %a, i32 %b, i1 %cond2) {294; CHECK-LABEL: @test10(295; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i32 [[A:%.*]], [[B:%.*]]296; CHECK-NEXT:    [[AND:%.*]] = and i1 [[COND]], [[COND2:%.*]]297; CHECK-NEXT:    br i1 [[AND]], label [[BB3:%.*]], label [[BB1:%.*]]298; CHECK:       bb1:299; CHECK-NEXT:    [[SUB1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[A]], i32 [[B]])300; CHECK-NEXT:    [[C1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 1301; CHECK-NEXT:    br i1 [[C1]], label [[BB3]], label [[BB2:%.*]]302; CHECK:       bb2:303; CHECK-NEXT:    [[R1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 0304; CHECK-NEXT:    ret i32 [[R1]]305; CHECK:       bb3:306; CHECK-NEXT:    ret i32 0307;308  %cond = icmp ugt i32 %a, %b309  %and = and i1 %cond, %cond2310  br i1 %and, label %bb3, label %bb1311 312bb1:313  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)314  %r1 = extractvalue { i32, i1 } %sub1, 0315  %c1 = extractvalue { i32, i1 } %sub1, 1316  br i1 %c1, label %bb3, label %bb2317 318bb2:319  ret i32 %r1320 321bb3:322  ret i32 0323}324 325define i32 @test10_logical(i32 %a, i32 %b, i1 %cond2) {326; CHECK-LABEL: @test10_logical(327; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i32 [[A:%.*]], [[B:%.*]]328; CHECK-NEXT:    [[AND:%.*]] = select i1 [[COND]], i1 [[COND2:%.*]], i1 false329; CHECK-NEXT:    br i1 [[AND]], label [[BB3:%.*]], label [[BB1:%.*]]330; CHECK:       bb1:331; CHECK-NEXT:    [[SUB1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[A]], i32 [[B]])332; CHECK-NEXT:    [[C1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 1333; CHECK-NEXT:    br i1 [[C1]], label [[BB3]], label [[BB2:%.*]]334; CHECK:       bb2:335; CHECK-NEXT:    [[R1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 0336; CHECK-NEXT:    ret i32 [[R1]]337; CHECK:       bb3:338; CHECK-NEXT:    ret i32 0339;340  %cond = icmp ugt i32 %a, %b341  %and = select i1 %cond, i1 %cond2, i1 false342  br i1 %and, label %bb3, label %bb1343 344bb1:345  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)346  %r1 = extractvalue { i32, i1 } %sub1, 0347  %c1 = extractvalue { i32, i1 } %sub1, 1348  br i1 %c1, label %bb3, label %bb2349 350bb2:351  ret i32 %r1352 353bb3:354  ret i32 0355}356 357define i32 @test11(i32 %a, i32 %b, i1 %cond2) {358; CHECK-LABEL: @test11(359; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i32 [[A:%.*]], [[B:%.*]]360; CHECK-NEXT:    [[OR:%.*]] = or i1 [[COND]], [[COND2:%.*]]361; CHECK-NEXT:    br i1 [[OR]], label [[BB1:%.*]], label [[BB3:%.*]]362; CHECK:       bb1:363; CHECK-NEXT:    [[SUB1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[A]], i32 [[B]])364; CHECK-NEXT:    [[C1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 1365; CHECK-NEXT:    br i1 [[C1]], label [[BB3]], label [[BB2:%.*]]366; CHECK:       bb2:367; CHECK-NEXT:    [[R1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 0368; CHECK-NEXT:    ret i32 [[R1]]369; CHECK:       bb3:370; CHECK-NEXT:    ret i32 0371;372  %cond = icmp ugt i32 %a, %b373  %or = or i1 %cond, %cond2374  br i1 %or, label %bb1, label %bb3375 376bb1:377  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)378  %r1 = extractvalue { i32, i1 } %sub1, 0379  %c1 = extractvalue { i32, i1 } %sub1, 1380  br i1 %c1, label %bb3, label %bb2381 382bb2:383  ret i32 %r1384 385bb3:386  ret i32 0387}388 389define i32 @test11_logical(i32 %a, i32 %b, i1 %cond2) {390; CHECK-LABEL: @test11_logical(391; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i32 [[A:%.*]], [[B:%.*]]392; CHECK-NEXT:    [[OR:%.*]] = select i1 [[COND]], i1 true, i1 [[COND2:%.*]]393; CHECK-NEXT:    br i1 [[OR]], label [[BB1:%.*]], label [[BB3:%.*]]394; CHECK:       bb1:395; CHECK-NEXT:    [[SUB1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[A]], i32 [[B]])396; CHECK-NEXT:    [[C1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 1397; CHECK-NEXT:    br i1 [[C1]], label [[BB3]], label [[BB2:%.*]]398; CHECK:       bb2:399; CHECK-NEXT:    [[R1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 0400; CHECK-NEXT:    ret i32 [[R1]]401; CHECK:       bb3:402; CHECK-NEXT:    ret i32 0403;404  %cond = icmp ugt i32 %a, %b405  %or = select i1 %cond, i1 true, i1 %cond2406  br i1 %or, label %bb1, label %bb3407 408bb1:409  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)410  %r1 = extractvalue { i32, i1 } %sub1, 0411  %c1 = extractvalue { i32, i1 } %sub1, 1412  br i1 %c1, label %bb3, label %bb2413 414bb2:415  ret i32 %r1416 417bb3:418  ret i32 0419}420 421define i32 @test12(i32 %a, i32 %b, i1 %cond2) {422; CHECK-LABEL: @test12(423; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i32 [[A:%.*]], [[B:%.*]]424; CHECK-NEXT:    [[OR:%.*]] = or i1 [[COND]], [[COND2:%.*]]425; CHECK-NEXT:    br i1 [[OR]], label [[BB3:%.*]], label [[BB1:%.*]]426; CHECK:       bb1:427; CHECK-NEXT:    [[SUB1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[A]], i32 [[B]])428; CHECK-NEXT:    [[C1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 1429; CHECK-NEXT:    br i1 [[C1]], label [[BB3]], label [[BB2:%.*]]430; CHECK:       bb2:431; CHECK-NEXT:    [[R1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 0432; CHECK-NEXT:    ret i32 [[R1]]433; CHECK:       bb3:434; CHECK-NEXT:    ret i32 0435;436  %cond = icmp ugt i32 %a, %b437  %or = or i1 %cond, %cond2438  br i1 %or, label %bb3, label %bb1439 440bb1:441  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)442  %r1 = extractvalue { i32, i1 } %sub1, 0443  %c1 = extractvalue { i32, i1 } %sub1, 1444  br i1 %c1, label %bb3, label %bb2445 446bb2:447  ret i32 %r1448 449bb3:450  ret i32 0451}452 453define i32 @test12_logical(i32 %a, i32 %b, i1 %cond2) {454; CHECK-LABEL: @test12_logical(455; CHECK-NEXT:    [[COND:%.*]] = icmp ugt i32 [[A:%.*]], [[B:%.*]]456; CHECK-NEXT:    [[OR:%.*]] = select i1 [[COND]], i1 true, i1 [[COND2:%.*]]457; CHECK-NEXT:    br i1 [[OR]], label [[BB3:%.*]], label [[BB1:%.*]]458; CHECK:       bb1:459; CHECK-NEXT:    [[SUB1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[A]], i32 [[B]])460; CHECK-NEXT:    [[C1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 1461; CHECK-NEXT:    br i1 [[C1]], label [[BB3]], label [[BB2:%.*]]462; CHECK:       bb2:463; CHECK-NEXT:    [[R1:%.*]] = extractvalue { i32, i1 } [[SUB1]], 0464; CHECK-NEXT:    ret i32 [[R1]]465; CHECK:       bb3:466; CHECK-NEXT:    ret i32 0467;468  %cond = icmp ugt i32 %a, %b469  %or = select i1 %cond, i1 true, i1 %cond2470  br i1 %or, label %bb3, label %bb1471 472bb1:473  %sub1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %a, i32 %b)474  %r1 = extractvalue { i32, i1 } %sub1, 0475  %c1 = extractvalue { i32, i1 } %sub1, 1476  br i1 %c1, label %bb3, label %bb2477 478bb2:479  ret i32 %r1480 481bb3:482  ret i32 0483}484