[llvm] r241206 - [TwoAddressInstructionPass] Try 3 Addr Conversion After Commuting.
Bruno Cardoso Lopes
bruno.cardoso at gmail.com
Mon Jul 6 12:21:20 PDT 2015
Hi,
On Wed, Jul 1, 2015 at 8:12 PM, Quentin Colombet <qcolombet at apple.com> wrote:
> Author: qcolombet
> Date: Wed Jul 1 18:12:13 2015
> New Revision: 241206
>
> URL: http://llvm.org/viewvc/llvm-project?rev=241206&view=rev
> Log:
> [TwoAddressInstructionPass] Try 3 Addr Conversion After Commuting.
>
> TwoAddressInstructionPass stops after a successful commuting but 3 Addr
> conversion might be good for some cases.
>
> Consider:
>
> int foo(int a, int b) {
> return a + b;
> }
>
> Before this commit, we emit:
>
> addl %esi, %edi
> movl %edi, %eax
> ret
>
> After this commit, we try 3 Addr conversion:
>
> leal (%rsi,%rdi), %eax
> ret
>
> Patch by Volkan Keles <vkeles at apple.com>!
>
> Differential Revision: http://reviews.llvm.org/D10851
>
> Modified:
> llvm/trunk/lib/CodeGen/TwoAddressInstructionPass.cpp
> llvm/trunk/test/CodeGen/X86/commute-two-addr.ll
> llvm/trunk/test/CodeGen/X86/twoaddr-lea.ll
> llvm/trunk/test/CodeGen/X86/win64_params.ll
> llvm/trunk/test/Transforms/LoopStrengthReduce/X86/ivchain-stress-X86.ll
>
> Modified: llvm/trunk/lib/CodeGen/TwoAddressInstructionPass.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TwoAddressInstructionPass.cpp?rev=241206&r1=241205&r2=241206&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/TwoAddressInstructionPass.cpp (original)
> +++ llvm/trunk/lib/CodeGen/TwoAddressInstructionPass.cpp Wed Jul 1 18:12:13 2015
> @@ -1207,12 +1207,24 @@ tryInstructionTransform(MachineBasicBloc
> }
> }
>
> + // If the instruction is convertible to 3 Addr, instead
> + // of returning try 3 Addr transformation aggresively and
> + // use this variable to check later. Because it might be better.
> + // For example, we can just use `leal (%rsi,%rdi), %eax` and `ret`
> + // instead of the following code.
> + // addl %esi, %edi
> + // movl %edi, %eax
> + // ret
> + bool commuted = false;
Shouldn't we use "Commuted" instead of "commuted"? :-)
> // If it's profitable to commute, try to do so.
> if (TryCommute && commuteInstruction(mi, regB, regC, Dist)) {
> + commuted = true;
> ++NumCommuted;
> if (AggressiveCommute)
> ++NumAggrCommuted;
> - return false;
> + if (!MI.isConvertibleTo3Addr())
> + return false;
> }
>
> if (shouldOnlyCommute)
> @@ -1220,7 +1232,7 @@ tryInstructionTransform(MachineBasicBloc
>
> // If there is one more use of regB later in the same MBB, consider
> // re-schedule this MI below it.
> - if (EnableRescheduling && rescheduleMIBelowKill(mi, nmi, regB)) {
> + if (!commuted && EnableRescheduling && rescheduleMIBelowKill(mi, nmi, regB)) {
> ++NumReSchedDowns;
> return true;
> }
> @@ -1237,6 +1249,10 @@ tryInstructionTransform(MachineBasicBloc
> }
> }
>
> + // Return if it is commuted but 3 addr conversion is failed.
> + if (commuted)
> + return false;
> +
> // If there is one more use of regB later in the same MBB, consider
> // re-schedule it before this MI if it's legal.
> if (EnableRescheduling && rescheduleKillAboveMI(mi, nmi, regB)) {
>
> Modified: llvm/trunk/test/CodeGen/X86/commute-two-addr.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/commute-two-addr.ll?rev=241206&r1=241205&r2=241206&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/commute-two-addr.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/commute-two-addr.ll Wed Jul 1 18:12:13 2015
> @@ -39,7 +39,7 @@ define %0 @t3(i32 %lb, i8 zeroext %has_l
> entry:
> ; DARWIN-LABEL: t3:
> ; DARWIN: shlq $32, %rcx
> -; DARWIN-NEXT: orq %rcx, %rax
> +; DARWIN-NEXT: leaq (%rax,%rcx), %rax
> ; DARWIN-NEXT: shll $8
> ; DARWIN-NOT: leaq
> %tmp21 = zext i32 %lb to i64
>
> Modified: llvm/trunk/test/CodeGen/X86/twoaddr-lea.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/twoaddr-lea.ll?rev=241206&r1=241205&r2=241206&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/twoaddr-lea.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/twoaddr-lea.ll Wed Jul 1 18:12:13 2015
> @@ -25,8 +25,7 @@ define i32 @test2(i32 inreg %a, i32 inre
> entry:
> ; CHECK-LABEL: test2:
> ; CHECK: leal
> -; CHECK-NOT: leal
> -; CHECK-NOT: mov
> +; CHECK-NEXT: addl
> ; CHECK-NEXT: addl
> ; CHECK-NEXT: ret
> %add = add i32 %b, %a
>
> Modified: llvm/trunk/test/CodeGen/X86/win64_params.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/win64_params.ll?rev=241206&r1=241205&r2=241206&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/win64_params.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/win64_params.ll Wed Jul 1 18:12:13 2015
> @@ -7,8 +7,7 @@ define i32 @f6(i32 %p1, i32 %p2, i32 %p3
> entry:
> ; CHECK: movl 48(%rsp), %eax
> ; CHECK: addl 40(%rsp), %eax
> -; LINUX: addl %r9d, %r8d
> -; LINUX: movl %r8d, %eax
> +; LINUX: leal (%r8,%r9), %eax
> %add = add nsw i32 %p6, %p5
> ret i32 %add
> }
> @@ -27,10 +26,8 @@ entry:
> ; on other platforms here (note the x86_64_sysvcc calling convention).
> define x86_64_sysvcc i32 @f8(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5, i32 %p6) nounwind readnone optsize {
> entry:
> -; CHECK: addl %r9d, %r8d
> -; CHECK: movl %r8d, %eax
> -; LINUX: addl %r9d, %r8d
> -; LINUX: movl %r8d, %eax
> +; CHECK: leal (%r8,%r9), %eax
> +; LINUX: leal (%r8,%r9), %eax
> %add = add nsw i32 %p6, %p5
> ret i32 %add
> }
>
> Modified: llvm/trunk/test/Transforms/LoopStrengthReduce/X86/ivchain-stress-X86.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopStrengthReduce/X86/ivchain-stress-X86.ll?rev=241206&r1=241205&r2=241206&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopStrengthReduce/X86/ivchain-stress-X86.ll (original)
> +++ llvm/trunk/test/Transforms/LoopStrengthReduce/X86/ivchain-stress-X86.ll Wed Jul 1 18:12:13 2015
> @@ -23,7 +23,7 @@
> ; X32: add
> ; X32: add
> ; X32: add
> -; X32: add
> +; X32: leal
> ; X32: %for.body.3
> define void @sharedidx(i8* nocapture %a, i8* nocapture %b, i8* nocapture %c, i32 %s, i32 %len) nounwind ssp {
> entry:
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
--
Bruno Cardoso Lopes
http://www.brunocardoso.cc
More information about the llvm-commits
mailing list