brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.5 KiB · b19909a Raw
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