Temporarily revert r61019, r61030, and r61040. These were breaking LLVM Release
authorBill Wendling <isanbard@gmail.com>
Tue, 16 Dec 2008 19:06:48 +0000 (19:06 +0000)
committerBill Wendling <isanbard@gmail.com>
Tue, 16 Dec 2008 19:06:48 +0000 (19:06 +0000)
builds.

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

docs/AliasAnalysis.html
docs/LangRef.html
include/llvm/Attributes.h
lib/Analysis/BasicAliasAnalysis.cpp
lib/AsmParser/LLLexer.cpp
lib/AsmParser/llvmAsmParser.y
lib/Bitcode/Reader/BitcodeReader.cpp
lib/Bitcode/Writer/BitcodeWriter.cpp
lib/VMCore/Attributes.cpp
test/Analysis/BasicAA/nocapture.ll

index 97a813344d894dea99fa9489ee2a02136ee82f96..1569fb8e688ca71df0ff5968d4761ea7b3dc0864 100644 (file)
@@ -192,11 +192,11 @@ and returns MustAlias, MayAlias, or NoAlias as appropriate.
 
 <div class="doc_text">
 <p>The NoAlias response is used when the two pointers refer to distinct objects,
-regardless of whether the pointers compare equal.  For example, freed pointers
-don't alias any pointers that were allocated afterwards.  As a degenerate case,
-pointers returned by malloc(0) have no bytes for an object, and are considered
-NoAlias even when malloc returns the same pointer.  The same rule applies to
-NULL pointers.</p>
+even regardless of whether the pointers compare equal.  For example, freed
+pointers don't alias any pointers that were allocated afterwards.  As a
+degenerate case, pointers returned by malloc(0) have no bytes for an object,
+and are considered NoAlias even when malloc returns the same pointer.  The same
+rule applies to NULL pointers.</p>
 
 <p>The MayAlias response is used whenever the two pointers might refer to the
 same object.  If the two memory objects overlap, but do not start at the same
index 95fb8de319bca7704d55e0d4d916c9fd7f9fbd5c..83bd667fac30e2f2356813300b73a9cd47dfaca2 100644 (file)
@@ -894,15 +894,9 @@ declare signext i8 @returns_signed_char()
     parameter.  The caller is responsible for ensuring that this is the
     case. On a function return value, <tt>noalias</tt> additionally indicates
     that the pointer does not alias any other pointers visible to the
-    caller. For further details, please see the discussion of the NoAlias
-    response in
-    <a href="http://llvm.org/docs/AliasAnalysis.html#MustMayNo">alias
-    analysis</a>.</dd>
-
-    <dt><tt>nocapture</tt></dt>
-    <dd>This indicates that the callee does not make any copies of the pointer
-    that outlive the callee itself. This is not a valid attribute for return
-    values.</dd>
+    caller. Note that this applies only to pointers that can be used to actually
+    load/store a value: NULL, unique pointers from malloc(0), and freed pointers
+    are considered to not alias anything.</dd>
 
     <dt><tt>nest</tt></dt>
     <dd>This indicates that the pointer parameter can be excised using the
index 2b70596b33d22d27f35f71c10f6992238a857e45..57f4e17c47fea25ad2615d0f4d7cfeec9d773321 100644 (file)
@@ -15,7 +15,6 @@
 #ifndef LLVM_ATTRIBUTES_H
 #define LLVM_ATTRIBUTES_H
 
-#include "llvm/Support/MathExtras.h"
 #include <cassert>
 #include <string>
 
@@ -24,7 +23,7 @@ class Type;
 
 /// Attributes - A bitset of attributes.
 typedef unsigned Attributes;
-
+  
 namespace Attribute {
 
 /// Function parameters and results can have attributes to indicate how they 
@@ -45,18 +44,16 @@ const Attributes ByVal     = 1<<7;  ///< Pass structure by value
 const Attributes Nest      = 1<<8;  ///< Nested function static chain
 const Attributes ReadNone  = 1<<9;  ///< Function does not access memory
 const Attributes ReadOnly  = 1<<10; ///< Function only reads from memory
-const Attributes NoInline        = 1<<11; ///< inline=never 
-const Attributes AlwaysInline    = 1<<12; ///< inline=always
-const Attributes OptimizeForSize = 1<<13; ///< opt_size
-const Attributes StackProtect    = 1<<14; ///< Stack protection.
-const Attributes StackProtectReq = 1<<15; ///< Stack protection required.
-const Attributes Alignment = 31<<16; ///< Alignment of parameter (5 bits)
-                                     // stored as log2 of alignment with +1 bias
-                                     // 0 means unaligned different from align 1
-const Attributes NoCapture = 1<<21; ///< Function creates no aliases of pointer
-
+const Attributes NoInline        = 1<<11; // inline=never 
+const Attributes AlwaysInline    = 1<<12; // inline=always
+const Attributes OptimizeForSize = 1<<13; // opt_size
+const Attributes StackProtect    = 1<<14; // Stack protection.
+const Attributes StackProtectReq = 1<<15; // Stack protection required.
+const Attributes Alignment = 0xffff<<16; ///< Alignment of parameter (16 bits)
+                                    // 0 = unknown, else in clear (not log)
+                                    
 /// @brief Attributes that only apply to function parameters.
-const Attributes ParameterOnly = ByVal | Nest | StructRet | NoCapture;
+const Attributes ParameterOnly = ByVal | Nest | StructRet;
 
 /// @brief Attributes that only apply to function.
 const Attributes FunctionOnly = NoReturn | NoUnwind | ReadNone | ReadOnly | 
@@ -67,7 +64,7 @@ const Attributes VarArgsIncompatible = StructRet;
 
 /// @brief Attributes that are mutually incompatible.
 const Attributes MutuallyIncompatible[4] = {
-  ByVal | InReg | Nest | StructRet,
+  ByVal | InReg | Nest  | StructRet,
   ZExt  | SExt,
   ReadNone | ReadOnly,
   NoInline | AlwaysInline
@@ -79,9 +76,7 @@ Attributes typeIncompatible(const Type *Ty);
 /// This turns an int alignment (a power of 2, normally) into the
 /// form used internally in Attributes.
 inline Attributes constructAlignmentFromInt(unsigned i) {
-  assert(isPowerOf2_32(i) && "Alignment must be a power of two.");
-  assert(i <= 0x40000000 && "Alignment too large.");
-  return (Log2_32(i)+1) << 16;
+  return (i << 16);
 }
 
 /// The set of Attributes set in Attributes is converted to a
@@ -180,7 +175,7 @@ public:
   /// getParamAlignment - Return the alignment for the specified function
   /// parameter.
   unsigned getParamAlignment(unsigned Idx) const {
-    return 1ull << (((getAttributes(Idx) & Attribute::Alignment) >> 16) - 1);
+    return (getAttributes(Idx) & Attribute::Alignment) >> 16;
   }
   
   /// hasAttrSomewhere - Return true if the specified attribute is set for at
index 57d320971dbef17b0b9e3dba382f67bc4cb825c4..3270f35ac411d9cf7b3f25668d196b69a99c6f8d 100644 (file)
@@ -63,23 +63,12 @@ static bool AddressMightEscape(const Value *V) {
       // callees could modify it.
       break; // next use
     case Instruction::Call:
-      // If the argument to the call has the nocapture attribute, then the call
-      // may store or load to the pointer, but it cannot escape.
-      if (cast<CallInst>(I)->paramHasAttr(UI.getOperandNo(), 
-                                          Attribute::NoCapture))
-        continue;
-
-      // FIXME: MemIntrinsics should have their operands marked nocapture!
-      if (isa<MemIntrinsic>(I))
-        continue;  // next use
-      return true;
-    case Instruction::Invoke:
-      // If the argument to the call has the nocapture attribute, then the call
-      // may store or load to the pointer, but it cannot escape.
-      if (cast<InvokeInst>(I)->paramHasAttr(UI.getOperandNo()-2,
-                                            Attribute::NoCapture))
-        continue;
-      return true;
+      // If the call is to a few known safe intrinsics, we know that it does
+      // not escape.
+      // TODO: Eventually just check the 'nocapture' attribute.
+      if (!isa<MemIntrinsic>(I))
+        return true;
+      break;  // next use
     default:
       return true;
     }
index b8f497a5e90d22198bf6c5423758e2147a5752e9..20b2b888b1f1f29a3132570c6b569bc3b520efed 100644 (file)
@@ -491,7 +491,6 @@ int LLLexer::LexIdentifier() {
   KEYWORD("nounwind", NOUNWIND);
   KEYWORD("noreturn", NORETURN);
   KEYWORD("noalias", NOALIAS);
-  KEYWORD("nocapture", NOCAPTURE);
   KEYWORD("byval", BYVAL);
   KEYWORD("nest", NEST);
   KEYWORD("readnone", READNONE);
index 7028ea3fe0d2564a69ced084bc41219a5da50e98..8b54251c6589253a20d8350c0321136e7edeefb2 100644 (file)
@@ -1136,8 +1136,8 @@ Module *llvm::RunVMAsmParser(llvm::MemoryBuffer *MB) {
 %token <OtherOpVal> EXTRACTVALUE INSERTVALUE
 
 // Function Attributes
-%token SIGNEXT ZEROEXT NORETURN INREG SRET NOUNWIND NOALIAS NOCAPTURE BYVAL
-%token READNONE READONLY GC OPTSIZE NOINLINE ALWAYSINLINE SSP SSPREQ NEST
+%token SIGNEXT ZEROEXT NORETURN INREG SRET NOUNWIND NOALIAS BYVAL NEST
+%token READNONE READONLY GC OPTSIZE NOINLINE ALWAYSINLINE SSP SSPREQ
 
 // Visibility Styles
 %token DEFAULT HIDDEN PROTECTED
@@ -1265,16 +1265,15 @@ OptCallingConv : /*empty*/          { $$ = CallingConv::C; } |
                   CHECK_FOR_ERROR
                  };
 
-Attribute     : ZEROEXT   { $$ = Attribute::ZExt;      }
-              | ZEXT      { $$ = Attribute::ZExt;      }
-              | SIGNEXT   { $$ = Attribute::SExt;      }
-              | SEXT      { $$ = Attribute::SExt;      }
-              | INREG     { $$ = Attribute::InReg;     }
-              | SRET      { $$ = Attribute::StructRet; }
-              | NOALIAS   { $$ = Attribute::NoAlias;   }
-              | NOCAPTURE { $$ = Attribute::NoCapture; }
-              | BYVAL     { $$ = Attribute::ByVal;     }
-              | NEST      { $$ = Attribute::Nest;      }
+Attribute     : ZEROEXT { $$ = Attribute::ZExt;      }
+              | ZEXT    { $$ = Attribute::ZExt;      }
+              | SIGNEXT { $$ = Attribute::SExt;      }
+              | SEXT    { $$ = Attribute::SExt;      }
+              | INREG   { $$ = Attribute::InReg;     }
+              | SRET    { $$ = Attribute::StructRet; }
+              | NOALIAS { $$ = Attribute::NoAlias;   }
+              | BYVAL   { $$ = Attribute::ByVal;     }
+              | NEST    { $$ = Attribute::Nest;      }
               | ALIGN EUINT64VAL { $$ =
                           Attribute::constructAlignmentFromInt($2);    }
               ;
@@ -1332,8 +1331,6 @@ OptAlign : /*empty*/        { $$ = 0; } |
   $$ = $2;
   if ($$ != 0 && !isPowerOf2_32($$))
     GEN_ERROR("Alignment must be a power of two");
-  if ($$ > 0x40000000)
-    GEN_ERROR("Alignment too large");
   CHECK_FOR_ERROR
 };
 OptCAlign : /*empty*/            { $$ = 0; } |
@@ -1341,8 +1338,6 @@ OptCAlign : /*empty*/            { $$ = 0; } |
   $$ = $3;
   if ($$ != 0 && !isPowerOf2_32($$))
     GEN_ERROR("Alignment must be a power of two");
-  if ($$ > 0x40000000)
-    GEN_ERROR("Alignment too large");
   CHECK_FOR_ERROR
 };
 
@@ -1372,8 +1367,6 @@ GlobalVarAttribute : SectionString {
   | ALIGN EUINT64VAL {
     if ($2 != 0 && !isPowerOf2_32($2))
       GEN_ERROR("Alignment must be a power of two");
-    if ($2 > 0x40000000)
-      GEN_ERROR("Alignment too large");
     CurGV->setAlignment($2);
     CHECK_FOR_ERROR
   };
index 2d994d4b13d03d71bab25d111a0d0e2bfacec3b5..f06c61de41594bfb1e8cb2142f1c67742f6ea2d9 100644 (file)
@@ -362,20 +362,6 @@ bool BitcodeReader::ParseAttributeBlock() {
       Attributes RetAttribute = Attribute::None;
       Attributes FnAttribute = Attribute::None;
       for (unsigned i = 0, e = Record.size(); i != e; i += 2) {
-        // FIXME: remove in LLVM 3.0
-        // The alignment is stored as a 16-bit raw value from bits 31--16.
-        // We shift the bits above 31 down by 11 bits.
-
-        unsigned Alignment = (Record[i+1] & (0xffffull << 16)) >> 16;
-        if (Alignment && !isPowerOf2_32(Alignment))
-          return Error("Alignment is not a power of two.");
-
-        Attributes ReconstitutedAttr = Record[i+1] & 0xffff;
-        if (Alignment)
-          ReconstitutedAttr |= Attribute::constructAlignmentFromInt(Alignment);
-        ReconstitutedAttr |= (Record[i+1] & (0xffffull << 32)) >> 11;
-        Record[i+1] = ReconstitutedAttr;
-
         if (Record[i] == 0)
           RetAttribute = Record[i+1];
         else if (Record[i] == ~0U)
index adf49a524a38d83552036fbaac81a029b007785e..279e447873cab76fc90b4097f95d852e64366816 100644 (file)
@@ -122,17 +122,7 @@ static void WriteAttributeTable(const ValueEnumerator &VE,
     for (unsigned i = 0, e = A.getNumSlots(); i != e; ++i) {
       const AttributeWithIndex &PAWI = A.getSlot(i);
       Record.push_back(PAWI.Index);
-
-      // FIXME: remove in LLVM 3.0
-      // Store the alignment in the bitcode as a 16-bit raw value instead of a
-      // 5-bit log2 encoded value. Shift the bits above the alignment up by
-      // 11 bits.
-      uint64_t FauxAttr = PAWI.Attrs & 0xffff;
-      if (PAWI.Attrs & Attribute::Alignment)
-        FauxAttr |= (1ull<<16)<<(((PAWI.Attrs & Attribute::Alignment)-1) >> 16);
-      FauxAttr |= (PAWI.Attrs & (0x3FFull << 21)) << 11;
-
-      Record.push_back(FauxAttr);
+      Record.push_back(PAWI.Attrs);
     }
     
     Stream.EmitRecord(bitc::PARAMATTR_CODE_ENTRY, Record);
index dd47814d97ad971cecd4be5c751aa85870a93aaf..92acc111be952f21ddcc3b2570c525492ceb7757 100644 (file)
@@ -37,8 +37,6 @@ std::string Attribute::getAsString(Attributes Attrs) {
     Result += "inreg ";
   if (Attrs & Attribute::NoAlias)
     Result += "noalias ";
-  if (Attrs & Attribute::NoCapture)
-    Result += "nocapture ";
   if (Attrs & Attribute::StructRet)
     Result += "sret ";  
   if (Attrs & Attribute::ByVal)
@@ -61,11 +59,10 @@ std::string Attribute::getAsString(Attributes Attrs) {
     Result += "sspreq ";
   if (Attrs & Attribute::Alignment) {
     Result += "align ";
-    Result += utostr(1ull << (((Attrs & Attribute::Alignment)>>16) - 1));
+    Result += utostr((Attrs & Attribute::Alignment) >> 16);
     Result += " ";
   }
   // Trim the trailing space.
-  assert(!Result.empty() && "Unknown attribute!");
   Result.erase(Result.end()-1);
   return Result;
 }
@@ -79,7 +76,7 @@ Attributes Attribute::typeIncompatible(const Type *Ty) {
   
   if (!isa<PointerType>(Ty))
     // Attributes that only apply to pointers.
-    Incompatible |= ByVal | Nest | NoAlias | StructRet | NoCapture;
+    Incompatible |= ByVal | Nest | NoAlias | StructRet;
   
   return Incompatible;
 }
index aa4c7f194cd1bcf7cb3bee5c82afca4ffc16224a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,13 +0,0 @@
-; RUN: llvm-as < %s | opt -basicaa -gvn -instcombine | llvm-dis | grep {ret i32 0}
-
-declare i32* @test(i32* nocapture)
-
-define i32 @test2() {
-       %P = alloca i32
-       %Q = call i32* @test(i32* %P)
-       %a = load i32* %P
-       store i32 4, i32* %Q   ;; cannot clobber P since it is nocapture.
-       %b = load i32* %P
-       %c = sub i32 %a, %b
-       ret i32 %c
-}