mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[IRCE] isKnownNonNegative helper function
Created a helper function to query for non negative SCEVs. Uses the SGE predicate to catch constants that could be interpreted as negative. Differential Revision: https://reviews.llvm.org/D45481 llvm-svn: 329907
This commit is contained in:
parent
26e6861798
commit
2c966d209b
@ -804,6 +804,13 @@ static bool CannotBeMinInLoop(const SCEV *BoundSCEV, Loop *L,
|
||||
SE.getConstant(Min));
|
||||
}
|
||||
|
||||
static bool isKnownNonNegativeInLoop(const SCEV *BoundSCEV, Loop *L,
|
||||
ScalarEvolution &SE) {
|
||||
const SCEV *Zero = SE.getZero(BoundSCEV->getType());
|
||||
return SE.isAvailableAtLoopEntry(BoundSCEV, L) &&
|
||||
SE.isLoopEntryGuardedByCond(L, ICmpInst::ICMP_SGE, BoundSCEV, Zero);
|
||||
}
|
||||
|
||||
Optional<LoopStructure>
|
||||
LoopStructure::parseLoopStructure(ScalarEvolution &SE,
|
||||
BranchProbabilityInfo *BPI, Loop &L,
|
||||
@ -963,8 +970,8 @@ LoopStructure::parseLoopStructure(ScalarEvolution &SE,
|
||||
// If both parts are known non-negative, it is profitable to use
|
||||
// unsigned comparison in increasing loop. This allows us to make the
|
||||
// comparison check against "RightSCEV + 1" more optimistic.
|
||||
if (SE.isKnownNonNegative(IndVarStart) &&
|
||||
SE.isKnownNonNegative(RightSCEV))
|
||||
if (isKnownNonNegativeInLoop(IndVarStart, &L, SE) &&
|
||||
isKnownNonNegativeInLoop(RightSCEV, &L, SE))
|
||||
Pred = ICmpInst::ICMP_ULT;
|
||||
else
|
||||
Pred = ICmpInst::ICMP_SLT;
|
||||
|
@ -55,7 +55,7 @@ for.inc:
|
||||
; CHECK-LABEL: test_inc_ne
|
||||
; CHECK: main.exit.selector:
|
||||
; CHECK: [[PSEUDO_PHI:%[^ ]+]] = phi i32 [ %inc, %for.inc ]
|
||||
; CHECK: [[COND:%[^ ]+]] = icmp slt i32 [[PSEUDO_PHI]], %N
|
||||
; CHECK: [[COND:%[^ ]+]] = icmp ult i32 [[PSEUDO_PHI]], %N
|
||||
; CHECK: br i1 [[COND]], label %main.pseudo.exit, label %for.cond.cleanup.loopexit
|
||||
define void @test_inc_ne(i32* nocapture %a, i32* nocapture readonly %b, i32* nocapture readonly %c, i32 %N) {
|
||||
entry:
|
||||
|
Loading…
Reference in New Issue
Block a user