[SCCP] Can't go from overdefined to constant
[oota-llvm.git] / lib / Transforms / Scalar / SCCP.cpp
index 2fca803adde80b0a0b095ddda4d30a9551f86b86..c5e2e9f3f79921981b3dd3b37fa8a17f825e03a0 100644 (file)
@@ -1047,7 +1047,7 @@ void SCCPSolver::visitStoreInst(StoreInst &SI) {
 // global, we can replace the load with the loaded constant value!
 void SCCPSolver::visitLoadInst(LoadInst &I) {
   // If this load is of a struct, just mark the result overdefined.
-  if (I.getType()->isStructTy())
+  if (I.getType()->isStructTy() || I.getType()->isMMXTy())
     return markAnythingOverdefined(&I);
 
   LatticeVal PtrVal = getValueState(I.getOperand(0));
@@ -1061,9 +1061,9 @@ void SCCPSolver::visitLoadInst(LoadInst &I) {
 
   Constant *Ptr = PtrVal.getConstant();
 
-  // load null -> null
+  // load null is undefined.
   if (isa<ConstantPointerNull>(Ptr) && I.getPointerAddressSpace() == 0)
-    return markConstant(IV, &I, UndefValue::get(I.getType()));
+    return;
 
   // Transform load (constant global) into the value loaded.
   if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Ptr)) {