OSDN Git Service

Revert the rule that considers comparisons between two pointers in the
authorDan Gohman <gohman@apple.com>
Fri, 20 Nov 2009 17:50:21 +0000 (17:50 +0000)
committerDan Gohman <gohman@apple.com>
Fri, 20 Nov 2009 17:50:21 +0000 (17:50 +0000)
same object to be a non-capture; Duncan pointed out a way that such
a comparison could be a capture.

Make the rule that considers a comparison against null more specific,
and only consider noalias return values compared against null. This
still supports test/Transforms/GVN/nonescaping-malloc.ll, and is not
susceptible to the problem Duncan pointed out with noalias arguments.

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

lib/Analysis/CaptureTracking.cpp

index 1db9f2d..8364d81 100644 (file)
@@ -106,19 +106,14 @@ bool llvm::PointerMayBeCaptured(const Value *V,
       }
       break;
     case Instruction::ICmp:
-      // Don't count comparisons of the original value against null as captures.
-      // This allows us to ignore comparisons of malloc results with null,
-      // for example.
-      if (isIdentifiedObject(V))
+      // Don't count comparisons of a no-alias return value against null as
+      // captures. This allows us to ignore comparisons of malloc results
+      // with null, for example.
+      if (isNoAliasCall(V))
         if (ConstantPointerNull *CPN =
               dyn_cast<ConstantPointerNull>(I->getOperand(1)))
           if (CPN->getType()->getAddressSpace() == 0)
             break;
-      // Don't count comparisons of two pointers within the same object
-      // as captures.
-      if (I->getOperand(0)->getUnderlyingObject() ==
-          I->getOperand(1)->getUnderlyingObject())
-        break;
       // Otherwise, be conservative. There are crazy ways to capture pointers
       // using comparisons.
       return true;