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

Bill Wendling isanbard at gmail.com
Fri Dec 19 01:37:10 PST 2008


Great! Thanks, Nick.

-bw

On Dec 19, 2008, at 1:34 AM, Nick Lewycky <nicholas at mxc.ca> wrote:

> 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
>>
>
> _______________________________________________
> 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