Handle X = phi Y --> X = Y
authorChris Lattner <sabre@nondot.org>
Mon, 6 May 2002 18:06:38 +0000 (18:06 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 6 May 2002 18:06:38 +0000 (18:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2501 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 0c089120eadb056fcb2e0d65ea8a14191df9e477..5b9f31892ea2c31574ab8680392998b87ca9bd84 100644 (file)
@@ -19,6 +19,7 @@
 #include "llvm/ConstantHandling.h"
 #include "llvm/iMemory.h"
 #include "llvm/iOther.h"
+#include "llvm/iPHINode.h"
 #include "llvm/iOperators.h"
 #include "llvm/Pass.h"
 #include "llvm/Support/InstIterator.h"
@@ -69,6 +70,7 @@ namespace {
     Instruction *visitSetCondInst(BinaryOperator *I);
     Instruction *visitShiftInst(Instruction *I);
     Instruction *visitCastInst(CastInst *CI);
+    Instruction *visitPHINode(PHINode *PN);
     Instruction *visitGetElementPtrInst(GetElementPtrInst *GEP);
     Instruction *visitMemAccessInst(MemAccessInst *MAI);
 
@@ -412,6 +414,8 @@ static inline bool isEliminableCastOfCast(const CastInst *CI,
 // CastInst simplification
 //
 Instruction *InstCombiner::visitCastInst(CastInst *CI) {
+  if (CI->use_empty()) return 0;       // Don't fix dead instructions...
+
   // If the user is casting a value to the same type, eliminate this cast
   // instruction...
   if (CI->getType() == CI->getOperand(0)->getType() && !CI->use_empty()) {
@@ -436,6 +440,21 @@ Instruction *InstCombiner::visitCastInst(CastInst *CI) {
 }
 
 
+// PHINode simplification
+//
+Instruction *InstCombiner::visitPHINode(PHINode *PN) {
+  if (PN->use_empty()) return 0;       // Don't fix dead instructions...
+
+  // If the PHI node only has one incoming value, eliminate the PHI node...
+  if (PN->getNumIncomingValues() == 1) {
+    AddUsesToWorkList(PN);         // Add all modified instrs to worklist
+    PN->replaceAllUsesWith(PN->getIncomingValue(0));
+    return PN;
+  }
+
+  return 0;
+}
+
 
 Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst *GEP) {
   // Is it getelementptr %P, uint 0