This patch removes some of useless instructions generated by bitfield access.
authorJin-Gu Kang <jaykang10@imrc.kist.re.kr>
Sat, 12 Mar 2011 12:18:44 +0000 (12:18 +0000)
committerJin-Gu Kang <jaykang10@imrc.kist.re.kr>
Sat, 12 Mar 2011 12:18:44 +0000 (12:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127539 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp

index 35c1d91d501663566a2feea3492df8f17c08bb6c..f233ca6af1d22522fbb74a678f043cf7047b2a31 100644 (file)
@@ -429,9 +429,19 @@ Instruction *InstCombiner::visitStoreInst(StoreInst &SI) {
     // the pointer we're loading and is producing the pointer we're storing,
     // then *this* store is dead (X = load P; store X -> P).
     if (LoadInst *LI = dyn_cast<LoadInst>(BBI)) {
-      if (LI == Val && equivalentAddressValues(LI->getOperand(0), Ptr) &&
-          !SI.isVolatile())
-        return EraseInstFromFunction(SI);
+      if (equivalentAddressValues(LI->getOperand(0), Ptr) &&
+          !SI.isVolatile()) {
+        if (LI == Val)
+          return EraseInstFromFunction(SI);
+        if (Ptr->hasNUses(2)) {
+          if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Ptr)) {
+            if (isa<AllocaInst>(GEP->getOperand(0))) {
+              if (GEP->getOperand(0)->hasOneUse())
+                return EraseInstFromFunction(SI);
+            }
+          }
+        }
+      }
       
       // Otherwise, this is a load from some other location.  Stores before it
       // may not be dead.