diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index 5073f8fde27..dc141d5b54e 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -175,13 +175,13 @@ private: hash_map::iterator I = ValueState.find(V); if (I != ValueState.end()) return I->second; // Common case, in the map - if (Constant *CPV = dyn_cast(V)) { // Constants are constant + if (GlobalValue *GV = dyn_cast(V)) { + // The address of a global is a constant... + ValueState[V].markConstant(GV); + } else if (Constant *CPV = dyn_cast(V)) { // Constants are constant ValueState[CPV].markConstant(CPV); } else if (isa(V)) { // Arguments are overdefined ValueState[V].markOverdefined(); - } else if (GlobalValue *GV = dyn_cast(V)) { - // The address of a global is a constant... - ValueState[V].markConstant(ConstantPointerRef::get(GV)); } // All others are underdefined by default... return ValueState[V]; @@ -784,9 +784,6 @@ void SCCP::visitLoadInst(LoadInst &I) { return; } - if (ConstantPointerRef *CPR = dyn_cast(Ptr)) - Ptr = CPR->getValue(); - // Transform load (constant global) into the value loaded. if (GlobalVariable *GV = dyn_cast(Ptr)) if (GV->isConstant() && !GV->isExternal()) { @@ -797,15 +794,13 @@ void SCCP::visitLoadInst(LoadInst &I) { // Transform load (constantexpr_GEP global, 0, ...) into the value loaded. if (ConstantExpr *CE = dyn_cast(Ptr)) if (CE->getOpcode() == Instruction::GetElementPtr) - if (ConstantPointerRef *G - = dyn_cast(CE->getOperand(0))) - if (GlobalVariable *GV = dyn_cast(G->getValue())) - if (GV->isConstant() && !GV->isExternal()) - if (Constant *V = - GetGEPGlobalInitializer(GV->getInitializer(), CE)) { - markConstant(IV, &I, V); - return; - } + if (GlobalVariable *GV = dyn_cast(CE->getOperand(0))) + if (GV->isConstant() && !GV->isExternal()) + if (Constant *V = + GetGEPGlobalInitializer(GV->getInitializer(), CE)) { + markConstant(IV, &I, V); + return; + } } // Otherwise we cannot say for certain what value this load will produce.