[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 00:02:46 PST 2008
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
More information about the llvm-commits
mailing list