[PATCH] D19659: [X86] Enable RRL part of the LEA optimization pass for -O2
Andrey Turetskiy via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 28 07:11:54 PDT 2016
aturetsk created this revision.
aturetsk added reviewers: nadav, qcolombet, rnk.
aturetsk added subscribers: reames, zinovy.nis, llvm-commits.
Enable "Remove Redundant LEAs" part of the LEA optimization pass for -O2.
This gives 6.4% performance improve on nnet benchmark from coremark-pro. There is no significant effect on other benchmarks.
http://reviews.llvm.org/D19659
Files:
lib/Target/X86/X86OptimizeLEAs.cpp
test/CodeGen/X86/lea-opt.ll
Index: test/CodeGen/X86/lea-opt.ll
===================================================================
--- test/CodeGen/X86/lea-opt.ll
+++ test/CodeGen/X86/lea-opt.ll
@@ -38,12 +38,11 @@
; CHECK: movl arr1([[REG1]],[[REG1]],2), {{.*}}
; CHECK: leaq arr1+4([[REG1]],[[REG1]],2), [[REG2:%[a-z]+]]
; CHECK: subl arr1+4([[REG1]],[[REG1]],2), {{.*}}
-; CHECK: leaq arr1+8([[REG1]],[[REG1]],2), [[REG3:%[a-z]+]]
; CHECK: addl arr1+8([[REG1]],[[REG1]],2), {{.*}}
; CHECK: movl ${{[1-4]+}}, ([[REG2]])
-; CHECK: movl ${{[1-4]+}}, ([[REG3]])
+; CHECK: movl ${{[1-4]+}}, 4([[REG2]])
; CHECK: movl ${{[1-4]+}}, ([[REG2]])
-; CHECK: movl ${{[1-4]+}}, ([[REG3]])
+; CHECK: movl ${{[1-4]+}}, 4([[REG2]])
}
define void @test2(i64 %x) nounwind optsize {
@@ -78,12 +77,11 @@
; CHECK: leaq arr1+4([[REG1]],[[REG1]],2), [[REG2:%[a-z]+]]
; CHECK: movl -4([[REG2]]), {{.*}}
; CHECK: subl ([[REG2]]), {{.*}}
-; CHECK: leaq arr1+8([[REG1]],[[REG1]],2), [[REG3:%[a-z]+]]
-; CHECK: addl ([[REG3]]), {{.*}}
+; CHECK: addl 4([[REG2]]), {{.*}}
; CHECK: movl ${{[1-4]+}}, ([[REG2]])
-; CHECK: movl ${{[1-4]+}}, ([[REG3]])
+; CHECK: movl ${{[1-4]+}}, 4([[REG2]])
; CHECK: movl ${{[1-4]+}}, ([[REG2]])
-; CHECK: movl ${{[1-4]+}}, ([[REG3]])
+; CHECK: movl ${{[1-4]+}}, 4([[REG2]])
}
; Check that LEA optimization pass takes into account a resultant address
@@ -109,7 +107,9 @@
sw.bb.2: ; preds = %entry
store i32 333, i32* %a, align 4
- store i32 444, i32* %b, align 4
+ ; Make sure the REG3's definition LEA won't be removed as a redundant.
+ %cvt = ptrtoint i32* %b to i32
+ store i32 %cvt, i32* %b, align 4
br label %sw.epilog
sw.epilog: ; preds = %sw.bb.2, %sw.bb.1, %entry
@@ -127,7 +127,7 @@
; CHECK: movl ${{[1-4]+}}, ([[REG2]])
; CHECK: movl ${{[1-4]+}}, ([[REG3]])
; CHECK: movl ${{[1-4]+}}, ([[REG2]])
-; CHECK: movl ${{[1-4]+}}, ([[REG3]])
+; CHECK: movl {{.*}}, ([[REG3]])
}
define void @test4(i64 %x) nounwind minsize {
Index: lib/Target/X86/X86OptimizeLEAs.cpp
===================================================================
--- lib/Target/X86/X86OptimizeLEAs.cpp
+++ lib/Target/X86/X86OptimizeLEAs.cpp
@@ -8,7 +8,7 @@
//===----------------------------------------------------------------------===//
//
// This file defines the pass that performs some optimizations with LEA
-// instructions in order to improve code size.
+// instructions in order to improve performance and code size.
// Currently, it does two things:
// 1) If there are two LEA instructions calculating addresses which only differ
// by displacement inside a basic block, one of them is removed.
@@ -615,8 +615,7 @@
bool OptimizeLEAPass::runOnMachineFunction(MachineFunction &MF) {
bool Changed = false;
- // Perform this optimization only if we care about code size.
- if (DisableX86LEAOpt || !MF.getFunction()->optForSize())
+ if (DisableX86LEAOpt)
return false;
MRI = &MF.getRegInfo();
@@ -635,13 +634,13 @@
if (LEAs.empty())
continue;
- // Remove redundant LEA instructions. The optimization may have a negative
- // effect on performance, so do it only for -Oz.
- if (MF.getFunction()->optForMinSize())
- Changed |= removeRedundantLEAs(LEAs);
+ // Remove redundant LEA instructions.
+ Changed |= removeRedundantLEAs(LEAs);
- // Remove redundant address calculations.
- Changed |= removeRedundantAddrCalc(LEAs);
+ // Remove redundant address calculations. Do it only for -Os/-Oz since only
+ // a code size gain is expected from this part of the pass.
+ if (MF.getFunction()->optForSize())
+ Changed |= removeRedundantAddrCalc(LEAs);
}
return Changed;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D19659.55411.patch
Type: text/x-patch
Size: 3727 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160428/e0ff0dc9/attachment.bin>
More information about the llvm-commits
mailing list