1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=loop-predication < %s 2>&1 | FileCheck %s 3 4declare void @llvm.experimental.deoptimize.isVoid(...) 5 6define void @test_01(i1 %cond) { 7; CHECK-LABEL: @test_01( 8; CHECK-NEXT: bb: 9; CHECK-NEXT: [[INST:%.*]] = call i1 @llvm.experimental.widenable.condition() 10; CHECK-NEXT: [[TMP0:%.*]] = freeze i1 true 11; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[TMP0]], [[INST]] 12; CHECK-NEXT: br label [[LOOP:%.*]] 13; CHECK: unreached: 14; CHECK-NEXT: unreachable 15; CHECK: loop: 16; CHECK-NEXT: [[INST3:%.*]] = phi i32 [ 0, [[BB:%.*]] ], [ [[INST4:%.*]], [[BACKEDGE:%.*]] ] 17; CHECK-NEXT: [[INST4]] = add nsw i32 [[INST3]], 1 18; CHECK-NEXT: br i1 [[COND:%.*]], label [[BACKEDGE]], label [[GUARD_BLOCK:%.*]] 19; CHECK: normal_ret: 20; CHECK-NEXT: ret void 21; CHECK: backedge: 22; CHECK-NEXT: [[ASSUME_COND:%.*]] = phi i1 [ [[INST9:%.*]], [[GUARD_BLOCK]] ], [ true, [[LOOP]] ] 23; CHECK-NEXT: call void @llvm.assume(i1 [[ASSUME_COND]]) 24; CHECK-NEXT: [[INST7:%.*]] = icmp sgt i32 [[INST3]], 137 25; CHECK-NEXT: br i1 [[INST7]], label [[UNREACHED:%.*]], label [[LOOP]] 26; CHECK: guard_block: 27; CHECK-NEXT: [[INST9]] = icmp ult i32 [[INST4]], 10000 28; CHECK-NEXT: br i1 [[TMP1]], label [[BACKEDGE]], label [[DEOPT:%.*]] 29; CHECK: deopt: 30; CHECK-NEXT: call void (...) @llvm.experimental.deoptimize.isVoid(i32 13) [ "deopt"() ] 31; CHECK-NEXT: ret void 32; CHECK: done: 33; CHECK-NEXT: ret void 34; 35bb: 36 %inst = call i1 @llvm.experimental.widenable.condition() 37 br label %loop 38 39unreached: ; preds = %backedge 40 unreachable 41 42loop: ; preds = %backedge, %bb 43 %inst3 = phi i32 [ 0, %bb ], [ %inst4, %backedge ] 44 %inst4 = add nsw i32 %inst3, 1 45 br i1 %cond, label %backedge, label %guard_block 46 47normal_ret: ; preds = %loop 48 ret void 49 50backedge: ; preds = %guard_block, %loop 51 %inst7 = icmp sgt i32 %inst3, 137 52 br i1 %inst7, label %unreached, label %loop 53 54guard_block: ; preds = %loop, %loop 55 %inst9 = icmp ult i32 %inst4, 10000 56 %inst10 = and i1 %inst9, %inst 57 br i1 %inst10, label %backedge, label %deopt 58 59deopt: ; preds = %guard_block 60 call void (...) @llvm.experimental.deoptimize.isVoid(i32 13) [ "deopt"() ] 61 ret void 62 63done: ; preds = %loop 64 ret void 65} 66 67declare i1 @llvm.experimental.widenable.condition() 68