summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-05-06 18:06:38 +0000
committerChris Lattner <sabre@nondot.org>2002-05-06 18:06:38 +0000
commitbbbdd852b86c0ad8689f87130637bac99a8e047a (patch)
tree6ee681d00285dce5390da870b740aebbdaa0c894 /llvm/lib/Transforms
parenta9c099d1d2c14d1465a70a0988f1c5de5f382bfa (diff)
downloadbcm5719-llvm-bbbdd852b86c0ad8689f87130637bac99a8e047a.tar.gz
bcm5719-llvm-bbbdd852b86c0ad8689f87130637bac99a8e047a.zip
Handle X = phi Y --> X = Y
llvm-svn: 2501
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/InstructionCombining.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
index 0c089120ead..5b9f31892ea 100644
--- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -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
OpenPOWER on IntegriCloud