diff options
author | Chris Lattner <sabre@nondot.org> | 2006-03-19 19:37:24 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-03-19 19:37:24 +0000 |
commit | d783c76c1821908fd7dae98b736123c8da24d7cb (patch) | |
tree | 1050007334d85f7bb288cae2a645de576d020f28 | |
parent | 2a028e2f95d73236681671e14f04b9d72566cd99 (diff) | |
download | bcm5719-llvm-d783c76c1821908fd7dae98b736123c8da24d7cb.tar.gz bcm5719-llvm-d783c76c1821908fd7dae98b736123c8da24d7cb.zip |
Teach cee to propagate through switch statements. This implements
Transforms/CorrelatedExprs/switch.ll
Patch contributed by Eric Kidd!
llvm-svn: 26872
-rw-r--r-- | llvm/lib/Transforms/Scalar/CorrelatedExprs.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/CorrelatedExprs.cpp b/llvm/lib/Transforms/Scalar/CorrelatedExprs.cpp index 3da7e6e2df5..feae636dfec 100644 --- a/llvm/lib/Transforms/Scalar/CorrelatedExprs.cpp +++ b/llvm/lib/Transforms/Scalar/CorrelatedExprs.cpp @@ -267,6 +267,7 @@ namespace { const std::vector<BasicBlock*> &RegionExitBlocks); void PropagateBranchInfo(BranchInst *BI); + void PropagateSwitchInfo(SwitchInst *SI); void PropagateEquality(Value *Op0, Value *Op1, RegionInfo &RI); void PropagateRelation(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, RegionInfo &RI); @@ -360,9 +361,12 @@ bool CEE::TransformRegion(BasicBlock *BB, std::set<BasicBlock*> &VisitedBlocks){ // Now that all of our successors have information if they deserve it, // propagate any information our terminator instruction finds to our // successors. - if (BranchInst *BI = dyn_cast<BranchInst>(TI)) + if (BranchInst *BI = dyn_cast<BranchInst>(TI)) { if (BI->isConditional()) PropagateBranchInfo(BI); + } else if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) { + PropagateSwitchInfo(SI); + } // If this is a branch to a block outside our region that simply performs // another conditional branch, one whose outcome is known inside of this @@ -794,6 +798,22 @@ void CEE::PropagateBranchInfo(BranchInst *BI) { } +// PropagateSwitchInfo - We need to propagate the value tested by the +// switch statement through each case block. +// +void CEE::PropagateSwitchInfo(SwitchInst *SI) { + // Propagate information down each of our non-default case labels. We + // don't yet propagate information down the default label, because a + // potentially large number of inequality constraints provide less + // benefit per unit work than a single equality constraint. + // + Value *cond = SI->getCondition(); + for (unsigned i = 1; i < SI->getNumSuccessors(); ++i) + PropagateEquality(cond, SI->getSuccessorValue(i), + getRegionInfo(SI->getSuccessor(i))); +} + + // PropagateEquality - If we discover that two values are equal to each other in // a specified region, propagate this knowledge recursively. // |