1130 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-inst-comments2; RUN: opt -passes=print-predicateinfo -disable-output < %s 2>&1 | FileCheck %s3 4declare void @foo(i1)5declare void @bar(i32)6declare void @llvm.assume(i1)7 8define void @test_or(i32 %x, i32 %y) {9; CHECK-LABEL: @test_or(10; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 011; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 012; CHECK-NEXT: [[Z:%.*]] = or i1 [[XZ]], [[YZ]]13; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[Z]] = or i1 [[XZ]], [[YZ]] Edge: [label [[TMP0:%.*]],label [[NEITHER:%.*]]], RenamedOp: [[Z]] }14; CHECK-NEXT: [[Z_0:%.*]] = bitcast i1 [[Z]] to i115; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[NEITHER]]], RenamedOp: [[XZ]] }16; CHECK-NEXT: [[XZ_0:%.*]] = bitcast i1 [[XZ]] to i117; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[NEITHER]]], RenamedOp: [[X]] }18; CHECK-NEXT: [[X_0:%.*]] = bitcast i32 [[X]] to i3219; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[NEITHER]]], RenamedOp: [[YZ]] }20; CHECK-NEXT: [[YZ_0:%.*]] = bitcast i1 [[YZ]] to i121; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[NEITHER]]], RenamedOp: [[Y]] }22; CHECK-NEXT: [[Y_0:%.*]] = bitcast i32 [[Y]] to i3223; CHECK-NEXT: br i1 [[Z]], label [[ONEOF:%.*]], label [[NEITHER]]24; CHECK: oneof:25; CHECK-NEXT: call void @foo(i1 [[XZ]])26; CHECK-NEXT: call void @foo(i1 [[YZ]])27; CHECK-NEXT: call void @bar(i32 [[X]])28; CHECK-NEXT: call void @bar(i32 [[Y]])29; CHECK-NEXT: ret void30; CHECK: neither:31; CHECK-NEXT: call void @foo(i1 [[XZ_0]])32; CHECK-NEXT: call void @foo(i1 [[YZ_0]])33; CHECK-NEXT: call void @bar(i32 [[X_0]])34; CHECK-NEXT: call void @bar(i32 [[Y_0]])35; CHECK-NEXT: call void @foo(i1 [[Z_0]])36; CHECK-NEXT: ret void37;38 %xz = icmp eq i32 %x, 039 %yz = icmp eq i32 %y, 040 %z = or i1 %xz, %yz41 br i1 %z, label %oneof, label %neither42oneof:43;; Should not insert on the true edge for or44 call void @foo(i1 %xz)45 call void @foo(i1 %yz)46 call void @bar(i32 %x)47 call void @bar(i32 %y)48 ret void49neither:50 call void @foo(i1 %xz)51 call void @foo(i1 %yz)52 call void @bar(i32 %x)53 call void @bar(i32 %y)54 call void @foo(i1 %z)55 ret void56}57 58define void @test_or_logical(i32 %x, i32 %y) {59; CHECK-LABEL: @test_or_logical(60; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 061; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 062; CHECK-NEXT: [[Z:%.*]] = select i1 [[XZ]], i1 true, i1 [[YZ]]63; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[Z]] = select i1 [[XZ]], i1 true, i1 [[YZ]] Edge: [label [[TMP0:%.*]],label [[NEITHER:%.*]]], RenamedOp: [[Z]] }64; CHECK-NEXT: [[Z_0:%.*]] = bitcast i1 [[Z]] to i165; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[NEITHER]]], RenamedOp: [[XZ]] }66; CHECK-NEXT: [[XZ_0:%.*]] = bitcast i1 [[XZ]] to i167; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[NEITHER]]], RenamedOp: [[X]] }68; CHECK-NEXT: [[X_0:%.*]] = bitcast i32 [[X]] to i3269; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[NEITHER]]], RenamedOp: [[YZ]] }70; CHECK-NEXT: [[YZ_0:%.*]] = bitcast i1 [[YZ]] to i171; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[NEITHER]]], RenamedOp: [[Y]] }72; CHECK-NEXT: [[Y_0:%.*]] = bitcast i32 [[Y]] to i3273; CHECK-NEXT: br i1 [[Z]], label [[ONEOF:%.*]], label [[NEITHER]]74; CHECK: oneof:75; CHECK-NEXT: call void @foo(i1 [[XZ]])76; CHECK-NEXT: call void @foo(i1 [[YZ]])77; CHECK-NEXT: call void @bar(i32 [[X]])78; CHECK-NEXT: call void @bar(i32 [[Y]])79; CHECK-NEXT: ret void80; CHECK: neither:81; CHECK-NEXT: call void @foo(i1 [[XZ_0]])82; CHECK-NEXT: call void @foo(i1 [[YZ_0]])83; CHECK-NEXT: call void @bar(i32 [[X_0]])84; CHECK-NEXT: call void @bar(i32 [[Y_0]])85; CHECK-NEXT: call void @foo(i1 [[Z_0]])86; CHECK-NEXT: ret void87;88 %xz = icmp eq i32 %x, 089 %yz = icmp eq i32 %y, 090 %z = select i1 %xz, i1 true, i1 %yz91 br i1 %z, label %oneof, label %neither92oneof:93;; Should not insert on the true edge for or94 call void @foo(i1 %xz)95 call void @foo(i1 %yz)96 call void @bar(i32 %x)97 call void @bar(i32 %y)98 ret void99neither:100 call void @foo(i1 %xz)101 call void @foo(i1 %yz)102 call void @bar(i32 %x)103 call void @bar(i32 %y)104 call void @foo(i1 %z)105 ret void106}107 108define void @test_and(i32 %x, i32 %y) {109; CHECK-LABEL: @test_and(110; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0111; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0112; CHECK-NEXT: [[Z:%.*]] = and i1 [[XZ]], [[YZ]]113; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[Z]] = and i1 [[XZ]], [[YZ]] Edge: [label [[TMP0:%.*]],label [[NOPE:%.*]]], RenamedOp: [[Z]] }114; CHECK-NEXT: [[Z_0:%.*]] = bitcast i1 [[Z]] to i1115; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH:%.*]]], RenamedOp: [[XZ]] }116; CHECK-NEXT: [[XZ_0:%.*]] = bitcast i1 [[XZ]] to i1117; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[X]] }118; CHECK-NEXT: [[X_0:%.*]] = bitcast i32 [[X]] to i32119; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[YZ]] }120; CHECK-NEXT: [[YZ_0:%.*]] = bitcast i1 [[YZ]] to i1121; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[Y]] }122; CHECK-NEXT: [[Y_0:%.*]] = bitcast i32 [[Y]] to i32123; CHECK-NEXT: br i1 [[Z]], label [[BOTH]], label [[NOPE]]124; CHECK: both:125; CHECK-NEXT: call void @foo(i1 [[XZ_0]])126; CHECK-NEXT: call void @foo(i1 [[YZ_0]])127; CHECK-NEXT: call void @bar(i32 [[X_0]])128; CHECK-NEXT: call void @bar(i32 [[Y_0]])129; CHECK-NEXT: ret void130; CHECK: nope:131; CHECK-NEXT: call void @foo(i1 [[XZ]])132; CHECK-NEXT: call void @foo(i1 [[YZ]])133; CHECK-NEXT: call void @bar(i32 [[X]])134; CHECK-NEXT: call void @bar(i32 [[Y]])135; CHECK-NEXT: call void @foo(i1 [[Z_0]])136; CHECK-NEXT: ret void137;138 %xz = icmp eq i32 %x, 0139 %yz = icmp eq i32 %y, 0140 %z = and i1 %xz, %yz141 br i1 %z, label %both, label %nope142both:143 call void @foo(i1 %xz)144 call void @foo(i1 %yz)145 call void @bar(i32 %x)146 call void @bar(i32 %y)147 ret void148nope:149;; Should not insert on the false edge for and150 call void @foo(i1 %xz)151 call void @foo(i1 %yz)152 call void @bar(i32 %x)153 call void @bar(i32 %y)154 call void @foo(i1 %z)155 ret void156}157 158define void @test_and_logical(i32 %x, i32 %y) {159; CHECK-LABEL: @test_and_logical(160; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0161; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0162; CHECK-NEXT: [[Z:%.*]] = select i1 [[XZ]], i1 [[YZ]], i1 false163; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[Z]] = select i1 [[XZ]], i1 [[YZ]], i1 false Edge: [label [[TMP0:%.*]],label [[NOPE:%.*]]], RenamedOp: [[Z]] }164; CHECK-NEXT: [[Z_0:%.*]] = bitcast i1 [[Z]] to i1165; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH:%.*]]], RenamedOp: [[XZ]] }166; CHECK-NEXT: [[XZ_0:%.*]] = bitcast i1 [[XZ]] to i1167; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[X]] }168; CHECK-NEXT: [[X_0:%.*]] = bitcast i32 [[X]] to i32169; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[YZ]] }170; CHECK-NEXT: [[YZ_0:%.*]] = bitcast i1 [[YZ]] to i1171; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[Y]] }172; CHECK-NEXT: [[Y_0:%.*]] = bitcast i32 [[Y]] to i32173; CHECK-NEXT: br i1 [[Z]], label [[BOTH]], label [[NOPE]]174; CHECK: both:175; CHECK-NEXT: call void @foo(i1 [[XZ_0]])176; CHECK-NEXT: call void @foo(i1 [[YZ_0]])177; CHECK-NEXT: call void @bar(i32 [[X_0]])178; CHECK-NEXT: call void @bar(i32 [[Y_0]])179; CHECK-NEXT: ret void180; CHECK: nope:181; CHECK-NEXT: call void @foo(i1 [[XZ]])182; CHECK-NEXT: call void @foo(i1 [[YZ]])183; CHECK-NEXT: call void @bar(i32 [[X]])184; CHECK-NEXT: call void @bar(i32 [[Y]])185; CHECK-NEXT: call void @foo(i1 [[Z_0]])186; CHECK-NEXT: ret void187;188 %xz = icmp eq i32 %x, 0189 %yz = icmp eq i32 %y, 0190 %z = select i1 %xz, i1 %yz, i1 false191 br i1 %z, label %both, label %nope192both:193 call void @foo(i1 %xz)194 call void @foo(i1 %yz)195 call void @bar(i32 %x)196 call void @bar(i32 %y)197 ret void198nope:199;; Should not insert on the false edge for and200 call void @foo(i1 %xz)201 call void @foo(i1 %yz)202 call void @bar(i32 %x)203 call void @bar(i32 %y)204 call void @foo(i1 %z)205 ret void206}207 208define void @testandsame(i32 %x, i32 %y) {209; CHECK-LABEL: @testandsame(210; CHECK-NEXT: [[XGT:%.*]] = icmp sgt i32 [[X:%.*]], 0211; CHECK-NEXT: [[XLT:%.*]] = icmp slt i32 [[X]], 100212; CHECK-NEXT: [[Z:%.*]] = and i1 [[XGT]], [[XLT]]213; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[Z]] = and i1 [[XGT]], [[XLT]] Edge: [label [[TMP0:%.*]],label [[NOPE:%.*]]], RenamedOp: [[Z]] }214; CHECK-NEXT: [[Z_0:%.*]] = bitcast i1 [[Z]] to i1215; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XGT]] = icmp sgt i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH:%.*]]], RenamedOp: [[XGT]] }216; CHECK-NEXT: [[XGT_0:%.*]] = bitcast i1 [[XGT]] to i1217; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XGT]] = icmp sgt i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[X]] }218; CHECK-NEXT: [[X_0:%.*]] = bitcast i32 [[X]] to i32219; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XLT]] = icmp slt i32 [[X]], 100 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[X]] }220; CHECK-NEXT: [[X_0_1:%.*]] = bitcast i32 [[X_0]] to i32221; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XLT]] = icmp slt i32 [[X]], 100 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[XLT]] }222; CHECK-NEXT: [[XLT_0:%.*]] = bitcast i1 [[XLT]] to i1223; CHECK-NEXT: br i1 [[Z]], label [[BOTH]], label [[NOPE]]224; CHECK: both:225; CHECK-NEXT: call void @foo(i1 [[XGT_0]])226; CHECK-NEXT: call void @foo(i1 [[XLT_0]])227; CHECK-NEXT: call void @bar(i32 [[X_0_1]])228; CHECK-NEXT: ret void229; CHECK: nope:230; CHECK-NEXT: call void @foo(i1 [[XGT]])231; CHECK-NEXT: call void @foo(i1 [[XLT]])232; CHECK-NEXT: call void @foo(i1 [[Z_0]])233; CHECK-NEXT: ret void234;235 %xgt = icmp sgt i32 %x, 0236 %xlt = icmp slt i32 %x, 100237 %z = and i1 %xgt, %xlt238 br i1 %z, label %both, label %nope239both:240 call void @foo(i1 %xgt)241 call void @foo(i1 %xlt)242 call void @bar(i32 %x)243 ret void244nope:245 call void @foo(i1 %xgt)246 call void @foo(i1 %xlt)247 call void @foo(i1 %z)248 ret void249}250 251define void @testandassume(i32 %x, i32 %y) {252; CHECK-LABEL: @testandassume(253; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0254; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0255; CHECK-NEXT: [[Z:%.*]] = and i1 [[XZ]], [[YZ]]256; CHECK-NEXT: call void @llvm.assume(i1 [[Z]])257; CHECK-NEXT: ; assume predicate info { Comparison: [[YZ]] = icmp eq i32 [[Y]], 0, RenamedOp: [[Y]] }258; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32 [[Y]] to i32259; CHECK-NEXT: ; assume predicate info { Comparison: [[YZ]] = icmp eq i32 [[Y]], 0, RenamedOp: [[YZ]] }260; CHECK-NEXT: [[TMP2:%.*]] = bitcast i1 [[YZ]] to i1261; CHECK-NEXT: ; assume predicate info { Comparison: [[XZ]] = icmp eq i32 [[X]], 0, RenamedOp: [[X]] }262; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32 [[X]] to i32263; CHECK-NEXT: ; assume predicate info { Comparison: [[XZ]] = icmp eq i32 [[X]], 0, RenamedOp: [[XZ]] }264; CHECK-NEXT: [[TMP4:%.*]] = bitcast i1 [[XZ]] to i1265; CHECK-NEXT: ; assume predicate info { Comparison: [[Z]] = and i1 [[XZ]], [[YZ]], RenamedOp: [[Z]] }266; CHECK-NEXT: [[TMP5:%.*]] = bitcast i1 [[Z]] to i1267; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[Z]] = and i1 [[XZ]], [[YZ]] Edge: [label [[TMP0:%.*]],label [[NOPE:%.*]]], RenamedOp: [[TMP5]] }268; CHECK-NEXT: [[DOT0:%.*]] = bitcast i1 [[TMP5]] to i1269; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH:%.*]]], RenamedOp: [[XZ]] }270; CHECK-NEXT: [[DOT01:%.*]] = bitcast i1 [[TMP4]] to i1271; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[X]] }272; CHECK-NEXT: [[DOT02:%.*]] = bitcast i32 [[TMP3]] to i32273; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[YZ]] }274; CHECK-NEXT: [[DOT03:%.*]] = bitcast i1 [[TMP2]] to i1275; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[Y]] }276; CHECK-NEXT: [[DOT04:%.*]] = bitcast i32 [[TMP1]] to i32277; CHECK-NEXT: br i1 [[TMP5]], label [[BOTH]], label [[NOPE]]278; CHECK: both:279; CHECK-NEXT: call void @foo(i1 [[DOT01]])280; CHECK-NEXT: call void @foo(i1 [[DOT03]])281; CHECK-NEXT: call void @bar(i32 [[DOT02]])282; CHECK-NEXT: call void @bar(i32 [[DOT04]])283; CHECK-NEXT: ret void284; CHECK: nope:285; CHECK-NEXT: call void @foo(i1 [[DOT0]])286; CHECK-NEXT: ret void287;288 %xz = icmp eq i32 %x, 0289 %yz = icmp eq i32 %y, 0290 %z = and i1 %xz, %yz291 call void @llvm.assume(i1 %z)292 br i1 %z, label %both, label %nope293both:294 call void @foo(i1 %xz)295 call void @foo(i1 %yz)296 call void @bar(i32 %x)297 call void @bar(i32 %y)298 ret void299nope:300 call void @foo(i1 %z)301 ret void302}303 304;; Unlike and/or for branches, assume is *always* true, so we only match and for it305define void @testorassume(i32 %x, i32 %y) {306;307; CHECK-LABEL: @testorassume(308; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0309; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0310; CHECK-NEXT: [[Z:%.*]] = or i1 [[XZ]], [[YZ]]311; CHECK-NEXT: call void @llvm.assume(i1 [[Z]])312; CHECK-NEXT: ; assume predicate info { Comparison: [[Z]] = or i1 [[XZ]], [[YZ]], RenamedOp: [[Z]] }313; CHECK-NEXT: [[TMP1:%.*]] = bitcast i1 [[Z]] to i1314; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[Z]] = or i1 [[XZ]], [[YZ]] Edge: [label [[TMP0:%.*]],label [[NOPE:%.*]]], RenamedOp: [[TMP1]] }315; CHECK-NEXT: [[DOT0:%.*]] = bitcast i1 [[TMP1]] to i1316; CHECK-NEXT: br i1 [[TMP1]], label [[BOTH:%.*]], label [[NOPE]]317; CHECK: both:318; CHECK-NEXT: call void @foo(i1 [[XZ]])319; CHECK-NEXT: call void @foo(i1 [[YZ]])320; CHECK-NEXT: call void @bar(i32 [[X]])321; CHECK-NEXT: call void @bar(i32 [[Y]])322; CHECK-NEXT: ret void323; CHECK: nope:324; CHECK-NEXT: call void @foo(i1 [[DOT0]])325; CHECK-NEXT: ret void326;327 %xz = icmp eq i32 %x, 0328 %yz = icmp eq i32 %y, 0329 %z = or i1 %xz, %yz330 call void @llvm.assume(i1 %z)331 br i1 %z, label %both, label %nope332both:333 call void @foo(i1 %xz)334 call void @foo(i1 %yz)335 call void @bar(i32 %x)336 call void @bar(i32 %y)337 ret void338nope:339 call void @foo(i1 %z)340 ret void341}342 343define void @test_and_one_unknown_cond(i32 %x, i1 %c1) {344; CHECK-LABEL: @test_and_one_unknown_cond(345; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[X:%.*]], 0346; CHECK-NEXT: [[A:%.*]] = and i1 [[C1:%.*]], [[C2]]347; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A]] = and i1 [[C1]], [[C2]] Edge: [label [[TMP0:%.*]],label [[BOTH:%.*]]], RenamedOp: [[A]] }348; CHECK-NEXT: [[A_0:%.*]] = bitcast i1 [[A]] to i1349; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A]] = and i1 [[C1]], [[C2]] Edge: [label [[TMP0]],label [[NOPE:%.*]]], RenamedOp: [[A]] }350; CHECK-NEXT: [[A_1:%.*]] = bitcast i1 [[A]] to i1351; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison:i1 [[C1]] Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[C1]] }352; CHECK-NEXT: [[C1_0:%.*]] = bitcast i1 [[C1]] to i1353; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[C2]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[C2]] }354; CHECK-NEXT: [[C2_0:%.*]] = bitcast i1 [[C2]] to i1355; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[C2]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH]]], RenamedOp: [[X]] }356; CHECK-NEXT: [[X_0:%.*]] = bitcast i32 [[X]] to i32357; CHECK-NEXT: br i1 [[A]], label [[BOTH]], label [[NOPE]]358; CHECK: both:359; CHECK-NEXT: call void @bar(i32 [[X_0]])360; CHECK-NEXT: call void @foo(i1 [[C1_0]])361; CHECK-NEXT: call void @foo(i1 [[C2_0]])362; CHECK-NEXT: call void @foo(i1 [[A_0]])363; CHECK-NEXT: ret void364; CHECK: nope:365; CHECK-NEXT: call void @bar(i32 [[X]])366; CHECK-NEXT: call void @foo(i1 [[C1]])367; CHECK-NEXT: call void @foo(i1 [[C2]])368; CHECK-NEXT: call void @foo(i1 [[A_1]])369; CHECK-NEXT: ret void370;371 %c2 = icmp eq i32 %x, 0372 %a = and i1 %c1, %c2373 br i1 %a, label %both, label %nope374 375both:376 call void @bar(i32 %x)377 call void @foo(i1 %c1)378 call void @foo(i1 %c2)379 call void @foo(i1 %a)380 ret void381 382nope:383 call void @bar(i32 %x)384 call void @foo(i1 %c1)385 call void @foo(i1 %c2)386 call void @foo(i1 %a)387 ret void388}389 390define void @test_or_one_unknown_cond(i32 %x, i1 %c1) {391; CHECK-LABEL: @test_or_one_unknown_cond(392; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[X:%.*]], 0393; CHECK-NEXT: [[A:%.*]] = or i1 [[C1:%.*]], [[C2]]394; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A]] = or i1 [[C1]], [[C2]] Edge: [label [[TMP0:%.*]],label [[NOPE:%.*]]], RenamedOp: [[A]] }395; CHECK-NEXT: [[A_0:%.*]] = bitcast i1 [[A]] to i1396; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A]] = or i1 [[C1]], [[C2]] Edge: [label [[TMP0]],label [[BOTH_INVERTED:%.*]]], RenamedOp: [[A]] }397; CHECK-NEXT: [[A_1:%.*]] = bitcast i1 [[A]] to i1398; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison:i1 [[C1]] Edge: [label [[TMP0]],label [[BOTH_INVERTED]]], RenamedOp: [[C1]] }399; CHECK-NEXT: [[C1_0:%.*]] = bitcast i1 [[C1]] to i1400; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[C2]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH_INVERTED]]], RenamedOp: [[C2]] }401; CHECK-NEXT: [[C2_0:%.*]] = bitcast i1 [[C2]] to i1402; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[C2]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH_INVERTED]]], RenamedOp: [[X]] }403; CHECK-NEXT: [[X_0:%.*]] = bitcast i32 [[X]] to i32404; CHECK-NEXT: br i1 [[A]], label [[NOPE]], label [[BOTH_INVERTED]]405; CHECK: both_inverted:406; CHECK-NEXT: call void @bar(i32 [[X_0]])407; CHECK-NEXT: call void @foo(i1 [[C1_0]])408; CHECK-NEXT: call void @foo(i1 [[C2_0]])409; CHECK-NEXT: call void @foo(i1 [[A_1]])410; CHECK-NEXT: ret void411; CHECK: nope:412; CHECK-NEXT: call void @bar(i32 [[X]])413; CHECK-NEXT: call void @foo(i1 [[C1]])414; CHECK-NEXT: call void @foo(i1 [[C2]])415; CHECK-NEXT: call void @foo(i1 [[A_0]])416; CHECK-NEXT: ret void417;418 %c2 = icmp eq i32 %x, 0419 %a = or i1 %c1, %c2420 br i1 %a, label %nope, label %both_inverted421 422both_inverted:423 call void @bar(i32 %x)424 call void @foo(i1 %c1)425 call void @foo(i1 %c2)426 call void @foo(i1 %a)427 ret void428 429nope:430 call void @bar(i32 %x)431 call void @foo(i1 %c1)432 call void @foo(i1 %c2)433 call void @foo(i1 %a)434 ret void435}436 437define void @test_and_chain(i1 %a, i1 %b, i1 %c) {438; CHECK-LABEL: @test_and_chain(439; CHECK-NEXT: [[AND1:%.*]] = and i1 [[A:%.*]], [[B:%.*]]440; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[C:%.*]]441; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[AND2]] = and i1 [[AND1]], [[C]] Edge: [label [[TMP0:%.*]],label [[IF:%.*]]], RenamedOp: [[AND2]] }442; CHECK-NEXT: [[AND2_0:%.*]] = bitcast i1 [[AND2]] to i1443; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[AND2]] = and i1 [[AND1]], [[C]] Edge: [label [[TMP0]],label [[ELSE:%.*]]], RenamedOp: [[AND2]] }444; CHECK-NEXT: [[AND2_1:%.*]] = bitcast i1 [[AND2]] to i1445; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[AND1]] = and i1 [[A]], [[B]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[AND1]] }446; CHECK-NEXT: [[AND1_0:%.*]] = bitcast i1 [[AND1]] to i1447; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison:i1 [[A]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A]] }448; CHECK-NEXT: [[A_0:%.*]] = bitcast i1 [[A]] to i1449; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison:i1 [[B]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[B]] }450; CHECK-NEXT: [[B_0:%.*]] = bitcast i1 [[B]] to i1451; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison:i1 [[C]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[C]] }452; CHECK-NEXT: [[C_0:%.*]] = bitcast i1 [[C]] to i1453; CHECK-NEXT: br i1 [[AND2]], label [[IF]], label [[ELSE]]454; CHECK: if:455; CHECK-NEXT: call void @foo(i1 [[A_0]])456; CHECK-NEXT: call void @foo(i1 [[B_0]])457; CHECK-NEXT: call void @foo(i1 [[C_0]])458; CHECK-NEXT: call void @foo(i1 [[AND1_0]])459; CHECK-NEXT: call void @foo(i1 [[AND2_0]])460; CHECK-NEXT: ret void461; CHECK: else:462; CHECK-NEXT: call void @foo(i1 [[A]])463; CHECK-NEXT: call void @foo(i1 [[B]])464; CHECK-NEXT: call void @foo(i1 [[C]])465; CHECK-NEXT: call void @foo(i1 [[AND1]])466; CHECK-NEXT: call void @foo(i1 [[AND2_1]])467; CHECK-NEXT: ret void468;469 %and1 = and i1 %a, %b470 %and2 = and i1 %and1, %c471 br i1 %and2, label %if, label %else472 473if:474 call void @foo(i1 %a)475 call void @foo(i1 %b)476 call void @foo(i1 %c)477 call void @foo(i1 %and1)478 call void @foo(i1 %and2)479 ret void480 481else:482 call void @foo(i1 %a)483 call void @foo(i1 %b)484 call void @foo(i1 %c)485 call void @foo(i1 %and1)486 call void @foo(i1 %and2)487 ret void488}489 490define void @test_or_chain(i1 %a, i1 %b, i1 %c) {491; CHECK-LABEL: @test_or_chain(492; CHECK-NEXT: [[OR1:%.*]] = or i1 [[A:%.*]], [[B:%.*]]493; CHECK-NEXT: [[OR2:%.*]] = or i1 [[OR1]], [[C:%.*]]494; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[OR2]] = or i1 [[OR1]], [[C]] Edge: [label [[TMP0:%.*]],label [[IF:%.*]]], RenamedOp: [[OR2]] }495; CHECK-NEXT: [[OR2_0:%.*]] = bitcast i1 [[OR2]] to i1496; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[OR2]] = or i1 [[OR1]], [[C]] Edge: [label [[TMP0]],label [[ELSE:%.*]]], RenamedOp: [[OR2]] }497; CHECK-NEXT: [[OR2_1:%.*]] = bitcast i1 [[OR2]] to i1498; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[OR1]] = or i1 [[A]], [[B]] Edge: [label [[TMP0]],label [[ELSE]]], RenamedOp: [[OR1]] }499; CHECK-NEXT: [[OR1_0:%.*]] = bitcast i1 [[OR1]] to i1500; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison:i1 [[A]] Edge: [label [[TMP0]],label [[ELSE]]], RenamedOp: [[A]] }501; CHECK-NEXT: [[A_0:%.*]] = bitcast i1 [[A]] to i1502; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison:i1 [[B]] Edge: [label [[TMP0]],label [[ELSE]]], RenamedOp: [[B]] }503; CHECK-NEXT: [[B_0:%.*]] = bitcast i1 [[B]] to i1504; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison:i1 [[C]] Edge: [label [[TMP0]],label [[ELSE]]], RenamedOp: [[C]] }505; CHECK-NEXT: [[C_0:%.*]] = bitcast i1 [[C]] to i1506; CHECK-NEXT: br i1 [[OR2]], label [[IF]], label [[ELSE]]507; CHECK: if:508; CHECK-NEXT: call void @foo(i1 [[A]])509; CHECK-NEXT: call void @foo(i1 [[B]])510; CHECK-NEXT: call void @foo(i1 [[C]])511; CHECK-NEXT: call void @foo(i1 [[OR1]])512; CHECK-NEXT: call void @foo(i1 [[OR2_0]])513; CHECK-NEXT: ret void514; CHECK: else:515; CHECK-NEXT: call void @foo(i1 [[A_0]])516; CHECK-NEXT: call void @foo(i1 [[B_0]])517; CHECK-NEXT: call void @foo(i1 [[C_0]])518; CHECK-NEXT: call void @foo(i1 [[OR1_0]])519; CHECK-NEXT: call void @foo(i1 [[OR2_1]])520; CHECK-NEXT: ret void521;522 %or1 = or i1 %a, %b523 %or2 = or i1 %or1, %c524 br i1 %or2, label %if, label %else525 526if:527 call void @foo(i1 %a)528 call void @foo(i1 %b)529 call void @foo(i1 %c)530 call void @foo(i1 %or1)531 call void @foo(i1 %or2)532 ret void533 534else:535 call void @foo(i1 %a)536 call void @foo(i1 %b)537 call void @foo(i1 %c)538 call void @foo(i1 %or1)539 call void @foo(i1 %or2)540 ret void541}542 543define void @test_and_or_mixed(i1 %a, i1 %b, i1 %c) {544; CHECK-LABEL: @test_and_or_mixed(545; CHECK-NEXT: [[OR:%.*]] = or i1 [[A:%.*]], [[B:%.*]]546; CHECK-NEXT: [[AND:%.*]] = and i1 [[OR]], [[C:%.*]]547; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[AND]] = and i1 [[OR]], [[C]] Edge: [label [[TMP0:%.*]],label [[IF:%.*]]], RenamedOp: [[AND]] }548; CHECK-NEXT: [[AND_0:%.*]] = bitcast i1 [[AND]] to i1549; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[AND]] = and i1 [[OR]], [[C]] Edge: [label [[TMP0]],label [[ELSE:%.*]]], RenamedOp: [[AND]] }550; CHECK-NEXT: [[AND_1:%.*]] = bitcast i1 [[AND]] to i1551; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[OR]] = or i1 [[A]], [[B]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[OR]] }552; CHECK-NEXT: [[OR_0:%.*]] = bitcast i1 [[OR]] to i1553; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison:i1 [[C]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[C]] }554; CHECK-NEXT: [[C_0:%.*]] = bitcast i1 [[C]] to i1555; CHECK-NEXT: br i1 [[AND]], label [[IF]], label [[ELSE]]556; CHECK: if:557; CHECK-NEXT: call void @foo(i1 [[A]])558; CHECK-NEXT: call void @foo(i1 [[B]])559; CHECK-NEXT: call void @foo(i1 [[C_0]])560; CHECK-NEXT: call void @foo(i1 [[OR_0]])561; CHECK-NEXT: call void @foo(i1 [[AND_0]])562; CHECK-NEXT: ret void563; CHECK: else:564; CHECK-NEXT: call void @foo(i1 [[A]])565; CHECK-NEXT: call void @foo(i1 [[B]])566; CHECK-NEXT: call void @foo(i1 [[C]])567; CHECK-NEXT: call void @foo(i1 [[OR]])568; CHECK-NEXT: call void @foo(i1 [[AND_1]])569; CHECK-NEXT: ret void570;571 %or = or i1 %a, %b572 %and = and i1 %or, %c573 br i1 %and, label %if, label %else574 575if:576 call void @foo(i1 %a)577 call void @foo(i1 %b)578 call void @foo(i1 %c)579 call void @foo(i1 %or)580 call void @foo(i1 %and)581 ret void582 583else:584 call void @foo(i1 %a)585 call void @foo(i1 %b)586 call void @foo(i1 %c)587 call void @foo(i1 %or)588 call void @foo(i1 %and)589 ret void590}591 592define void @test_deep_and_chain(i1 %a1) {593; CHECK-LABEL: @test_deep_and_chain(594; CHECK-NEXT: [[A2:%.*]] = and i1 [[A1:%.*]], true595; CHECK-NEXT: [[A3:%.*]] = and i1 [[A2]], true596; CHECK-NEXT: [[A4:%.*]] = and i1 [[A3]], true597; CHECK-NEXT: [[A5:%.*]] = and i1 [[A4]], true598; CHECK-NEXT: [[A6:%.*]] = and i1 [[A5]], true599; CHECK-NEXT: [[A7:%.*]] = and i1 [[A6]], true600; CHECK-NEXT: [[A8:%.*]] = and i1 [[A7]], true601; CHECK-NEXT: [[A9:%.*]] = and i1 [[A8]], true602; CHECK-NEXT: [[A10:%.*]] = and i1 [[A9]], true603; CHECK-NEXT: [[A11:%.*]] = and i1 [[A10]], true604; CHECK-NEXT: [[A12:%.*]] = and i1 [[A11]], true605; CHECK-NEXT: [[A13:%.*]] = and i1 [[A12]], true606; CHECK-NEXT: [[A14:%.*]] = and i1 [[A13]], true607; CHECK-NEXT: [[A15:%.*]] = and i1 [[A14]], true608; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A15]] = and i1 [[A14]], true Edge: [label [[TMP0:%.*]],label [[IF:%.*]]], RenamedOp: [[A15]] }609; CHECK-NEXT: [[A15_0:%.*]] = bitcast i1 [[A15]] to i1610; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A15]] = and i1 [[A14]], true Edge: [label [[TMP0]],label [[ELSE:%.*]]], RenamedOp: [[A15]] }611; CHECK-NEXT: [[A15_1:%.*]] = bitcast i1 [[A15]] to i1612; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A14]] = and i1 [[A13]], true Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A14]] }613; CHECK-NEXT: [[A14_0:%.*]] = bitcast i1 [[A14]] to i1614; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A13]] = and i1 [[A12]], true Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A13]] }615; CHECK-NEXT: [[A13_0:%.*]] = bitcast i1 [[A13]] to i1616; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A12]] = and i1 [[A11]], true Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A12]] }617; CHECK-NEXT: [[A12_0:%.*]] = bitcast i1 [[A12]] to i1618; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A11]] = and i1 [[A10]], true Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A11]] }619; CHECK-NEXT: [[A11_0:%.*]] = bitcast i1 [[A11]] to i1620; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A10]] = and i1 [[A9]], true Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A10]] }621; CHECK-NEXT: [[A10_0:%.*]] = bitcast i1 [[A10]] to i1622; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A9]] = and i1 [[A8]], true Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A9]] }623; CHECK-NEXT: [[A9_0:%.*]] = bitcast i1 [[A9]] to i1624; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A8]] = and i1 [[A7]], true Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A8]] }625; CHECK-NEXT: [[A8_0:%.*]] = bitcast i1 [[A8]] to i1626; CHECK-NEXT: br i1 [[A15]], label [[IF]], label [[ELSE]]627; CHECK: if:628; CHECK-NEXT: call void @foo(i1 [[A1]])629; CHECK-NEXT: call void @foo(i1 [[A2]])630; CHECK-NEXT: call void @foo(i1 [[A3]])631; CHECK-NEXT: call void @foo(i1 [[A4]])632; CHECK-NEXT: call void @foo(i1 [[A5]])633; CHECK-NEXT: call void @foo(i1 [[A6]])634; CHECK-NEXT: call void @foo(i1 [[A7]])635; CHECK-NEXT: call void @foo(i1 [[A8_0]])636; CHECK-NEXT: call void @foo(i1 [[A9_0]])637; CHECK-NEXT: call void @foo(i1 [[A10_0]])638; CHECK-NEXT: call void @foo(i1 [[A11_0]])639; CHECK-NEXT: call void @foo(i1 [[A12_0]])640; CHECK-NEXT: call void @foo(i1 [[A13_0]])641; CHECK-NEXT: call void @foo(i1 [[A14_0]])642; CHECK-NEXT: call void @foo(i1 [[A15_0]])643; CHECK-NEXT: ret void644; CHECK: else:645; CHECK-NEXT: call void @foo(i1 [[A1]])646; CHECK-NEXT: call void @foo(i1 [[A2]])647; CHECK-NEXT: call void @foo(i1 [[A3]])648; CHECK-NEXT: call void @foo(i1 [[A4]])649; CHECK-NEXT: call void @foo(i1 [[A5]])650; CHECK-NEXT: call void @foo(i1 [[A6]])651; CHECK-NEXT: call void @foo(i1 [[A7]])652; CHECK-NEXT: call void @foo(i1 [[A8]])653; CHECK-NEXT: call void @foo(i1 [[A9]])654; CHECK-NEXT: call void @foo(i1 [[A10]])655; CHECK-NEXT: call void @foo(i1 [[A11]])656; CHECK-NEXT: call void @foo(i1 [[A12]])657; CHECK-NEXT: call void @foo(i1 [[A13]])658; CHECK-NEXT: call void @foo(i1 [[A14]])659; CHECK-NEXT: call void @foo(i1 [[A15_1]])660; CHECK-NEXT: ret void661;662 %a2 = and i1 %a1, true663 %a3 = and i1 %a2, true664 %a4 = and i1 %a3, true665 %a5 = and i1 %a4, true666 %a6 = and i1 %a5, true667 %a7 = and i1 %a6, true668 %a8 = and i1 %a7, true669 %a9 = and i1 %a8, true670 %a10 = and i1 %a9, true671 %a11 = and i1 %a10, true672 %a12 = and i1 %a11, true673 %a13 = and i1 %a12, true674 %a14 = and i1 %a13, true675 %a15 = and i1 %a14, true676 br i1 %a15, label %if, label %else677 678if:679 call void @foo(i1 %a1)680 call void @foo(i1 %a2)681 call void @foo(i1 %a3)682 call void @foo(i1 %a4)683 call void @foo(i1 %a5)684 call void @foo(i1 %a6)685 call void @foo(i1 %a7)686 call void @foo(i1 %a8)687 call void @foo(i1 %a9)688 call void @foo(i1 %a10)689 call void @foo(i1 %a11)690 call void @foo(i1 %a12)691 call void @foo(i1 %a13)692 call void @foo(i1 %a14)693 call void @foo(i1 %a15)694 ret void695 696else:697 call void @foo(i1 %a1)698 call void @foo(i1 %a2)699 call void @foo(i1 %a3)700 call void @foo(i1 %a4)701 call void @foo(i1 %a5)702 call void @foo(i1 %a6)703 call void @foo(i1 %a7)704 call void @foo(i1 %a8)705 call void @foo(i1 %a9)706 call void @foo(i1 %a10)707 call void @foo(i1 %a11)708 call void @foo(i1 %a12)709 call void @foo(i1 %a13)710 call void @foo(i1 %a14)711 call void @foo(i1 %a15)712 ret void713}714 715define void @test_deep_and_tree(i1 %a1) {716; CHECK-LABEL: @test_deep_and_tree(717; CHECK-NEXT: [[A2:%.*]] = and i1 [[A1:%.*]], [[A1]]718; CHECK-NEXT: [[A3:%.*]] = and i1 [[A2]], [[A2]]719; CHECK-NEXT: [[A4:%.*]] = and i1 [[A3]], [[A3]]720; CHECK-NEXT: [[A5:%.*]] = and i1 [[A4]], [[A4]]721; CHECK-NEXT: [[A6:%.*]] = and i1 [[A5]], [[A5]]722; CHECK-NEXT: [[A7:%.*]] = and i1 [[A6]], [[A6]]723; CHECK-NEXT: [[A8:%.*]] = and i1 [[A7]], [[A7]]724; CHECK-NEXT: [[A9:%.*]] = and i1 [[A8]], [[A8]]725; CHECK-NEXT: [[A10:%.*]] = and i1 [[A9]], [[A9]]726; CHECK-NEXT: [[A11:%.*]] = and i1 [[A10]], [[A10]]727; CHECK-NEXT: [[A12:%.*]] = and i1 [[A11]], [[A11]]728; CHECK-NEXT: [[A13:%.*]] = and i1 [[A12]], [[A12]]729; CHECK-NEXT: [[A14:%.*]] = and i1 [[A13]], [[A13]]730; CHECK-NEXT: [[A15:%.*]] = and i1 [[A14]], [[A14]]731; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A15]] = and i1 [[A14]], [[A14]] Edge: [label [[TMP0:%.*]],label [[IF:%.*]]], RenamedOp: [[A15]] }732; CHECK-NEXT: [[A15_0:%.*]] = bitcast i1 [[A15]] to i1733; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A15]] = and i1 [[A14]], [[A14]] Edge: [label [[TMP0]],label [[ELSE:%.*]]], RenamedOp: [[A15]] }734; CHECK-NEXT: [[A15_1:%.*]] = bitcast i1 [[A15]] to i1735; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A14]] = and i1 [[A13]], [[A13]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A14]] }736; CHECK-NEXT: [[A14_0:%.*]] = bitcast i1 [[A14]] to i1737; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A13]] = and i1 [[A12]], [[A12]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A13]] }738; CHECK-NEXT: [[A13_0:%.*]] = bitcast i1 [[A13]] to i1739; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A12]] = and i1 [[A11]], [[A11]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A12]] }740; CHECK-NEXT: [[A12_0:%.*]] = bitcast i1 [[A12]] to i1741; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A11]] = and i1 [[A10]], [[A10]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A11]] }742; CHECK-NEXT: [[A11_0:%.*]] = bitcast i1 [[A11]] to i1743; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A10]] = and i1 [[A9]], [[A9]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A10]] }744; CHECK-NEXT: [[A10_0:%.*]] = bitcast i1 [[A10]] to i1745; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A9]] = and i1 [[A8]], [[A8]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A9]] }746; CHECK-NEXT: [[A9_0:%.*]] = bitcast i1 [[A9]] to i1747; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A8]] = and i1 [[A7]], [[A7]] Edge: [label [[TMP0]],label [[IF]]], RenamedOp: [[A8]] }748; CHECK-NEXT: [[A8_0:%.*]] = bitcast i1 [[A8]] to i1749; CHECK-NEXT: br i1 [[A15]], label [[IF]], label [[ELSE]]750; CHECK: if:751; CHECK-NEXT: call void @foo(i1 [[A1]])752; CHECK-NEXT: call void @foo(i1 [[A2]])753; CHECK-NEXT: call void @foo(i1 [[A3]])754; CHECK-NEXT: call void @foo(i1 [[A4]])755; CHECK-NEXT: call void @foo(i1 [[A5]])756; CHECK-NEXT: call void @foo(i1 [[A6]])757; CHECK-NEXT: call void @foo(i1 [[A7]])758; CHECK-NEXT: call void @foo(i1 [[A8_0]])759; CHECK-NEXT: call void @foo(i1 [[A9_0]])760; CHECK-NEXT: call void @foo(i1 [[A10_0]])761; CHECK-NEXT: call void @foo(i1 [[A11_0]])762; CHECK-NEXT: call void @foo(i1 [[A12_0]])763; CHECK-NEXT: call void @foo(i1 [[A13_0]])764; CHECK-NEXT: call void @foo(i1 [[A14_0]])765; CHECK-NEXT: call void @foo(i1 [[A15_0]])766; CHECK-NEXT: ret void767; CHECK: else:768; CHECK-NEXT: call void @foo(i1 [[A1]])769; CHECK-NEXT: call void @foo(i1 [[A2]])770; CHECK-NEXT: call void @foo(i1 [[A3]])771; CHECK-NEXT: call void @foo(i1 [[A4]])772; CHECK-NEXT: call void @foo(i1 [[A5]])773; CHECK-NEXT: call void @foo(i1 [[A6]])774; CHECK-NEXT: call void @foo(i1 [[A7]])775; CHECK-NEXT: call void @foo(i1 [[A8]])776; CHECK-NEXT: call void @foo(i1 [[A9]])777; CHECK-NEXT: call void @foo(i1 [[A10]])778; CHECK-NEXT: call void @foo(i1 [[A11]])779; CHECK-NEXT: call void @foo(i1 [[A12]])780; CHECK-NEXT: call void @foo(i1 [[A13]])781; CHECK-NEXT: call void @foo(i1 [[A14]])782; CHECK-NEXT: call void @foo(i1 [[A15_1]])783; CHECK-NEXT: ret void784;785 %a2 = and i1 %a1, %a1786 %a3 = and i1 %a2, %a2787 %a4 = and i1 %a3, %a3788 %a5 = and i1 %a4, %a4789 %a6 = and i1 %a5, %a5790 %a7 = and i1 %a6, %a6791 %a8 = and i1 %a7, %a7792 %a9 = and i1 %a8, %a8793 %a10 = and i1 %a9, %a9794 %a11 = and i1 %a10, %a10795 %a12 = and i1 %a11, %a11796 %a13 = and i1 %a12, %a12797 %a14 = and i1 %a13, %a13798 %a15 = and i1 %a14, %a14799 br i1 %a15, label %if, label %else800 801if:802 call void @foo(i1 %a1)803 call void @foo(i1 %a2)804 call void @foo(i1 %a3)805 call void @foo(i1 %a4)806 call void @foo(i1 %a5)807 call void @foo(i1 %a6)808 call void @foo(i1 %a7)809 call void @foo(i1 %a8)810 call void @foo(i1 %a9)811 call void @foo(i1 %a10)812 call void @foo(i1 %a11)813 call void @foo(i1 %a12)814 call void @foo(i1 %a13)815 call void @foo(i1 %a14)816 call void @foo(i1 %a15)817 ret void818 819else:820 call void @foo(i1 %a1)821 call void @foo(i1 %a2)822 call void @foo(i1 %a3)823 call void @foo(i1 %a4)824 call void @foo(i1 %a5)825 call void @foo(i1 %a6)826 call void @foo(i1 %a7)827 call void @foo(i1 %a8)828 call void @foo(i1 %a9)829 call void @foo(i1 %a10)830 call void @foo(i1 %a11)831 call void @foo(i1 %a12)832 call void @foo(i1 %a13)833 call void @foo(i1 %a14)834 call void @foo(i1 %a15)835 ret void836}837 838define void @test_deep_or_tree(i1 %a1) {839; CHECK-LABEL: @test_deep_or_tree(840; CHECK-NEXT: [[A2:%.*]] = or i1 [[A1:%.*]], [[A1]]841; CHECK-NEXT: [[A3:%.*]] = or i1 [[A2]], [[A2]]842; CHECK-NEXT: [[A4:%.*]] = or i1 [[A3]], [[A3]]843; CHECK-NEXT: [[A5:%.*]] = or i1 [[A4]], [[A4]]844; CHECK-NEXT: [[A6:%.*]] = or i1 [[A5]], [[A5]]845; CHECK-NEXT: [[A7:%.*]] = or i1 [[A6]], [[A6]]846; CHECK-NEXT: [[A8:%.*]] = or i1 [[A7]], [[A7]]847; CHECK-NEXT: [[A9:%.*]] = or i1 [[A8]], [[A8]]848; CHECK-NEXT: [[A10:%.*]] = or i1 [[A9]], [[A9]]849; CHECK-NEXT: [[A11:%.*]] = or i1 [[A10]], [[A10]]850; CHECK-NEXT: [[A12:%.*]] = or i1 [[A11]], [[A11]]851; CHECK-NEXT: [[A13:%.*]] = or i1 [[A12]], [[A12]]852; CHECK-NEXT: [[A14:%.*]] = or i1 [[A13]], [[A13]]853; CHECK-NEXT: [[A15:%.*]] = or i1 [[A14]], [[A14]]854; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[A15]] = or i1 [[A14]], [[A14]] Edge: [label [[TMP0:%.*]],label [[IF:%.*]]], RenamedOp: [[A15]] }855; CHECK-NEXT: [[A15_0:%.*]] = bitcast i1 [[A15]] to i1856; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A15]] = or i1 [[A14]], [[A14]] Edge: [label [[TMP0]],label [[ELSE:%.*]]], RenamedOp: [[A15]] }857; CHECK-NEXT: [[A15_1:%.*]] = bitcast i1 [[A15]] to i1858; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A14]] = or i1 [[A13]], [[A13]] Edge: [label [[TMP0]],label [[ELSE]]], RenamedOp: [[A14]] }859; CHECK-NEXT: [[A14_0:%.*]] = bitcast i1 [[A14]] to i1860; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A13]] = or i1 [[A12]], [[A12]] Edge: [label [[TMP0]],label [[ELSE]]], RenamedOp: [[A13]] }861; CHECK-NEXT: [[A13_0:%.*]] = bitcast i1 [[A13]] to i1862; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A12]] = or i1 [[A11]], [[A11]] Edge: [label [[TMP0]],label [[ELSE]]], RenamedOp: [[A12]] }863; CHECK-NEXT: [[A12_0:%.*]] = bitcast i1 [[A12]] to i1864; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A11]] = or i1 [[A10]], [[A10]] Edge: [label [[TMP0]],label [[ELSE]]], RenamedOp: [[A11]] }865; CHECK-NEXT: [[A11_0:%.*]] = bitcast i1 [[A11]] to i1866; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A10]] = or i1 [[A9]], [[A9]] Edge: [label [[TMP0]],label [[ELSE]]], RenamedOp: [[A10]] }867; CHECK-NEXT: [[A10_0:%.*]] = bitcast i1 [[A10]] to i1868; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A9]] = or i1 [[A8]], [[A8]] Edge: [label [[TMP0]],label [[ELSE]]], RenamedOp: [[A9]] }869; CHECK-NEXT: [[A9_0:%.*]] = bitcast i1 [[A9]] to i1870; CHECK-NEXT: ; branch predicate info { TrueEdge: 0 Comparison: [[A8]] = or i1 [[A7]], [[A7]] Edge: [label [[TMP0]],label [[ELSE]]], RenamedOp: [[A8]] }871; CHECK-NEXT: [[A8_0:%.*]] = bitcast i1 [[A8]] to i1872; CHECK-NEXT: br i1 [[A15]], label [[IF]], label [[ELSE]]873; CHECK: if:874; CHECK-NEXT: call void @foo(i1 [[A1]])875; CHECK-NEXT: call void @foo(i1 [[A2]])876; CHECK-NEXT: call void @foo(i1 [[A3]])877; CHECK-NEXT: call void @foo(i1 [[A4]])878; CHECK-NEXT: call void @foo(i1 [[A5]])879; CHECK-NEXT: call void @foo(i1 [[A6]])880; CHECK-NEXT: call void @foo(i1 [[A7]])881; CHECK-NEXT: call void @foo(i1 [[A8]])882; CHECK-NEXT: call void @foo(i1 [[A9]])883; CHECK-NEXT: call void @foo(i1 [[A10]])884; CHECK-NEXT: call void @foo(i1 [[A11]])885; CHECK-NEXT: call void @foo(i1 [[A12]])886; CHECK-NEXT: call void @foo(i1 [[A13]])887; CHECK-NEXT: call void @foo(i1 [[A14]])888; CHECK-NEXT: call void @foo(i1 [[A15_0]])889; CHECK-NEXT: ret void890; CHECK: else:891; CHECK-NEXT: call void @foo(i1 [[A1]])892; CHECK-NEXT: call void @foo(i1 [[A2]])893; CHECK-NEXT: call void @foo(i1 [[A3]])894; CHECK-NEXT: call void @foo(i1 [[A4]])895; CHECK-NEXT: call void @foo(i1 [[A5]])896; CHECK-NEXT: call void @foo(i1 [[A6]])897; CHECK-NEXT: call void @foo(i1 [[A7]])898; CHECK-NEXT: call void @foo(i1 [[A8_0]])899; CHECK-NEXT: call void @foo(i1 [[A9_0]])900; CHECK-NEXT: call void @foo(i1 [[A10_0]])901; CHECK-NEXT: call void @foo(i1 [[A11_0]])902; CHECK-NEXT: call void @foo(i1 [[A12_0]])903; CHECK-NEXT: call void @foo(i1 [[A13_0]])904; CHECK-NEXT: call void @foo(i1 [[A14_0]])905; CHECK-NEXT: call void @foo(i1 [[A15_1]])906; CHECK-NEXT: ret void907;908 %a2 = or i1 %a1, %a1909 %a3 = or i1 %a2, %a2910 %a4 = or i1 %a3, %a3911 %a5 = or i1 %a4, %a4912 %a6 = or i1 %a5, %a5913 %a7 = or i1 %a6, %a6914 %a8 = or i1 %a7, %a7915 %a9 = or i1 %a8, %a8916 %a10 = or i1 %a9, %a9917 %a11 = or i1 %a10, %a10918 %a12 = or i1 %a11, %a11919 %a13 = or i1 %a12, %a12920 %a14 = or i1 %a13, %a13921 %a15 = or i1 %a14, %a14922 br i1 %a15, label %if, label %else923 924if:925 call void @foo(i1 %a1)926 call void @foo(i1 %a2)927 call void @foo(i1 %a3)928 call void @foo(i1 %a4)929 call void @foo(i1 %a5)930 call void @foo(i1 %a6)931 call void @foo(i1 %a7)932 call void @foo(i1 %a8)933 call void @foo(i1 %a9)934 call void @foo(i1 %a10)935 call void @foo(i1 %a11)936 call void @foo(i1 %a12)937 call void @foo(i1 %a13)938 call void @foo(i1 %a14)939 call void @foo(i1 %a15)940 ret void941 942else:943 call void @foo(i1 %a1)944 call void @foo(i1 %a2)945 call void @foo(i1 %a3)946 call void @foo(i1 %a4)947 call void @foo(i1 %a5)948 call void @foo(i1 %a6)949 call void @foo(i1 %a7)950 call void @foo(i1 %a8)951 call void @foo(i1 %a9)952 call void @foo(i1 %a10)953 call void @foo(i1 %a11)954 call void @foo(i1 %a12)955 call void @foo(i1 %a13)956 call void @foo(i1 %a14)957 call void @foo(i1 %a15)958 ret void959}960 961define void @test_assume_and_chain(i1 %a, i1 %b, i1 %c) {962; CHECK-LABEL: @test_assume_and_chain(963; CHECK-NEXT: [[AND1:%.*]] = and i1 [[A:%.*]], [[B:%.*]]964; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[C:%.*]]965; CHECK-NEXT: call void @llvm.assume(i1 [[AND2]])966; CHECK-NEXT: ; assume predicate info { Comparison:i1 [[C]], RenamedOp: [[C]] }967; CHECK-NEXT: [[TMP1:%.*]] = bitcast i1 [[C]] to i1968; CHECK-NEXT: ; assume predicate info { Comparison:i1 [[B]], RenamedOp: [[B]] }969; CHECK-NEXT: [[TMP2:%.*]] = bitcast i1 [[B]] to i1970; CHECK-NEXT: ; assume predicate info { Comparison:i1 [[A]], RenamedOp: [[A]] }971; CHECK-NEXT: [[TMP3:%.*]] = bitcast i1 [[A]] to i1972; CHECK-NEXT: ; assume predicate info { Comparison: [[AND1]] = and i1 [[A]], [[B]], RenamedOp: [[AND1]] }973; CHECK-NEXT: [[TMP4:%.*]] = bitcast i1 [[AND1]] to i1974; CHECK-NEXT: ; assume predicate info { Comparison: [[AND2]] = and i1 [[AND1]], [[C]], RenamedOp: [[AND2]] }975; CHECK-NEXT: [[TMP5:%.*]] = bitcast i1 [[AND2]] to i1976; CHECK-NEXT: call void @foo(i1 [[TMP3]])977; CHECK-NEXT: call void @foo(i1 [[TMP2]])978; CHECK-NEXT: call void @foo(i1 [[TMP1]])979; CHECK-NEXT: call void @foo(i1 [[TMP4]])980; CHECK-NEXT: call void @foo(i1 [[TMP5]])981; CHECK-NEXT: ret void982;983 %and1 = and i1 %a, %b984 %and2 = and i1 %and1, %c985 call void @llvm.assume(i1 %and2)986 call void @foo(i1 %a)987 call void @foo(i1 %b)988 call void @foo(i1 %c)989 call void @foo(i1 %and1)990 call void @foo(i1 %and2)991 ret void992}993 994define void @test_assume_or_chain(i1 %a, i1 %b, i1 %c) {995; CHECK-LABEL: @test_assume_or_chain(996; CHECK-NEXT: [[OR1:%.*]] = or i1 [[A:%.*]], [[B:%.*]]997; CHECK-NEXT: [[OR2:%.*]] = or i1 [[OR1]], [[C:%.*]]998; CHECK-NEXT: call void @llvm.assume(i1 [[OR2]])999; CHECK-NEXT: ; assume predicate info { Comparison: [[OR2]] = or i1 [[OR1]], [[C]], RenamedOp: [[OR2]] }1000; CHECK-NEXT: [[TMP1:%.*]] = bitcast i1 [[OR2]] to i11001; CHECK-NEXT: call void @foo(i1 [[A]])1002; CHECK-NEXT: call void @foo(i1 [[B]])1003; CHECK-NEXT: call void @foo(i1 [[C]])1004; CHECK-NEXT: call void @foo(i1 [[OR1]])1005; CHECK-NEXT: call void @foo(i1 [[TMP1]])1006; CHECK-NEXT: ret void1007;1008 %or1 = or i1 %a, %b1009 %or2 = or i1 %or1, %c1010 call void @llvm.assume(i1 %or2)1011 call void @foo(i1 %a)1012 call void @foo(i1 %b)1013 call void @foo(i1 %c)1014 call void @foo(i1 %or1)1015 call void @foo(i1 %or2)1016 ret void1017}1018 1019define void @test_assume_deep_and_tree(i1 %a1) {1020; CHECK-LABEL: @test_assume_deep_and_tree(1021; CHECK-NEXT: [[A2:%.*]] = and i1 [[A1:%.*]], [[A1]]1022; CHECK-NEXT: [[A3:%.*]] = and i1 [[A2]], [[A2]]1023; CHECK-NEXT: [[A4:%.*]] = and i1 [[A3]], [[A3]]1024; CHECK-NEXT: [[A5:%.*]] = and i1 [[A4]], [[A4]]1025; CHECK-NEXT: [[A6:%.*]] = and i1 [[A5]], [[A5]]1026; CHECK-NEXT: [[A7:%.*]] = and i1 [[A6]], [[A6]]1027; CHECK-NEXT: [[A8:%.*]] = and i1 [[A7]], [[A7]]1028; CHECK-NEXT: [[A9:%.*]] = and i1 [[A8]], [[A8]]1029; CHECK-NEXT: [[A10:%.*]] = and i1 [[A9]], [[A9]]1030; CHECK-NEXT: [[A11:%.*]] = and i1 [[A10]], [[A10]]1031; CHECK-NEXT: [[A12:%.*]] = and i1 [[A11]], [[A11]]1032; CHECK-NEXT: [[A13:%.*]] = and i1 [[A12]], [[A12]]1033; CHECK-NEXT: [[A14:%.*]] = and i1 [[A13]], [[A13]]1034; CHECK-NEXT: [[A15:%.*]] = and i1 [[A14]], [[A14]]1035; CHECK-NEXT: call void @llvm.assume(i1 [[A15]])1036; CHECK-NEXT: ; assume predicate info { Comparison: [[A8]] = and i1 [[A7]], [[A7]], RenamedOp: [[A8]] }1037; CHECK-NEXT: [[TMP1:%.*]] = bitcast i1 [[A8]] to i11038; CHECK-NEXT: ; assume predicate info { Comparison: [[A9]] = and i1 [[A8]], [[A8]], RenamedOp: [[A9]] }1039; CHECK-NEXT: [[TMP2:%.*]] = bitcast i1 [[A9]] to i11040; CHECK-NEXT: ; assume predicate info { Comparison: [[A10]] = and i1 [[A9]], [[A9]], RenamedOp: [[A10]] }1041; CHECK-NEXT: [[TMP3:%.*]] = bitcast i1 [[A10]] to i11042; CHECK-NEXT: ; assume predicate info { Comparison: [[A11]] = and i1 [[A10]], [[A10]], RenamedOp: [[A11]] }1043; CHECK-NEXT: [[TMP4:%.*]] = bitcast i1 [[A11]] to i11044; CHECK-NEXT: ; assume predicate info { Comparison: [[A12]] = and i1 [[A11]], [[A11]], RenamedOp: [[A12]] }1045; CHECK-NEXT: [[TMP5:%.*]] = bitcast i1 [[A12]] to i11046; CHECK-NEXT: ; assume predicate info { Comparison: [[A13]] = and i1 [[A12]], [[A12]], RenamedOp: [[A13]] }1047; CHECK-NEXT: [[TMP6:%.*]] = bitcast i1 [[A13]] to i11048; CHECK-NEXT: ; assume predicate info { Comparison: [[A14]] = and i1 [[A13]], [[A13]], RenamedOp: [[A14]] }1049; CHECK-NEXT: [[TMP7:%.*]] = bitcast i1 [[A14]] to i11050; CHECK-NEXT: ; assume predicate info { Comparison: [[A15]] = and i1 [[A14]], [[A14]], RenamedOp: [[A15]] }1051; CHECK-NEXT: [[TMP8:%.*]] = bitcast i1 [[A15]] to i11052; CHECK-NEXT: call void @foo(i1 [[A1]])1053; CHECK-NEXT: call void @foo(i1 [[A2]])1054; CHECK-NEXT: call void @foo(i1 [[A3]])1055; CHECK-NEXT: call void @foo(i1 [[A4]])1056; CHECK-NEXT: call void @foo(i1 [[A5]])1057; CHECK-NEXT: call void @foo(i1 [[A6]])1058; CHECK-NEXT: call void @foo(i1 [[A7]])1059; CHECK-NEXT: call void @foo(i1 [[TMP1]])1060; CHECK-NEXT: call void @foo(i1 [[TMP2]])1061; CHECK-NEXT: call void @foo(i1 [[TMP3]])1062; CHECK-NEXT: call void @foo(i1 [[TMP4]])1063; CHECK-NEXT: call void @foo(i1 [[TMP5]])1064; CHECK-NEXT: call void @foo(i1 [[TMP6]])1065; CHECK-NEXT: call void @foo(i1 [[TMP7]])1066; CHECK-NEXT: call void @foo(i1 [[TMP8]])1067; CHECK-NEXT: ret void1068;1069 %a2 = and i1 %a1, %a11070 %a3 = and i1 %a2, %a21071 %a4 = and i1 %a3, %a31072 %a5 = and i1 %a4, %a41073 %a6 = and i1 %a5, %a51074 %a7 = and i1 %a6, %a61075 %a8 = and i1 %a7, %a71076 %a9 = and i1 %a8, %a81077 %a10 = and i1 %a9, %a91078 %a11 = and i1 %a10, %a101079 %a12 = and i1 %a11, %a111080 %a13 = and i1 %a12, %a121081 %a14 = and i1 %a13, %a131082 %a15 = and i1 %a14, %a141083 call void @llvm.assume(i1 %a15)1084 call void @foo(i1 %a1)1085 call void @foo(i1 %a2)1086 call void @foo(i1 %a3)1087 call void @foo(i1 %a4)1088 call void @foo(i1 %a5)1089 call void @foo(i1 %a6)1090 call void @foo(i1 %a7)1091 call void @foo(i1 %a8)1092 call void @foo(i1 %a9)1093 call void @foo(i1 %a10)1094 call void @foo(i1 %a11)1095 call void @foo(i1 %a12)1096 call void @foo(i1 %a13)1097 call void @foo(i1 %a14)1098 call void @foo(i1 %a15)1099 ret void1100}1101 1102define i32 @test_and_with_phinode(i32 %x) {1103; CHECK-LABEL: @test_and_with_phinode(1104; CHECK-NEXT: entry:1105; CHECK-NEXT: [[XGE1:%.*]] = icmp uge i32 [[X:%.*]], 11106; CHECK-NEXT: [[XLT2:%.*]] = icmp ult i32 [[X]], 21107; CHECK-NEXT: [[AND:%.*]] = and i1 [[XGE1]], [[XLT2]]1108; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XGE1]] = icmp uge i32 [[X]], 1 Edge: [label [[ENTRY:%.*]],label [[PHI:%.*]]], RenamedOp: [[X]] }1109; CHECK-NEXT: [[X_0_1:%.*]] = bitcast i32 [[X]] to i321110; CHECK-NEXT: ; branch predicate info { TrueEdge: 1 Comparison: [[XLT2]] = icmp ult i32 [[X]], 2 Edge: [label [[ENTRY]],label [[PHI]]], RenamedOp: [[X]] }1111; CHECK-NEXT: [[X_0_2:%.*]] = bitcast i32 [[X_0_1]] to i321112; CHECK-NEXT: br i1 [[AND]], label [[PHI]], label [[NOPE:%.*]]1113; CHECK: nope:1114; CHECK-NEXT: br label [[PHI]]1115; CHECK: phi:1116; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[X_0_2]], [[ENTRY]] ], [ 1, [[NOPE]] ]1117; CHECK-NEXT: ret i32 [[RES]]1118;1119entry:1120 %xge1 = icmp uge i32 %x, 11121 %xlt2 = icmp ult i32 %x, 21122 %and = and i1 %xge1, %xlt21123 br i1 %and, label %phi, label %nope1124nope:1125 br label %phi1126phi:1127 %res = phi i32 [ %x, %entry ], [ 1, %nope ]1128 ret i32 %res1129}1130