1; RUN: opt -S -licm -loop-guard-widening -licm -debug-pass=Structure -enable-new-pm=0 < %s 2>&1 | FileCheck %s --check-prefixes=LPM,CHECK 2; RUN: opt -S -passes='licm,guard-widening,licm' -debug-pass-manager < %s 2>&1 | FileCheck %s --check-prefixes=NPM,CHECK 3 4; Main point of this test is to check the scheduling -- there should be 5; no analysis passes needed between LICM and LoopGuardWidening 6 7; LPM: Loop Pass Manager 8; LPM: Loop Invariant Code Motion 9; LPM: Widen guards (within a single loop, as a loop pass) 10; LPM: Loop Invariant Code Motion 11 12; NPM: LICMPass 13; NPM-NEXT: GuardWideningPass 14; NPM-NEXT: LICMPass 15 16declare void @llvm.experimental.guard(i1,...) 17 18define void @iter(i32 %a, i32 %b, i1* %c_p) { 19; CHECK-LABEL: @iter 20; CHECK: %cond_0 = icmp ult i32 %a, 10 21; CHECK: %cond_1 = icmp ult i32 %b, 10 22; CHECK: %wide.chk = and i1 %cond_0, %cond_1 23; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %wide.chk) [ "deopt"() ] 24; CHECK-LABEL: loop: 25 26entry: 27 %cond_0 = icmp ult i32 %a, 10 28 call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ] 29 br label %loop 30 31loop: ; preds = %loop.preheader, %loop 32 %cond_1 = icmp ult i32 %b, 10 33 call void (i1, ...) @llvm.experimental.guard(i1 %cond_1) [ "deopt"() ] 34 %cnd = load i1, i1* %c_p 35 br i1 %cnd, label %loop, label %leave.loopexit 36 37leave.loopexit: ; preds = %loop 38 br label %leave 39 40leave: ; preds = %leave.loopexit, %entry 41 ret void 42} 43 44define void @within_loop(i32 %a, i32 %b, i1* %c_p) { 45; CHECK-LABEL: @within_loop 46; CHECK: %cond_0 = icmp ult i32 %a, 10 47; CHECK: %cond_1 = icmp ult i32 %b, 10 48; CHECK: %wide.chk = and i1 %cond_0, %cond_1 49; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %wide.chk) [ "deopt"() ] 50; CHECK-LABEL: loop: 51 52entry: 53 br label %loop 54 55loop: ; preds = %loop.preheader, %loop 56 %cond_0 = icmp ult i32 %a, 10 57 call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ] 58 %cond_1 = icmp ult i32 %b, 10 59 call void (i1, ...) @llvm.experimental.guard(i1 %cond_1) [ "deopt"() ] 60 %cnd = load i1, i1* %c_p 61 br i1 %cnd, label %loop, label %leave.loopexit 62 63leave.loopexit: ; preds = %loop 64 br label %leave 65 66leave: ; preds = %leave.loopexit, %entry 67 ret void 68} 69 70