| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | 
 | ; RUN: opt -S -passes=guard-widening < %s | FileCheck %s | 
 |  | 
 | declare void @llvm.experimental.deoptimize.isVoid(...) | 
 | declare i1 @llvm.experimental.widenable.condition() | 
 |  | 
 | ; In the current scheme we widen `br i1 %and1`, so we try to build | 
 | ; `and i1 poison, %and1` using `%call0` as insertion point. | 
 | ; That's not possible, so widening will not occur in the case. | 
 | ; TODO: Widen `%call0` in the test case, not a branch. | 
 | define void @test() { | 
 | ; CHECK-LABEL: @test( | 
 | ; CHECK-NEXT:  bb0: | 
 | ; CHECK-NEXT:    [[CALL0:%.*]] = call i1 @llvm.experimental.widenable.condition() | 
 | ; CHECK-NEXT:    [[AND0:%.*]] = and i1 false, [[CALL0]] | 
 | ; CHECK-NEXT:    [[AND1:%.*]] = and i1 false, [[AND0]] | 
 | ; CHECK-NEXT:    br i1 [[AND1]], label [[BB1:%.*]], label [[DEOPT:%.*]] | 
 | ; CHECK:       bb1: | 
 | ; CHECK-NEXT:    [[CALL1:%.*]] = call i1 @llvm.experimental.widenable.condition() | 
 | ; CHECK-NEXT:    [[AND2:%.*]] = and i1 poison, [[CALL1]] | 
 | ; CHECK-NEXT:    br i1 [[AND2]], label [[UNREACH:%.*]], label [[DEOPT]] | 
 | ; CHECK:       unreach: | 
 | ; CHECK-NEXT:    unreachable | 
 | ; CHECK:       deopt: | 
 | ; CHECK-NEXT:    call void (...) @llvm.experimental.deoptimize.isVoid(i32 0) [ "deopt"(i32 0) ] | 
 | ; CHECK-NEXT:    ret void | 
 | ; | 
 | bb0: | 
 |   %call0 = call i1 @llvm.experimental.widenable.condition() | 
 |   %and0 = and i1 false, %call0 | 
 |   %and1 = and i1 false, %and0 | 
 |   br i1 %and1, label %bb1, label %deopt | 
 |  | 
 | bb1: | 
 |   %call1 = call i1 @llvm.experimental.widenable.condition() | 
 |   %and2 = and i1 poison, %call1 | 
 |   br i1 %and2, label %unreach, label %deopt | 
 |  | 
 | unreach: | 
 |   unreachable | 
 |  | 
 | deopt: | 
 |   call void (...) @llvm.experimental.deoptimize.isVoid(i32 0) [ "deopt"(i32 0) ] | 
 |   ret void | 
 | } |