[llvm-commits] [llvm] r61580 - /llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp

Duncan Sands baldrick at free.fr
Fri Jan 2 07:16:39 PST 2009


Author: baldrick
Date: Fri Jan  2 09:16:38 2009
New Revision: 61580

URL: http://llvm.org/viewvc/llvm-project?rev=61580&view=rev
Log:
Load tracking means that the value analyzed may
not have pointer type.  In particular, it may
be the condition argument for a select or a GEP
index.  While I was unable to construct a testcase
for which some bits of the original pointer are
captured due to one of these, it's very very close
to being possible - so play safe and exclude these
possibilities.

Modified:
    llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp

Modified: llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp?rev=61580&r1=61579&r2=61580&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp Fri Jan  2 09:16:38 2009
@@ -198,6 +198,7 @@
     UseWithDepth UD = Worklist.pop_back_val();
     Use *U = UD.getPointer();
     Instruction *I = cast<Instruction>(U->getUser());
+    // The value V may have any type if it comes from tracking a load.
     V = U->get();
     // The depth represents the number of loads that need to be performed to
     // get back the original pointer (or a bitcast etc of it).  For example,
@@ -253,7 +254,10 @@
       // Only passed via 'nocapture' arguments, or is the called function - not
       // captured.
     } else if (isa<BitCastInst>(I) || isa<LoadInst>(I) || isa<PHINode>(I) ||
-               isa<GetElementPtrInst>(I) || isa<SelectInst>(I)) {
+               // Play safe and exclude GEP indices.
+               (isa<GetElementPtrInst>(I) && V == I->getOperand(0)) ||
+               // Play safe and exclude the select condition.
+               (isa<SelectInst>(I) && V != I->getOperand(0))) {
 
       // Usually loads can be ignored because they dereference the original
       // pointer.  However the loaded value needs to be tracked if loading
@@ -267,7 +271,9 @@
           continue;
         // Loading a pointer to (a pointer to...) the original pointer or a
         // variation of it.  Track uses of the loaded value, noting that one
-        // dereference was performed.
+        // dereference was performed.  Note that the loaded value need not be
+        // of pointer type.  For example, an alloca may have been bitcast to
+        // a pointer to another type, which was then loaded.
         --Depth;
       }
 





More information about the llvm-commits mailing list