[llvm] r200717 - inalloca: Don't remove dead arguments in the presence of inalloca args
Nick Lewycky
nicholas at mxc.ca
Mon Feb 3 22:35:57 PST 2014
Reid Kleckner wrote:
> Author: rnk
> Date: Mon Feb 3 14:42:49 2014
> New Revision: 200717
>
> URL: http://llvm.org/viewvc/llvm-project?rev=200717&view=rev
> Log:
> inalloca: Don't remove dead arguments in the presence of inalloca args
>
> It disturbs the layout of the parameters in memory and registers,
> leading to problems in the backend.
:-(
> The plan for optimizing internal inalloca functions going forward is to
> essentially SROA the argument memory and demote any captured arguments
> (things that aren't trivially written by a load or store) to an indirect
> pointer to a static alloca.
>
> Modified:
> llvm/trunk/lib/Transforms/IPO/DeadArgumentElimination.cpp
> llvm/trunk/test/Transforms/DeadArgElim/keepalive.ll
>
> Modified: llvm/trunk/lib/Transforms/IPO/DeadArgumentElimination.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/DeadArgumentElimination.cpp?rev=200717&r1=200716&r2=200717&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/DeadArgumentElimination.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/DeadArgumentElimination.cpp Mon Feb 3 14:42:49 2014
> @@ -531,6 +531,13 @@ DAE::Liveness DAE::SurveyUses(const Valu
> // well as arguments to functions which have their "address taken".
> //
> void DAE::SurveyFunction(const Function&F) {
> + // Functions with inalloca parameters are expecting args in a particular
> + // register and memory layout.
> + if (F.getAttributes().hasAttrSomewhere(Attribute::InAlloca)) {
> + MarkLive(F);
Hold on. Does it actually need to be live? Consider A(x) calls B(x)
calls C(x). If C takes 'x' as inalloca and doesn't use it, B can pass in
C(undef). If B doesn't take 'x' as inalloca, A doesn't need to pass B
anything.
> + return;
> + }
> +
> unsigned RetCount = NumRetVals(&F);
> // Assume all return values are dead
> typedef SmallVector<Liveness, 5> RetVals;
>
> Modified: llvm/trunk/test/Transforms/DeadArgElim/keepalive.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadArgElim/keepalive.ll?rev=200717&r1=200716&r2=200717&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/DeadArgElim/keepalive.ll (original)
> +++ llvm/trunk/test/Transforms/DeadArgElim/keepalive.ll Mon Feb 3 14:42:49 2014
> @@ -28,4 +28,20 @@ define void @caller() {
> ret void
> }
>
> +; We can't remove 'this' here, as that would put argmem in ecx instead of
> +; memory.
> +define internal x86_thiscallcc i32 @unused_this(i32* %this, i32* inalloca %argmem) {
If it isn't used, please it readnone nocapture instead. Replacing it
with 'undef' at the visible callsites would be nice too.
Also, is this a representative case in the real world? Why do you have
an internal x86_thiscallcc function instead of an internal fastcc function?
> + %v = load i32* %argmem
> + ret i32 %v
> +}
> +; CHECK-LABEL: define internal x86_thiscallcc i32 @unused_this(i32* %this, i32* inalloca %argmem)
> +
> +define i32 @caller2() {
> + %t = alloca i32
> + %m = alloca i32, inalloca
> + store i32 42, i32* %m
> + %v = call x86_thiscallcc i32 @unused_this(i32* %t, i32* inalloca %m)
> + ret i32 %v
> +}
> +
> ; CHECK: attributes #0 = { nounwind }
>
>
> _______________________________________________
> 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