3106 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"5 6define i32 @test1(i32 %A, i1 %b) {7; CHECK-LABEL: @test1(8; CHECK-NEXT: BB0:9; CHECK-NEXT: br i1 [[B:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]10; CHECK: BB1:11; CHECK-NEXT: ret i32 [[A:%.*]]12; CHECK: BB2:13; CHECK-NEXT: ret i32 [[A]]14;15BB0:16 br i1 %b, label %BB1, label %BB217 18BB1:19 ; Combine away one argument PHI nodes20 %B = phi i32 [ %A, %BB0 ]21 ret i32 %B22 23BB2:24 ret i32 %A25}26 27define i32 @test2(i32 %A, i1 %b) {28; CHECK-LABEL: @test2(29; CHECK-NEXT: BB0:30; CHECK-NEXT: br i1 [[B:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]31; CHECK: BB1:32; CHECK-NEXT: br label [[BB2]]33; CHECK: BB2:34; CHECK-NEXT: ret i32 [[A:%.*]]35;36BB0:37 br i1 %b, label %BB1, label %BB238 39BB1:40 br label %BB241 42BB2:43 ; Combine away PHI nodes with same values44 %B = phi i32 [ %A, %BB0 ], [ %A, %BB1 ]45 ret i32 %B46}47 48define i32 @test3(i32 %A, i1 %b) {49; CHECK-LABEL: @test3(50; CHECK-NEXT: BB0:51; CHECK-NEXT: br label [[LOOP:%.*]]52; CHECK: Loop:53; CHECK-NEXT: br i1 [[B:%.*]], label [[LOOP]], label [[EXIT:%.*]]54; CHECK: Exit:55; CHECK-NEXT: ret i32 [[A:%.*]]56;57BB0:58 br label %Loop59 60Loop:61 ; PHI has same value always.62 %B = phi i32 [ %A, %BB0 ], [ %B, %Loop ]63 br i1 %b, label %Loop, label %Exit64 65Exit:66 ret i32 %B67}68 69define i32 @test4(i1 %b) {70; CHECK-LABEL: @test4(71; CHECK-NEXT: BB0:72; CHECK-NEXT: ret i32 773; CHECK: Loop:74; CHECK-NEXT: br i1 [[B:%.*]], label [[L2:%.*]], label [[LOOP:%.*]]75; CHECK: L2:76; CHECK-NEXT: br label [[LOOP]]77;78BB0:79 ; Loop is unreachable80 ret i32 781 82Loop: ; preds = %L2, %Loop83 ; PHI has same value always.84 %B = phi i32 [ %B, %L2 ], [ %B, %Loop ]85 br i1 %b, label %L2, label %Loop86 87L2: ; preds = %Loop88 br label %Loop89}90 91define i32 @test5_undef(i32 %A, i1 %cond) {92; CHECK-LABEL: @test5_undef(93; CHECK-NEXT: BB0:94; CHECK-NEXT: br label [[LOOP:%.*]]95; CHECK: Loop:96; CHECK-NEXT: [[B:%.*]] = phi i32 [ [[A:%.*]], [[BB0:%.*]] ], [ undef, [[LOOP]] ]97; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP]], label [[EXIT:%.*]]98; CHECK: Exit:99; CHECK-NEXT: ret i32 [[B]]100;101BB0:102 br label %Loop103 104Loop: ; preds = %Loop, %BB0105 ; PHI has same value always.106 %B = phi i32 [ %A, %BB0 ], [ undef, %Loop ]107 br i1 %cond, label %Loop, label %Exit108 109Exit: ; preds = %Loop110 ret i32 %B111}112 113define i32 @test5_poison(i32 %A, i1 %cond) {114; CHECK-LABEL: @test5_poison(115; CHECK-NEXT: BB0:116; CHECK-NEXT: br label [[LOOP:%.*]]117; CHECK: Loop:118; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP]], label [[EXIT:%.*]]119; CHECK: Exit:120; CHECK-NEXT: ret i32 [[A:%.*]]121;122BB0:123 br label %Loop124 125Loop: ; preds = %Loop, %BB0126 ; PHI has same value always.127 %B = phi i32 [ %A, %BB0 ], [ poison, %Loop ]128 br i1 %cond, label %Loop, label %Exit129 130Exit: ; preds = %Loop131 ret i32 %B132}133 134define i32 @test6(i16 %A, i1 %b) {135; CHECK-LABEL: @test6(136; CHECK-NEXT: BB0:137; CHECK-NEXT: br i1 [[B:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]138; CHECK: BB1:139; CHECK-NEXT: br label [[BB2]]140; CHECK: BB2:141; CHECK-NEXT: [[C:%.*]] = zext i16 [[A:%.*]] to i32142; CHECK-NEXT: ret i32 [[C]]143;144BB0:145 %X = zext i16 %A to i32146 br i1 %b, label %BB1, label %BB2147 148BB1:149 %Y = zext i16 %A to i32150 br label %BB2151 152BB2:153 ;; Suck casts into phi154 %c = phi i32 [ %X, %BB0 ], [ %Y, %BB1 ]155 ret i32 %c156}157 158define i32 @test_dead_cycle(i32 %A, i1 %cond) {159; CHECK-LABEL: @test_dead_cycle(160; CHECK-NEXT: BB0:161; CHECK-NEXT: br label [[LOOP:%.*]]162; CHECK: Loop:163; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP]], label [[EXIT:%.*]]164; CHECK: Exit:165; CHECK-NEXT: ret i32 0166;167BB0:168 br label %Loop169 170Loop: ; preds = %Loop, %BB0171 %B = phi i32 [ %A, %BB0 ], [ %C, %Loop ]172 %C = add i32 %B, 123173 br i1 %cond, label %Loop, label %Exit174 175Exit: ; preds = %Loop176 ret i32 0177}178 179define i32 @test_dead_UnaryOp_cycle(double %A, i1 %cond) {180; CHECK-LABEL: @test_dead_UnaryOp_cycle(181; CHECK-NEXT: BB0:182; CHECK-NEXT: br label [[LOOP:%.*]]183; CHECK: Loop:184; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP]], label [[EXIT:%.*]]185; CHECK: Exit:186; CHECK-NEXT: ret i32 0187;188BB0:189 br label %Loop190 191Loop: ; preds = %Loop, %BB0192 %B = phi double [ %A, %BB0 ], [ %C, %Loop ]193 %C = fneg double %B194 br i1 %cond, label %Loop, label %Exit195 196Exit: ; preds = %Loop197 ret i32 0198}199 200define i32 @test_dead_cycle_two_insts(i32 %A, i1 %cond) {201; CHECK-LABEL: @test_dead_cycle_two_insts(202; CHECK-NEXT: BB0:203; CHECK-NEXT: br label [[LOOP:%.*]]204; CHECK: Loop:205; CHECK-NEXT: [[B:%.*]] = phi i32 [ [[A:%.*]], [[BB0:%.*]] ], [ [[D:%.*]], [[LOOP]] ]206; CHECK-NEXT: [[C:%.*]] = add i32 [[B]], 123207; CHECK-NEXT: [[D]] = lshr i32 [[C]], 1208; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP]], label [[EXIT:%.*]]209; CHECK: Exit:210; CHECK-NEXT: ret i32 0211;212BB0:213 br label %Loop214 215Loop: ; preds = %Loop, %BB0216 %B = phi i32 [ %A, %BB0 ], [ %D, %Loop ]217 %C = add i32 %B, 123218 %D = lshr i32 %C, 1219 br i1 %cond, label %Loop, label %Exit220 221Exit: ; preds = %Loop222 ret i32 0223}224 225declare i32 @llvm.uadd.sat.i32(i32, i32)226 227define i32 @test_dead_cycle_intrin(i32 %A, i1 %cond) {228; CHECK-LABEL: @test_dead_cycle_intrin(229; CHECK-NEXT: BB0:230; CHECK-NEXT: br label [[LOOP:%.*]]231; CHECK: Loop:232; CHECK-NEXT: [[B:%.*]] = phi i32 [ [[A:%.*]], [[BB0:%.*]] ], [ [[C:%.*]], [[LOOP]] ]233; CHECK-NEXT: [[C]] = call i32 @llvm.uadd.sat.i32(i32 [[B]], i32 123)234; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP]], label [[EXIT:%.*]]235; CHECK: Exit:236; CHECK-NEXT: ret i32 0237;238BB0:239 br label %Loop240 241Loop: ; preds = %Loop, %BB0242 %B = phi i32 [ %A, %BB0 ], [ %C, %Loop ]243 %C = call i32 @llvm.uadd.sat.i32(i32 %B, i32 123)244 br i1 %cond, label %Loop, label %Exit245 246Exit: ; preds = %Loop247 ret i32 0248}249 250define ptr @test8(ptr %A, i1 %b) {251; CHECK-LABEL: @test8(252; CHECK-NEXT: BB0:253; CHECK-NEXT: br i1 [[B:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]254; CHECK: BB1:255; CHECK-NEXT: br label [[BB2]]256; CHECK: BB2:257; CHECK-NEXT: [[C:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 4258; CHECK-NEXT: ret ptr [[C]]259;260BB0:261 %X = getelementptr inbounds { i32, i32 }, ptr %A, i32 0, i32 1262 br i1 %b, label %BB1, label %BB2263 264BB1:265 %Y = getelementptr { i32, i32 }, ptr %A, i32 0, i32 1266 br label %BB2267 268BB2:269 ;; Suck GEPs into phi270 %c = phi ptr [ %X, %BB0 ], [ %Y, %BB1 ]271 ret ptr %c272}273 274define i32 @test9(ptr %A, ptr %B) {275; CHECK-LABEL: @test9(276; CHECK-NEXT: entry:277; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[A:%.*]], null278; CHECK-NEXT: br i1 [[C]], label [[BB1:%.*]], label [[BB:%.*]]279; CHECK: bb:280; CHECK-NEXT: br label [[BB2:%.*]]281; CHECK: bb1:282; CHECK-NEXT: br label [[BB2]]283; CHECK: bb2:284; CHECK-NEXT: [[E_IN:%.*]] = phi ptr [ [[B:%.*]], [[BB]] ], [ [[A]], [[BB1]] ]285; CHECK-NEXT: [[E:%.*]] = load i32, ptr [[E_IN]], align 1286; CHECK-NEXT: ret i32 [[E]]287;288entry:289 %c = icmp eq ptr %A, null290 br i1 %c, label %bb1, label %bb291 292bb:293 %C = load i32, ptr %B, align 1294 br label %bb2295 296bb1:297 %D = load i32, ptr %A, align 1298 br label %bb2299 300bb2:301 %E = phi i32 [ %C, %bb ], [ %D, %bb1 ]302 ret i32 %E303 304}305 306define i32 @test10(ptr %A, ptr %B) {307; CHECK-LABEL: @test10(308; CHECK-NEXT: entry:309; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[A:%.*]], null310; CHECK-NEXT: br i1 [[C]], label [[BB1:%.*]], label [[BB:%.*]]311; CHECK: bb:312; CHECK-NEXT: br label [[BB2:%.*]]313; CHECK: bb1:314; CHECK-NEXT: br label [[BB2]]315; CHECK: bb2:316; CHECK-NEXT: [[E_IN:%.*]] = phi ptr [ [[B:%.*]], [[BB]] ], [ [[A]], [[BB1]] ]317; CHECK-NEXT: [[E:%.*]] = load i32, ptr [[E_IN]], align 16318; CHECK-NEXT: ret i32 [[E]]319;320entry:321 %c = icmp eq ptr %A, null322 br i1 %c, label %bb1, label %bb323 324bb:325 %C = load i32, ptr %B, align 16326 br label %bb2327 328bb1:329 %D = load i32, ptr %A, align 32330 br label %bb2331 332bb2:333 %E = phi i32 [ %C, %bb ], [ %D, %bb1 ]334 ret i32 %E335}336 337 338; PR1777339declare i1 @test11a()340 341define i1 @test11() {342; CHECK-LABEL: @test11(343; CHECK-NEXT: entry:344; CHECK-NEXT: [[B:%.*]] = call i1 @test11a()345; CHECK-NEXT: br i1 [[B]], label [[ONE:%.*]], label [[TWO:%.*]]346; CHECK: one:347; CHECK-NEXT: [[C:%.*]] = call i1 @test11a()348; CHECK-NEXT: br i1 [[C]], label [[TWO]], label [[END:%.*]]349; CHECK: two:350; CHECK-NEXT: [[D:%.*]] = call i1 @test11a()351; CHECK-NEXT: br i1 [[D]], label [[ONE]], label [[END]]352; CHECK: end:353; CHECK-NEXT: [[Z:%.*]] = call i1 @test11a()354; CHECK-NEXT: ret i1 [[Z]]355;356entry:357 %a = alloca i32358 %i = ptrtoint ptr %a to i64359 %b = call i1 @test11a()360 br i1 %b, label %one, label %two361 362one:363 %x = phi i64 [%i, %entry], [%y, %two]364 %c = call i1 @test11a()365 br i1 %c, label %two, label %end366 367two:368 %y = phi i64 [%i, %entry], [%x, %one]369 %d = call i1 @test11a()370 br i1 %d, label %one, label %end371 372end:373 %f = phi i64 [ %x, %one], [%y, %two]374 ; Change the %f to %i, and the optimizer suddenly becomes a lot smarter375 ; even though %f must equal %i at this point376 %g = inttoptr i64 %f to ptr377 store i32 10, ptr %g378 %z = call i1 @test11a()379 ret i1 %z380}381 382 383define i64 @test12(i1 %cond, ptr %Ptr, i64 %Val) {384; CHECK-LABEL: @test12(385; CHECK-NEXT: entry:386; CHECK-NEXT: br i1 [[COND:%.*]], label [[END:%.*]], label [[TWO:%.*]]387; CHECK: two:388; CHECK-NEXT: br label [[END]]389; CHECK: end:390; CHECK-NEXT: [[T869_0_OFF64:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[VAL:%.*]], [[TWO]] ]391; CHECK-NEXT: [[T41:%.*]] = ptrtoint ptr [[PTR:%.*]] to i64392; CHECK-NEXT: [[T2:%.*]] = add i64 [[T869_0_OFF64]], [[T41]]393; CHECK-NEXT: ret i64 [[T2]]394;395entry:396 %t41 = ptrtoint ptr %Ptr to i64397 %t42 = zext i64 %t41 to i128398 br i1 %cond, label %end, label %two399 400two:401 %t36 = zext i64 %Val to i128 ; <i128> [#uses=1]402 %t37 = shl i128 %t36, 64 ; <i128> [#uses=1]403 %ins39 = or i128 %t42, %t37 ; <i128> [#uses=1]404 br label %end405 406end:407 %t869.0 = phi i128 [ %t42, %entry ], [ %ins39, %two ]408 %t32 = trunc i128 %t869.0 to i64 ; <i64> [#uses=1]409 %t29 = lshr i128 %t869.0, 64 ; <i128> [#uses=1]410 %t30 = trunc i128 %t29 to i64 ; <i64> [#uses=1]411 412 %t2 = add i64 %t32, %t30413 ret i64 %t2414}415 416declare void @test13f(double, i32)417 418define void @test13(i1 %cond, i32 %V1, double %Vald) {419; CHECK-LABEL: @test13(420; CHECK-NEXT: entry:421; CHECK-NEXT: br i1 [[COND:%.*]], label [[END:%.*]], label [[TWO:%.*]]422; CHECK: two:423; CHECK-NEXT: br label [[END]]424; CHECK: end:425; CHECK-NEXT: [[T31:%.*]] = phi double [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[VALD:%.*]], [[TWO]] ]426; CHECK-NEXT: call void @test13f(double [[T31]], i32 [[V1:%.*]])427; CHECK-NEXT: ret void428;429entry:430 %t42 = zext i32 %V1 to i128431 br i1 %cond, label %end, label %two432 433two:434 %Val = bitcast double %Vald to i64435 %t36 = zext i64 %Val to i128 ; <i128> [#uses=1]436 %t37 = shl i128 %t36, 64 ; <i128> [#uses=1]437 %ins39 = or i128 %t42, %t37 ; <i128> [#uses=1]438 br label %end439 440end:441 %t869.0 = phi i128 [ %t42, %entry ], [ %ins39, %two ]442 %t32 = trunc i128 %t869.0 to i32443 %t29 = lshr i128 %t869.0, 64 ; <i128> [#uses=1]444 %t30 = trunc i128 %t29 to i64 ; <i64> [#uses=1]445 %t31 = bitcast i64 %t30 to double446 447 call void @test13f(double %t31, i32 %t32)448 ret void449}450 451define i640 @test14a(i320 %A, i320 %B, i1 %b1) {452; CHECK-LABEL: @test14a(453; CHECK-NEXT: BB0:454; CHECK-NEXT: br label [[LOOP:%.*]]455; CHECK: Loop:456; CHECK-NEXT: [[C_IN:%.*]] = phi i320 [ [[A:%.*]], [[BB0:%.*]] ], [ [[B:%.*]], [[LOOP]] ]457; CHECK-NEXT: br i1 [[B1:%.*]], label [[LOOP]], label [[EXIT:%.*]]458; CHECK: Exit:459; CHECK-NEXT: [[C:%.*]] = zext i320 [[C_IN]] to i640460; CHECK-NEXT: ret i640 [[C]]461;462BB0:463 %a = zext i320 %A to i640464 %b = zext i320 %B to i640465 br label %Loop466 467Loop:468 %C = phi i640 [ %a, %BB0 ], [ %b, %Loop ]469 br i1 %b1, label %Loop, label %Exit470 471Exit: ; preds = %Loop472 ret i640 %C473}474 475define i160 @test14b(i320 %pA, i320 %pB, i1 %b1) {476; CHECK-LABEL: @test14b(477; CHECK-NEXT: BB0:478; CHECK-NEXT: [[A:%.*]] = trunc i320 [[PA:%.*]] to i160479; CHECK-NEXT: [[B:%.*]] = trunc i320 [[PB:%.*]] to i160480; CHECK-NEXT: br label [[LOOP:%.*]]481; CHECK: Loop:482; CHECK-NEXT: [[C:%.*]] = phi i160 [ [[A]], [[BB0:%.*]] ], [ [[B]], [[LOOP]] ]483; CHECK-NEXT: br i1 [[B1:%.*]], label [[LOOP]], label [[EXIT:%.*]]484; CHECK: Exit:485; CHECK-NEXT: ret i160 [[C]]486;487BB0:488 %a = trunc i320 %pA to i160489 %b = trunc i320 %pB to i160490 br label %Loop491 492Loop:493 %C = phi i160 [ %a, %BB0 ], [ %b, %Loop ]494 br i1 %b1, label %Loop, label %Exit495 496Exit: ; preds = %Loop497 ret i160 %C498}499 500declare i64 @test15a(i64)501 502define i64 @test15b(i64 %A, i1 %b) {503; CHECK-LABEL: @test15b(504; CHECK-NEXT: entry:505; CHECK-NEXT: br i1 [[B:%.*]], label [[ONE:%.*]], label [[TWO:%.*]]506; CHECK: one:507; CHECK-NEXT: [[X_OFF64:%.*]] = phi i64 [ [[A:%.*]], [[ENTRY:%.*]] ], [ [[Y_OFF64:%.*]], [[TWO]] ]508; CHECK-NEXT: [[C:%.*]] = call i64 @test15a(i64 [[X_OFF64]])509; CHECK-NEXT: br label [[TWO]]510; CHECK: two:511; CHECK-NEXT: [[Y_OFF0:%.*]] = phi i64 [ [[A]], [[ENTRY]] ], [ [[C]], [[ONE]] ]512; CHECK-NEXT: [[Y_OFF64]] = phi i64 [ [[A]], [[ENTRY]] ], [ 0, [[ONE]] ]513; CHECK-NEXT: [[D:%.*]] = call i64 @test15a(i64 [[Y_OFF64]])514; CHECK-NEXT: [[D1:%.*]] = trunc i64 [[D]] to i1515; CHECK-NEXT: br i1 [[D1]], label [[ONE]], label [[END:%.*]]516; CHECK: end:517; CHECK-NEXT: ret i64 [[Y_OFF0]]518;519entry:520 %i0 = zext i64 %A to i128521 %i1 = shl i128 %i0, 64522 %i = or i128 %i1, %i0523 br i1 %b, label %one, label %two524 525one:526 %x = phi i128 [%i, %entry], [%y, %two]527 %x1 = lshr i128 %x, 64528 %x2 = trunc i128 %x1 to i64529 %c = call i64 @test15a(i64 %x2)530 %c1 = zext i64 %c to i128531 br label %two532 533 534two:535 %y = phi i128 [%i, %entry], [%c1, %one]536 %y1 = lshr i128 %y, 64537 %y2 = trunc i128 %y1 to i64538 %d = call i64 @test15a(i64 %y2)539 %d1 = trunc i64 %d to i1540 br i1 %d1, label %one, label %end541 542 543end:544 %g = trunc i128 %y to i64545 ret i64 %g546}547 548; PR6512 - Shouldn't merge loads from different addr spaces.549define i32 @test16(ptr addrspace(1) %pointer1, i32 %flag, ptr %pointer2)550; CHECK-LABEL: @test16(551; CHECK-NEXT: entry:552; CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4553; CHECK-NEXT: [[POINTER1_ADDR:%.*]] = alloca ptr addrspace(1), align 4554; CHECK-NEXT: [[POINTER2_ADDR:%.*]] = alloca ptr, align 4555; CHECK-NEXT: store ptr addrspace(1) [[POINTER1:%.*]], ptr [[POINTER1_ADDR]], align 8556; CHECK-NEXT: store ptr [[POINTER2:%.*]], ptr [[POINTER2_ADDR]], align 8557; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[FLAG:%.*]], 0558; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]559; CHECK: return:560; CHECK-NEXT: [[T7:%.*]] = load i32, ptr [[RETVAL]], align 4561; CHECK-NEXT: ret i32 [[T7]]562; CHECK: if.end:563; CHECK-NEXT: [[STOREMERGE:%.*]] = phi i32 [ [[T5:%.*]], [[IF_ELSE]] ], [ [[T2:%.*]], [[IF_THEN]] ]564; CHECK-NEXT: store i32 [[STOREMERGE]], ptr [[RETVAL]], align 4565; CHECK-NEXT: br label [[RETURN:%.*]]566; CHECK: if.then:567; CHECK-NEXT: [[T1:%.*]] = load ptr addrspace(1), ptr [[POINTER1_ADDR]], align 8568; CHECK-NEXT: [[T2]] = load i32, ptr addrspace(1) [[T1]], align 4569; CHECK-NEXT: br label [[IF_END:%.*]]570; CHECK: if.else:571; CHECK-NEXT: [[T3:%.*]] = load ptr, ptr [[POINTER2_ADDR]], align 8572; CHECK-NEXT: [[T5]] = load i32, ptr [[T3]], align 4573; CHECK-NEXT: br label [[IF_END]]574;575nounwind {576entry:577 %retval = alloca i32, align 4 ; <ptr> [#uses=2]578 %pointer1.addr = alloca ptr addrspace(1), align 4 ; <ptr>579 %flag.addr = alloca i32, align 4 ; <ptr> [#uses=2]580 %pointer2.addr = alloca ptr, align 4 ; <ptr> [#uses=2]581 %res = alloca i32, align 4 ; <ptr> [#uses=4]582 store ptr addrspace(1) %pointer1, ptr %pointer1.addr583 store i32 %flag, ptr %flag.addr584 store ptr %pointer2, ptr %pointer2.addr585 store i32 10, ptr %res586 %t = load i32, ptr %flag.addr ; <i32> [#uses=1]587 %tobool = icmp ne i32 %t, 0 ; <i1> [#uses=1]588 br i1 %tobool, label %if.then, label %if.else589 590return: ; preds = %if.end591 %t7 = load i32, ptr %retval ; <i32> [#uses=1]592 ret i32 %t7593 594if.end: ; preds = %if.else, %if.then595 %t6 = load i32, ptr %res ; <i32> [#uses=1]596 store i32 %t6, ptr %retval597 br label %return598 599if.then: ; preds = %entry600 %t1 = load ptr addrspace(1), ptr %pointer1.addr ; <ptr addrspace(1)>601 %arrayidx = getelementptr i32, ptr addrspace(1) %t1, i32 0 ; <ptr addrspace(1)> [#uses=1]602 %t2 = load i32, ptr addrspace(1) %arrayidx ; <i32> [#uses=1]603 store i32 %t2, ptr %res604 br label %if.end605 606if.else: ; preds = %entry607 %t3 = load ptr, ptr %pointer2.addr ; <ptr> [#uses=1]608 %arrayidx4 = getelementptr i32, ptr %t3, i32 0 ; <ptr> [#uses=1]609 %t5 = load i32, ptr %arrayidx4 ; <i32> [#uses=1]610 store i32 %t5, ptr %res611 br label %if.end612}613 614; PR4413615declare i32 @ext()616define i32 @test17(i1 %a) {617; CHECK-LABEL: @test17(618; CHECK-NEXT: entry:619; CHECK-NEXT: br i1 [[A:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]620; CHECK: bb1:621; CHECK-NEXT: [[TMP0:%.*]] = tail call i32 @ext()622; CHECK-NEXT: br label [[BB2]]623; CHECK: bb2:624; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[TMP0]], [[BB1]] ], [ 0, [[ENTRY:%.*]] ]625; CHECK-NEXT: ret i32 [[RES]]626;627entry:628 br i1 %a, label %bb1, label %bb2629 630bb1: ; preds = %entry631 %0 = tail call i32 @ext() ; <i32> [#uses=1]632 br label %bb2633 634bb2: ; preds = %bb1, %entry635 %cond = phi i1 [ true, %bb1 ], [ false, %entry ] ; <i1> [#uses=1]636 %val = phi i32 [ %0, %bb1 ], [ 0, %entry ] ; <i32> [#uses=1]637 %res = select i1 %cond, i32 %val, i32 0 ; <i32> [#uses=1]638 ret i32 %res639}640 641; Atomic and non-atomic loads should not be combined.642define i32 @PR51435(ptr %ptr, ptr %atomic_ptr, i1 %c) {643; CHECK-LABEL: @PR51435(644; CHECK-NEXT: entry:645; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[PTR:%.*]], align 4646; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[END:%.*]]647; CHECK: if:648; CHECK-NEXT: [[Y:%.*]] = load atomic i32, ptr [[ATOMIC_PTR:%.*]] acquire, align 4649; CHECK-NEXT: br label [[END]]650; CHECK: end:651; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[X]], [[ENTRY:%.*]] ], [ [[Y]], [[IF]] ]652; CHECK-NEXT: ret i32 [[COND]]653;654entry:655 %x = load i32, ptr %ptr, align 4656 br i1 %c, label %if, label %end657 658if:659 %y = load atomic i32, ptr %atomic_ptr acquire, align 4660 br label %end661 662end:663 %cond = phi i32 [ %x, %entry ], [ %y, %if ]664 ret i32 %cond665}666 667define i1 @test18(i1 %cond) {668; CHECK-LABEL: @test18(669; CHECK-NEXT: br i1 [[COND:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]670; CHECK: true:671; CHECK-NEXT: br label [[RET:%.*]]672; CHECK: false:673; CHECK-NEXT: br label [[RET]]674; CHECK: ret:675; CHECK-NEXT: ret i1 false676;677 %zero = alloca i32678 %one = alloca i32679 br i1 %cond, label %true, label %false680true:681 br label %ret682false:683 br label %ret684ret:685 %ptr = phi ptr [ %zero, %true ] , [ %one, %false ]686 %isnull = icmp eq ptr %ptr, null687 ret i1 %isnull688}689 690define i1 @test19(i1 %cond, double %x) {691; CHECK-LABEL: @test19(692; CHECK-NEXT: br i1 [[COND:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]693; CHECK: true:694; CHECK-NEXT: br label [[RET:%.*]]695; CHECK: false:696; CHECK-NEXT: br label [[RET]]697; CHECK: ret:698; CHECK-NEXT: ret i1 true699;700 br i1 %cond, label %true, label %false701true:702 br label %ret703false:704 br label %ret705ret:706 %p = phi double [ %x, %true ], [ 0x7FF0000000000000, %false ]; RHS = +infty707 %cmp = fcmp ule double %x, %p708 ret i1 %cmp709}710 711define i1 @test20(i1 %cond) {712; CHECK-LABEL: @test20(713; CHECK-NEXT: br i1 [[COND:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]714; CHECK: true:715; CHECK-NEXT: br label [[RET:%.*]]716; CHECK: false:717; CHECK-NEXT: br label [[RET]]718; CHECK: ret:719; CHECK-NEXT: ret i1 false720;721 %a = alloca i32722 %b = alloca i32723 %c = alloca i32724 br i1 %cond, label %true, label %false725true:726 br label %ret727false:728 br label %ret729ret:730 %p = phi ptr [ %a, %true ], [ %b, %false ]731 %r = icmp eq ptr %p, %c732 ret i1 %r733}734 735define i1 @test21(i1 %c1, i1 %c2) {736; CHECK-LABEL: @test21(737; CHECK-NEXT: br i1 [[C1:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]738; CHECK: true:739; CHECK-NEXT: br label [[LOOP:%.*]]740; CHECK: false:741; CHECK-NEXT: br label [[LOOP]]742; CHECK: loop:743; CHECK-NEXT: br i1 [[C2:%.*]], label [[RET:%.*]], label [[LOOP]]744; CHECK: ret:745; CHECK-NEXT: ret i1 false746;747 %a = alloca i32748 %b = alloca i32749 %c = alloca i32750 br i1 %c1, label %true, label %false751true:752 br label %loop753false:754 br label %loop755loop:756 %p = phi ptr [ %a, %true ], [ %b, %false ], [ %p, %loop ]757 %r = icmp eq ptr %p, %c758 br i1 %c2, label %ret, label %loop759ret:760 ret i1 %r761}762 763define void @test22() {764; CHECK-LABEL: @test22(765; CHECK-NEXT: entry:766; CHECK-NEXT: br label [[LOOP:%.*]]767; CHECK: loop:768; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[Y:%.*]], [[LOOP]] ]769; CHECK-NEXT: [[Y]] = add i32 [[PHI]], 1770; CHECK-NEXT: [[O:%.*]] = or i32 [[Y]], [[PHI]]771; CHECK-NEXT: [[E:%.*]] = icmp eq i32 [[O]], [[Y]]772; CHECK-NEXT: br i1 [[E]], label [[LOOP]], label [[RET:%.*]]773; CHECK: ret:774; CHECK-NEXT: ret void775;776entry:777 br label %loop778loop:779 %phi = phi i32 [ 0, %entry ], [ %y, %loop ]780 %y = add i32 %phi, 1781 %o = or i32 %y, %phi782 %e = icmp eq i32 %o, %y783 br i1 %e, label %loop, label %ret784ret:785 ret void786}787 788define i32 @test23(i32 %A, i1 %pb, ptr %P) {789; CHECK-LABEL: @test23(790; CHECK-NEXT: BB0:791; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[A:%.*]], 19792; CHECK-NEXT: br label [[LOOP:%.*]]793; CHECK: Loop:794; CHECK-NEXT: [[B:%.*]] = phi i32 [ [[TMP0]], [[BB0:%.*]] ], [ 61, [[LOOP]] ]795; CHECK-NEXT: store i32 [[B]], ptr [[P:%.*]], align 4796; CHECK-NEXT: br i1 [[PB:%.*]], label [[LOOP]], label [[EXIT:%.*]]797; CHECK: Exit:798; CHECK-NEXT: ret i32 [[B]]799;800BB0:801 br label %Loop802 803Loop: ; preds = %Loop, %BB0804 ; PHI has same value always.805 %B = phi i32 [ %A, %BB0 ], [ 42, %Loop ]806 %D = add i32 %B, 19807 store i32 %D, ptr %P808 br i1 %pb, label %Loop, label %Exit809 810Exit: ; preds = %Loop811 %E = add i32 %B, 19812 ret i32 %E813}814 815define i32 @test24(i32 %A, i1 %cond) {816; CHECK-LABEL: @test24(817; CHECK-NEXT: BB0:818; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]819; CHECK: BB1:820; CHECK-NEXT: br label [[BB2]]821; CHECK: BB2:822; CHECK-NEXT: [[C:%.*]] = add nuw i32 [[A:%.*]], 1823; CHECK-NEXT: ret i32 [[C]]824;825BB0:826 %X = add nuw nsw i32 %A, 1827 br i1 %cond, label %BB1, label %BB2828 829BB1:830 %Y = add nuw i32 %A, 1831 br label %BB2832 833BB2:834 %C = phi i32 [ %X, %BB0 ], [ %Y, %BB1 ]835 ret i32 %C836}837 838; Same as test11, but used to be missed due to a bug.839declare i1 @test25a()840 841define i1 @test25() {842; CHECK-LABEL: @test25(843; CHECK-NEXT: entry:844; CHECK-NEXT: [[B:%.*]] = call i1 @test25a()845; CHECK-NEXT: br i1 [[B]], label [[ONE:%.*]], label [[TWO:%.*]]846; CHECK: one:847; CHECK-NEXT: [[C:%.*]] = call i1 @test25a()848; CHECK-NEXT: br i1 [[C]], label [[TWO]], label [[END:%.*]]849; CHECK: two:850; CHECK-NEXT: [[D:%.*]] = call i1 @test25a()851; CHECK-NEXT: br i1 [[D]], label [[ONE]], label [[END]]852; CHECK: end:853; CHECK-NEXT: [[Z:%.*]] = call i1 @test25a()854; CHECK-NEXT: ret i1 [[Z]]855;856entry:857 %a = alloca i32858 %i = ptrtoint ptr %a to i64859 %b = call i1 @test25a()860 br i1 %b, label %one, label %two861 862one:863 %x = phi i64 [%y, %two], [%i, %entry]864 %c = call i1 @test25a()865 br i1 %c, label %two, label %end866 867two:868 %y = phi i64 [%x, %one], [%i, %entry]869 %d = call i1 @test25a()870 br i1 %d, label %one, label %end871 872end:873 %f = phi i64 [ %x, %one], [%y, %two]874 ; Change the %f to %i, and the optimizer suddenly becomes a lot smarter875 ; even though %f must equal %i at this point876 %g = inttoptr i64 %f to ptr877 store i32 10, ptr %g878 %z = call i1 @test25a()879 ret i1 %z880}881 882; Same as above, but the input is also a phi883define i1 @test25b(i1 %ci, i64 %ai, i64 %bi) {884; CHECK-LABEL: @test25b(885; CHECK-NEXT: entry:886; CHECK-NEXT: br i1 [[CI:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]887; CHECK: then:888; CHECK-NEXT: br label [[ELSE]]889; CHECK: else:890; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[AI:%.*]], [[ENTRY:%.*]] ], [ [[BI:%.*]], [[THEN]] ]891; CHECK-NEXT: [[B:%.*]] = call i1 @test25a()892; CHECK-NEXT: br i1 [[B]], label [[ONE:%.*]], label [[TWO:%.*]]893; CHECK: one:894; CHECK-NEXT: [[C:%.*]] = call i1 @test25a()895; CHECK-NEXT: br i1 [[C]], label [[TWO]], label [[END:%.*]]896; CHECK: two:897; CHECK-NEXT: [[D:%.*]] = call i1 @test25a()898; CHECK-NEXT: br i1 [[D]], label [[ONE]], label [[END]]899; CHECK: end:900; CHECK-NEXT: [[G:%.*]] = inttoptr i64 [[I]] to ptr901; CHECK-NEXT: store i32 10, ptr [[G]], align 4902; CHECK-NEXT: [[Z:%.*]] = call i1 @test25a()903; CHECK-NEXT: ret i1 [[Z]]904;905entry:906 br i1 %ci, label %then, label %else907 908then:909 br label %else910 911else:912 %i = phi i64 [ %ai, %entry ], [ %bi, %then ]913 %b = call i1 @test25a()914 br i1 %b, label %one, label %two915 916one:917 %x = phi i64 [%y, %two], [%i, %else]918 %c = call i1 @test25a()919 br i1 %c, label %two, label %end920 921two:922 %y = phi i64 [%x, %one], [%i, %else]923 %d = call i1 @test25a()924 br i1 %d, label %one, label %end925 926end:927 %f = phi i64 [ %x, %one], [%y, %two]928 ; Change the %f to %i, and the optimizer suddenly becomes a lot smarter929 ; even though %f must equal %i at this point930 %g = inttoptr i64 %f to ptr931 store i32 10, ptr %g932 %z = call i1 @test25a()933 ret i1 %z934}935 936declare i1 @test26a()937 938define i1 @test26(i32 %n) {939; CHECK-LABEL: @test26(940; CHECK-NEXT: entry:941; CHECK-NEXT: [[B:%.*]] = call i1 @test26a()942; CHECK-NEXT: br label [[ONE:%.*]]943; CHECK: one:944; CHECK-NEXT: [[C:%.*]] = call i1 @test26a()945; CHECK-NEXT: switch i32 [[N:%.*]], label [[END:%.*]] [946; CHECK-NEXT: i32 2, label [[TWO:%.*]]947; CHECK-NEXT: i32 3, label [[THREE:%.*]]948; CHECK-NEXT: ]949; CHECK: two:950; CHECK-NEXT: [[D:%.*]] = call i1 @test26a()951; CHECK-NEXT: switch i32 [[N]], label [[END]] [952; CHECK-NEXT: i32 10, label [[ONE]]953; CHECK-NEXT: i32 30, label [[THREE]]954; CHECK-NEXT: ]955; CHECK: three:956; CHECK-NEXT: [[E:%.*]] = call i1 @test26a()957; CHECK-NEXT: br i1 [[E]], label [[ONE]], label [[TWO]]958; CHECK: end:959; CHECK-NEXT: [[Z:%.*]] = call i1 @test26a()960; CHECK-NEXT: ret i1 [[Z]]961;962entry:963 %a = alloca i32964 %i = ptrtoint ptr %a to i64965 %b = call i1 @test26a()966 br label %one967 968one:969 %x = phi i64 [%y, %two], [%w, %three], [%i, %entry]970 %c = call i1 @test26a()971 switch i32 %n, label %end [972 i32 2, label %two973 i32 3, label %three974 ]975 976two:977 %y = phi i64 [%x, %one], [%w, %three]978 %d = call i1 @test26a()979 switch i32 %n, label %end [980 i32 10, label %one981 i32 30, label %three982 ]983 984three:985 %w = phi i64 [%y, %two], [%x, %one]986 %e = call i1 @test26a()987 br i1 %e, label %one, label %two988 989end:990 %f = phi i64 [ %x, %one], [%y, %two]991 ; Change the %f to %i, and the optimizer suddenly becomes a lot smarter992 ; even though %f must equal %i at this point993 %g = inttoptr i64 %f to ptr994 store i32 10, ptr %g995 %z = call i1 @test26a()996 ret i1 %z997}998 999define i32 @test27(i1 %b) {1000; CHECK-LABEL: @test27(1001; CHECK-NEXT: entry:1002; CHECK-NEXT: br label [[DONE:%.*]]1003; CHECK: done:1004; CHECK-NEXT: ret i32 undef1005;1006entry:1007 br label %done1008done:1009 %y = phi i32 [ undef, %entry ]1010 ret i32 %y1011}1012 1013; We should be able to fold the zexts to the other side of the phi1014; even though there's a constant value input to the phi. This is1015; because we can shrink that constant to the smaller phi type.1016 1017define i1 @PR24766(i8 %x1, i8 %x2, i8 %condition) {1018; CHECK-LABEL: @PR24766(1019; CHECK-NEXT: entry:1020; CHECK-NEXT: switch i8 [[CONDITION:%.*]], label [[EPILOG:%.*]] [1021; CHECK-NEXT: i8 0, label [[SW1:%.*]]1022; CHECK-NEXT: i8 1, label [[SW2:%.*]]1023; CHECK-NEXT: ]1024; CHECK: sw1:1025; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X1:%.*]], [[X2:%.*]]1026; CHECK-NEXT: br label [[EPILOG]]1027; CHECK: sw2:1028; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i8 [[X1]], [[X2]]1029; CHECK-NEXT: br label [[EPILOG]]1030; CHECK: epilog:1031; CHECK-NEXT: [[CONDITIONMET_SHRUNK:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP2]], [[SW2]] ], [ [[CMP1]], [[SW1]] ]1032; CHECK-NEXT: ret i1 [[CONDITIONMET_SHRUNK]]1033;1034entry:1035 %conv = sext i8 %condition to i321036 switch i32 %conv, label %epilog [1037 i32 0, label %sw11038 i32 1, label %sw21039 ]1040 1041sw1:1042 %cmp1 = icmp eq i8 %x1, %x21043 %frombool1 = zext i1 %cmp1 to i81044 br label %epilog1045 1046sw2:1047 %cmp2 = icmp sle i8 %x1, %x21048 %frombool2 = zext i1 %cmp2 to i81049 br label %epilog1050 1051epilog:1052 %conditionMet = phi i8 [ 0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ]1053 %tobool = icmp ne i8 %conditionMet, 01054 ret i1 %tobool1055 1056}1057 1058; Same as above (a phi with more than 2 operands), but no constants1059 1060define i1 @PR24766_no_constants(i8 %x1, i8 %x2, i8 %condition, i1 %another_condition) {1061; CHECK-LABEL: @PR24766_no_constants(1062; CHECK-NEXT: entry:1063; CHECK-NEXT: switch i8 [[CONDITION:%.*]], label [[EPILOG:%.*]] [1064; CHECK-NEXT: i8 0, label [[SW1:%.*]]1065; CHECK-NEXT: i8 1, label [[SW2:%.*]]1066; CHECK-NEXT: ]1067; CHECK: sw1:1068; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X1:%.*]], [[X2:%.*]]1069; CHECK-NEXT: br label [[EPILOG]]1070; CHECK: sw2:1071; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i8 [[X1]], [[X2]]1072; CHECK-NEXT: br label [[EPILOG]]1073; CHECK: epilog:1074; CHECK-NEXT: [[CONDITIONMET_IN:%.*]] = phi i1 [ [[ANOTHER_CONDITION:%.*]], [[ENTRY:%.*]] ], [ [[CMP2]], [[SW2]] ], [ [[CMP1]], [[SW1]] ]1075; CHECK-NEXT: ret i1 [[CONDITIONMET_IN]]1076;1077entry:1078 %frombool0 = zext i1 %another_condition to i81079 %conv = sext i8 %condition to i321080 switch i32 %conv, label %epilog [1081 i32 0, label %sw11082 i32 1, label %sw21083 ]1084 1085sw1:1086 %cmp1 = icmp eq i8 %x1, %x21087 %frombool1 = zext i1 %cmp1 to i81088 br label %epilog1089 1090sw2:1091 %cmp2 = icmp sle i8 %x1, %x21092 %frombool2 = zext i1 %cmp2 to i81093 br label %epilog1094 1095epilog:1096 %conditionMet = phi i8 [ %frombool0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ]1097 %tobool = icmp ne i8 %conditionMet, 01098 ret i1 %tobool1099 1100}1101 1102; Same as above (a phi with more than 2 operands), but two constants1103 1104define i1 @PR24766_two_constants(i8 %x1, i8 %x2, i8 %condition) {1105; CHECK-LABEL: @PR24766_two_constants(1106; CHECK-NEXT: entry:1107; CHECK-NEXT: switch i8 [[CONDITION:%.*]], label [[EPILOG:%.*]] [1108; CHECK-NEXT: i8 0, label [[SW1:%.*]]1109; CHECK-NEXT: i8 1, label [[SW2:%.*]]1110; CHECK-NEXT: ]1111; CHECK: sw1:1112; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X1:%.*]], [[X2:%.*]]1113; CHECK-NEXT: br label [[EPILOG]]1114; CHECK: sw2:1115; CHECK-NEXT: br label [[EPILOG]]1116; CHECK: epilog:1117; CHECK-NEXT: [[CONDITIONMET:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ true, [[SW2]] ], [ [[CMP1]], [[SW1]] ]1118; CHECK-NEXT: ret i1 [[CONDITIONMET]]1119;1120entry:1121 %conv = sext i8 %condition to i321122 switch i32 %conv, label %epilog [1123 i32 0, label %sw11124 i32 1, label %sw21125 ]1126 1127sw1:1128 %cmp1 = icmp eq i8 %x1, %x21129 %frombool1 = zext i1 %cmp1 to i81130 br label %epilog1131 1132sw2:1133 %cmp2 = icmp sle i8 %x1, %x21134 %frombool2 = zext i1 %cmp2 to i81135 br label %epilog1136 1137epilog:1138 %conditionMet = phi i8 [ 0, %entry ], [ 1, %sw2 ], [ %frombool1, %sw1 ]1139 %tobool = icmp ne i8 %conditionMet, 01140 ret i1 %tobool1141 1142}1143 1144; Same as above (a phi with more than 2 operands), but two constants and two variables1145 1146define i1 @PR24766_two_constants_two_var(i8 %x1, i8 %x2, i8 %condition) {1147; CHECK-LABEL: @PR24766_two_constants_two_var(1148; CHECK-NEXT: entry:1149; CHECK-NEXT: switch i8 [[CONDITION:%.*]], label [[EPILOG:%.*]] [1150; CHECK-NEXT: i8 0, label [[SW1:%.*]]1151; CHECK-NEXT: i8 1, label [[SW2:%.*]]1152; CHECK-NEXT: i8 2, label [[SW3:%.*]]1153; CHECK-NEXT: ]1154; CHECK: sw1:1155; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X1:%.*]], [[X2:%.*]]1156; CHECK-NEXT: br label [[EPILOG]]1157; CHECK: sw2:1158; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i8 [[X1]], [[X2]]1159; CHECK-NEXT: br label [[EPILOG]]1160; CHECK: sw3:1161; CHECK-NEXT: br label [[EPILOG]]1162; CHECK: epilog:1163; CHECK-NEXT: [[CONDITIONMET_SHRUNK:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP2]], [[SW2]] ], [ [[CMP1]], [[SW1]] ], [ true, [[SW3]] ]1164; CHECK-NEXT: ret i1 [[CONDITIONMET_SHRUNK]]1165;1166entry:1167 %conv = sext i8 %condition to i321168 switch i32 %conv, label %epilog [1169 i32 0, label %sw11170 i32 1, label %sw21171 i32 2, label %sw31172 ]1173 1174sw1:1175 %cmp1 = icmp eq i8 %x1, %x21176 %frombool1 = zext i1 %cmp1 to i81177 br label %epilog1178 1179sw2:1180 %cmp2 = icmp sle i8 %x1, %x21181 %frombool2 = zext i1 %cmp2 to i81182 br label %epilog1183 1184sw3:1185 %cmp3 = icmp sge i8 %x1, %x21186 %frombool3 = zext i1 %cmp3 to i81187 br label %epilog1188 1189epilog:1190 %conditionMet = phi i8 [ 0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ], [ 1, %sw3 ]1191 %tobool = icmp ne i8 %conditionMet, 01192 ret i1 %tobool1193 1194}1195 1196define i1 @phi_allnonzeroconstant(i1 %c, i32 %a, i32 %b) {1197; CHECK-LABEL: @phi_allnonzeroconstant(1198; CHECK-NEXT: entry:1199; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]1200; CHECK: if.then:1201; CHECK-NEXT: br label [[IF_END:%.*]]1202; CHECK: if.else:1203; CHECK-NEXT: call void @dummy()1204; CHECK-NEXT: br label [[IF_END]]1205; CHECK: if.end:1206; CHECK-NEXT: ret i1 false1207;1208entry:1209 br i1 %c, label %if.then, label %if.else1210 1211if.then: ; preds = %entry1212 br label %if.end1213 1214if.else: ; preds = %entry1215 call void @dummy()1216 1217 br label %if.end1218 1219if.end: ; preds = %if.else, %if.then1220 %x.0 = phi i32 [ 1, %if.then ], [ 2, %if.else ]1221 %or = or i32 %x.0, %a1222 %cmp1 = icmp eq i32 %or, 01223 ret i1 %cmp11224}1225 1226define i1 @phi_allnonzerononconstant(i1 %c, i32 %a, ptr nonnull %b1, ptr nonnull %b2) {1227; CHECK-LABEL: @phi_allnonzerononconstant(1228; CHECK-NEXT: entry:1229; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]1230; CHECK: if.then:1231; CHECK-NEXT: br label [[IF_END:%.*]]1232; CHECK: if.else:1233; CHECK-NEXT: call void @dummy()1234; CHECK-NEXT: br label [[IF_END]]1235; CHECK: if.end:1236; CHECK-NEXT: ret i1 false1237;1238entry:1239 br i1 %c, label %if.then, label %if.else1240 1241if.then: ; preds = %entry1242 br label %if.end1243 1244if.else: ; preds = %entry1245 call void @dummy()1246 1247 br label %if.end1248 1249if.end: ; preds = %if.else, %if.then1250 %x.0 = phi ptr [ %b1, %if.then ], [ %b2, %if.else ]1251 %cmp1 = icmp eq ptr %x.0, null1252 ret i1 %cmp11253}1254 1255declare void @dummy()1256 1257define i1 @phi_knownnonzero_eq(i32 %n, i32 %s, ptr nocapture readonly %P) {1258; CHECK-LABEL: @phi_knownnonzero_eq(1259; CHECK-NEXT: entry:1260; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1261; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]1262; CHECK: if.then:1263; CHECK-NEXT: br label [[IF_END]]1264; CHECK: if.end:1265; CHECK-NEXT: [[A_0:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[N]], [[ENTRY:%.*]] ]1266; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A_0]], 01267; CHECK-NEXT: ret i1 [[CMP1]]1268;1269entry:1270 %tobool = icmp slt i32 %n, %s1271 br i1 %tobool, label %if.end, label %if.then1272 1273if.then: ; preds = %entry1274 %0 = load i32, ptr %P1275 %cmp = icmp eq i32 %n, %01276 %1 = select i1 %cmp, i32 1, i32 21277 br label %if.end1278 1279if.end: ; preds = %entry, %if.then1280 %a.0 = phi i32 [ %1, %if.then ], [ %n, %entry ]1281 %cmp1 = icmp eq i32 %a.0, 01282 ret i1 %cmp11283}1284 1285define i1 @phi_knownnonzero_ne(i32 %n, i32 %s, ptr nocapture readonly %P) {1286; CHECK-LABEL: @phi_knownnonzero_ne(1287; CHECK-NEXT: entry:1288; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1289; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]1290; CHECK: if.then:1291; CHECK-NEXT: br label [[IF_END]]1292; CHECK: if.end:1293; CHECK-NEXT: [[A_0:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[N]], [[ENTRY:%.*]] ]1294; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[A_0]], 01295; CHECK-NEXT: ret i1 [[CMP1]]1296;1297entry:1298 %tobool = icmp slt i32 %n, %s1299 br i1 %tobool, label %if.end, label %if.then1300 1301if.then: ; preds = %entry1302 %0 = load i32, ptr %P1303 %cmp = icmp eq i32 %n, %01304 %1 = select i1 %cmp, i32 1, i32 21305 br label %if.end1306 1307if.end: ; preds = %entry, %if.then1308 %a.0 = phi i32 [ %1, %if.then ], [ %n, %entry ]1309 %cmp1 = icmp ne i32 %a.0, 01310 ret i1 %cmp11311}1312 1313define i1 @phi_knownnonzero_eq_2(i32 %n, i32 %s, ptr nocapture readonly %P) {1314; CHECK-LABEL: @phi_knownnonzero_eq_2(1315; CHECK-NEXT: entry:1316; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1317; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]1318; CHECK: if.then:1319; CHECK-NEXT: br i1 true, label [[IF_ELSE:%.*]], label [[IF_END]]1320; CHECK: if.else:1321; CHECK-NEXT: br label [[IF_END]]1322; CHECK: if.end:1323; CHECK-NEXT: [[A_0:%.*]] = phi i32 [ 1, [[IF_ELSE]] ], [ [[N]], [[ENTRY:%.*]] ], [ poison, [[IF_THEN]] ]1324; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A_0]], 01325; CHECK-NEXT: ret i1 [[CMP1]]1326;1327entry:1328 %tobool = icmp slt i32 %n, %s1329 br i1 %tobool, label %if.then, label %if.end1330 1331if.then:1332 %tobool2 = icmp slt i32 %n, %s1333 br i1 %tobool2, label %if.else, label %if.end1334 1335if.else: ; preds = %entry1336 %0 = load i32, ptr %P1337 %cmp = icmp eq i32 %n, %01338 %1 = select i1 %cmp, i32 1, i32 21339 br label %if.end1340 1341if.end: ; preds = %entry, %if.then1342 %a.0 = phi i32 [ %1, %if.else], [ %n, %entry ], [2, %if.then]1343 %cmp1 = icmp eq i32 %a.0, 01344 ret i1 %cmp11345}1346 1347define i1 @phi_knownnonzero_ne_2(i32 %n, i32 %s, ptr nocapture readonly %P) {1348; CHECK-LABEL: @phi_knownnonzero_ne_2(1349; CHECK-NEXT: entry:1350; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1351; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]1352; CHECK: if.then:1353; CHECK-NEXT: br i1 true, label [[IF_ELSE:%.*]], label [[IF_END]]1354; CHECK: if.else:1355; CHECK-NEXT: br label [[IF_END]]1356; CHECK: if.end:1357; CHECK-NEXT: [[A_0:%.*]] = phi i32 [ 1, [[IF_ELSE]] ], [ [[N]], [[ENTRY:%.*]] ], [ poison, [[IF_THEN]] ]1358; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[A_0]], 01359; CHECK-NEXT: ret i1 [[CMP1]]1360;1361entry:1362 %tobool = icmp slt i32 %n, %s1363 br i1 %tobool, label %if.then, label %if.end1364 1365if.then:1366 %tobool2 = icmp slt i32 %n, %s1367 br i1 %tobool2, label %if.else, label %if.end1368 1369if.else: ; preds = %entry1370 %0 = load i32, ptr %P1371 %cmp = icmp eq i32 %n, %01372 %1 = select i1 %cmp, i32 1, i32 21373 br label %if.end1374 1375if.end: ; preds = %entry, %if.then1376 %a.0 = phi i32 [ %1, %if.else], [ %n, %entry ], [2, %if.then]1377 %cmp1 = icmp ne i32 %a.0, 01378 ret i1 %cmp11379}1380 1381define i1 @phi_knownnonzero_eq_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {1382; CHECK-LABEL: @phi_knownnonzero_eq_oricmp(1383; CHECK-NEXT: entry:1384; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1385; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]1386; CHECK: if.then:1387; CHECK-NEXT: br label [[IF_END]]1388; CHECK: if.end:1389; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[N]], [[ENTRY:%.*]] ]1390; CHECK-NEXT: [[ORPHI:%.*]] = or i32 [[PHI]], [[VAL:%.*]]1391; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[ORPHI]], 01392; CHECK-NEXT: ret i1 [[CMP1]]1393;1394entry:1395 %tobool = icmp slt i32 %n, %s1396 br i1 %tobool, label %if.end, label %if.then1397 1398if.then:1399 %load = load i32, ptr %P1400 %cmp = icmp eq i32 %n, %load1401 %sel = select i1 %cmp, i32 1, i32 21402 br label %if.end1403 1404if.end:1405 %phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]1406 %orphi = or i32 %phi, %val1407 %cmp1 = icmp eq i32 %orphi, 01408 ret i1 %cmp11409}1410 1411define i1 @phi_knownnonzero_eq_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {1412; CHECK-LABEL: @phi_knownnonzero_eq_oricmp_commuted(1413; CHECK-NEXT: entry:1414; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1415; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]1416; CHECK: if.then:1417; CHECK-NEXT: br label [[IF_END]]1418; CHECK: if.end:1419; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[N]], [[ENTRY:%.*]] ]1420; CHECK-NEXT: [[ORPHI:%.*]] = or i32 [[VAL:%.*]], [[PHI]]1421; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[ORPHI]], 01422; CHECK-NEXT: ret i1 [[CMP1]]1423;1424entry:1425 %tobool = icmp slt i32 %n, %s1426 br i1 %tobool, label %if.end, label %if.then1427 1428if.then:1429 %load = load i32, ptr %P1430 %cmp = icmp eq i32 %n, %load1431 %sel = select i1 %cmp, i32 1, i32 21432 br label %if.end1433 1434if.end:1435 %phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]1436 %orphi = or i32 %val, %phi1437 %cmp1 = icmp eq i32 %orphi, 01438 ret i1 %cmp11439}1440 1441define i1 @phi_knownnonzero_eq_or_disjoint_icmp(i32 %n, i32 %s, ptr %P, i32 %val) {1442; CHECK-LABEL: @phi_knownnonzero_eq_or_disjoint_icmp(1443; CHECK-NEXT: entry:1444; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1445; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]1446; CHECK: if.then:1447; CHECK-NEXT: br label [[IF_END]]1448; CHECK: if.end:1449; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[N]], [[ENTRY:%.*]] ]1450; CHECK-NEXT: [[ORPHI:%.*]] = or i32 [[PHI]], [[VAL:%.*]]1451; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[ORPHI]], 01452; CHECK-NEXT: ret i1 [[CMP1]]1453;1454entry:1455 %tobool = icmp slt i32 %n, %s1456 br i1 %tobool, label %if.end, label %if.then1457 1458if.then:1459 %load = load i32, ptr %P1460 %cmp = icmp eq i32 %n, %load1461 %sel = select i1 %cmp, i32 1, i32 21462 br label %if.end1463 1464if.end:1465 %phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]1466 %orphi = or disjoint i32 %phi, %val1467 %cmp1 = icmp eq i32 %orphi, 01468 ret i1 %cmp11469}1470 1471define i1 @phi_knownnonzero_ne_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {1472; CHECK-LABEL: @phi_knownnonzero_ne_oricmp(1473; CHECK-NEXT: entry:1474; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1475; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]1476; CHECK: if.then:1477; CHECK-NEXT: br label [[IF_END]]1478; CHECK: if.end:1479; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[N]], [[ENTRY:%.*]] ]1480; CHECK-NEXT: [[ORPHI:%.*]] = or i32 [[PHI]], [[VAL:%.*]]1481; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[ORPHI]], 01482; CHECK-NEXT: ret i1 [[CMP1]]1483;1484entry:1485 %tobool = icmp slt i32 %n, %s1486 br i1 %tobool, label %if.end, label %if.then1487 1488if.then:1489 %load = load i32, ptr %P1490 %cmp = icmp eq i32 %n, %load1491 %sel = select i1 %cmp, i32 1, i32 21492 br label %if.end1493 1494if.end:1495 %phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]1496 %orphi = or i32 %phi, %val1497 %cmp1 = icmp ne i32 %orphi, 01498 ret i1 %cmp11499}1500 1501define i1 @phi_knownnonzero_ne_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {1502; CHECK-LABEL: @phi_knownnonzero_ne_oricmp_commuted(1503; CHECK-NEXT: entry:1504; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1505; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]1506; CHECK: if.then:1507; CHECK-NEXT: br label [[IF_END]]1508; CHECK: if.end:1509; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[N]], [[ENTRY:%.*]] ]1510; CHECK-NEXT: [[ORPHI:%.*]] = or i32 [[VAL:%.*]], [[PHI]]1511; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[ORPHI]], 01512; CHECK-NEXT: ret i1 [[CMP1]]1513;1514entry:1515 %tobool = icmp slt i32 %n, %s1516 br i1 %tobool, label %if.end, label %if.then1517 1518if.then:1519 %load = load i32, ptr %P1520 %cmp = icmp eq i32 %n, %load1521 %sel = select i1 %cmp, i32 1, i32 21522 br label %if.end1523 1524if.end:1525 %phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]1526 %orphi = or i32 %val, %phi1527 %cmp1 = icmp ne i32 %orphi, 01528 ret i1 %cmp11529}1530 1531define i1 @phi_knownnonzero_eq_multiuse_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {1532; CHECK-LABEL: @phi_knownnonzero_eq_multiuse_oricmp(1533; CHECK-NEXT: entry:1534; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1535; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]1536; CHECK: if.then:1537; CHECK-NEXT: br label [[IF_END]]1538; CHECK: if.end:1539; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[N]], [[ENTRY:%.*]] ]1540; CHECK-NEXT: [[ORPHI:%.*]] = or i32 [[PHI]], [[VAL:%.*]]1541; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[ORPHI]], 01542; CHECK-NEXT: br i1 [[CMP1]], label [[NEXT:%.*]], label [[CLEANUP:%.*]]1543; CHECK: next:1544; CHECK-NEXT: [[BOOL2:%.*]] = icmp eq i32 [[PHI]], 01545; CHECK-NEXT: br label [[CLEANUP]]1546; CHECK: cleanup:1547; CHECK-NEXT: [[FINAL:%.*]] = phi i1 [ false, [[IF_END]] ], [ [[BOOL2]], [[NEXT]] ]1548; CHECK-NEXT: ret i1 [[FINAL]]1549;1550entry:1551 %tobool = icmp slt i32 %n, %s1552 br i1 %tobool, label %if.end, label %if.then1553 1554if.then:1555 %load = load i32, ptr %P1556 %cmp = icmp eq i32 %n, %load1557 %sel = select i1 %cmp, i32 1, i32 21558 br label %if.end1559 1560if.end:1561 %phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]1562 %orphi = or i32 %phi, %val1563 %cmp1 = icmp eq i32 %orphi, 01564 br i1 %cmp1, label %next, label %cleanup1565 1566next:1567 %bool2 = icmp eq i32 %phi, 01568 br label %cleanup1569 1570cleanup:1571 %final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]1572 ret i1 %final1573}1574 1575define i1 @phi_knownnonzero_ne_multiuse_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {1576; CHECK-LABEL: @phi_knownnonzero_ne_multiuse_oricmp_commuted(1577; CHECK-NEXT: entry:1578; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1579; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]1580; CHECK: if.then:1581; CHECK-NEXT: br label [[IF_END]]1582; CHECK: if.end:1583; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[N]], [[ENTRY:%.*]] ]1584; CHECK-NEXT: [[ORPHI:%.*]] = or i32 [[VAL:%.*]], [[PHI]]1585; CHECK-NEXT: [[CMP1_NOT:%.*]] = icmp eq i32 [[ORPHI]], 01586; CHECK-NEXT: br i1 [[CMP1_NOT]], label [[CLEANUP:%.*]], label [[NEXT:%.*]]1587; CHECK: next:1588; CHECK-NEXT: [[BOOL2:%.*]] = icmp ne i32 [[PHI]], 01589; CHECK-NEXT: br label [[CLEANUP]]1590; CHECK: cleanup:1591; CHECK-NEXT: [[FINAL:%.*]] = phi i1 [ false, [[IF_END]] ], [ [[BOOL2]], [[NEXT]] ]1592; CHECK-NEXT: ret i1 [[FINAL]]1593;1594entry:1595 %tobool = icmp slt i32 %n, %s1596 br i1 %tobool, label %if.end, label %if.then1597 1598if.then:1599 %load = load i32, ptr %P1600 %cmp = icmp eq i32 %n, %load1601 %sel = select i1 %cmp, i32 1, i32 21602 br label %if.end1603 1604if.end:1605 %phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]1606 %orphi = or i32 %val, %phi1607 %cmp1 = icmp ne i32 %orphi, 01608 br i1 %cmp1, label %next, label %cleanup1609 1610next:1611 %bool2 = icmp ne i32 %phi, 01612 br label %cleanup1613 1614cleanup:1615 %final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]1616 ret i1 %final1617}1618 1619define i1 @phi_knownnonzero_eq_multiuse_andicmp(i32 %n, i32 %s, ptr %P, i32 %val) {1620; CHECK-LABEL: @phi_knownnonzero_eq_multiuse_andicmp(1621; CHECK-NEXT: entry:1622; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1623; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]1624; CHECK: if.then:1625; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[P:%.*]], align 41626; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[N]], [[LOAD]]1627; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 1, i32 21628; CHECK-NEXT: br label [[IF_END]]1629; CHECK: if.end:1630; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[SEL]], [[IF_THEN]] ], [ [[N]], [[ENTRY:%.*]] ]1631; CHECK-NEXT: [[ANDPHI:%.*]] = and i32 [[PHI]], [[VAL:%.*]]1632; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[ANDPHI]], 01633; CHECK-NEXT: br i1 [[CMP1]], label [[NEXT:%.*]], label [[CLEANUP:%.*]]1634; CHECK: next:1635; CHECK-NEXT: [[BOOL2:%.*]] = icmp eq i32 [[PHI]], 01636; CHECK-NEXT: br label [[CLEANUP]]1637; CHECK: cleanup:1638; CHECK-NEXT: [[FINAL:%.*]] = phi i1 [ false, [[IF_END]] ], [ [[BOOL2]], [[NEXT]] ]1639; CHECK-NEXT: ret i1 [[FINAL]]1640;1641entry:1642 %tobool = icmp slt i32 %n, %s1643 br i1 %tobool, label %if.end, label %if.then1644 1645if.then:1646 %load = load i32, ptr %P1647 %cmp = icmp eq i32 %n, %load1648 %sel = select i1 %cmp, i32 1, i32 21649 br label %if.end1650 1651if.end:1652 %phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]1653 %andphi = and i32 %phi, %val1654 %cmp1 = icmp eq i32 %andphi, 01655 br i1 %cmp1, label %next, label %cleanup1656 1657next:1658 %bool2 = icmp eq i32 %phi, 01659 br label %cleanup1660 1661cleanup:1662 %final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]1663 ret i1 %final1664}1665 1666define i1 @phi_knownnonzero_ne_multiuse_andicmp(i32 %n, i32 %s, ptr %P, i32 %val) {1667; CHECK-LABEL: @phi_knownnonzero_ne_multiuse_andicmp(1668; CHECK-NEXT: entry:1669; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i32 [[N:%.*]], [[S:%.*]]1670; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]1671; CHECK: if.then:1672; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[P:%.*]], align 41673; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[N]], [[LOAD]]1674; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 1, i32 21675; CHECK-NEXT: br label [[IF_END]]1676; CHECK: if.end:1677; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[SEL]], [[IF_THEN]] ], [ [[N]], [[ENTRY:%.*]] ]1678; CHECK-NEXT: [[ANDPHI:%.*]] = and i32 [[PHI]], [[VAL:%.*]]1679; CHECK-NEXT: [[CMP1_NOT:%.*]] = icmp eq i32 [[ANDPHI]], 01680; CHECK-NEXT: br i1 [[CMP1_NOT]], label [[CLEANUP:%.*]], label [[NEXT:%.*]]1681; CHECK: next:1682; CHECK-NEXT: [[BOOL2:%.*]] = icmp ne i32 [[PHI]], 01683; CHECK-NEXT: br label [[CLEANUP]]1684; CHECK: cleanup:1685; CHECK-NEXT: [[FINAL:%.*]] = phi i1 [ false, [[IF_END]] ], [ [[BOOL2]], [[NEXT]] ]1686; CHECK-NEXT: ret i1 [[FINAL]]1687;1688entry:1689 %tobool = icmp slt i32 %n, %s1690 br i1 %tobool, label %if.end, label %if.then1691 1692if.then:1693 %load = load i32, ptr %P1694 %cmp = icmp eq i32 %n, %load1695 %sel = select i1 %cmp, i32 1, i32 21696 br label %if.end1697 1698if.end:1699 %phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]1700 %andphi = and i32 %phi, %val1701 %cmp1 = icmp ne i32 %andphi, 01702 br i1 %cmp1, label %next, label %cleanup1703 1704next:1705 %bool2 = icmp ne i32 %phi, 01706 br label %cleanup1707 1708cleanup:1709 %final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]1710 ret i1 %final1711}1712 1713; This would crash trying to delete an instruction (conv)1714; that still had uses because the user (the phi) was not1715; updated to remove a use from an unreachable block (g.exit).1716 1717define void @main(i1 %cond, i16 %x) {1718; CHECK-LABEL: @main(1719; CHECK-NEXT: entry:1720; CHECK-NEXT: br label [[FOR_COND:%.*]]1721; CHECK: for.cond:1722; CHECK-NEXT: br i1 [[COND:%.*]], label [[FOR_END:%.*]], label [[FOR_BODY:%.*]]1723; CHECK: for.body:1724; CHECK-NEXT: unreachable1725; CHECK: g.exit:1726; CHECK-NEXT: br label [[FOR_COND]]1727; CHECK: for.end:1728; CHECK-NEXT: store double undef, ptr undef, align 81729; CHECK-NEXT: ret void1730;1731entry:1732 br label %for.cond1733 1734for.cond:1735 %p = phi double [ %conv, %g.exit ], [ undef, %entry ]1736 br i1 %cond, label %for.end, label %for.body1737 1738for.body:1739 %conv = sitofp i16 %x to double1740 unreachable1741 1742g.exit:1743 br label %for.cond1744 1745for.end:1746 store double %p, ptr undef1747 ret void1748}1749 1750define i1 @pr57488_icmp_of_phi(ptr %ptr.base, i64 %len) {1751; CHECK-LABEL: @pr57488_icmp_of_phi(1752; CHECK-NEXT: start:1753; CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i64, ptr [[PTR_BASE:%.*]], i64 [[LEN:%.*]]1754; CHECK-NEXT: [[LEN_ZERO:%.*]] = icmp eq i64 [[LEN]], 01755; CHECK-NEXT: br i1 [[LEN_ZERO]], label [[EXIT:%.*]], label [[LOOP:%.*]]1756; CHECK: loop:1757; CHECK-NEXT: [[ACCUM:%.*]] = phi i1 [ [[AND:%.*]], [[LOOP]] ], [ true, [[START:%.*]] ]1758; CHECK-NEXT: [[PTR:%.*]] = phi ptr [ [[PTR_NEXT:%.*]], [[LOOP]] ], [ [[PTR_BASE]], [[START]] ]1759; CHECK-NEXT: [[PTR_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR]], i64 81760; CHECK-NEXT: [[VAL:%.*]] = load i64, ptr [[PTR]], align 81761; CHECK-NEXT: [[VAL_ZERO:%.*]] = icmp eq i64 [[VAL]], 01762; CHECK-NEXT: [[AND]] = and i1 [[ACCUM]], [[VAL_ZERO]]1763; CHECK-NEXT: [[EXIT_COND:%.*]] = icmp eq ptr [[PTR_NEXT]], [[END]]1764; CHECK-NEXT: br i1 [[EXIT_COND]], label [[EXIT]], label [[LOOP]]1765; CHECK: exit:1766; CHECK-NEXT: [[RES:%.*]] = phi i1 [ true, [[START]] ], [ [[AND]], [[LOOP]] ]1767; CHECK-NEXT: ret i1 [[RES]]1768;1769start:1770 %end = getelementptr inbounds i64, ptr %ptr.base, i64 %len1771 %len.zero = icmp eq i64 %len, 01772 br i1 %len.zero, label %exit, label %loop1773 1774loop:1775 %accum = phi i8 [ %accum.next, %loop ], [ 1, %start ]1776 %ptr = phi ptr [ %ptr.next, %loop ], [ %ptr.base, %start ]1777 %ptr.next = getelementptr inbounds i64, ptr %ptr, i64 11778 %accum.bool = icmp ne i8 %accum, 01779 %val = load i64, ptr %ptr, align 81780 %val.zero = icmp eq i64 %val, 01781 %and = and i1 %accum.bool, %val.zero1782 %accum.next = zext i1 %and to i81783 %exit.cond = icmp eq ptr %ptr.next, %end1784 br i1 %exit.cond, label %exit, label %loop1785 1786exit:1787 %res = phi i1 [ true, %start ], [ %and, %loop ]1788 ret i1 %res1789}1790 1791declare void @use(i32)1792declare i1 @get.i1()1793 1794define i32 @phi_op_self_simplify() {1795; CHECK-LABEL: @phi_op_self_simplify(1796; CHECK-NEXT: entry:1797; CHECK-NEXT: br label [[LOOP:%.*]]1798; CHECK: loop:1799; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[IV_ADD2:%.*]], [[LOOP]] ]1800; CHECK-NEXT: [[IV_ADD:%.*]] = xor i32 [[IV]], -11801; CHECK-NEXT: call void @use(i32 [[IV_ADD]])1802; CHECK-NEXT: [[IV_ADD2]] = xor i32 [[IV]], -11803; CHECK-NEXT: br label [[LOOP]]1804;1805entry:1806 br label %loop1807 1808loop:1809 %iv = phi i32 [ 1, %entry ], [ %iv.add2, %loop ]1810 %iv.add = xor i32 %iv, -11811 call void @use(i32 %iv.add)1812 %iv.add2 = xor i32 %iv, -11813 br label %loop1814}1815 1816define i32 @phi_op_self_simplify_2(i32 %x) {1817; CHECK-LABEL: @phi_op_self_simplify_2(1818; CHECK-NEXT: entry:1819; CHECK-NEXT: [[TMP0:%.*]] = or i32 [[X:%.*]], 11820; CHECK-NEXT: br label [[LOOP:%.*]]1821; CHECK: loop:1822; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[PHI]], [[LOOP]] ], [ 11, [[LOOP_LATCH:%.*]] ]1823; CHECK-NEXT: [[C1:%.*]] = call i1 @get.i1()1824; CHECK-NEXT: br i1 [[C1]], label [[LOOP_LATCH]], label [[LOOP]]1825; CHECK: loop.latch:1826; CHECK-NEXT: [[C2:%.*]] = call i1 @get.i1()1827; CHECK-NEXT: br i1 [[C2]], label [[EXIT:%.*]], label [[LOOP]]1828; CHECK: exit:1829; CHECK-NEXT: ret i32 [[PHI]]1830;1831entry:1832 br label %loop1833 1834loop:1835 %phi = phi i32 [ %x, %entry ], [ %or, %loop ], [ 10, %loop.latch ]1836 %or = or i32 %phi, 11837 %c1 = call i1 @get.i1()1838 br i1 %c1, label %loop.latch, label %loop1839 1840loop.latch:1841 %c2 = call i1 @get.i1()1842 br i1 %c2, label %exit, label %loop1843 1844exit:1845 ret i32 %or1846}1847 1848; Caused an infinite loop with D134954.1849define i64 @inttoptr_of_phi(i1 %c, ptr %arg.ptr, ptr %arg.ptr2) {1850; CHECK-LABEL: @inttoptr_of_phi(1851; CHECK-NEXT: entry:1852; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]1853; CHECK: if:1854; CHECK-NEXT: [[ARG_PTR2_VAL:%.*]] = load i64, ptr [[ARG_PTR2:%.*]], align 81855; CHECK-NEXT: [[ARG_PTR2_VAL_PTR:%.*]] = inttoptr i64 [[ARG_PTR2_VAL]] to ptr1856; CHECK-NEXT: br label [[JOIN:%.*]]1857; CHECK: else:1858; CHECK-NEXT: br label [[JOIN]]1859; CHECK: join:1860; CHECK-NEXT: [[INT_PTR_PTR:%.*]] = phi ptr [ [[ARG_PTR2_VAL_PTR]], [[IF]] ], [ [[ARG_PTR:%.*]], [[ELSE]] ]1861; CHECK-NEXT: [[V:%.*]] = load i64, ptr [[INT_PTR_PTR]], align 81862; CHECK-NEXT: ret i64 [[V]]1863;1864entry:1865 br i1 %c, label %if, label %else1866 1867if:1868 %arg.ptr2.val = load i64, ptr %arg.ptr2, align 81869 br label %join1870 1871else:1872 %arg.int.ptr = ptrtoint ptr %arg.ptr to i641873 br label %join1874 1875join:1876 %int.ptr = phi i64 [ %arg.ptr2.val, %if ], [ %arg.int.ptr, %else ]1877 %ptr = inttoptr i64 %int.ptr to ptr1878 %v = load i64, ptr %ptr, align 81879 ret i64 %v1880}1881 1882define void @simplify_context_instr(ptr %ptr.base, i64 %n) {1883; CHECK-LABEL: @simplify_context_instr(1884; CHECK-NEXT: entry:1885; CHECK-NEXT: [[PTR_END:%.*]] = getelementptr inbounds i8, ptr [[PTR_BASE:%.*]], i64 [[N:%.*]]1886; CHECK-NEXT: br label [[LOOP:%.*]]1887; CHECK: loop:1888; CHECK-NEXT: [[PTR:%.*]] = phi ptr [ [[PTR_NEXT:%.*]], [[LATCH:%.*]] ], [ [[PTR_BASE]], [[ENTRY:%.*]] ]1889; CHECK-NEXT: [[PHI:%.*]] = phi i1 [ [[CMP:%.*]], [[LATCH]] ], [ true, [[ENTRY]] ]1890; CHECK-NEXT: [[V:%.*]] = load i8, ptr [[PTR]], align 11891; CHECK-NEXT: [[CMP]] = icmp eq i8 [[V]], 951892; CHECK-NEXT: br i1 [[CMP]], label [[LATCH]], label [[IF:%.*]]1893; CHECK: if:1894; CHECK-NEXT: [[SEL:%.*]] = select i1 [[PHI]], i32 117, i32 1001895; CHECK-NEXT: call void @use(i32 [[SEL]])1896; CHECK-NEXT: br label [[LATCH]]1897; CHECK: latch:1898; CHECK-NEXT: [[PTR_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR]], i64 11899; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq ptr [[PTR_NEXT]], [[PTR_END]]1900; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT:%.*]], label [[LOOP]]1901; CHECK: exit:1902; CHECK-NEXT: ret void1903;1904entry:1905 %ptr.end = getelementptr inbounds i8, ptr %ptr.base, i64 %n1906 br label %loop1907 1908loop:1909 %ptr = phi ptr [ %ptr.next, %latch ], [ %ptr.base, %entry ]1910 %phi = phi i1 [ %cmp, %latch ], [ true, %entry ]1911 %v = load i8, ptr %ptr, align 11912 %cmp = icmp eq i8 %v, 951913 br i1 %cmp, label %latch, label %if1914 1915if:1916 %sel = select i1 %phi, i32 117, i32 1001917 call void @use(i32 %sel)1918 br label %latch1919 1920latch:1921 %ptr.next = getelementptr inbounds i8, ptr %ptr, i64 11922 %cmp.i.not = icmp eq ptr %ptr.next, %ptr.end1923 br i1 %cmp.i.not, label %exit, label %loop1924 1925exit:1926 ret void1927}1928 1929define i32 @add_two_phi_node_can_fold(i1 %c, i32 %i, i32 %j) {1930; CHECK-LABEL: @add_two_phi_node_can_fold(1931; CHECK-NEXT: entry:1932; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]1933; CHECK: if.then:1934; CHECK-NEXT: br label [[IF_END]]1935; CHECK: if.end:1936; CHECK-NEXT: [[ADD:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]1937; CHECK-NEXT: ret i32 [[ADD]]1938;1939entry:1940 br i1 %c, label %if.then, label %if.end1941 1942if.then:1943 br label %if.end1944 1945if.end:1946 %x = phi i32 [ 0, %if.then ], [ %j, %entry ]1947 %y = phi i32 [ %i, %if.then ], [ 0, %entry ]1948 %add = add i32 %y, %x1949 ret i32 %add1950}1951 1952define i32 @add_two_phi_node_cannt_fold(i1 %c, i32 %i, i32 %j) {1953; CHECK-LABEL: @add_two_phi_node_cannt_fold(1954; CHECK-NEXT: entry:1955; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]1956; CHECK: if.then:1957; CHECK-NEXT: br label [[IF_END]]1958; CHECK: if.end:1959; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]1960; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 1, [[ENTRY]] ]1961; CHECK-NEXT: [[ADD:%.*]] = add i32 [[Y]], [[X]]1962; CHECK-NEXT: ret i32 [[ADD]]1963;1964entry:1965 br i1 %c, label %if.then, label %if.end1966 1967if.then:1968 br label %if.end1969 1970if.end:1971 %x = phi i32 [ 0, %if.then ], [ %j, %entry ]1972 %y = phi i32 [ %i, %if.then ], [ 1, %entry ]1973 %add = add i32 %y, %x1974 ret i32 %add1975}1976 1977define i32 @or_two_phi_node_can_fold(i1 %c, i32 %i, i32 %j) {1978; CHECK-LABEL: @or_two_phi_node_can_fold(1979; CHECK-NEXT: entry:1980; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]1981; CHECK: if.then:1982; CHECK-NEXT: br label [[IF_END]]1983; CHECK: if.end:1984; CHECK-NEXT: [[ADD:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]1985; CHECK-NEXT: ret i32 [[ADD]]1986;1987entry:1988 br i1 %c, label %if.then, label %if.end1989 1990if.then:1991 br label %if.end1992 1993if.end:1994 %x = phi i32 [ 0, %if.then ], [ %j, %entry ]1995 %y = phi i32 [ %i, %if.then ], [ 0, %entry ]1996 %add = or i32 %y, %x1997 ret i32 %add1998}1999 2000define i32 @and_two_phi_node_can_fold(i1 %c, i32 %i, i32 %j) {2001; CHECK-LABEL: @and_two_phi_node_can_fold(2002; CHECK-NEXT: entry:2003; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]2004; CHECK: if.then:2005; CHECK-NEXT: br label [[IF_END]]2006; CHECK: if.end:2007; CHECK-NEXT: [[ADD:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]2008; CHECK-NEXT: ret i32 [[ADD]]2009;2010entry:2011 br i1 %c, label %if.then, label %if.end2012 2013if.then:2014 br label %if.end2015 2016if.end:2017 %x = phi i32 [ -1, %if.then ], [ %j, %entry ]2018 %y = phi i32 [ %i, %if.then ], [ -1, %entry ]2019 %add = and i32 %y, %x2020 ret i32 %add2021}2022 2023define i32 @mul_two_phi_node_can_fold(i1 %c, i32 %i, i32 %j) {2024; CHECK-LABEL: @mul_two_phi_node_can_fold(2025; CHECK-NEXT: entry:2026; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]2027; CHECK: if.then:2028; CHECK-NEXT: br label [[IF_END]]2029; CHECK: if.end:2030; CHECK-NEXT: [[ADD:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]2031; CHECK-NEXT: ret i32 [[ADD]]2032;2033entry:2034 br i1 %c, label %if.then, label %if.end2035 2036if.then:2037 br label %if.end2038 2039if.end:2040 %x = phi i32 [ 1, %if.then ], [ %j, %entry ]2041 %y = phi i32 [ %i, %if.then ], [ 1, %entry ]2042 %add = mul i32 %y, %x2043 ret i32 %add2044}2045 2046define i32 @xor_two_phi_node_can_fold(i1 %c, i32 %i, i32 %j) {2047; CHECK-LABEL: @xor_two_phi_node_can_fold(2048; CHECK-NEXT: entry:2049; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]2050; CHECK: if.then:2051; CHECK-NEXT: br label [[IF_END]]2052; CHECK: if.end:2053; CHECK-NEXT: [[ADD:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]2054; CHECK-NEXT: ret i32 [[ADD]]2055;2056entry:2057 br i1 %c, label %if.then, label %if.end2058 2059if.then:2060 br label %if.end2061 2062if.end:2063 %x = phi i32 [ 0, %if.then ], [ %j, %entry ]2064 %y = phi i32 [ %i, %if.then ], [ 0, %entry ]2065 %add = xor i32 %y, %x2066 ret i32 %add2067}2068 2069define i32 @sub_two_phi_node_cant_fold(i1 %c, i32 %i, i32 %j) {2070; CHECK-LABEL: @sub_two_phi_node_cant_fold(2071; CHECK-NEXT: entry:2072; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]2073; CHECK: if.then:2074; CHECK-NEXT: br label [[IF_END]]2075; CHECK: if.end:2076; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ]2077; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 0, [[ENTRY]] ]2078; CHECK-NEXT: [[ADD:%.*]] = sub i32 [[Y]], [[X]]2079; CHECK-NEXT: ret i32 [[ADD]]2080;2081entry:2082 br i1 %c, label %if.then, label %if.end2083 2084if.then:2085 br label %if.end2086 2087if.end:2088 %x = phi i32 [ 0, %if.then ], [ %j, %entry ]2089 %y = phi i32 [ %i, %if.then ], [ 0, %entry ]2090 %add = sub i32 %y, %x2091 ret i32 %add2092}2093 2094define i1 @cmp_eq_phi_node_can_fold_1(ptr %C) {2095; CHECK-LABEL: @cmp_eq_phi_node_can_fold_1(2096; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12097; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482098; CHECK-NEXT: br i1 [[TMP2]], label [[SUB_IS_ZERO:%.*]], label [[JOIN:%.*]]2099; CHECK: sub_is_zero:2100; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12101; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 12102; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 02103; CHECK-NEXT: br label [[JOIN]]2104; CHECK: join:2105; CHECK-NEXT: [[CMP:%.*]] = phi i1 [ false, [[TMP0:%.*]] ], [ [[TMP5]], [[SUB_IS_ZERO]] ]2106; CHECK-NEXT: ret i1 [[CMP]]2107;2108 %1 = load i8, ptr %C, align 12109 %2 = zext i8 %1 to i322110 %3 = sub nsw i32 %2, 482111 %4 = icmp eq i32 %3, 02112 br i1 %4, label %sub_is_zero, label %join2113 2114sub_is_zero:2115 %5 = getelementptr inbounds i8, ptr %C, i64 12116 %6 = load i8, ptr %5, align 12117 %7 = zext i8 %6 to i322118 br label %join2119 2120join:2121 %8 = phi i32 [ %3, %0 ], [ %7, %sub_is_zero ]2122 %cmp = icmp eq i32 %8, 02123 ret i1 %cmp2124}2125 2126define i1 @cmp_eq_phi_node_can_fold_2(ptr %C) {2127; CHECK-LABEL: @cmp_eq_phi_node_can_fold_2(2128; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12129; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482130; CHECK-NEXT: br i1 [[TMP2]], label [[SUB_IS_ZERO:%.*]], label [[JOIN:%.*]]2131; CHECK: sub_is_zero:2132; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12133; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 12134; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 492135; CHECK-NEXT: br i1 [[TMP5]], label [[SUB_IS_ZERO1:%.*]], label [[JOIN]]2136; CHECK: sub_is_zero1:2137; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 22138; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[TMP6]], align 12139; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i8 [[TMP7]], 02140; CHECK-NEXT: br label [[JOIN]]2141; CHECK: join:2142; CHECK-NEXT: [[CMP:%.*]] = phi i1 [ false, [[TMP0:%.*]] ], [ false, [[SUB_IS_ZERO]] ], [ [[TMP8]], [[SUB_IS_ZERO1]] ]2143; CHECK-NEXT: ret i1 [[CMP]]2144;2145 %1 = load i8, ptr %C, align 12146 %2 = zext i8 %1 to i322147 %3 = sub nsw i32 %2, 482148 %4 = icmp eq i32 %3, 02149 br i1 %4, label %sub_is_zero, label %join2150 2151sub_is_zero:2152 %5 = getelementptr inbounds i8, ptr %C, i64 12153 %6 = load i8, ptr %5, align 12154 %7 = zext i8 %6 to i322155 %8 = sub nsw i32 %7, 492156 %9 = icmp eq i32 %8, 02157 br i1 %9, label %sub_is_zero1, label %join2158 2159sub_is_zero1:2160 %10 = getelementptr inbounds i8, ptr %C, i64 22161 %11 = load i8, ptr %10, align 12162 %12 = zext i8 %11 to i322163 br label %join2164 2165join:2166 %13 = phi i32 [ %3, %0 ], [ %8, %sub_is_zero ], [ %12, %sub_is_zero1 ]2167 %cmp = icmp eq i32 %13, 02168 ret i1 %cmp2169}2170 2171define i1 @cmp_eq_phi_node_can_fold_3(ptr %C) {2172; CHECK-LABEL: @cmp_eq_phi_node_can_fold_3(2173; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12174; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482175; CHECK-NEXT: br i1 [[TMP2]], label [[JOIN:%.*]], label [[SUB_IS_ZERO:%.*]]2176; CHECK: sub_is_zero:2177; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12178; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 12179; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 02180; CHECK-NEXT: br label [[JOIN]]2181; CHECK: join:2182; CHECK-NEXT: [[CMP:%.*]] = phi i1 [ true, [[TMP0:%.*]] ], [ [[TMP5]], [[SUB_IS_ZERO]] ]2183; CHECK-NEXT: ret i1 [[CMP]]2184;2185 %1 = load i8, ptr %C, align 12186 %2 = zext i8 %1 to i322187 %3 = sub nsw i32 %2, 482188 %4 = icmp eq i32 %3, 02189 br i1 %4, label %join, label %sub_is_zero2190 2191sub_is_zero:2192 %5 = getelementptr inbounds i8, ptr %C, i64 12193 %6 = load i8, ptr %5, align 12194 %7 = zext i8 %6 to i322195 br label %join2196 2197join:2198 %8 = phi i32 [ %3, %0 ], [ %7, %sub_is_zero ]2199 %cmp = icmp eq i32 %8, 02200 ret i1 %cmp2201}2202 2203 2204define i1 @cmp_eq_phi_node_can_fold_4(ptr %C) {2205; CHECK-LABEL: @cmp_eq_phi_node_can_fold_4(2206; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12207; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482208; CHECK-NEXT: br i1 [[TMP2]], label [[JOIN:%.*]], label [[SUB_IS_ZERO:%.*]]2209; CHECK: sub_is_zero:2210; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12211; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 12212; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 492213; CHECK-NEXT: br i1 [[TMP5]], label [[JOIN]], label [[SUB_IS_ZERO1:%.*]]2214; CHECK: sub_is_zero1:2215; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 22216; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[TMP6]], align 12217; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i8 [[TMP7]], 02218; CHECK-NEXT: br label [[JOIN]]2219; CHECK: join:2220; CHECK-NEXT: [[CMP:%.*]] = phi i1 [ true, [[TMP0:%.*]] ], [ true, [[SUB_IS_ZERO]] ], [ [[TMP8]], [[SUB_IS_ZERO1]] ]2221; CHECK-NEXT: ret i1 [[CMP]]2222;2223 %1 = load i8, ptr %C, align 12224 %2 = zext i8 %1 to i322225 %3 = sub nsw i32 %2, 482226 %4 = icmp eq i32 %3, 02227 br i1 %4, label %join, label %sub_is_zero2228 2229sub_is_zero:2230 %5 = getelementptr inbounds i8, ptr %C, i64 12231 %6 = load i8, ptr %5, align 12232 %7 = zext i8 %6 to i322233 %8 = sub nsw i32 %7, 492234 %9 = icmp eq i32 %8, 02235 br i1 %9, label %join, label %sub_is_zero12236 2237sub_is_zero1:2238 %10 = getelementptr inbounds i8, ptr %C, i64 22239 %11 = load i8, ptr %10, align 12240 %12 = zext i8 %11 to i322241 br label %join2242 2243join:2244 %13 = phi i32 [ %3, %0 ], [ %8, %sub_is_zero ], [ %12, %sub_is_zero1 ]2245 %cmp = icmp eq i32 %13, 02246 ret i1 %cmp2247}2248 2249define i1 @cmp_ne_phi_node_can_fold_1(ptr %C) {2250; CHECK-LABEL: @cmp_ne_phi_node_can_fold_1(2251; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12252; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482253; CHECK-NEXT: br i1 [[TMP2]], label [[SUB_IS_ZERO:%.*]], label [[JOIN:%.*]]2254; CHECK: sub_is_zero:2255; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12256; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 12257; CHECK-NEXT: [[TMP5:%.*]] = icmp ne i8 [[TMP4]], 02258; CHECK-NEXT: br label [[JOIN]]2259; CHECK: join:2260; CHECK-NEXT: [[CMP:%.*]] = phi i1 [ true, [[TMP0:%.*]] ], [ [[TMP5]], [[SUB_IS_ZERO]] ]2261; CHECK-NEXT: ret i1 [[CMP]]2262;2263 %1 = load i8, ptr %C, align 12264 %2 = zext i8 %1 to i322265 %3 = sub nsw i32 %2, 482266 %4 = icmp eq i32 %3, 02267 br i1 %4, label %sub_is_zero, label %join2268 2269sub_is_zero:2270 %5 = getelementptr inbounds i8, ptr %C, i64 12271 %6 = load i8, ptr %5, align 12272 %7 = zext i8 %6 to i322273 br label %join2274 2275join:2276 %8 = phi i32 [ %3, %0 ], [ %7, %sub_is_zero ]2277 %cmp = icmp ne i32 %8, 02278 ret i1 %cmp2279}2280 2281define i1 @cmp_ne_phi_node_can_fold_2(ptr %C) {2282; CHECK-LABEL: @cmp_ne_phi_node_can_fold_2(2283; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12284; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482285; CHECK-NEXT: br i1 [[TMP2]], label [[SUB_IS_ZERO:%.*]], label [[JOIN:%.*]]2286; CHECK: sub_is_zero:2287; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12288; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 12289; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 492290; CHECK-NEXT: br i1 [[TMP5]], label [[SUB_IS_ZERO1:%.*]], label [[JOIN]]2291; CHECK: sub_is_zero1:2292; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 22293; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[TMP6]], align 12294; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i8 [[TMP7]], 02295; CHECK-NEXT: br label [[JOIN]]2296; CHECK: join:2297; CHECK-NEXT: [[CMP:%.*]] = phi i1 [ true, [[TMP0:%.*]] ], [ true, [[SUB_IS_ZERO]] ], [ [[TMP8]], [[SUB_IS_ZERO1]] ]2298; CHECK-NEXT: ret i1 [[CMP]]2299;2300 %1 = load i8, ptr %C, align 12301 %2 = zext i8 %1 to i322302 %3 = sub nsw i32 %2, 482303 %4 = icmp eq i32 %3, 02304 br i1 %4, label %sub_is_zero, label %join2305 2306sub_is_zero: ; preds = %02307 %5 = getelementptr inbounds i8, ptr %C, i64 12308 %6 = load i8, ptr %5, align 12309 %7 = zext i8 %6 to i322310 %8 = sub nsw i32 %7, 492311 %9 = icmp eq i32 %8, 02312 br i1 %9, label %sub_is_zero1, label %join2313 2314sub_is_zero1:2315 %10 = getelementptr inbounds i8, ptr %C, i64 22316 %11 = load i8, ptr %10, align 12317 %12 = zext i8 %11 to i322318 br label %join2319 2320join:2321 %13 = phi i32 [ %3, %0 ], [ %8, %sub_is_zero ], [ %12, %sub_is_zero1 ]2322 %cmp = icmp ne i32 %13, 02323 ret i1 %cmp2324}2325 2326define i1 @cmp_ne_phi_node_can_fold_3(ptr %C) {2327; CHECK-LABEL: @cmp_ne_phi_node_can_fold_3(2328; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12329; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482330; CHECK-NEXT: br i1 [[TMP2]], label [[JOIN:%.*]], label [[SUB_IS_ZERO:%.*]]2331; CHECK: sub_is_zero:2332; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12333; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 12334; CHECK-NEXT: [[TMP5:%.*]] = icmp ne i8 [[TMP4]], 02335; CHECK-NEXT: br label [[JOIN]]2336; CHECK: join:2337; CHECK-NEXT: [[CMP:%.*]] = phi i1 [ false, [[TMP0:%.*]] ], [ [[TMP5]], [[SUB_IS_ZERO]] ]2338; CHECK-NEXT: ret i1 [[CMP]]2339;2340 %1 = load i8, ptr %C, align 12341 %2 = zext i8 %1 to i322342 %3 = sub nsw i32 %2, 482343 %4 = icmp eq i32 %3, 02344 br i1 %4, label %join, label %sub_is_zero2345 2346sub_is_zero:2347 %5 = getelementptr inbounds i8, ptr %C, i64 12348 %6 = load i8, ptr %5, align 12349 %7 = zext i8 %6 to i322350 br label %join2351 2352join:2353 %8 = phi i32 [ %3, %0 ], [ %7, %sub_is_zero ]2354 %cmp = icmp ne i32 %8, 02355 ret i1 %cmp2356}2357 2358define i1 @cmp_ne_phi_node_can_fold_4(ptr %C) {2359; CHECK-LABEL: @cmp_ne_phi_node_can_fold_4(2360; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12361; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482362; CHECK-NEXT: br i1 [[TMP2]], label [[JOIN:%.*]], label [[SUB_IS_ZERO:%.*]]2363; CHECK: sub_is_zero:2364; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12365; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 12366; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 492367; CHECK-NEXT: br i1 [[TMP5]], label [[JOIN]], label [[SUB_IS_ZERO1:%.*]]2368; CHECK: sub_is_zero1:2369; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 22370; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[TMP6]], align 12371; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i8 [[TMP7]], 02372; CHECK-NEXT: br label [[JOIN]]2373; CHECK: join:2374; CHECK-NEXT: [[CMP:%.*]] = phi i1 [ false, [[TMP0:%.*]] ], [ false, [[SUB_IS_ZERO]] ], [ [[TMP8]], [[SUB_IS_ZERO1]] ]2375; CHECK-NEXT: ret i1 [[CMP]]2376;2377 %1 = load i8, ptr %C, align 12378 %2 = zext i8 %1 to i322379 %3 = sub nsw i32 %2, 482380 %4 = icmp eq i32 %3, 02381 br i1 %4, label %join, label %sub_is_zero2382 2383sub_is_zero: ; preds = %02384 %5 = getelementptr inbounds i8, ptr %C, i64 12385 %6 = load i8, ptr %5, align 12386 %7 = zext i8 %6 to i322387 %8 = sub nsw i32 %7, 492388 %9 = icmp eq i32 %8, 02389 br i1 %9, label %join, label %sub_is_zero12390 2391sub_is_zero1:2392 %10 = getelementptr inbounds i8, ptr %C, i64 22393 %11 = load i8, ptr %10, align 12394 %12 = zext i8 %11 to i322395 br label %join2396 2397join:2398 %13 = phi i32 [ %3, %0 ], [ %8, %sub_is_zero ], [ %12, %sub_is_zero1 ]2399 %cmp = icmp ne i32 %13, 02400 ret i1 %cmp2401}2402 2403define i1 @cmp_sgt_phi_node_can_fold_1(ptr %C) {2404; CHECK-LABEL: @cmp_sgt_phi_node_can_fold_1(2405; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12406; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482407; CHECK-NEXT: br i1 [[TMP2]], label [[JOIN:%.*]], label [[SUB_IS_ZERO:%.*]]2408; CHECK: sub_is_zero:2409; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12410; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 12411; CHECK-NEXT: [[TMP5:%.*]] = icmp ne i8 [[TMP4]], 02412; CHECK-NEXT: br label [[JOIN]]2413; CHECK: join:2414; CHECK-NEXT: [[CMP:%.*]] = phi i1 [ false, [[TMP0:%.*]] ], [ [[TMP5]], [[SUB_IS_ZERO]] ]2415; CHECK-NEXT: ret i1 [[CMP]]2416;2417 %1 = load i8, ptr %C, align 12418 %2 = zext i8 %1 to i322419 %3 = sub nsw i32 %2, 482420 %4 = icmp eq i32 %3, 02421 br i1 %4, label %join, label %sub_is_zero2422 2423sub_is_zero:2424 %5 = getelementptr inbounds i8, ptr %C, i64 12425 %6 = load i8, ptr %5, align 12426 %7 = zext i8 %6 to i322427 br label %join2428 2429join:2430 %8 = phi i32 [ %3, %0 ], [ %7, %sub_is_zero ]2431 %cmp = icmp sgt i32 %8, 02432 ret i1 %cmp2433}2434 2435define i1 @cmp_sgt_phi_node_can_fold_2(ptr %C) {2436; CHECK-LABEL: @cmp_sgt_phi_node_can_fold_2(2437; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12438; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482439; CHECK-NEXT: br i1 [[TMP2]], label [[JOIN:%.*]], label [[SUB_IS_ZERO:%.*]]2440; CHECK: sub_is_zero:2441; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12442; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 12443; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 492444; CHECK-NEXT: br i1 [[TMP5]], label [[JOIN]], label [[SUB_IS_ZERO1:%.*]]2445; CHECK: sub_is_zero1:2446; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 22447; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[TMP6]], align 12448; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i8 [[TMP7]], 02449; CHECK-NEXT: br label [[JOIN]]2450; CHECK: join:2451; CHECK-NEXT: [[CMP:%.*]] = phi i1 [ false, [[TMP0:%.*]] ], [ false, [[SUB_IS_ZERO]] ], [ [[TMP8]], [[SUB_IS_ZERO1]] ]2452; CHECK-NEXT: ret i1 [[CMP]]2453;2454 %1 = load i8, ptr %C, align 12455 %2 = zext i8 %1 to i322456 %3 = sub nsw i32 %2, 482457 %4 = icmp eq i32 %3, 02458 br i1 %4, label %join, label %sub_is_zero2459 2460sub_is_zero:2461 %5 = getelementptr inbounds i8, ptr %C, i64 12462 %6 = load i8, ptr %5, align 12463 %7 = zext i8 %6 to i322464 %8 = sub nsw i32 %7, 492465 %9 = icmp eq i32 %8, 02466 br i1 %9, label %join, label %sub_is_zero12467 2468sub_is_zero1:2469 %10 = getelementptr inbounds i8, ptr %C, i64 22470 %11 = load i8, ptr %10, align 12471 %12 = zext i8 %11 to i322472 br label %join2473 2474join:2475 %13 = phi i32 [ %3, %0 ], [ %8, %sub_is_zero ], [ %12, %sub_is_zero1 ]2476 %cmp = icmp sgt i32 %13, 02477 ret i1 %cmp2478}2479 2480define i1 @cmp_sgt_phi_node_cant_fold_1(ptr %C) {2481; CHECK-LABEL: @cmp_sgt_phi_node_cant_fold_1(2482; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12483; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP1]] to i322484; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -482485; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 02486; CHECK-NEXT: br i1 [[TMP4]], label [[SUB_IS_ZERO:%.*]], label [[JOIN:%.*]]2487; CHECK: sub_is_zero:2488; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12489; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 12490; CHECK-NEXT: [[TMP7:%.*]] = zext i8 [[TMP6]] to i322491; CHECK-NEXT: br label [[JOIN]]2492; CHECK: join:2493; CHECK-NEXT: [[TMP8:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[TMP7]], [[SUB_IS_ZERO]] ]2494; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP8]], 02495; CHECK-NEXT: ret i1 [[CMP]]2496;2497 %1 = load i8, ptr %C, align 12498 %2 = zext i8 %1 to i322499 %3 = sub nsw i32 %2, 482500 %4 = icmp eq i32 %3, 02501 br i1 %4, label %sub_is_zero, label %join2502 2503sub_is_zero:2504 %5 = getelementptr inbounds i8, ptr %C, i64 12505 %6 = load i8, ptr %5, align 12506 %7 = zext i8 %6 to i322507 br label %join2508 2509join:2510 %8 = phi i32 [ %3, %0 ], [ %7, %sub_is_zero ]2511 %cmp = icmp sgt i32 %8, 02512 ret i1 %cmp2513}2514 2515define i1 @cmp_sgt_phi_node_cant_fold_2(ptr %C) {2516; CHECK-LABEL: @cmp_sgt_phi_node_cant_fold_2(2517; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12518; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP1]] to i322519; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -482520; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 02521; CHECK-NEXT: br i1 [[TMP4]], label [[SUB_IS_ZERO:%.*]], label [[JOIN:%.*]]2522; CHECK: sub_is_zero:2523; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12524; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 12525; CHECK-NEXT: [[TMP7:%.*]] = zext i8 [[TMP6]] to i322526; CHECK-NEXT: [[TMP8:%.*]] = add nsw i32 [[TMP7]], -492527; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 02528; CHECK-NEXT: br i1 [[TMP9]], label [[SUB_IS_ZERO1:%.*]], label [[JOIN]]2529; CHECK: sub_is_zero1:2530; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 22531; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP10]], align 12532; CHECK-NEXT: [[TMP12:%.*]] = zext i8 [[TMP11]] to i322533; CHECK-NEXT: br label [[JOIN]]2534; CHECK: join:2535; CHECK-NEXT: [[TMP13:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[TMP8]], [[SUB_IS_ZERO]] ], [ [[TMP12]], [[SUB_IS_ZERO1]] ]2536; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP13]], 02537; CHECK-NEXT: ret i1 [[CMP]]2538;2539 %1 = load i8, ptr %C, align 12540 %2 = zext i8 %1 to i322541 %3 = sub nsw i32 %2, 482542 %4 = icmp eq i32 %3, 02543 br i1 %4, label %sub_is_zero, label %join2544 2545sub_is_zero:2546 %5 = getelementptr inbounds i8, ptr %C, i64 12547 %6 = load i8, ptr %5, align 12548 %7 = zext i8 %6 to i322549 %8 = sub nsw i32 %7, 492550 %9 = icmp eq i32 %8, 02551 br i1 %9, label %sub_is_zero1, label %join2552 2553sub_is_zero1:2554 %10 = getelementptr inbounds i8, ptr %C, i64 22555 %11 = load i8, ptr %10, align 12556 %12 = zext i8 %11 to i322557 br label %join2558 2559join:2560 %13 = phi i32 [ %3, %0 ], [ %8, %sub_is_zero ], [ %12, %sub_is_zero1 ]2561 %cmp = icmp sgt i32 %13, 02562 ret i1 %cmp2563}2564 2565define i1 @cmp_slt_phi_node_can_fold_1(ptr %C) {2566; CHECK-LABEL: @cmp_slt_phi_node_can_fold_1(2567; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12568; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482569; CHECK-NEXT: br i1 [[TMP2]], label [[JOIN:%.*]], label [[SUB_IS_ZERO:%.*]]2570; CHECK: sub_is_zero:2571; CHECK-NEXT: br label [[JOIN]]2572; CHECK: join:2573; CHECK-NEXT: ret i1 false2574;2575 %1 = load i8, ptr %C, align 12576 %2 = zext i8 %1 to i322577 %3 = sub nsw i32 %2, 482578 %4 = icmp eq i32 %3, 02579 br i1 %4, label %join, label %sub_is_zero2580 2581sub_is_zero:2582 %5 = getelementptr inbounds i8, ptr %C, i64 12583 %6 = load i8, ptr %5, align 12584 %7 = zext i8 %6 to i322585 br label %join2586 2587join:2588 %8 = phi i32 [ %3, %0 ], [ %7, %sub_is_zero ]2589 %cmp = icmp slt i32 %8, 02590 ret i1 %cmp2591}2592 2593define i1 @cmp_slt_phi_node_can_fold_2(ptr %C) {2594; CHECK-LABEL: @cmp_slt_phi_node_can_fold_2(2595; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12596; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 482597; CHECK-NEXT: br i1 [[TMP2]], label [[JOIN:%.*]], label [[SUB_IS_ZERO:%.*]]2598; CHECK: sub_is_zero:2599; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12600; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 12601; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 492602; CHECK-NEXT: br i1 [[TMP5]], label [[JOIN]], label [[SUB_IS_ZERO1:%.*]]2603; CHECK: sub_is_zero1:2604; CHECK-NEXT: br label [[JOIN]]2605; CHECK: join:2606; CHECK-NEXT: ret i1 false2607;2608 %1 = load i8, ptr %C, align 12609 %2 = zext i8 %1 to i322610 %3 = sub nsw i32 %2, 482611 %4 = icmp eq i32 %3, 02612 br i1 %4, label %join, label %sub_is_zero2613 2614sub_is_zero:2615 %5 = getelementptr inbounds i8, ptr %C, i64 12616 %6 = load i8, ptr %5, align 12617 %7 = zext i8 %6 to i322618 %8 = sub nsw i32 %7, 492619 %9 = icmp eq i32 %8, 02620 br i1 %9, label %join, label %sub_is_zero12621 2622sub_is_zero1:2623 %10 = getelementptr inbounds i8, ptr %C, i64 22624 %11 = load i8, ptr %10, align 12625 %12 = zext i8 %11 to i322626 br label %join2627 2628join:2629 %13 = phi i32 [ %3, %0 ], [ %8, %sub_is_zero ], [ %12, %sub_is_zero1 ]2630 %cmp = icmp slt i32 %13, 02631 ret i1 %cmp2632}2633 2634define i1 @cmp_slt_phi_node_cant_fold_1(ptr %C) {2635; CHECK-LABEL: @cmp_slt_phi_node_cant_fold_1(2636; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12637; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP1]] to i322638; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -482639; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 02640; CHECK-NEXT: br i1 [[TMP4]], label [[SUB_IS_ZERO:%.*]], label [[JOIN:%.*]]2641; CHECK: sub_is_zero:2642; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12643; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 12644; CHECK-NEXT: [[TMP7:%.*]] = zext i8 [[TMP6]] to i322645; CHECK-NEXT: br label [[JOIN]]2646; CHECK: join:2647; CHECK-NEXT: [[TMP8:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[TMP7]], [[SUB_IS_ZERO]] ]2648; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP8]], 02649; CHECK-NEXT: ret i1 [[CMP]]2650;2651 %1 = load i8, ptr %C, align 12652 %2 = zext i8 %1 to i322653 %3 = sub nsw i32 %2, 482654 %4 = icmp eq i32 %3, 02655 br i1 %4, label %sub_is_zero, label %join2656 2657sub_is_zero:2658 %5 = getelementptr inbounds i8, ptr %C, i64 12659 %6 = load i8, ptr %5, align 12660 %7 = zext i8 %6 to i322661 br label %join2662 2663join:2664 %8 = phi i32 [ %3, %0 ], [ %7, %sub_is_zero ]2665 %cmp = icmp slt i32 %8, 02666 ret i1 %cmp2667}2668 2669define i1 @cmp_slt_phi_node_cant_fold_2(ptr %C) {2670; CHECK-LABEL: @cmp_slt_phi_node_cant_fold_2(2671; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[C:%.*]], align 12672; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP1]] to i322673; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -482674; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 02675; CHECK-NEXT: br i1 [[TMP4]], label [[SUB_IS_ZERO:%.*]], label [[JOIN:%.*]]2676; CHECK: sub_is_zero:2677; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 12678; CHECK-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP5]], align 12679; CHECK-NEXT: [[TMP7:%.*]] = zext i8 [[TMP6]] to i322680; CHECK-NEXT: [[TMP8:%.*]] = add nsw i32 [[TMP7]], -492681; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 02682; CHECK-NEXT: br i1 [[TMP9]], label [[SUB_IS_ZERO1:%.*]], label [[JOIN]]2683; CHECK: sub_is_zero1:2684; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw i8, ptr [[C]], i64 22685; CHECK-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP10]], align 12686; CHECK-NEXT: [[TMP12:%.*]] = zext i8 [[TMP11]] to i322687; CHECK-NEXT: br label [[JOIN]]2688; CHECK: join:2689; CHECK-NEXT: [[TMP13:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[TMP8]], [[SUB_IS_ZERO]] ], [ [[TMP12]], [[SUB_IS_ZERO1]] ]2690; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP13]], 02691; CHECK-NEXT: ret i1 [[CMP]]2692;2693 %1 = load i8, ptr %C, align 12694 %2 = zext i8 %1 to i322695 %3 = sub nsw i32 %2, 482696 %4 = icmp eq i32 %3, 02697 br i1 %4, label %sub_is_zero, label %join2698 2699sub_is_zero:2700 %5 = getelementptr inbounds i8, ptr %C, i64 12701 %6 = load i8, ptr %5, align 12702 %7 = zext i8 %6 to i322703 %8 = sub nsw i32 %7, 492704 %9 = icmp eq i32 %8, 02705 br i1 %9, label %sub_is_zero1, label %join2706 2707sub_is_zero1:2708 %10 = getelementptr inbounds i8, ptr %C, i64 22709 %11 = load i8, ptr %10, align 12710 %12 = zext i8 %11 to i322711 br label %join2712 2713join:2714 %13 = phi i32 [ %3, %0 ], [ %8, %sub_is_zero ], [ %12, %sub_is_zero1 ]2715 %cmp = icmp slt i32 %13, 02716 ret i1 %cmp2717}2718 2719define void @phi_op_in_loop(i1 %c, i32 %x) {2720; CHECK-LABEL: @phi_op_in_loop(2721; CHECK-NEXT: br label [[LOOP:%.*]]2722; CHECK: loop:2723; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[LOOP_LATCH:%.*]]2724; CHECK: if:2725; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 12726; CHECK-NEXT: br label [[LOOP_LATCH]]2727; CHECK: loop.latch:2728; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[TMP1]], [[IF]] ], [ 0, [[LOOP]] ]2729; CHECK-NEXT: call void @use(i32 [[PHI]])2730; CHECK-NEXT: br label [[LOOP]]2731;2732 br label %loop2733 2734loop:2735 br i1 %c, label %if, label %loop.latch2736 2737if:2738 br label %loop.latch2739 2740loop.latch:2741 %phi = phi i32 [ %x, %if ], [ 0, %loop ]2742 %and = and i32 %phi, 12743 call void @use(i32 %and)2744 br label %loop2745}2746 2747define void @test_dead_phi_web(i64 %index, i1 %cond) {2748; CHECK-LABEL: @test_dead_phi_web(2749; CHECK-NEXT: entry:2750; CHECK-NEXT: br label [[BB0:%.*]]2751; CHECK: BB0:2752; CHECK-NEXT: switch i64 [[INDEX:%.*]], label [[BB4:%.*]] [2753; CHECK-NEXT: i64 0, label [[BB1:%.*]]2754; CHECK-NEXT: i64 1, label [[BB2:%.*]]2755; CHECK-NEXT: i64 2, label [[BB3:%.*]]2756; CHECK-NEXT: ]2757; CHECK: BB1:2758; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB2]], label [[BB4]]2759; CHECK: BB2:2760; CHECK-NEXT: br i1 [[COND]], label [[BB3]], label [[BB4]]2761; CHECK: BB3:2762; CHECK-NEXT: br label [[BB4]]2763; CHECK: BB4:2764; CHECK-NEXT: br i1 [[COND]], label [[BB0]], label [[BB5:%.*]]2765; CHECK: BB5:2766; CHECK-NEXT: ret void2767;2768entry:2769 br label %BB02770 2771BB0: ; preds = %BB4, %entry2772 %a = phi float [ 0.0, %entry ], [ %x, %BB4 ]2773 switch i64 %index, label %BB4 [2774 i64 0, label %BB12775 i64 1, label %BB22776 i64 2, label %BB32777 ]2778 2779BB1: ; preds = %BB02780 br i1 %cond, label %BB2, label %BB42781 2782BB2: ; preds = %BB1, %BB02783 %b = phi float [ 2.0, %BB0 ], [ %a, %BB1 ]2784 br i1 %cond, label %BB3, label %BB42785 2786BB3: ; preds = %BB2, %BB02787 %c = phi float [ 3.0, %BB0 ], [ %b, %BB2 ]2788 br label %BB42789 2790BB4: ; preds = %BB3, %BB2, %BB1, %BB02791 %x = phi float [ %a, %BB0 ], [ %a, %BB1 ], [ %b, %BB2 ], [ %c, %BB3 ]2792 br i1 %cond, label %BB0, label %BB52793 2794BB5: ; preds = %BB42795 ret void2796}2797 2798define i64 @wrong_gep_arg_into_phi(ptr noundef %ptr) {2799; CHECK-LABEL: @wrong_gep_arg_into_phi(2800; CHECK-NEXT: entry:2801; CHECK-NEXT: br label [[FOR_COND:%.*]]2802; CHECK: for.cond:2803; CHECK-NEXT: [[PTR_PN:%.*]] = phi ptr [ [[PTR:%.*]], [[ENTRY:%.*]] ], [ [[DOTPN:%.*]], [[FOR_COND]] ]2804; CHECK-NEXT: [[DOTPN]] = getelementptr i8, ptr [[PTR_PN]], i64 12805; CHECK-NEXT: [[VAL:%.*]] = load i8, ptr [[DOTPN]], align 12806; CHECK-NEXT: [[COND_NOT:%.*]] = icmp eq i8 [[VAL]], 02807; CHECK-NEXT: br i1 [[COND_NOT]], label [[EXIT:%.*]], label [[FOR_COND]]2808; CHECK: exit:2809; CHECK-NEXT: ret i64 02810;2811entry:2812 %add.ptr = getelementptr i8, ptr %ptr, i64 12813 br label %for.cond2814 2815for.cond: ; preds = %for.cond, %entry2816 %.pn = phi ptr [ %add.ptr, %entry ], [ %incdec.ptr, %for.cond ]2817 %val = load i8, ptr %.pn, align 12818 %cond = icmp ne i8 %val, 02819 %incdec.ptr = getelementptr inbounds nuw i8, ptr %.pn, i64 12820 br i1 %cond, label %for.cond, label %exit2821 2822exit: ; preds = %for.cond2823 ret i64 02824}2825 2826define i1 @test_zext_icmp_eq_0(i1 %a, i1 %b, i32 %c) {2827; CHECK-LABEL: @test_zext_icmp_eq_0(2828; CHECK-NEXT: entry:2829; CHECK-NEXT: br i1 [[A:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]2830; CHECK: if:2831; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[B:%.*]], true2832; CHECK-NEXT: br label [[JOIN:%.*]]2833; CHECK: else:2834; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[C:%.*]], 02835; CHECK-NEXT: br label [[JOIN]]2836; CHECK: join:2837; CHECK-NEXT: [[CMP:%.*]] = phi i1 [ [[TMP0]], [[IF]] ], [ [[TMP1]], [[ELSE]] ]2838; CHECK-NEXT: ret i1 [[CMP]]2839;2840entry:2841 br i1 %a, label %if, label %else2842 2843if:2844 %b.ext = zext i1 %b to i322845 br label %join2846 2847else:2848 br label %join2849 2850join:2851 %phi = phi i32 [ %b.ext, %if ], [ %c, %else ]2852 %cmp = icmp eq i32 %phi, 02853 ret i1 %cmp2854}2855 2856define i1 @test_zext_icmp_ne_0(i1 %a, i1 %b, i32 %c) {2857; CHECK-LABEL: @test_zext_icmp_ne_0(2858; CHECK-NEXT: entry:2859; CHECK-NEXT: br i1 [[A:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]2860; CHECK: if:2861; CHECK-NEXT: br label [[JOIN:%.*]]2862; CHECK: else:2863; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i32 [[C:%.*]], 02864; CHECK-NEXT: br label [[JOIN]]2865; CHECK: join:2866; CHECK-NEXT: [[PHI:%.*]] = phi i1 [ [[B:%.*]], [[IF]] ], [ [[TMP0]], [[ELSE]] ]2867; CHECK-NEXT: ret i1 [[PHI]]2868;2869entry:2870 br i1 %a, label %if, label %else2871 2872if:2873 %b.ext = zext i1 %b to i322874 br label %join2875 2876else:2877 br label %join2878 2879join:2880 %phi = phi i32 [ %b.ext, %if ], [ %c, %else ]2881 %cmp = icmp ne i32 %phi, 02882 ret i1 %cmp2883}2884 2885define i1 @test_zext_icmp_eq_1(i1 %a, i1 %b, i32 %c) {2886; CHECK-LABEL: @test_zext_icmp_eq_1(2887; CHECK-NEXT: entry:2888; CHECK-NEXT: br i1 [[A:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]2889; CHECK: if:2890; CHECK-NEXT: br label [[JOIN:%.*]]2891; CHECK: else:2892; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[C:%.*]], 12893; CHECK-NEXT: br label [[JOIN]]2894; CHECK: join:2895; CHECK-NEXT: [[PHI:%.*]] = phi i1 [ [[B:%.*]], [[IF]] ], [ [[TMP0]], [[ELSE]] ]2896; CHECK-NEXT: ret i1 [[PHI]]2897;2898entry:2899 br i1 %a, label %if, label %else2900 2901if:2902 %b.ext = zext i1 %b to i322903 br label %join2904 2905else:2906 br label %join2907 2908join:2909 %phi = phi i32 [ %b.ext, %if ], [ %c, %else ]2910 %cmp = icmp eq i32 %phi, 12911 ret i1 %cmp2912}2913 2914define i1 @test_zext_icmp_eq_0_loop(i1 %c, i1 %b) {2915; CHECK-LABEL: @test_zext_icmp_eq_0_loop(2916; CHECK-NEXT: entry:2917; CHECK-NEXT: br label [[LOOP:%.*]]2918; CHECK: loop:2919; CHECK-NEXT: [[X:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[LOOP]] ]2920; CHECK-NEXT: [[Y:%.*]] = and i1 [[X]], [[B:%.*]]2921; CHECK-NEXT: [[TMP0]] = xor i1 [[Y]], true2922; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP]], label [[EXIT:%.*]]2923; CHECK: exit:2924; CHECK-NEXT: ret i1 [[X]]2925;2926entry:2927 br label %loop2928 2929loop:2930 %phi = phi i32 [ 1, %entry ], [ %ext, %loop ]2931 %x = icmp eq i32 %phi, 02932 %y = and i1 %x, %b2933 %ext = zext i1 %y to i322934 br i1 %c, label %loop, label %exit2935 2936exit:2937 ret i1 %x2938}2939 2940define i1 @test_zext_icmp_eq_0_multi_use(i1 %a, i1 %b, i32 %c) {2941; CHECK-LABEL: @test_zext_icmp_eq_0_multi_use(2942; CHECK-NEXT: entry:2943; CHECK-NEXT: br i1 [[A:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]2944; CHECK: if:2945; CHECK-NEXT: [[B_EXT:%.*]] = zext i1 [[B:%.*]] to i322946; CHECK-NEXT: call void @use(i32 [[B_EXT]])2947; CHECK-NEXT: br label [[JOIN:%.*]]2948; CHECK: else:2949; CHECK-NEXT: br label [[JOIN]]2950; CHECK: join:2951; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[B_EXT]], [[IF]] ], [ [[C:%.*]], [[ELSE]] ]2952; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI]], 02953; CHECK-NEXT: ret i1 [[CMP]]2954;2955entry:2956 br i1 %a, label %if, label %else2957 2958if:2959 %b.ext = zext i1 %b to i322960 call void @use(i32 %b.ext)2961 br label %join2962 2963else:2964 br label %join2965 2966join:2967 %phi = phi i32 [ %b.ext, %if ], [ %c, %else ]2968 %cmp = icmp eq i32 %phi, 02969 ret i1 %cmp2970}2971 2972define i1 @test_zext_icmp_eq_0_not_bool(i1 %a, i2 %b, i32 %c) {2973; CHECK-LABEL: @test_zext_icmp_eq_0_not_bool(2974; CHECK-NEXT: entry:2975; CHECK-NEXT: br i1 [[A:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]2976; CHECK: if:2977; CHECK-NEXT: [[B_EXT:%.*]] = zext i2 [[B:%.*]] to i322978; CHECK-NEXT: br label [[JOIN:%.*]]2979; CHECK: else:2980; CHECK-NEXT: br label [[JOIN]]2981; CHECK: join:2982; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[B_EXT]], [[IF]] ], [ [[C:%.*]], [[ELSE]] ]2983; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI]], 02984; CHECK-NEXT: ret i1 [[CMP]]2985;2986entry:2987 br i1 %a, label %if, label %else2988 2989if:2990 %b.ext = zext i2 %b to i322991 br label %join2992 2993else:2994 br label %join2995 2996join:2997 %phi = phi i32 [ %b.ext, %if ], [ %c, %else ]2998 %cmp = icmp eq i32 %phi, 02999 ret i1 %cmp3000}3001 3002declare void @may_exit()3003 3004define i32 @intrinsic_over_phi_noundef(i1 %c, i1 %c2, i32 %a) {3005; CHECK-LABEL: @intrinsic_over_phi_noundef(3006; CHECK-NEXT: entry:3007; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]]3008; CHECK: if:3009; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.umax.i32(i32 [[A:%.*]], i32 1)3010; CHECK-NEXT: br label [[JOIN]]3011; CHECK: join:3012; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[TMP0]], [[IF]] ], [ 1, [[ENTRY:%.*]] ]3013; CHECK-NEXT: call void @may_exit()3014; CHECK-NEXT: ret i32 [[PHI]]3015;3016entry:3017 br i1 %c, label %if, label %join3018 3019if:3020 br label %join3021 3022join:3023 %phi = phi i32 [ %a, %if ], [ 0, %entry ]3024 call void @may_exit()3025 %umax = call noundef i32 @llvm.umax(i32 noundef %phi, i32 1)3026 ret i32 %umax3027}3028 3029define i32 @cross_lane_intrinsic_over_phi(i1 %c, i1 %c2, <4 x i32> %a) {3030; CHECK-LABEL: @cross_lane_intrinsic_over_phi(3031; CHECK-NEXT: entry:3032; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]]3033; CHECK: if:3034; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[A:%.*]])3035; CHECK-NEXT: br label [[JOIN]]3036; CHECK: join:3037; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[TMP0]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]3038; CHECK-NEXT: call void @may_exit()3039; CHECK-NEXT: ret i32 [[PHI]]3040;3041entry:3042 br i1 %c, label %if, label %join3043 3044if:3045 br label %join3046 3047join:3048 %phi = phi <4 x i32> [ %a, %if ], [ zeroinitializer, %entry ]3049 call void @may_exit()3050 %sum = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %phi)3051 ret i32 %sum3052}3053 3054define { i64, i1 } @overflow_intrinsic_over_phi(i1 %c, i64 %a) {3055; CHECK-LABEL: @overflow_intrinsic_over_phi(3056; CHECK-NEXT: entry:3057; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]]3058; CHECK: if:3059; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[A:%.*]], i64 1)3060; CHECK-NEXT: br label [[JOIN]]3061; CHECK: join:3062; CHECK-NEXT: [[PHI:%.*]] = phi { i64, i1 } [ [[TMP0]], [[IF]] ], [ { i64 1, i1 false }, [[ENTRY:%.*]] ]3063; CHECK-NEXT: call void @may_exit()3064; CHECK-NEXT: ret { i64, i1 } [[PHI]]3065;3066entry:3067 br i1 %c, label %if, label %join3068 3069if:3070 br label %join3071 3072join:3073 %phi = phi i64 [ %a, %if ], [ 0, %entry ]3074 call void @may_exit()3075 %add_overflow = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %phi, i64 1)3076 ret { i64, i1 } %add_overflow3077}3078 3079define i32 @multiple_intrinsics_with_multiple_phi_uses(i1 %c, i32 %arg) {3080; CHECK-LABEL: @multiple_intrinsics_with_multiple_phi_uses(3081; CHECK-NEXT: entry:3082; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[IF_END:%.*]]3083; CHECK: if:3084; CHECK-NEXT: [[ADD:%.*]] = add i32 [[ARG:%.*]], -83085; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.fshl.i32(i32 [[ADD]], i32 [[ADD]], i32 29)3086; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[TMP0]], 13087; CHECK-NEXT: br label [[IF_END]]3088; CHECK: if.end:3089; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[TMP1]], [[IF]] ], [ 0, [[ENTRY:%.*]] ]3090; CHECK-NEXT: ret i32 [[PHI]]3091;3092entry:3093 br i1 %c, label %if, label %if.end3094 3095if:3096 %add = add i32 %arg, -83097 br label %if.end3098 3099if.end:3100 %phi = phi i32 [ %add, %if ], [ 0, %entry ]3101 %fshl1 = call i32 @llvm.fshl.i32(i32 %phi, i32 %phi, i32 29)3102 %fshl2 = call i32 @llvm.fshl.i32(i32 %phi, i32 %phi, i32 29)3103 %add2 = add i32 %fshl1, %fshl23104 ret i32 %add23105}3106