mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[HardwareLoops] Change order of SCEV expression construction for InitLoopCount.
Putting the +1 before the zero-extend will allow scalar evolution to fold the expression in some cases such as the one shown in PowerPC's `shrink-wrap.ll` test. Reviewed By: samparker Differential Revision: https://reviews.llvm.org/D91724
This commit is contained in:
parent
973429439b
commit
96555c9f4f
@ -93,7 +93,7 @@ struct HardwareLoopInfo {
|
||||
Loop *L = nullptr;
|
||||
BasicBlock *ExitBlock = nullptr;
|
||||
BranchInst *ExitBranch = nullptr;
|
||||
const SCEV *ExitCount = nullptr;
|
||||
const SCEV *TripCount = nullptr;
|
||||
IntegerType *CountType = nullptr;
|
||||
Value *LoopDecrement = nullptr; // Decrement the loop counter by this
|
||||
// value in every iteration.
|
||||
|
@ -216,7 +216,11 @@ bool HardwareLoopInfo::isHardwareLoopCandidate(ScalarEvolution &SE,
|
||||
// Note that this block may not be the loop latch block, even if the loop
|
||||
// has a latch block.
|
||||
ExitBlock = BB;
|
||||
ExitCount = EC;
|
||||
TripCount = SE.getAddExpr(EC, SE.getOne(EC->getType()));
|
||||
|
||||
if (!EC->getType()->isPointerTy() && EC->getType() != CountType)
|
||||
TripCount = SE.getZeroExtendExpr(TripCount, CountType);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -187,7 +187,7 @@ namespace {
|
||||
const DataLayout &DL,
|
||||
OptimizationRemarkEmitter *ORE) :
|
||||
SE(SE), DL(DL), ORE(ORE), L(Info.L), M(L->getHeader()->getModule()),
|
||||
ExitCount(Info.ExitCount),
|
||||
TripCount(Info.TripCount),
|
||||
CountType(Info.CountType),
|
||||
ExitBranch(Info.ExitBranch),
|
||||
LoopDecrement(Info.LoopDecrement),
|
||||
@ -202,7 +202,7 @@ namespace {
|
||||
OptimizationRemarkEmitter *ORE = nullptr;
|
||||
Loop *L = nullptr;
|
||||
Module *M = nullptr;
|
||||
const SCEV *ExitCount = nullptr;
|
||||
const SCEV *TripCount = nullptr;
|
||||
Type *CountType = nullptr;
|
||||
BranchInst *ExitBranch = nullptr;
|
||||
Value *LoopDecrement = nullptr;
|
||||
@ -298,7 +298,7 @@ bool HardwareLoops::TryConvertLoop(HardwareLoopInfo &HWLoopInfo) {
|
||||
}
|
||||
|
||||
assert(
|
||||
(HWLoopInfo.ExitBlock && HWLoopInfo.ExitBranch && HWLoopInfo.ExitCount) &&
|
||||
(HWLoopInfo.ExitBlock && HWLoopInfo.ExitBranch && HWLoopInfo.TripCount) &&
|
||||
"Hardware Loop must have set exit info.");
|
||||
|
||||
BasicBlock *Preheader = L->getLoopPreheader();
|
||||
@ -383,18 +383,13 @@ Value *HardwareLoop::InitLoopCount() {
|
||||
// loop counter and tests that is not zero?
|
||||
|
||||
SCEVExpander SCEVE(SE, DL, "loopcnt");
|
||||
if (!ExitCount->getType()->isPointerTy() &&
|
||||
ExitCount->getType() != CountType)
|
||||
ExitCount = SE.getZeroExtendExpr(ExitCount, CountType);
|
||||
|
||||
ExitCount = SE.getAddExpr(ExitCount, SE.getOne(CountType));
|
||||
|
||||
// If we're trying to use the 'test and set' form of the intrinsic, we need
|
||||
// to replace a conditional branch that is controlling entry to the loop. It
|
||||
// is likely (guaranteed?) that the preheader has an unconditional branch to
|
||||
// the loop header, so also check if it has a single predecessor.
|
||||
if (SE.isLoopEntryGuardedByCond(L, ICmpInst::ICMP_NE, ExitCount,
|
||||
SE.getZero(ExitCount->getType()))) {
|
||||
if (SE.isLoopEntryGuardedByCond(L, ICmpInst::ICMP_NE, TripCount,
|
||||
SE.getZero(TripCount->getType()))) {
|
||||
LLVM_DEBUG(dbgs() << " - Attempting to use test.set counter.\n");
|
||||
UseLoopGuard |= ForceGuardLoopEntry;
|
||||
} else
|
||||
@ -406,19 +401,19 @@ Value *HardwareLoop::InitLoopCount() {
|
||||
BasicBlock *Predecessor = BB->getSinglePredecessor();
|
||||
// If it's not safe to create a while loop then don't force it and create a
|
||||
// do-while loop instead
|
||||
if (!isSafeToExpandAt(ExitCount, Predecessor->getTerminator(), SE))
|
||||
if (!isSafeToExpandAt(TripCount, Predecessor->getTerminator(), SE))
|
||||
UseLoopGuard = false;
|
||||
else
|
||||
BB = Predecessor;
|
||||
}
|
||||
|
||||
if (!isSafeToExpandAt(ExitCount, BB->getTerminator(), SE)) {
|
||||
LLVM_DEBUG(dbgs() << "- Bailing, unsafe to expand ExitCount "
|
||||
<< *ExitCount << "\n");
|
||||
if (!isSafeToExpandAt(TripCount, BB->getTerminator(), SE)) {
|
||||
LLVM_DEBUG(dbgs() << "- Bailing, unsafe to expand TripCount "
|
||||
<< *TripCount << "\n");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Value *Count = SCEVE.expandCodeFor(ExitCount, CountType,
|
||||
Value *Count = SCEVE.expandCodeFor(TripCount, CountType,
|
||||
BB->getTerminator());
|
||||
|
||||
// FIXME: We've expanded Count where we hope to insert the counter setting
|
||||
|
@ -32,9 +32,7 @@ entry:
|
||||
; CHECK: std
|
||||
; CHECK: blt 0, .LBB0_3
|
||||
; CHECK: # %bb.1:
|
||||
; CHECK-NEXT: addi
|
||||
; CHECK-NEXT: clrldi
|
||||
; CHECK-NEXT: addi
|
||||
; CHECK-NEXT: mtctr
|
||||
; CHECK-NEXT: li
|
||||
; CHECK: .LBB0_2:
|
||||
|
Loading…
x
Reference in New Issue
Block a user