brintos

brintos / llvm-project-archived public Read only

0
0
Text · 49.0 KiB · d29aadd Raw
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