547 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4declare void @llvm.assume(i1)5declare i32 @llvm.ctpop.i32(i32)6 7define i32 @pow2_32_assume(i32 %x) {8; CHECK-LABEL: @pow2_32_assume(9; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 410; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 011; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])12; CHECK-NEXT: ret i32 413;14 %and = and i32 %x, 415 %cmp = icmp ne i32 %and, 016 call void @llvm.assume(i1 %cmp)17 %and2 = and i32 %x, 418 ret i32 %and219}20 21define i32 @not_pow2_32_assume(i32 %x) {22; CHECK-LABEL: @not_pow2_32_assume(23; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 324; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 025; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])26; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], 327; CHECK-NEXT: ret i32 [[AND2]]28;29 %and = and i32 %x, 330 %cmp = icmp ne i32 %and, 031 call void @llvm.assume(i1 %cmp)32 %and2 = and i32 %x, 333 ret i32 %and234}35 36define i64 @pow2_64_assume(i64 %x) {37; CHECK-LABEL: @pow2_64_assume(38; CHECK-NEXT: [[AND:%.*]] = and i64 [[X:%.*]], 139; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[AND]], 040; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])41; CHECK-NEXT: ret i64 [[X]]42;43 %and = and i64 %x, 144 %cmp = icmp ne i64 %and, 045 call void @llvm.assume(i1 %cmp)46 %or = or i64 %x, 147 ret i64 %or48}49 50define i64 @not_pow2_64_assume(i64 %x) {51; CHECK-LABEL: @not_pow2_64_assume(52; CHECK-NEXT: [[AND:%.*]] = and i64 [[X:%.*]], 214748364753; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[AND]], 054; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])55; CHECK-NEXT: [[OR:%.*]] = or i64 [[X]], 214748364756; CHECK-NEXT: ret i64 [[OR]]57;58 %and = and i64 %x, 214748364759 %cmp = icmp ne i64 %and, 060 call void @llvm.assume(i1 %cmp)61 %or = or i64 %x, 214748364762 ret i64 %or63}64 65define i16 @pow2_16_assume(i16 %x) {66; CHECK-LABEL: @pow2_16_assume(67; CHECK-NEXT: [[AND:%.*]] = and i16 [[X:%.*]], 1638468; CHECK-NEXT: [[CMP:%.*]] = icmp ne i16 [[AND]], 069; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])70; CHECK-NEXT: ret i16 1638471;72 %and = and i16 %x, 1638473 %cmp = icmp eq i16 %and, 1638474 call void @llvm.assume(i1 %cmp)75 %and2 = and i16 %x, 1638476 ret i16 %and277}78 79define i16 @not_pow2_16_assume(i16 %x) {80; CHECK-LABEL: @not_pow2_16_assume(81; CHECK-NEXT: [[AND:%.*]] = and i16 [[X:%.*]], 782; CHECK-NEXT: [[CMP:%.*]] = icmp ne i16 [[AND]], 783; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])84; CHECK-NEXT: [[AND2:%.*]] = and i16 [[X]], 785; CHECK-NEXT: ret i16 [[AND2]]86;87 %and = and i16 %x, 788 %cmp = icmp ne i16 %and, 789 call void @llvm.assume(i1 %cmp)90 %and2 = and i16 %x, 791 ret i16 %and292}93 94define i8 @pow2_8_assume(i8 %x) {95; CHECK-LABEL: @pow2_8_assume(96; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 097; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])98; CHECK-NEXT: ret i8 [[X]]99;100 %and = and i8 %x, 128101 %cmp = icmp eq i8 %and, 128102 call void @llvm.assume(i1 %cmp)103 %or = or i8 %x, 128104 ret i8 %or105}106 107define i8 @not_pow2_8_assume(i8 %x) {108; CHECK-LABEL: @not_pow2_8_assume(109; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 127110; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[AND]], 127111; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])112; CHECK-NEXT: [[OR:%.*]] = or i8 [[X]], 127113; CHECK-NEXT: ret i8 [[OR]]114;115 %and = and i8 %x, 127116 %cmp = icmp ne i8 %and, 127117 call void @llvm.assume(i1 %cmp)118 %or = or i8 %x, 127119 ret i8 %or120}121 122define i32 @pow2_32_br(i32 %x) {123; CHECK-LABEL: @pow2_32_br(124; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4125; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0126; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE:%.*]], label [[TRUE:%.*]]127; CHECK: True:128; CHECK-NEXT: ret i32 [[X]]129; CHECK: False:130; CHECK-NEXT: ret i32 0131;132 %and = and i32 %x, 4133 %cmp = icmp eq i32 %and, 4134 br i1 %cmp, label %True, label %False135True:136 %or = or i32 %x, 4137 ret i32 %or138False:139 ret i32 0140}141 142define i32 @not_pow2_32_br(i32 %x) {143; CHECK-LABEL: @not_pow2_32_br(144; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 3145; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0146; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE:%.*]], label [[TRUE:%.*]]147; CHECK: True:148; CHECK-NEXT: [[OR:%.*]] = or i32 [[X]], 3149; CHECK-NEXT: ret i32 [[OR]]150; CHECK: False:151; CHECK-NEXT: ret i32 0152;153 %and = and i32 %x, 3154 %cmp = icmp ne i32 %and, 0155 br i1 %cmp, label %True, label %False156True:157 %or = or i32 %x, 3158 ret i32 %or159False:160 ret i32 0161}162 163define i64 @pow2_64_br(i64 %x) {164; CHECK-LABEL: @pow2_64_br(165; CHECK-NEXT: [[AND:%.*]] = and i64 [[X:%.*]], 1166; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i64 [[AND]], 0167; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE:%.*]], label [[TRUE:%.*]]168; CHECK: True:169; CHECK-NEXT: ret i64 1170; CHECK: False:171; CHECK-NEXT: ret i64 0172;173 %and = and i64 %x, 1174 %cmp = icmp ne i64 %and, 0175 br i1 %cmp, label %True, label %False176True:177 %and2 = and i64 %x, 1178 ret i64 %and2179False:180 ret i64 0181}182 183define i64 @not_pow2_64_br(i64 %x) {184; CHECK-LABEL: @not_pow2_64_br(185; CHECK-NEXT: [[AND:%.*]] = and i64 [[X:%.*]], 2147483647186; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i64 [[AND]], 0187; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE:%.*]], label [[TRUE:%.*]]188; CHECK: True:189; CHECK-NEXT: [[AND2:%.*]] = and i64 [[X]], 2147483647190; CHECK-NEXT: ret i64 [[AND2]]191; CHECK: False:192; CHECK-NEXT: ret i64 0193;194 %and = and i64 %x, 2147483647195 %cmp = icmp ne i64 %and, 0196 br i1 %cmp, label %True, label %False197True:198 %and2 = and i64 %x, 2147483647199 ret i64 %and2200False:201 ret i64 0202}203 204define i16 @pow2_16_br(i16 %x) {205; CHECK-LABEL: @pow2_16_br(206; CHECK-NEXT: [[AND:%.*]] = and i16 [[X:%.*]], 16384207; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i16 [[AND]], 0208; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE:%.*]], label [[TRUE:%.*]]209; CHECK: True:210; CHECK-NEXT: ret i16 [[X]]211; CHECK: False:212; CHECK-NEXT: ret i16 0213;214 %and = and i16 %x, 16384215 %cmp = icmp eq i16 %and, 16384216 br i1 %cmp, label %True, label %False217True:218 %or = or i16 %x, 16384219 ret i16 %or220False:221 ret i16 0222}223 224define i16 @not_pow2_16_br(i16 %x) {225; CHECK-LABEL: @not_pow2_16_br(226; CHECK-NEXT: [[AND:%.*]] = and i16 [[X:%.*]], 7227; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i16 [[AND]], 7228; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE:%.*]], label [[TRUE:%.*]]229; CHECK: True:230; CHECK-NEXT: [[OR:%.*]] = or i16 [[X]], 7231; CHECK-NEXT: ret i16 [[OR]]232; CHECK: False:233; CHECK-NEXT: ret i16 0234;235 %and = and i16 %x, 7236 %cmp = icmp ne i16 %and, 7237 br i1 %cmp, label %True, label %False238True:239 %or = or i16 %x, 7240 ret i16 %or241False:242 ret i16 0243}244 245define i8 @pow2_8_br(i8 %x) {246; CHECK-LABEL: @pow2_8_br(247; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp sgt i8 [[X:%.*]], -1248; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE:%.*]], label [[TRUE:%.*]]249; CHECK: True:250; CHECK-NEXT: ret i8 -128251; CHECK: False:252; CHECK-NEXT: ret i8 0253;254 %and = and i8 %x, 128255 %cmp = icmp ne i8 %and, 0256 br i1 %cmp, label %True, label %False257True:258 %and2 = and i8 %x, 128259 ret i8 %and2260False:261 ret i8 0262}263 264define i8 @not_pow2_8_br(i8 %x) {265; CHECK-LABEL: @not_pow2_8_br(266; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 127267; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i8 [[AND]], 127268; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE:%.*]], label [[TRUE:%.*]]269; CHECK: True:270; CHECK-NEXT: [[AND2:%.*]] = and i8 [[X]], 127271; CHECK-NEXT: ret i8 [[AND2]]272; CHECK: False:273; CHECK-NEXT: ret i8 0274;275 %and = and i8 %x, 127276 %cmp = icmp ne i8 %and, 127277 br i1 %cmp, label %True, label %False278True:279 %and2 = and i8 %x, 127280 ret i8 %and2281False:282 ret i8 0283}284 285define i32 @pow2_32_nonconst_assume(i32 %x, i32 %y) {286; CHECK-LABEL: @pow2_32_nonconst_assume(287; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[Y:%.*]])288; CHECK-NEXT: [[YP2:%.*]] = icmp eq i32 [[CTPOP]], 1289; CHECK-NEXT: call void @llvm.assume(i1 [[YP2]])290; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]]291; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0292; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])293; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], [[Y]]294; CHECK-NEXT: ret i32 [[AND2]]295;296 %ctpop = call i32 @llvm.ctpop.i32(i32 %y)297 %yp2 = icmp eq i32 %ctpop, 1298 call void @llvm.assume(i1 %yp2)299 300 %and = and i32 %x, %y301 %cmp = icmp ne i32 %and, 0302 call void @llvm.assume(i1 %cmp)303 %and2 = and i32 %x, %y304 ret i32 %and2305}306 307define i32 @pow2_32_gtnonconst_assume(i32 %x, i32 %y) {308; CHECK-LABEL: @pow2_32_gtnonconst_assume(309; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[Y:%.*]])310; CHECK-NEXT: [[YP2:%.*]] = icmp eq i32 [[CTPOP]], 1311; CHECK-NEXT: call void @llvm.assume(i1 [[YP2]])312; CHECK-NEXT: [[YGT:%.*]] = icmp ugt i32 [[Y]], [[X:%.*]]313; CHECK-NEXT: call void @llvm.assume(i1 [[YGT]])314; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[Y]]315; CHECK-NEXT: ret i32 [[AND]]316;317 %ctpop = call i32 @llvm.ctpop.i32(i32 %y)318 %yp2 = icmp eq i32 %ctpop, 1319 call void @llvm.assume(i1 %yp2)320 321 %ygt = icmp ugt i32 %y, %x322 call void @llvm.assume(i1 %ygt)323 324 %and = and i32 %x, %y325 ret i32 %and326}327 328define i32 @not_pow2_32_nonconst_assume(i32 %x, i32 %y) {329; CHECK-LABEL: @not_pow2_32_nonconst_assume(330; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[Y:%.*]])331; CHECK-NEXT: [[YP2:%.*]] = icmp ne i32 [[CTPOP]], 1332; CHECK-NEXT: call void @llvm.assume(i1 [[YP2]])333; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]]334; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0335; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])336; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], [[Y]]337; CHECK-NEXT: ret i32 [[AND2]]338;339 %ctpop = call i32 @llvm.ctpop.i32(i32 %y)340 %yp2 = icmp ne i32 %ctpop, 1341 call void @llvm.assume(i1 %yp2)342 343 %and = and i32 %x, %y344 %cmp = icmp ne i32 %and, 0345 call void @llvm.assume(i1 %cmp)346 %and2 = and i32 %x, %y347 ret i32 %and2348}349 350define i32 @pow2_or_zero_32_nonconst_assume(i32 %x, i32 %y) {351; CHECK-LABEL: @pow2_or_zero_32_nonconst_assume(352; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[Y:%.*]])353; CHECK-NEXT: [[YP2:%.*]] = icmp samesign ult i32 [[CTPOP]], 2354; CHECK-NEXT: call void @llvm.assume(i1 [[YP2]])355; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]]356; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0357; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])358; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], [[Y]]359; CHECK-NEXT: ret i32 [[AND2]]360;361 %ctpop = call i32 @llvm.ctpop.i32(i32 %y)362 %yp2 = icmp ule i32 %ctpop, 1363 call void @llvm.assume(i1 %yp2)364 365 %and = and i32 %x, %y366 %cmp = icmp ne i32 %and, 0367 call void @llvm.assume(i1 %cmp)368 %and2 = and i32 %x, %y369 ret i32 %and2370}371 372define i32 @pow2_32_nonconst_assume_br(i32 %x, i32 %y) {373; CHECK-LABEL: @pow2_32_nonconst_assume_br(374; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[Y:%.*]])375; CHECK-NEXT: [[YP2:%.*]] = icmp eq i32 [[CTPOP]], 1376; CHECK-NEXT: call void @llvm.assume(i1 [[YP2]])377; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]]378; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0379; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE:%.*]], label [[TRUE:%.*]]380; CHECK: True:381; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], [[Y]]382; CHECK-NEXT: ret i32 [[AND2]]383; CHECK: False:384; CHECK-NEXT: ret i32 0385;386 %ctpop = call i32 @llvm.ctpop.i32(i32 %y)387 %yp2 = icmp eq i32 %ctpop, 1388 call void @llvm.assume(i1 %yp2)389 %and = and i32 %x, %y390 %cmp = icmp ne i32 %and, 0391 br i1 %cmp, label %True, label %False392True:393 %and2 = and i32 %x, %y394 ret i32 %and2395False:396 ret i32 0397}398 399define i32 @not_pow2_32_nonconst_assume_br(i32 %x, i32 %y) {400; CHECK-LABEL: @not_pow2_32_nonconst_assume_br(401; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[Y:%.*]])402; CHECK-NEXT: [[YP2:%.*]] = icmp ne i32 [[CTPOP]], 1403; CHECK-NEXT: call void @llvm.assume(i1 [[YP2]])404; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]]405; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0406; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE:%.*]], label [[TRUE:%.*]]407; CHECK: True:408; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], [[Y]]409; CHECK-NEXT: ret i32 [[AND2]]410; CHECK: False:411; CHECK-NEXT: ret i32 0412;413 %ctpop = call i32 @llvm.ctpop.i32(i32 %y)414 %yp2 = icmp ne i32 %ctpop, 1415 call void @llvm.assume(i1 %yp2)416 %and = and i32 %x, %y417 %cmp = icmp ne i32 %and, 0418 br i1 %cmp, label %True, label %False419True:420 %and2 = and i32 %x, %y421 ret i32 %and2422False:423 ret i32 0424}425 426define i32 @pow2_or_zero_32_nonconst_assume_br(i32 %x, i32 %y) {427; CHECK-LABEL: @pow2_or_zero_32_nonconst_assume_br(428; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[Y:%.*]])429; CHECK-NEXT: [[YP2:%.*]] = icmp samesign ult i32 [[CTPOP]], 2430; CHECK-NEXT: call void @llvm.assume(i1 [[YP2]])431; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]]432; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0433; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE:%.*]], label [[TRUE:%.*]]434; CHECK: True:435; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], [[Y]]436; CHECK-NEXT: ret i32 [[AND2]]437; CHECK: False:438; CHECK-NEXT: ret i32 0439;440 %ctpop = call i32 @llvm.ctpop.i32(i32 %y)441 %yp2 = icmp ule i32 %ctpop, 1442 call void @llvm.assume(i1 %yp2)443 %and = and i32 %x, %y444 %cmp = icmp ne i32 %and, 0445 br i1 %cmp, label %True, label %False446True:447 %and2 = and i32 %x, %y448 ret i32 %and2449False:450 ret i32 0451}452 453define i32 @pow2_32_nonconst_br1_br(i32 %x, i32 %y) {454; CHECK-LABEL: @pow2_32_nonconst_br1_br(455; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[Y:%.*]])456; CHECK-NEXT: [[YP2:%.*]] = icmp eq i32 [[CTPOP]], 1457; CHECK-NEXT: br i1 [[YP2]], label [[CONT:%.*]], label [[FALSE:%.*]]458; CHECK: Cont:459; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]]460; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0461; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE]], label [[TRUE:%.*]]462; CHECK: True:463; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], [[Y]]464; CHECK-NEXT: ret i32 [[AND2]]465; CHECK: False:466; CHECK-NEXT: ret i32 0467;468 %ctpop = call i32 @llvm.ctpop.i32(i32 %y)469 %yp2 = icmp eq i32 %ctpop, 1470 br i1 %yp2, label %Cont, label %False471Cont:472 %and = and i32 %x, %y473 %cmp = icmp ne i32 %and, 0474 br i1 %cmp, label %True, label %False475True:476 %and2 = and i32 %x, %y477 ret i32 %and2478False:479 ret i32 0480}481 482define i32 @not_pow2_32_nonconst_br1_br(i32 %x, i32 %y) {483; CHECK-LABEL: @not_pow2_32_nonconst_br1_br(484; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[Y:%.*]])485; CHECK-NEXT: [[YP2_NOT:%.*]] = icmp eq i32 [[CTPOP]], 1486; CHECK-NEXT: br i1 [[YP2_NOT]], label [[FALSE:%.*]], label [[CONT:%.*]]487; CHECK: Cont:488; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]]489; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0490; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE]], label [[TRUE:%.*]]491; CHECK: True:492; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], [[Y]]493; CHECK-NEXT: ret i32 [[AND2]]494; CHECK: False:495; CHECK-NEXT: ret i32 0496;497 %ctpop = call i32 @llvm.ctpop.i32(i32 %y)498 %yp2 = icmp ne i32 %ctpop, 1499 br i1 %yp2, label %Cont, label %False500Cont:501 %and = and i32 %x, %y502 %cmp = icmp ne i32 %and, 0503 br i1 %cmp, label %True, label %False504True:505 %and2 = and i32 %x, %y506 ret i32 %and2507False:508 ret i32 0509}510 511define i32 @maybe_pow2_32_noncont(i32 %x, i32 %y) {512; CHECK-LABEL: @maybe_pow2_32_noncont(513; CHECK-NEXT: [[YGT8:%.*]] = icmp ugt i32 [[Y:%.*]], 8514; CHECK-NEXT: br i1 [[YGT8]], label [[CONT1:%.*]], label [[CONT2:%.*]]515; CHECK: Cont1:516; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 1, 33) i32 @llvm.ctpop.i32(i32 [[Y]])517; CHECK-NEXT: [[YP2:%.*]] = icmp eq i32 [[CTPOP]], 1518; CHECK-NEXT: call void @llvm.assume(i1 [[YP2]])519; CHECK-NEXT: br i1 true, label [[CONT2]], label [[FALSE:%.*]]520; CHECK: Cont2:521; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]]522; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0523; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FALSE]], label [[TRUE:%.*]]524; CHECK: True:525; CHECK-NEXT: [[AND2:%.*]] = and i32 [[X]], [[Y]]526; CHECK-NEXT: ret i32 [[AND2]]527; CHECK: False:528; CHECK-NEXT: ret i32 0529;530 %ygt8 = icmp ugt i32 %y, 8531 br i1 %ygt8, label %Cont1, label %Cont2532Cont1:533 %ctpop = call i32 @llvm.ctpop.i32(i32 %y)534 %yp2 = icmp eq i32 %ctpop, 1535 call void @llvm.assume(i1 %yp2)536 br i1 true, label %Cont2, label %False537Cont2:538 %and = and i32 %x, %y539 %cmp = icmp ne i32 %and, 0540 br i1 %cmp, label %True, label %False541True:542 %and2 = and i32 %x, %y543 ret i32 %and2544False:545 ret i32 0546}547