[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
Bill Wendling
isanbard at gmail.com
Thu Dec 18 15:51:17 PST 2008
Hi Nick,
I tested this on my PPC machine and it works. Go ahead and submit it.
Thanks for looking into this!
-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
>
>
More information about the llvm-commits
mailing list