Small improvement: if a function doesn't access memory, we don't need to scan
authorOwen Anderson <resistor@mac.com>
Wed, 8 Aug 2007 17:58:56 +0000 (17:58 +0000)
committerOwen Anderson <resistor@mac.com>
Wed, 8 Aug 2007 17:58:56 +0000 (17:58 +0000)
it for potentially undeading pointers.

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

lib/Transforms/Scalar/DeadStoreElimination.cpp

index 39a0aba2c95dd1d98e23658ef0fffc8248f0d8c9..bcf674ed37ff0ee02794c4c7b4decc9dd0385c8d 100644 (file)
@@ -287,6 +287,13 @@ bool DSE::handleEndBlock(BasicBlock& BB,
       deadPointers.erase(A);
       continue;
     } else if (CallSite::get(BBI).getInstruction() != 0) {
+      // If this call does not access memory, it can't
+      // be undeadifying any of our pointers.
+      CallSite CS = CallSite::get(BBI);
+      if (CS.getCalledFunction() &&
+          AA.doesNotAccessMemory(CS.getCalledFunction()))
+        continue;
+      
       // Remove any pointers made undead by the call from the dead set
       std::vector<Instruction*> dead;
       for (SmallPtrSet<AllocaInst*, 64>::iterator I = deadPointers.begin(),
@@ -298,8 +305,7 @@ bool DSE::handleEndBlock(BasicBlock& BB,
                         TD.getTypeSize((*I)->getAllocatedType());     
         
         // See if the call site touches it
-        AliasAnalysis::ModRefResult A = AA.getModRefInfo(CallSite::get(BBI),
-                                                         *I, pointerSize);
+        AliasAnalysis::ModRefResult A = AA.getModRefInfo(CS, *I, pointerSize);
         if (A == AliasAnalysis::ModRef || A == AliasAnalysis::Ref)
           dead.push_back(*I);
       }