[llvm-commits] [llvm] r61239 - in /llvm/trunk: docs/LangRef.html include/llvm/Attributes.h lib/Analysis/BasicAliasAnalysis.cpp test/Analysis/BasicAA/nocapture.ll

Nick Lewycky nicholas at mxc.ca
Fri Dec 19 01:34:12 PST 2008


I just forgot to commit the parser changes, somehow. Should be easy to 
fix. Sorry!!

Nick

Bill Wendling wrote:
> Nicholas,
> 
> This is causing more failures:
> 
> Running /Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvmCore/test/ 
> Analysis/BasicAA/dg.exp ...
> FAIL: /Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvmCore/test/ 
> Analysis/BasicAA/nocapture.ll
> Failed with exit(1) at line 1
> while running:  llvm-as < /Volumes/Sandbox/Buildbot/llvm/full-llvm/ 
> build/llvmCore/test/Analysis/BasicAA/nocapture.ll |  opt -basicaa -gvn  
> -instcombine |  llvm-dis | /usr/bin/grep {ret i32 0}
> llvm-as: <stdin>:3,0: <stdin>:3: error: syntax error, unexpected  
> $undefined, expecting ')' while reading token: 'n'
> opt: Invalid bitcode signature
> llvm-dis: Invalid bitcode signature
> 
> Running /Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvmCore/test/ 
> FrontendC/dg.exp ...
> FAIL: /Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvmCore/test/ 
> FrontendC/2002-02-13-UnnamedLocal.c
> Failed with signal(SIGABRT) at line 1
> while running: /Volumes/Sandbox/Buildbot/llvm/full-llvm/build/ 
> llvmgcc42.roots/llvmgcc42~dst/Developer/usr/bin/llvm-gcc-4.2 -fstrict- 
> aliasing -Wstrict-aliasing -I/usr/include/c++/4.0.0/i686-apple-darwin9  
> -I/usr/include/c++/4.0.0 -emit-llvm -w -S /Volumes/Sandbox/Buildbot/ 
> llvm/full-llvm/build/llvmCore/test/FrontendC/2002-02-13-UnnamedLocal.c  
> -o - |  llvm-as -f -o /dev/null
> Assertion failed: (isPowerOf2_32(i) && "Alignment must be a power of  
> two."), function constructAlignmentFromInt, file /Volumes/Sandbox/ 
> Buildbot/llvm/full-llvm/build/llvmCore/include/llvm/Attributes.h, line  
> 86.
> 0   llvm-as           0x0017999f llvm::sys::SetInterruptFunction(void  
> (*)()) + 591
> 1   libSystem.B.dylib 0x91e592bb _sigtramp + 43
> 2   libSystem.B.dylib 0xffffffff _sigtramp + 1847225711
> 3   libSystem.B.dylib 0x91ecd23a raise + 26
> 4   libSystem.B.dylib 0x91ed9679 abort + 73
> 5   libSystem.Bmake[1]: *** [check-local] Error 1
> make: *** [check] Error 2
> 
> This is on Darwin x86.
> 
> -bw
> 
> On Dec 18, 2008, at 10:39 PM, Nick Lewycky wrote:
> 
>> Author: nicholas
>> Date: Fri Dec 19 00:39:12 2008
>> New Revision: 61239
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=61239&view=rev
>> Log:
>> Resubmit support for the 'nocapture' attribute.
>>
>> The problematic part of this patch is that we were out of attribute  
>> bits,
>> requiring some fancy bit hacking to make it fit (by shrinking  
>> alignment)
>> without breaking existing users or the file format.
>>
>> This change will require users to rebuild llvm-gcc to match llvm.
>>
>> Added:
>>    llvm/trunk/test/Analysis/BasicAA/nocapture.ll
>> Modified:
>>    llvm/trunk/docs/LangRef.html
>>    llvm/trunk/include/llvm/Attributes.h
>>    llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
>>
>> Modified: llvm/trunk/docs/LangRef.html
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=61239&r1=61238&r2=61239&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> ======================================================================
>> --- llvm/trunk/docs/LangRef.html (original)
>> +++ llvm/trunk/docs/LangRef.html Fri Dec 19 00:39:12 2008
>> @@ -894,9 +894,15 @@
>>     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. 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>
>> +    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>
>>
>>     <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=61239&r1=61238&r2=61239&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> ======================================================================
>> --- llvm/trunk/include/llvm/Attributes.h (original)
>> +++ llvm/trunk/include/llvm/Attributes.h Fri Dec 19 00:39:12 2008
>> @@ -15,6 +15,7 @@
>> #ifndef LLVM_ATTRIBUTES_H
>> #define LLVM_ATTRIBUTES_H
>>
>> +#include "llvm/Support/MathExtras.h"
>> #include <cassert>
>> #include <string>
>>
>> @@ -23,7 +24,7 @@
>>
>> /// Attributes - A bitset of attributes.
>> typedef unsigned Attributes;
>> -
>> +
>> namespace Attribute {
>>
>> /// Function parameters and results can have attributes to indicate  
>> how they
>> @@ -44,16 +45,18 @@
>> 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 = 0xffff<<16; ///< Alignment of  
>> parameter (16 bits)
>> -                                    // 0 = unknown, else in clear  
>> (not log)
>> -
>> +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
>> +
>> /// @brief Attributes that only apply to function parameters.
>> -const Attributes ParameterOnly = ByVal | Nest | StructRet;
>> +const Attributes ParameterOnly = ByVal | Nest | StructRet |  
>> NoCapture;
>>
>> /// @brief Attributes that only apply to function.
>> const Attributes FunctionOnly = NoReturn | NoUnwind | ReadNone |  
>> ReadOnly |
>> @@ -64,7 +67,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
>> @@ -76,7 +79,13 @@
>> /// This turns an int alignment (a power of 2, normally) into the
>> /// form used internally in Attributes.
>> inline Attributes constructAlignmentFromInt(unsigned i) {
>> -  return (i << 16);
>> +  // Default alignment, allow the target to define how to align it.
>> +  if (i == 0)
>> +    return 0;
>> +
>> +  assert(isPowerOf2_32(i) && "Alignment must be a power of two.");
>> +  assert(i <= 0x40000000 && "Alignment too large.");
>> +  return (Log2_32(i)+1) << 16;
>> }
>>
>> /// The set of Attributes set in Attributes is converted to a
>> @@ -175,7 +184,11 @@
>>   /// getParamAlignment - Return the alignment for the specified  
>> function
>>   /// parameter.
>>   unsigned getParamAlignment(unsigned Idx) const {
>> -    return (getAttributes(Idx) & Attribute::Alignment) >> 16;
>> +    Attributes Align = getAttributes(Idx) & Attribute::Alignment;
>> +    if (Align == 0)
>> +      return 0;
>> +
>> +    return 1ull << ((Align >> 16) - 1);
>>   }
>>
>>   /// 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=61239&r1=61238&r2=61239&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> ======================================================================
>> --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
>> +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Fri Dec 19  
>> 00:39:12 2008
>> @@ -63,12 +63,23 @@
>>       // callees could modify it.
>>       break; // next use
>>     case Instruction::Call:
>> -      // 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
>> +      // 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;
>>     default:
>>       return true;
>>     }
>>
>> Added: llvm/trunk/test/Analysis/BasicAA/nocapture.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/nocapture.ll?rev=61239&view=auto
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> ======================================================================
>> --- llvm/trunk/test/Analysis/BasicAA/nocapture.ll (added)
>> +++ llvm/trunk/test/Analysis/BasicAA/nocapture.ll Fri Dec 19  
>> 00:39:12 2008
>> @@ -0,0 +1,14 @@
>> +; 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