Fix for bug 1996: optimize out loads of undef. This code basically just
authorEli Friedman <eli.friedman@gmail.com>
Tue, 12 Feb 2008 12:08:14 +0000 (12:08 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 12 Feb 2008 12:08:14 +0000 (12:08 +0000)
checks for a malloc/alloca immediately followed by a load.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47006 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/GVN.cpp

index 42d7a939705c46ab311e9631b6e8d5854d75bc74..69f06909f6c0de8834946dd44da6601b49bb74ee 100644 (file)
@@ -1010,7 +1010,34 @@ bool GVN::processLoad(LoadInst* L,
       dep = MD.getDependency(L, dep);
     }
   }
-  
+
+  if (dep != MemoryDependenceAnalysis::None &&
+      dep != MemoryDependenceAnalysis::NonLocal &&
+      isa<AllocationInst>(dep)) {
+    // Check that this load is actually from the
+    // allocation we found
+    Value* v = L->getOperand(0);
+    while (true) {
+      if (BitCastInst *BC = dyn_cast<BitCastInst>(v))
+        v = BC->getOperand(0);
+      else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(v))
+        v = GEP->getOperand(0);
+      else
+        break;
+    }
+    if (v == dep) {
+      // If this load depends directly on an allocation, there isn't
+      // anything stored there; therefore, we can optimize this load
+      // to undef.
+      MD.removeInstruction(L);
+
+      L->replaceAllUsesWith(UndefValue::get(L->getType()));
+      toErase.push_back(L);
+      deletedLoad = true;
+      NumGVNLoad++;
+    }
+  }
+
   if (!deletedLoad)
     last = L;