Teach cee to propagate through switch statements. This implements
authorChris Lattner <sabre@nondot.org>
Sun, 19 Mar 2006 19:37:24 +0000 (19:37 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 19 Mar 2006 19:37:24 +0000 (19:37 +0000)
Transforms/CorrelatedExprs/switch.ll

Patch contributed by Eric Kidd!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26872 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/CorrelatedExprs.cpp

index 3da7e6e2df572da6701c71c289f898b42223b28b..feae636dfec3163367514b2494f676538f01bfa1 100644 (file)
@@ -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.
 //