aboutsummaryrefslogtreecommitdiff
path: root/test/CodeGen/X86/lea-opt.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGen/X86/lea-opt.ll')
-rw-r--r--test/CodeGen/X86/lea-opt.ll73
1 files changed, 46 insertions, 27 deletions
diff --git a/test/CodeGen/X86/lea-opt.ll b/test/CodeGen/X86/lea-opt.ll
index 8096bfabd6cf..9e0e34b1e09a 100644
--- a/test/CodeGen/X86/lea-opt.ll
+++ b/test/CodeGen/X86/lea-opt.ll
@@ -1,4 +1,5 @@
-; RUN: llc < %s -mtriple=x86_64-linux -enable-x86-lea-opt | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s -check-prefix=CHECK -check-prefix=ENABLED
+; RUN: llc --disable-x86-lea-opt < %s -mtriple=x86_64-linux | FileCheck %s -check-prefix=CHECK -check-prefix=DISABLED
%struct.anon1 = type { i32, i32, i32 }
%struct.anon2 = type { i32, [32 x i32], i32 }
@@ -34,16 +35,18 @@ sw.bb.2: ; preds = %entry
sw.epilog: ; preds = %sw.bb.2, %sw.bb.1, %entry
ret void
; CHECK-LABEL: test1:
-; CHECK: leaq (%rdi,%rdi,2), [[REG1:%[a-z]+]]
-; CHECK: movl arr1(,[[REG1]],4), {{.*}}
-; CHECK: leaq arr1+4(,[[REG1]],4), [[REG2:%[a-z]+]]
-; CHECK: subl arr1+4(,[[REG1]],4), {{.*}}
-; CHECK: leaq arr1+8(,[[REG1]],4), [[REG3:%[a-z]+]]
-; CHECK: addl arr1+8(,[[REG1]],4), {{.*}}
+; CHECK: shlq $2, [[REG1:%[a-z]+]]
+; CHECK: movl arr1([[REG1]],[[REG1]],2), {{.*}}
+; CHECK: leaq arr1+4([[REG1]],[[REG1]],2), [[REG2:%[a-z]+]]
+; CHECK: subl arr1+4([[REG1]],[[REG1]],2), {{.*}}
+; DISABLED: 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]])
+; ENABLED: movl ${{[1-4]+}}, 4([[REG2]])
+; DISABLED: movl ${{[1-4]+}}, ([[REG3]])
; CHECK: movl ${{[1-4]+}}, ([[REG2]])
-; CHECK: movl ${{[1-4]+}}, ([[REG3]])
+; ENABLED: movl ${{[1-4]+}}, 4([[REG2]])
+; DISABLED: movl ${{[1-4]+}}, ([[REG3]])
}
define void @test2(i64 %x) nounwind optsize {
@@ -74,16 +77,21 @@ sw.bb.2: ; preds = %entry
sw.epilog: ; preds = %sw.bb.2, %sw.bb.1, %entry
ret void
; CHECK-LABEL: test2:
-; CHECK: leaq (%rdi,%rdi,2), [[REG1:%[a-z]+]]
-; CHECK: leaq arr1+4(,[[REG1]],4), [[REG2:%[a-z]+]]
-; CHECK: movl -4([[REG2]]), {{.*}}
-; CHECK: subl ([[REG2]]), {{.*}}
-; CHECK: leaq arr1+8(,[[REG1]],4), [[REG3:%[a-z]+]]
-; CHECK: addl ([[REG3]]), {{.*}}
+; CHECK: shlq $2, [[REG1:%[a-z]+]]
+; DISABLED: movl arr1([[REG1]],[[REG1]],2), {{.*}}
+; CHECK: leaq arr1+4([[REG1]],[[REG1]],2), [[REG2:%[a-z]+]]
+; ENABLED: movl -4([[REG2]]), {{.*}}
+; ENABLED: subl ([[REG2]]), {{.*}}
+; ENABLED: addl 4([[REG2]]), {{.*}}
+; DISABLED: subl arr1+4([[REG1]],[[REG1]],2), {{.*}}
+; DISABLED: leaq arr1+8([[REG1]],[[REG1]],2), [[REG3:%[a-z]+]]
+; DISABLED: addl arr1+8([[REG1]],[[REG1]],2), {{.*}}
; CHECK: movl ${{[1-4]+}}, ([[REG2]])
-; CHECK: movl ${{[1-4]+}}, ([[REG3]])
+; ENABLED: movl ${{[1-4]+}}, 4([[REG2]])
+; DISABLED: movl ${{[1-4]+}}, ([[REG3]])
; CHECK: movl ${{[1-4]+}}, ([[REG2]])
-; CHECK: movl ${{[1-4]+}}, ([[REG3]])
+; ENABLED: movl ${{[1-4]+}}, 4([[REG2]])
+; DISABLED: movl ${{[1-4]+}}, ([[REG3]])
}
; Check that LEA optimization pass takes into account a resultant address
@@ -109,7 +117,9 @@ sw.bb.1: ; preds = %entry
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 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
@@ -122,12 +132,14 @@ sw.epilog: ; preds = %sw.bb.2, %sw.bb.1,
; REG3's definition is closer to movl than REG2's, but the pass still chooses
; REG2 because it provides the resultant address displacement fitting 1 byte.
-; CHECK: movl ([[REG2]]), {{.*}}
-; CHECK: addl ([[REG3]]), {{.*}}
+; ENABLED: movl ([[REG2]]), {{.*}}
+; ENABLED: addl ([[REG3]]), {{.*}}
+; DISABLED: movl arr2+132([[REG1]]), {{.*}}
+; DISABLED: addl arr2([[REG1]]), {{.*}}
; 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 {
@@ -158,12 +170,19 @@ sw.bb.2: ; preds = %entry
sw.epilog: ; preds = %sw.bb.2, %sw.bb.1, %entry
ret void
; CHECK-LABEL: test4:
-; CHECK: leaq arr1+4({{.*}}), [[REG2:%[a-z]+]]
-; CHECK: movl -4([[REG2]]), {{.*}}
-; CHECK: subl ([[REG2]]), {{.*}}
-; CHECK: addl 4([[REG2]]), {{.*}}
+; CHECK: imulq {{.*}}, [[REG1:%[a-z]+]]
+; DISABLED: movl arr1([[REG1]]), {{.*}}
+; CHECK: leaq arr1+4([[REG1]]), [[REG2:%[a-z]+]]
+; ENABLED: movl -4([[REG2]]), {{.*}}
+; ENABLED: subl ([[REG2]]), {{.*}}
+; ENABLED: addl 4([[REG2]]), {{.*}}
+; DISABLED: subl arr1+4([[REG1]]), {{.*}}
+; DISABLED: leaq arr1+8([[REG1]]), [[REG3:%[a-z]+]]
+; DISABLED: addl arr1+8([[REG1]]), {{.*}}
; CHECK: movl ${{[1-4]+}}, ([[REG2]])
-; CHECK: movl ${{[1-4]+}}, 4([[REG2]])
+; ENABLED: movl ${{[1-4]+}}, 4([[REG2]])
+; DISABLED: movl ${{[1-4]+}}, ([[REG3]])
; CHECK: movl ${{[1-4]+}}, ([[REG2]])
-; CHECK: movl ${{[1-4]+}}, 4([[REG2]])
+; ENABLED: movl ${{[1-4]+}}, 4([[REG2]])
+; DISABLED: movl ${{[1-4]+}}, ([[REG3]])
}