The effect of doing so is not disrupting the LoopPassManager when mixing this pass with other loop passes. This should help locality of access substaintially and avoids the cost of computing PostDom. The assumption here is that the full GuardWidening (which does use PostDom) is run as a canonicalization before loop opts and that this version is just catching cases exposed by other loop passes. (i.e. LoopPredication, IndVarSimplify, LoopUnswitch, etc..) llvm-svn: 331094
65 lines
2.2 KiB
LLVM
65 lines
2.2 KiB
LLVM
; RUN: opt -S -licm -loop-guard-widening -licm -debug-pass=Structure < %s 2>&1 | FileCheck %s
|
|
|
|
; Main point of this test is to check the scheduling -- there should be
|
|
; no analysis passes needed between LICM and LoopGuardWidening
|
|
|
|
; CHECK: Loop Pass Manager
|
|
; CHECK: Loop Invariant Code Motion
|
|
; CHECK: Widen guards (within a single loop, as a loop pass)
|
|
; CHECK: Loop Invariant Code Motion
|
|
|
|
declare void @llvm.experimental.guard(i1,...)
|
|
|
|
define void @iter(i32 %a, i32 %b, i1* %c_p) {
|
|
; CHECK-LABEL @iter
|
|
; CHECK: %cond_0 = icmp ult i32 %a, 10
|
|
; CHECK: %cond_1 = icmp ult i32 %b, 10
|
|
; CHECK: %wide.chk = and i1 %cond_0, %cond_1
|
|
; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %wide.chk) [ "deopt"() ]
|
|
; CHECK-LABEL: loop:
|
|
|
|
entry:
|
|
%cond_0 = icmp ult i32 %a, 10
|
|
call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
|
|
br label %loop
|
|
|
|
loop: ; preds = %loop.preheader, %loop
|
|
%cond_1 = icmp ult i32 %b, 10
|
|
call void (i1, ...) @llvm.experimental.guard(i1 %cond_1) [ "deopt"() ]
|
|
%cnd = load i1, i1* %c_p
|
|
br i1 %cnd, label %loop, label %leave.loopexit
|
|
|
|
leave.loopexit: ; preds = %loop
|
|
br label %leave
|
|
|
|
leave: ; preds = %leave.loopexit, %entry
|
|
ret void
|
|
}
|
|
|
|
define void @within_loop(i32 %a, i32 %b, i1* %c_p) {
|
|
; CHECK-LABEL @within_loop
|
|
; CHECK: %cond_0 = icmp ult i32 %a, 10
|
|
; CHECK: %cond_1 = icmp ult i32 %b, 10
|
|
; CHECK: %wide.chk = and i1 %cond_0, %cond_1
|
|
; CHECK-LABEL: loop:
|
|
; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %wide.chk) [ "deopt"() ]
|
|
|
|
entry:
|
|
br label %loop
|
|
|
|
loop: ; preds = %loop.preheader, %loop
|
|
%cond_0 = icmp ult i32 %a, 10
|
|
call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
|
|
%cond_1 = icmp ult i32 %b, 10
|
|
call void (i1, ...) @llvm.experimental.guard(i1 %cond_1) [ "deopt"() ]
|
|
%cnd = load i1, i1* %c_p
|
|
br i1 %cnd, label %loop, label %leave.loopexit
|
|
|
|
leave.loopexit: ; preds = %loop
|
|
br label %leave
|
|
|
|
leave: ; preds = %leave.loopexit, %entry
|
|
ret void
|
|
}
|
|
|