[llvm-commits] [llvm] r67093 - in /llvm/trunk: lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp test/CodeGen/X86/x86-64-malloc.ll

Bill Wendling isanbard at gmail.com
Tue Mar 17 13:07:59 PDT 2009


Chris,

This is causing this test to XPASS. Should it be un-XFAILed?

Running /Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm.src/test/CodeGen/X86/dg.exp
...
XPASS: /Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm.src/test/CodeGen/X86/alloca-align-rounding.ll


-bw

On Tue, Mar 17, 2009 at 12:36 PM, Chris Lattner <sabre at nondot.org> wrote:
> Author: lattner
> Date: Tue Mar 17 14:36:00 2009
> New Revision: 67093
>
> URL: http://llvm.org/viewvc/llvm-project?rev=67093&view=rev
> Log:
> Fix codegen to compute the size of an allocation by multiplying the
> size by the array amount as an i32 value instead of promoting from
> i32 to i64 then doing the multiply.  Not doing this broke wrap-around
> assumptions that the optimizers (validly) made.  The ultimate real
> fix for this is to introduce i64 version of alloca and remove mallocinst.
>
> This fixes PR3829
>
> Added:
>    llvm/trunk/test/CodeGen/X86/x86-64-malloc.ll
> Modified:
>    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp?rev=67093&r1=67092&r2=67093&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp Tue Mar 17 14:36:00 2009
> @@ -2763,6 +2763,13 @@
>              I.getAlignment());
>
>   SDValue AllocSize = getValue(I.getArraySize());
> +
> +  AllocSize = DAG.getNode(ISD::MUL, getCurDebugLoc(), AllocSize.getValueType(),
> +                          AllocSize,
> +                          DAG.getConstant(TySize, AllocSize.getValueType()));
> +
> +
> +
>   MVT IntPtr = TLI.getPointerTy();
>   if (IntPtr.bitsLT(AllocSize.getValueType()))
>     AllocSize = DAG.getNode(ISD::TRUNCATE, getCurDebugLoc(),
> @@ -2771,9 +2778,6 @@
>     AllocSize = DAG.getNode(ISD::ZERO_EXTEND, getCurDebugLoc(),
>                             IntPtr, AllocSize);
>
> -  AllocSize = DAG.getNode(ISD::MUL, getCurDebugLoc(), IntPtr, AllocSize,
> -                          DAG.getIntPtrConstant(TySize));
> -
>   // Handle alignment.  If the requested alignment is less than or equal to
>   // the stack alignment, ignore it.  If the size is greater than or equal to
>   // the stack alignment, we note this in the DYNAMIC_STACKALLOC node.
> @@ -5425,6 +5429,16 @@
>  void SelectionDAGLowering::visitMalloc(MallocInst &I) {
>   SDValue Src = getValue(I.getOperand(0));
>
> +  // Scale up by the type size in the original i32 type width.  Various
> +  // mid-level optimizers may make assumptions about demanded bits etc from the
> +  // i32-ness of the optimizer: we do not want to promote to i64 and then
> +  // multiply on 64-bit targets.
> +  // FIXME: Malloc inst should go away: PR715.
> +  uint64_t ElementSize = TD->getTypePaddedSize(I.getType()->getElementType());
> +  if (ElementSize != 1)
> +    Src = DAG.getNode(ISD::MUL, getCurDebugLoc(), Src.getValueType(),
> +                      Src, DAG.getConstant(ElementSize, Src.getValueType()));
> +
>   MVT IntPtr = TLI.getPointerTy();
>
>   if (IntPtr.bitsLT(Src.getValueType()))
> @@ -5432,11 +5446,6 @@
>   else if (IntPtr.bitsGT(Src.getValueType()))
>     Src = DAG.getNode(ISD::ZERO_EXTEND, getCurDebugLoc(), IntPtr, Src);
>
> -  // Scale the source by the type size.
> -  uint64_t ElementSize = TD->getTypePaddedSize(I.getType()->getElementType());
> -  Src = DAG.getNode(ISD::MUL, getCurDebugLoc(), Src.getValueType(),
> -                    Src, DAG.getIntPtrConstant(ElementSize));
> -
>   TargetLowering::ArgListTy Args;
>   TargetLowering::ArgListEntry Entry;
>   Entry.Node = Src;
>
> Added: llvm/trunk/test/CodeGen/X86/x86-64-malloc.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/x86-64-malloc.ll?rev=67093&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/x86-64-malloc.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/x86-64-malloc.ll Tue Mar 17 14:36:00 2009
> @@ -0,0 +1,10 @@
> +; RUN: llvm-as < %s | llc -march=x86-64 | grep {shll.*3, %edi}
> +; PR3829
> +; The generated code should multiply by 3 (sizeof i8*) as an i32,
> +; not as an i64!
> +
> +define i8** @test(i32 %sz) {
> +       %sub = add i32 %sz, 536870911           ; <i32> [#uses=1]
> +       %call = malloc i8*, i32 %sub            ; <i8**> [#uses=1]
> +       ret i8** %call
> +}
>
>
> _______________________________________________
> 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