[llvm-commits] CVS: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
Chris Lattner
lattner at cs.uiuc.edu
Tue Feb 14 17:44:53 PST 2006
Changes in directory llvm/lib/Transforms/Scalar:
LoopUnswitch.cpp updated: 1.19 -> 1.20
---
Log message:
more refactoring, no functionality change.
---
Diffs of the changes: (+11 -12)
LoopUnswitch.cpp | 23 +++++++++++------------
1 files changed, 11 insertions(+), 12 deletions(-)
Index: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
diff -u llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.19 llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.20
--- llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.19 Tue Feb 14 18:07:43 2006
+++ llvm/lib/Transforms/Scalar/LoopUnswitch.cpp Tue Feb 14 19:44:42 2006
@@ -77,7 +77,7 @@
BasicBlock *SplitEdge(BasicBlock *From, BasicBlock *To);
void RewriteLoopBodyWithConditionConstant(Loop *L, Value *LIC,Constant *Val,
bool isEqual);
- void UnswitchTrivialCondition(Loop *L, Value *Cond, bool EntersLoopOnCond,
+ void UnswitchTrivialCondition(Loop *L, Value *Cond, Constant *Val,
BasicBlock *ExitBlock);
};
RegisterOpt<LoopUnswitch> X("loop-unswitch", "Unswitch loops");
@@ -154,7 +154,7 @@
/// runs when the condition is true, False if the loop body executes when the
/// condition is false. Otherwise, return null to indicate a complex condition.
static bool IsTrivialUnswitchCondition(Loop *L, Value *Cond,
- bool *CondEntersLoop = 0,
+ Constant **Val = 0,
BasicBlock **LoopExit = 0) {
BasicBlock *Header = L->getHeader();
BranchInst *HeaderTerm = dyn_cast<BranchInst>(Header->getTerminator());
@@ -170,9 +170,9 @@
// the loop.
BasicBlock *Latch = L->getLoopLatch();
if (HeaderTerm->getSuccessor(1) == Latch) {
- if (CondEntersLoop) *CondEntersLoop = true;
+ if (Val) *Val = ConstantBool::True;
} else if (HeaderTerm->getSuccessor(0) == Latch)
- if (CondEntersLoop) *CondEntersLoop = false;
+ if (Val) *Val = ConstantBool::False;
else
return false; // Doesn't branch to latch block.
@@ -333,10 +333,10 @@
// If this is a trivial condition to unswitch (which results in no code
// duplication), do it now.
- bool EntersLoopOnCond;
+ Constant *CondVal;
BasicBlock *ExitBlock;
- if (IsTrivialUnswitchCondition(L, LoopCond, &EntersLoopOnCond, &ExitBlock)){
- UnswitchTrivialCondition(L, LoopCond, EntersLoopOnCond, ExitBlock);
+ if (IsTrivialUnswitchCondition(L, LoopCond, &CondVal, &ExitBlock)){
+ UnswitchTrivialCondition(L, LoopCond, CondVal, ExitBlock);
NewLoop1 = L;
} else {
VersionLoop(LoopCond, Val, L, NewLoop1, NewLoop2);
@@ -460,7 +460,7 @@
/// side-effects), unswitch it. This doesn't involve any code duplication, just
/// moving the conditional branch outside of the loop and updating loop info.
void LoopUnswitch::UnswitchTrivialCondition(Loop *L, Value *Cond,
- bool EnterOnCond,
+ Constant *Val,
BasicBlock *ExitBlock) {
DEBUG(std::cerr << "loop-unswitch: Trivial-Unswitch loop %"
<< L->getHeader()->getName() << " [" << L->getBlocks().size()
@@ -484,15 +484,14 @@
// Okay, now we have a position to branch from and a position to branch to,
// insert the new conditional branch.
- new BranchInst(EnterOnCond ? NewPH : NewExit, EnterOnCond ? NewExit : NewPH,
- Cond, OrigPH->getTerminator());
+ EmitPreheaderBranchOnCondition(Cond, Val, NewPH, NewExit,
+ OrigPH->getTerminator());
OrigPH->getTerminator()->eraseFromParent();
// Now that we know that the loop is never entered when this condition is a
// particular value, rewrite the loop with this info. We know that this will
// at least eliminate the old branch.
- RewriteLoopBodyWithConditionConstant(L, Cond, ConstantBool::get(EnterOnCond),
- true);
+ RewriteLoopBodyWithConditionConstant(L, Cond, Val, true);
++NumTrivial;
}
More information about the llvm-commits
mailing list