[llvm] r288759 - Revert "[SCCP] Remove manual folding of terminator instructions."

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 5 18:26:51 PST 2016


Author: davide
Date: Mon Dec  5 20:26:50 2016
New Revision: 288759

URL: http://llvm.org/viewvc/llvm-project?rev=288759&view=rev
Log:
Revert "[SCCP] Remove manual folding of terminator instructions."

This reverts commit r288725 as it broke a bot.

Modified:
    llvm/trunk/lib/Transforms/Scalar/SCCP.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SCCP.cpp?rev=288759&r1=288758&r2=288759&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SCCP.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SCCP.cpp Mon Dec  5 20:26:50 2016
@@ -1828,8 +1828,33 @@ static bool runIPSCCP(Module &M, const D
         // Ignore blockaddress users; BasicBlock's dtor will handle them.
         if (!I) continue;
 
-        assert(ConstantFoldTerminator(I->getParent()) &&
-          "Terminator should've been folded");
+        bool Folded = ConstantFoldTerminator(I->getParent());
+        if (!Folded) {
+          // The constant folder may not have been able to fold the terminator
+          // if this is a branch or switch on undef.  Fold it manually as a
+          // branch to the first successor.
+#ifndef NDEBUG
+          if (auto *BI = dyn_cast<BranchInst>(I)) {
+            assert(BI->isConditional() && isa<UndefValue>(BI->getCondition()) &&
+                   "Branch should be foldable!");
+          } else if (auto *SI = dyn_cast<SwitchInst>(I)) {
+            assert(isa<UndefValue>(SI->getCondition()) && "Switch should fold");
+          } else {
+            llvm_unreachable("Didn't fold away reference to block!");
+          }
+#endif
+
+          // Make this an uncond branch to the first successor.
+          TerminatorInst *TI = I->getParent()->getTerminator();
+          BranchInst::Create(TI->getSuccessor(0), TI);
+
+          // Remove entries in successor phi nodes to remove edges.
+          for (unsigned i = 1, e = TI->getNumSuccessors(); i != e; ++i)
+            TI->getSuccessor(i)->removePredecessor(TI->getParent());
+
+          // Remove the old terminator.
+          TI->eraseFromParent();
+        }
       }
 
       // Finally, delete the basic block.




More information about the llvm-commits mailing list