[llvm] r219899 - TRE: make TRE a bit more aggressive
Rafael EspĂndola
rafael.espindola at gmail.com
Fri Oct 17 12:14:18 PDT 2014
Is this actually safe?
The caller will deallocate the stack and then pass a pointer to that
area to the callee...
On 15 October 2014 23:27, Saleem Abdulrasool <compnerd at compnerd.org> wrote:
> Author: compnerd
> Date: Wed Oct 15 22:27:30 2014
> New Revision: 219899
>
> URL: http://llvm.org/viewvc/llvm-project?rev=219899&view=rev
> Log:
> TRE: make TRE a bit more aggressive
>
> Make tail recursion elimination a bit more aggressive. This allows us to get
> tail recursion on functions that are just branches to a different function. The
> fact that the function takes a byval argument does not restrict it from being
> optimised into just a tail call.
>
> Added:
> llvm/trunk/test/Transforms/TailCallElim/byval.ll
> Modified:
> llvm/trunk/lib/Transforms/Scalar/TailRecursionElimination.cpp
> llvm/trunk/test/Transforms/Inline/byval-tail-call.ll
> llvm/trunk/test/Transforms/TailCallElim/basic.ll
>
> Modified: llvm/trunk/lib/Transforms/Scalar/TailRecursionElimination.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/TailRecursionElimination.cpp?rev=219899&r1=219898&r2=219899&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/TailRecursionElimination.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/TailRecursionElimination.cpp Wed Oct 15 22:27:30 2014
> @@ -249,12 +249,7 @@ bool TailCallElim::markTails(Function &F
> return false;
> AllCallsAreTailCalls = true;
>
> - // The local stack holds all alloca instructions and all byval arguments.
> AllocaDerivedValueTracker Tracker;
> - for (Argument &Arg : F.args()) {
> - if (Arg.hasByValAttr())
> - Tracker.walk(&Arg);
> - }
> for (auto &BB : F) {
> for (auto &I : BB)
> if (AllocaInst *AI = dyn_cast<AllocaInst>(&I))
> @@ -310,9 +305,8 @@ bool TailCallElim::markTails(Function &F
> for (auto &Arg : CI->arg_operands()) {
> if (isa<Constant>(Arg.getUser()))
> continue;
> - if (Argument *A = dyn_cast<Argument>(Arg.getUser()))
> - if (!A->hasByValAttr())
> - continue;
> + if (isa<Argument>(Arg.getUser()))
> + continue;
> SafeToTail = false;
> break;
> }
>
> Modified: llvm/trunk/test/Transforms/Inline/byval-tail-call.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/byval-tail-call.ll?rev=219899&r1=219898&r2=219899&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/Inline/byval-tail-call.ll (original)
> +++ llvm/trunk/test/Transforms/Inline/byval-tail-call.ll Wed Oct 15 22:27:30 2014
> @@ -27,10 +27,11 @@ define internal void @qux(i32* byval %x)
> tail call void @ext(i32* null)
> ret void
> }
> +
> define void @frob(i32* %x) {
> ; CHECK-LABEL: define void @frob(
> ; CHECK: alloca i32
> -; CHECK: {{^ *}}call void @ext(
> +; CHECK: {{^ *}}tail call void @ext(
> ; CHECK: tail call void @ext(i32* null)
> ; CHECK: ret void
> tail call void @qux(i32* byval %x)
>
> Modified: llvm/trunk/test/Transforms/TailCallElim/basic.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/TailCallElim/basic.ll?rev=219899&r1=219898&r2=219899&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/TailCallElim/basic.ll (original)
> +++ llvm/trunk/test/Transforms/TailCallElim/basic.ll Wed Oct 15 22:27:30 2014
> @@ -147,7 +147,7 @@ cond_false:
> ; Don't tail call if a byval arg is captured.
> define void @test9(i32* byval %a) {
> ; CHECK-LABEL: define void @test9(
> -; CHECK: {{^ *}}call void @use(
> +; CHECK: {{^ *}}tail call void @use(
> call void @use(i32* %a)
> ret void
> }
>
> Added: llvm/trunk/test/Transforms/TailCallElim/byval.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/TailCallElim/byval.ll?rev=219899&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/TailCallElim/byval.ll (added)
> +++ llvm/trunk/test/Transforms/TailCallElim/byval.ll Wed Oct 15 22:27:30 2014
> @@ -0,0 +1,34 @@
> +; RUN: opt -mtriple i386 -Os -S %s -o - | FileCheck %s
> +; RUN: opt -mtriple x86_64 -Os -S %s -o - | FileCheck %s
> +; RUN: opt -mtriple armv7 -Os -S %s -o - | FileCheck %s
> +
> +%struct.D16 = type { [16 x double] }
> +
> +declare void @_Z2OpP3D16PKS_S2_(%struct.D16*, %struct.D16*, %struct.D16*)
> +
> +define void @_Z7TestRefRK3D16S1_(%struct.D16* noalias sret %agg.result, %struct.D16* %RHS, %struct.D16* %LHS) {
> + %1 = alloca %struct.D16*, align 8
> + %2 = alloca %struct.D16*, align 8
> + store %struct.D16* %RHS, %struct.D16** %1, align 8
> + store %struct.D16* %LHS, %struct.D16** %2, align 8
> + %3 = load %struct.D16** %1, align 8
> + %4 = load %struct.D16** %2, align 8
> + call void @_Z2OpP3D16PKS_S2_(%struct.D16* %agg.result, %struct.D16* %3, %struct.D16* %4)
> + ret void
> +}
> +
> +; CHECK: define void @_Z7TestRefRK3D16S1_({{.*}}) {
> +; CHECK: tail call void @_Z2OpP3D16PKS_S2_(%struct.D16* %agg.result, %struct.D16* %RHS, %struct.D16* %LHS)
> +; CHECK: ret void
> +; CHECK: }
> +
> +define void @_Z7TestVal3D16S_(%struct.D16* noalias sret %agg.result, %struct.D16* byval align 8 %RHS, %struct.D16* byval align 8 %LHS) {
> + call void @_Z2OpP3D16PKS_S2_(%struct.D16* %agg.result, %struct.D16* %RHS, %struct.D16* %LHS)
> + ret void
> +}
> +
> +; CHECK: define void @_Z7TestVal3D16S_({{.*}}) {
> +; CHECK: tail call void @_Z2OpP3D16PKS_S2_(%struct.D16* %agg.result, %struct.D16* %RHS, %struct.D16* %LHS)
> +; CHECK: ret void
> +; CHECK: }
> +
>
>
> _______________________________________________
> 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