[llvm-commits] [llvm] r61094 - in /llvm/trunk: 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 li

Nick Lewycky nicholas at mxc.ca
Thu Dec 18 22:39:54 PST 2008


Bill Wendling wrote:
> Hi Nick,
> 
> I tested this on my PPC machine and it works. Go ahead and submit it.
> Thanks for looking into this!

Done! Thanks for the testing!

Nick

> -bw
> 
> On Wed, Dec 17, 2008 at 9:04 PM, Nick Lewycky <nicholas at mxc.ca> wrote:
>> Hi Bill,
>>
>> I was never able to reproduce the problem, but I think I found the fix by
>> inspection. Would you please test out the attached patch?
>>
>> The bug was that constructAlignmentFromInt was asserting that its input was
>> a power of 2, which 0 is not. Zero is a valid alignment, and is explicitly
>> set by llvm-gcc when passing structs byval on OS X.
>>
>> Nick
>>
>> Bill Wendling wrote:
>>> Author: void
>>> Date: Tue Dec 16 13:06:48 2008
>>> New Revision: 61094
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=61094&view=rev
>>> Log:
>>> Temporarily revert r61019, r61030, and r61040. These were breaking LLVM
>>> Release
>>> builds.
>>>
>>> Modified:
>>>    llvm/trunk/docs/AliasAnalysis.html
>>>    llvm/trunk/docs/LangRef.html
>>>    llvm/trunk/include/llvm/Attributes.h
>>>    llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
>>>    llvm/trunk/lib/AsmParser/LLLexer.cpp
>>>    llvm/trunk/lib/AsmParser/llvmAsmParser.y
>>>    llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
>>>    llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
>>>    llvm/trunk/lib/VMCore/Attributes.cpp
>>>    llvm/trunk/test/Analysis/BasicAA/nocapture.ll
>>>
>>> Modified: llvm/trunk/docs/AliasAnalysis.html
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/AliasAnalysis.html?rev=61094&r1=61093&r2=61094&view=diff
>>>
>>>
>>> ==============================================================================
>>> --- llvm/trunk/docs/AliasAnalysis.html (original)
>>> +++ llvm/trunk/docs/AliasAnalysis.html Tue Dec 16 13:06:48 2008
>>> @@ -192,11 +192,11 @@
>>>   <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
>>>
>>> Modified: llvm/trunk/docs/LangRef.html
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=61094&r1=61093&r2=61094&view=diff
>>>
>>>
>>> ==============================================================================
>>> --- llvm/trunk/docs/LangRef.html (original)
>>> +++ llvm/trunk/docs/LangRef.html Tue Dec 16 13:06:48 2008
>>> @@ -894,15 +894,9 @@
>>>     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
>>>
>>> Modified: llvm/trunk/include/llvm/Attributes.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Attributes.h?rev=61094&r1=61093&r2=61094&view=diff
>>>
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Attributes.h (original)
>>> +++ llvm/trunk/include/llvm/Attributes.h Tue Dec 16 13:06:48 2008
>>> @@ -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 @@
>>>   /// 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 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 @@
>>>   /// @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 @@
>>>  /// 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 @@
>>>   /// 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
>>>
>>> Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=61094&r1=61093&r2=61094&view=diff
>>>
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Tue Dec 16 13:06:48
>>> 2008
>>> @@ -63,23 +63,12 @@
>>>       // 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;
>>>     }
>>>
>>> Modified: llvm/trunk/lib/AsmParser/LLLexer.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLLexer.cpp?rev=61094&r1=61093&r2=61094&view=diff
>>>
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/AsmParser/LLLexer.cpp (original)
>>> +++ llvm/trunk/lib/AsmParser/LLLexer.cpp Tue Dec 16 13:06:48 2008
>>> @@ -491,7 +491,6 @@
>>>   KEYWORD("nounwind", NOUNWIND);
>>>   KEYWORD("noreturn", NORETURN);
>>>   KEYWORD("noalias", NOALIAS);
>>> -  KEYWORD("nocapture", NOCAPTURE);
>>>   KEYWORD("byval", BYVAL);
>>>   KEYWORD("nest", NEST);
>>>   KEYWORD("readnone", READNONE);
>>>
>>> Modified: llvm/trunk/lib/AsmParser/llvmAsmParser.y
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/llvmAsmParser.y?rev=61094&r1=61093&r2=61094&view=diff
>>>
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/AsmParser/llvmAsmParser.y (original)
>>> +++ llvm/trunk/lib/AsmParser/llvmAsmParser.y Tue Dec 16 13:06:48 2008
>>> @@ -1136,8 +1136,8 @@
>>>  %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 @@
>>>                   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 @@
>>>   $$ = $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 @@
>>>   $$ = $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 @@
>>>   | 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
>>>   };
>>>
>>> Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=61094&r1=61093&r2=61094&view=diff
>>>
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
>>> +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Tue Dec 16 13:06:48
>>> 2008
>>> @@ -362,20 +362,6 @@
>>>       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)
>>>
>>> Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=61094&r1=61093&r2=61094&view=diff
>>>
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)
>>> +++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Tue Dec 16 13:06:48
>>> 2008
>>> @@ -122,17 +122,7 @@
>>>     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);
>>>
>>> Modified: llvm/trunk/lib/VMCore/Attributes.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Attributes.cpp?rev=61094&r1=61093&r2=61094&view=diff
>>>
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/VMCore/Attributes.cpp (original)
>>> +++ llvm/trunk/lib/VMCore/Attributes.cpp Tue Dec 16 13:06:48 2008
>>> @@ -37,8 +37,6 @@
>>>     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 @@
>>>     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 @@
>>>     if (!isa<PointerType>(Ty))
>>>     // Attributes that only apply to pointers.
>>> -    Incompatible |= ByVal | Nest | NoAlias | StructRet | NoCapture;
>>> +    Incompatible |= ByVal | Nest | NoAlias | StructRet;
>>>     return Incompatible;
>>>  }
>>>
>>> Modified: llvm/trunk/test/Analysis/BasicAA/nocapture.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/nocapture.ll?rev=61094&r1=61093&r2=61094&view=diff
>>>
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Analysis/BasicAA/nocapture.ll (original)
>>> +++ llvm/trunk/test/Analysis/BasicAA/nocapture.ll Tue Dec 16 13:06:48 2008
>>> @@ -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
>>> -}
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 




More information about the llvm-commits mailing list