650 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instsimplify -S < %s | FileCheck %s3 4define i1 @test_add_nsw(i8 %n, i8 %r) {5; CHECK-LABEL: @test_add_nsw(6; CHECK-NEXT: entry:7; CHECK-NEXT: br label [[LOOP:%.*]]8; CHECK: loop:9; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]10; CHECK-NEXT: [[NEXT]] = add nsw i8 [[A]], 111; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]12; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]13; CHECK: exit:14; CHECK-NEXT: ret i1 false15;16entry:17 br label %loop18loop:19 %A = phi i8 [ 1, %entry ], [ %next, %loop ]20 %next = add nsw i8 %A, 121 %cmp1 = icmp eq i8 %A, %n22 br i1 %cmp1, label %exit, label %loop23exit:24 %add = or i8 %A, %r25 %cmp = icmp eq i8 %add, 026 ret i1 %cmp27}28 29define i1 @test_add_may_wrap(i8 %n, i8 %r) {30; CHECK-LABEL: @test_add_may_wrap(31; CHECK-NEXT: entry:32; CHECK-NEXT: br label [[LOOP:%.*]]33; CHECK: loop:34; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]35; CHECK-NEXT: [[NEXT]] = add i8 [[A]], 136; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]37; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]38; CHECK: exit:39; CHECK-NEXT: [[ADD:%.*]] = or i8 [[A]], [[R:%.*]]40; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[ADD]], 041; CHECK-NEXT: ret i1 [[CMP]]42;43entry:44 br label %loop45loop:46 %A = phi i8 [ 1, %entry ], [ %next, %loop ]47 %next = add i8 %A, 148 %cmp1 = icmp eq i8 %A, %n49 br i1 %cmp1, label %exit, label %loop50exit:51 %add = or i8 %A, %r52 %cmp = icmp eq i8 %add, 053 ret i1 %cmp54}55 56define i1 @test_add_nuw(i8 %n, i8 %r) {57; CHECK-LABEL: @test_add_nuw(58; CHECK-NEXT: entry:59; CHECK-NEXT: br label [[LOOP:%.*]]60; CHECK: loop:61; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]62; CHECK-NEXT: [[NEXT]] = add nuw i8 [[A]], 163; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]64; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]65; CHECK: exit:66; CHECK-NEXT: ret i1 false67;68entry:69 br label %loop70loop:71 %A = phi i8 [ 1, %entry ], [ %next, %loop ]72 %next = add nuw i8 %A, 173 %cmp1 = icmp eq i8 %A, %n74 br i1 %cmp1, label %exit, label %loop75exit:76 %add = or i8 %A, %r77 %cmp = icmp eq i8 %add, 078 ret i1 %cmp79}80 81define i1 @test_add_nuw_unknown_step(i8 %n, i8 %r, i8 %s) {82; CHECK-LABEL: @test_add_nuw_unknown_step(83; CHECK-NEXT: entry:84; CHECK-NEXT: br label [[LOOP:%.*]]85; CHECK: loop:86; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]87; CHECK-NEXT: [[NEXT]] = add nuw i8 [[A]], [[S:%.*]]88; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]89; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]90; CHECK: exit:91; CHECK-NEXT: ret i1 false92;93entry:94 br label %loop95loop:96 %A = phi i8 [ 1, %entry ], [ %next, %loop ]97 %next = add nuw i8 %A, %s98 %cmp1 = icmp eq i8 %A, %n99 br i1 %cmp1, label %exit, label %loop100exit:101 %add = or i8 %A, %r102 %cmp = icmp eq i8 %add, 0103 ret i1 %cmp104}105 106define i1 @test_add_zero_start(i8 %n, i8 %r) {107; CHECK-LABEL: @test_add_zero_start(108; CHECK-NEXT: entry:109; CHECK-NEXT: br label [[LOOP:%.*]]110; CHECK: loop:111; CHECK-NEXT: [[A:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]112; CHECK-NEXT: [[NEXT]] = add nuw i8 [[A]], 1113; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]114; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]115; CHECK: exit:116; CHECK-NEXT: [[ADD:%.*]] = or i8 [[A]], [[R:%.*]]117; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[ADD]], 0118; CHECK-NEXT: ret i1 [[CMP]]119;120entry:121 br label %loop122loop:123 %A = phi i8 [ 0, %entry ], [ %next, %loop ]124 %next = add nuw i8 %A, 1125 %cmp1 = icmp eq i8 %A, %n126 br i1 %cmp1, label %exit, label %loop127exit:128 %add = or i8 %A, %r129 %cmp = icmp eq i8 %add, 0130 ret i1 %cmp131}132 133define i1 @test_add_nuw_negative_start(i8 %n, i8 %r) {134; CHECK-LABEL: @test_add_nuw_negative_start(135; CHECK-NEXT: entry:136; CHECK-NEXT: br label [[LOOP:%.*]]137; CHECK: loop:138; CHECK-NEXT: [[A:%.*]] = phi i8 [ -2, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]139; CHECK-NEXT: [[NEXT]] = add nuw i8 [[A]], 1140; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]141; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]142; CHECK: exit:143; CHECK-NEXT: ret i1 false144;145entry:146 br label %loop147loop:148 %A = phi i8 [ -2, %entry ], [ %next, %loop ]149 %next = add nuw i8 %A, 1150 %cmp1 = icmp eq i8 %A, %n151 br i1 %cmp1, label %exit, label %loop152exit:153 %add = or i8 %A, %r154 %cmp = icmp eq i8 %add, 0155 ret i1 %cmp156}157 158define i1 @test_add_nsw_negative_start(i8 %n, i8 %r) {159; CHECK-LABEL: @test_add_nsw_negative_start(160; CHECK-NEXT: entry:161; CHECK-NEXT: br label [[LOOP:%.*]]162; CHECK: loop:163; CHECK-NEXT: [[A:%.*]] = phi i8 [ -2, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]164; CHECK-NEXT: [[NEXT]] = add nsw i8 [[A]], 1165; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]166; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]167; CHECK: exit:168; CHECK-NEXT: [[ADD:%.*]] = or i8 [[A]], [[R:%.*]]169; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[ADD]], 0170; CHECK-NEXT: ret i1 [[CMP]]171;172entry:173 br label %loop174loop:175 %A = phi i8 [ -2, %entry ], [ %next, %loop ]176 %next = add nsw i8 %A, 1177 %cmp1 = icmp eq i8 %A, %n178 br i1 %cmp1, label %exit, label %loop179exit:180 %add = or i8 %A, %r181 %cmp = icmp eq i8 %add, 0182 ret i1 %cmp183}184 185define i1 @test_add_nsw_negative_start_and_step(i8 %n, i8 %r) {186; CHECK-LABEL: @test_add_nsw_negative_start_and_step(187; CHECK-NEXT: entry:188; CHECK-NEXT: br label [[LOOP:%.*]]189; CHECK: loop:190; CHECK-NEXT: [[A:%.*]] = phi i8 [ -1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]191; CHECK-NEXT: [[NEXT]] = add nsw i8 [[A]], -1192; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]193; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]194; CHECK: exit:195; CHECK-NEXT: ret i1 false196;197entry:198 br label %loop199loop:200 %A = phi i8 [ -1, %entry ], [ %next, %loop ]201 %next = add nsw i8 %A, -1202 %cmp1 = icmp eq i8 %A, %n203 br i1 %cmp1, label %exit, label %loop204exit:205 %add = or i8 %A, %r206 %cmp = icmp eq i8 %add, 0207 ret i1 %cmp208}209 210define i1 @test_mul_nsw(i8 %n) {211; CHECK-LABEL: @test_mul_nsw(212; CHECK-NEXT: entry:213; CHECK-NEXT: br label [[LOOP:%.*]]214; CHECK: loop:215; CHECK-NEXT: [[A:%.*]] = phi i8 [ 2, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]216; CHECK-NEXT: [[NEXT]] = mul nsw i8 [[A]], 2217; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]218; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]219; CHECK: exit:220; CHECK-NEXT: ret i1 false221;222entry:223 br label %loop224loop:225 %A = phi i8 [ 2, %entry ], [ %next, %loop ]226 %next = mul nsw i8 %A, 2227 %cmp1 = icmp eq i8 %A, %n228 br i1 %cmp1, label %exit, label %loop229exit:230 %cmp = icmp eq i8 %A, 0231 ret i1 %cmp232}233 234define i1 @test_mul_may_wrap(i8 %n) {235; CHECK-LABEL: @test_mul_may_wrap(236; CHECK-NEXT: entry:237; CHECK-NEXT: br label [[LOOP:%.*]]238; CHECK: loop:239; CHECK-NEXT: [[A:%.*]] = phi i8 [ 2, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]240; CHECK-NEXT: [[NEXT]] = mul i8 [[A]], 2241; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]242; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]243; CHECK: exit:244; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0245; CHECK-NEXT: ret i1 [[CMP]]246;247entry:248 br label %loop249loop:250 %A = phi i8 [ 2, %entry ], [ %next, %loop ]251 %next = mul i8 %A, 2252 %cmp1 = icmp eq i8 %A, %n253 br i1 %cmp1, label %exit, label %loop254exit:255 %cmp = icmp eq i8 %A, 0256 ret i1 %cmp257}258 259define i1 @test_mul_nuw(i8 %n) {260; CHECK-LABEL: @test_mul_nuw(261; CHECK-NEXT: entry:262; CHECK-NEXT: br label [[LOOP:%.*]]263; CHECK: loop:264; CHECK-NEXT: [[A:%.*]] = phi i8 [ 2, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]265; CHECK-NEXT: [[NEXT]] = mul nuw i8 [[A]], 2266; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]267; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]268; CHECK: exit:269; CHECK-NEXT: ret i1 false270;271entry:272 br label %loop273loop:274 %A = phi i8 [ 2, %entry ], [ %next, %loop ]275 %next = mul nuw i8 %A, 2276 %cmp1 = icmp eq i8 %A, %n277 br i1 %cmp1, label %exit, label %loop278exit:279 %cmp = icmp eq i8 %A, 0280 ret i1 %cmp281}282 283define i1 @test_mul_zero_start(i8 %n) {284; CHECK-LABEL: @test_mul_zero_start(285; CHECK-NEXT: entry:286; CHECK-NEXT: br label [[LOOP:%.*]]287; CHECK: loop:288; CHECK-NEXT: [[A:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]289; CHECK-NEXT: [[NEXT]] = mul nuw i8 [[A]], 2290; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]291; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]292; CHECK: exit:293; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0294; CHECK-NEXT: ret i1 [[CMP]]295;296entry:297 br label %loop298loop:299 %A = phi i8 [ 0, %entry ], [ %next, %loop ]300 %next = mul nuw i8 %A, 2301 %cmp1 = icmp eq i8 %A, %n302 br i1 %cmp1, label %exit, label %loop303exit:304 %cmp = icmp eq i8 %A, 0305 ret i1 %cmp306}307 308define i1 @test_mul_nuw_negative_step(i8 %n) {309; CHECK-LABEL: @test_mul_nuw_negative_step(310; CHECK-NEXT: entry:311; CHECK-NEXT: br label [[LOOP:%.*]]312; CHECK: loop:313; CHECK-NEXT: [[A:%.*]] = phi i8 [ 2, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]314; CHECK-NEXT: [[NEXT]] = mul nuw i8 [[A]], -2315; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]316; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]317; CHECK: exit:318; CHECK-NEXT: ret i1 false319;320entry:321 br label %loop322loop:323 %A = phi i8 [ 2, %entry ], [ %next, %loop ]324 %next = mul nuw i8 %A, -2325 %cmp1 = icmp eq i8 %A, %n326 br i1 %cmp1, label %exit, label %loop327exit:328 %cmp = icmp eq i8 %A, 0329 ret i1 %cmp330}331 332define i1 @test_mul_nsw_negative_step(i8 %n) {333; CHECK-LABEL: @test_mul_nsw_negative_step(334; CHECK-NEXT: entry:335; CHECK-NEXT: br label [[LOOP:%.*]]336; CHECK: loop:337; CHECK-NEXT: [[A:%.*]] = phi i8 [ 2, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]338; CHECK-NEXT: [[NEXT]] = mul nsw i8 [[A]], -2339; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]340; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]341; CHECK: exit:342; CHECK-NEXT: ret i1 false343;344entry:345 br label %loop346loop:347 %A = phi i8 [ 2, %entry ], [ %next, %loop ]348 %next = mul nsw i8 %A, -2349 %cmp1 = icmp eq i8 %A, %n350 br i1 %cmp1, label %exit, label %loop351exit:352 %cmp = icmp eq i8 %A, 0353 ret i1 %cmp354}355 356define i1 @test_mul_nuw_negative_start(i8 %n) {357; CHECK-LABEL: @test_mul_nuw_negative_start(358; CHECK-NEXT: entry:359; CHECK-NEXT: br label [[LOOP:%.*]]360; CHECK: loop:361; CHECK-NEXT: [[A:%.*]] = phi i8 [ -2, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]362; CHECK-NEXT: [[NEXT]] = mul nuw i8 [[A]], 2363; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]364; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]365; CHECK: exit:366; CHECK-NEXT: ret i1 false367;368entry:369 br label %loop370loop:371 %A = phi i8 [ -2, %entry ], [ %next, %loop ]372 %next = mul nuw i8 %A, 2373 %cmp1 = icmp eq i8 %A, %n374 br i1 %cmp1, label %exit, label %loop375exit:376 %cmp = icmp eq i8 %A, 0377 ret i1 %cmp378}379 380define i1 @test_shl_nuw(i8 %n) {381; CHECK-LABEL: @test_shl_nuw(382; CHECK-NEXT: entry:383; CHECK-NEXT: br label [[LOOP:%.*]]384; CHECK: loop:385; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]386; CHECK-NEXT: [[NEXT]] = shl nuw i8 [[A]], 1387; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]388; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]389; CHECK: exit:390; CHECK-NEXT: ret i1 false391;392entry:393 br label %loop394loop:395 %A = phi i8 [ 1, %entry ], [ %next, %loop ]396 %next = shl nuw i8 %A, 1397 %cmp1 = icmp eq i8 %A, %n398 br i1 %cmp1, label %exit, label %loop399exit:400 %cmp = icmp eq i8 %A, 0401 ret i1 %cmp402}403 404define i1 @test_shl_nsw(i8 %n) {405; CHECK-LABEL: @test_shl_nsw(406; CHECK-NEXT: entry:407; CHECK-NEXT: br label [[LOOP:%.*]]408; CHECK: loop:409; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]410; CHECK-NEXT: [[NEXT]] = shl nsw i8 [[A]], 1411; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]412; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]413; CHECK: exit:414; CHECK-NEXT: ret i1 false415;416entry:417 br label %loop418loop:419 %A = phi i8 [ 1, %entry ], [ %next, %loop ]420 %next = shl nsw i8 %A, 1421 %cmp1 = icmp eq i8 %A, %n422 br i1 %cmp1, label %exit, label %loop423exit:424 %cmp = icmp eq i8 %A, 0425 ret i1 %cmp426}427 428define i1 @test_shl_dynamic_shift(i8 %n, i8 %shift) {429; CHECK-LABEL: @test_shl_dynamic_shift(430; CHECK-NEXT: entry:431; CHECK-NEXT: br label [[LOOP:%.*]]432; CHECK: loop:433; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]434; CHECK-NEXT: [[NEXT]] = shl nuw i8 [[A]], [[SHIFT:%.*]]435; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]436; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]437; CHECK: exit:438; CHECK-NEXT: ret i1 false439;440entry:441 br label %loop442loop:443 %A = phi i8 [ 1, %entry ], [ %next, %loop ]444 %next = shl nuw i8 %A, %shift445 %cmp1 = icmp eq i8 %A, %n446 br i1 %cmp1, label %exit, label %loop447exit:448 %cmp = icmp eq i8 %A, 0449 ret i1 %cmp450}451 452define i1 @test_shl_may_wrap(i8 %n) {453; CHECK-LABEL: @test_shl_may_wrap(454; CHECK-NEXT: entry:455; CHECK-NEXT: br label [[LOOP:%.*]]456; CHECK: loop:457; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]458; CHECK-NEXT: [[NEXT]] = shl i8 [[A]], 1459; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]460; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]461; CHECK: exit:462; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0463; CHECK-NEXT: ret i1 [[CMP]]464;465entry:466 br label %loop467loop:468 %A = phi i8 [ 1, %entry ], [ %next, %loop ]469 %next = shl i8 %A, 1470 %cmp1 = icmp eq i8 %A, %n471 br i1 %cmp1, label %exit, label %loop472exit:473 %cmp = icmp eq i8 %A, 0474 ret i1 %cmp475}476 477define i1 @test_shl_zero_start(i8 %n) {478; CHECK-LABEL: @test_shl_zero_start(479; CHECK-NEXT: entry:480; CHECK-NEXT: br label [[LOOP:%.*]]481; CHECK: loop:482; CHECK-NEXT: [[A:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]483; CHECK-NEXT: [[NEXT]] = shl nuw i8 [[A]], 1484; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]485; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]486; CHECK: exit:487; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0488; CHECK-NEXT: ret i1 [[CMP]]489;490entry:491 br label %loop492loop:493 %A = phi i8 [ 0, %entry ], [ %next, %loop ]494 %next = shl nuw i8 %A, 1495 %cmp1 = icmp eq i8 %A, %n496 br i1 %cmp1, label %exit, label %loop497exit:498 %cmp = icmp eq i8 %A, 0499 ret i1 %cmp500}501 502 503define i1 @test_lshr_exact(i8 %n) {504; CHECK-LABEL: @test_lshr_exact(505; CHECK-NEXT: entry:506; CHECK-NEXT: br label [[LOOP:%.*]]507; CHECK: loop:508; CHECK-NEXT: [[A:%.*]] = phi i8 [ 64, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]509; CHECK-NEXT: [[NEXT]] = lshr exact i8 [[A]], 1510; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]511; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]512; CHECK: exit:513; CHECK-NEXT: ret i1 false514;515entry:516 br label %loop517loop:518 %A = phi i8 [ 64, %entry ], [ %next, %loop ]519 %next = lshr exact i8 %A, 1520 %cmp1 = icmp eq i8 %A, %n521 br i1 %cmp1, label %exit, label %loop522exit:523 %cmp = icmp eq i8 %A, 0524 ret i1 %cmp525}526 527define i1 @test_lshr_may_wrap(i8 %n) {528; CHECK-LABEL: @test_lshr_may_wrap(529; CHECK-NEXT: entry:530; CHECK-NEXT: br label [[LOOP:%.*]]531; CHECK: loop:532; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]533; CHECK-NEXT: [[NEXT]] = lshr i8 [[A]], 1534; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]535; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]536; CHECK: exit:537; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0538; CHECK-NEXT: ret i1 [[CMP]]539;540entry:541 br label %loop542loop:543 %A = phi i8 [ 1, %entry ], [ %next, %loop ]544 %next = lshr i8 %A, 1545 %cmp1 = icmp eq i8 %A, %n546 br i1 %cmp1, label %exit, label %loop547exit:548 %cmp = icmp eq i8 %A, 0549 ret i1 %cmp550}551 552define i1 @test_lshr_zero_start(i8 %n) {553; CHECK-LABEL: @test_lshr_zero_start(554; CHECK-NEXT: entry:555; CHECK-NEXT: br label [[LOOP:%.*]]556; CHECK: loop:557; CHECK-NEXT: [[A:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]558; CHECK-NEXT: [[NEXT]] = lshr exact i8 [[A]], 1559; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]560; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]561; CHECK: exit:562; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0563; CHECK-NEXT: ret i1 [[CMP]]564;565entry:566 br label %loop567loop:568 %A = phi i8 [ 0, %entry ], [ %next, %loop ]569 %next = lshr exact i8 %A, 1570 %cmp1 = icmp eq i8 %A, %n571 br i1 %cmp1, label %exit, label %loop572exit:573 %cmp = icmp eq i8 %A, 0574 ret i1 %cmp575}576 577define i1 @test_ashr_exact(i8 %n) {578; CHECK-LABEL: @test_ashr_exact(579; CHECK-NEXT: entry:580; CHECK-NEXT: br label [[LOOP:%.*]]581; CHECK: loop:582; CHECK-NEXT: [[A:%.*]] = phi i8 [ 64, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]583; CHECK-NEXT: [[NEXT]] = ashr exact i8 [[A]], 1584; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]585; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]586; CHECK: exit:587; CHECK-NEXT: ret i1 false588;589entry:590 br label %loop591loop:592 %A = phi i8 [ 64, %entry ], [ %next, %loop ]593 %next = ashr exact i8 %A, 1594 %cmp1 = icmp eq i8 %A, %n595 br i1 %cmp1, label %exit, label %loop596exit:597 %cmp = icmp eq i8 %A, 0598 ret i1 %cmp599}600 601define i1 @test_ashr_may_wrap(i8 %n) {602; CHECK-LABEL: @test_ashr_may_wrap(603; CHECK-NEXT: entry:604; CHECK-NEXT: br label [[LOOP:%.*]]605; CHECK: loop:606; CHECK-NEXT: [[A:%.*]] = phi i8 [ 1, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]607; CHECK-NEXT: [[NEXT]] = ashr i8 [[A]], 1608; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]609; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]610; CHECK: exit:611; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0612; CHECK-NEXT: ret i1 [[CMP]]613;614entry:615 br label %loop616loop:617 %A = phi i8 [ 1, %entry ], [ %next, %loop ]618 %next = ashr i8 %A, 1619 %cmp1 = icmp eq i8 %A, %n620 br i1 %cmp1, label %exit, label %loop621exit:622 %cmp = icmp eq i8 %A, 0623 ret i1 %cmp624}625 626define i1 @test_ashr_zero_start(i8 %n) {627; CHECK-LABEL: @test_ashr_zero_start(628; CHECK-NEXT: entry:629; CHECK-NEXT: br label [[LOOP:%.*]]630; CHECK: loop:631; CHECK-NEXT: [[A:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]632; CHECK-NEXT: [[NEXT]] = ashr exact i8 [[A]], 1633; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A]], [[N:%.*]]634; CHECK-NEXT: br i1 [[CMP1]], label [[EXIT:%.*]], label [[LOOP]]635; CHECK: exit:636; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A]], 0637; CHECK-NEXT: ret i1 [[CMP]]638;639entry:640 br label %loop641loop:642 %A = phi i8 [ 0, %entry ], [ %next, %loop ]643 %next = ashr exact i8 %A, 1644 %cmp1 = icmp eq i8 %A, %n645 br i1 %cmp1, label %exit, label %loop646exit:647 %cmp = icmp eq i8 %A, 0648 ret i1 %cmp649}650