[llvm] 4196ca3 - [X86] Improve mul x, 2^N +/- 2 pattern by making the +/- 2x compute independently to x << N
Phoebe Wang via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 12 20:54:07 PST 2023
Author: Noah Goldstein
Date: 2023-01-12T20:53:57-08:00
New Revision: 4196ca3278f78c6e19246e54ab0ecb364e37d66a
URL: https://github.com/llvm/llvm-project/commit/4196ca3278f78c6e19246e54ab0ecb364e37d66a
DIFF: https://github.com/llvm/llvm-project/commit/4196ca3278f78c6e19246e54ab0ecb364e37d66a.diff
LOG: [X86] Improve mul x, 2^N +/- 2 pattern by making the +/- 2x compute independently to x << N
Previous pattern was omitting ops in sequence which just increases the
latency (to 3c, same as imul!) i.e:
`(add/sub (add/sub (shl x, N), x), x)`
Better is to compute 2x indepedently so x << N for better ULP i.e:
`(add/sub (shl x, N), (add x, x))`
Reviewed By: pengfei, RKSimon
Differential Revision: https://reviews.llvm.org/D141113
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/mul-constant-i16.ll
llvm/test/CodeGen/X86/mul-constant-i32.ll
llvm/test/CodeGen/X86/mul-constant-i64.ll
llvm/test/CodeGen/X86/mul-constant-i8.ll
llvm/test/CodeGen/X86/mul-constant-result.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 30a71c64a95e4..49279ecd282a0 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -47360,19 +47360,21 @@ static SDValue combineMul(SDNode *N, SelectionDAG &DAG,
else
NewMul = DAG.getNode(ISD::SUB, DL, VT, NewMul, N->getOperand(0));
} else if (SignMulAmt >= 0 && isPowerOf2_64(AbsMulAmt - 2)) {
- // (mul x, 2^N + 2) => (add (add (shl x, N), x), x)
+ // (mul x, 2^N + 2) => (add (shl x, N), (add x, x))
NewMul = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0),
DAG.getConstant(Log2_64(AbsMulAmt - 2),
DL, MVT::i8));
- NewMul = DAG.getNode(ISD::ADD, DL, VT, NewMul, N->getOperand(0));
- NewMul = DAG.getNode(ISD::ADD, DL, VT, NewMul, N->getOperand(0));
+ NewMul = DAG.getNode(
+ ISD::ADD, DL, VT, NewMul,
+ DAG.getNode(ISD::ADD, DL, VT, N->getOperand(0), N->getOperand(0)));
} else if (SignMulAmt >= 0 && isPowerOf2_64(AbsMulAmt + 2)) {
- // (mul x, 2^N - 2) => (sub (sub (shl x, N), x), x)
+ // (mul x, 2^N - 2) => (sub (shl x, N), (add x, x))
NewMul = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0),
DAG.getConstant(Log2_64(AbsMulAmt + 2),
DL, MVT::i8));
- NewMul = DAG.getNode(ISD::SUB, DL, VT, NewMul, N->getOperand(0));
- NewMul = DAG.getNode(ISD::SUB, DL, VT, NewMul, N->getOperand(0));
+ NewMul = DAG.getNode(
+ ISD::SUB, DL, VT, NewMul,
+ DAG.getNode(ISD::ADD, DL, VT, N->getOperand(0), N->getOperand(0)));
}
}
diff --git a/llvm/test/CodeGen/X86/mul-constant-i16.ll b/llvm/test/CodeGen/X86/mul-constant-i16.ll
index f04b89f54e3a3..b1aa789e53cd7 100644
--- a/llvm/test/CodeGen/X86/mul-constant-i16.ll
+++ b/llvm/test/CodeGen/X86/mul-constant-i16.ll
@@ -248,21 +248,20 @@ define i16 @test_mul_by_13(i16 %x) {
define i16 @test_mul_by_14(i16 %x) {
; X86-LABEL: test_mul_by_14:
; X86: # %bb.0:
-; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: leal (%eax,%eax), %ecx
; X86-NEXT: shll $4, %eax
; X86-NEXT: subl %ecx, %eax
-; X86-NEXT: subl %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: test_mul_by_14:
; X64: # %bb.0:
; X64-NEXT: movl %edi, %eax
+; X64-NEXT: leal (%rax,%rax), %ecx
; X64-NEXT: shll $4, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: # kill: def $ax killed $ax killed $eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: # kill: def $ax killed $ax killed $rax
; X64-NEXT: retq
%mul = mul nsw i16 %x, 14
ret i16 %mul
@@ -582,21 +581,20 @@ define i16 @test_mul_by_29(i16 %x) {
define i16 @test_mul_by_30(i16 %x) {
; X86-LABEL: test_mul_by_30:
; X86: # %bb.0:
-; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: leal (%eax,%eax), %ecx
; X86-NEXT: shll $5, %eax
; X86-NEXT: subl %ecx, %eax
-; X86-NEXT: subl %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: test_mul_by_30:
; X64: # %bb.0:
; X64-NEXT: movl %edi, %eax
+; X64-NEXT: leal (%rax,%rax), %ecx
; X64-NEXT: shll $5, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: # kill: def $ax killed $ax killed $eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: # kill: def $ax killed $ax killed $rax
; X64-NEXT: retq
%mul = mul nsw i16 %x, 30
ret i16 %mul
@@ -684,21 +682,20 @@ define i16 @test_mul_by_41(i16 %x) {
define i16 @test_mul_by_62(i16 %x) {
; X86-LABEL: test_mul_by_62:
; X86: # %bb.0:
-; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: leal (%eax,%eax), %ecx
; X86-NEXT: shll $6, %eax
; X86-NEXT: subl %ecx, %eax
-; X86-NEXT: subl %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: test_mul_by_62:
; X64: # %bb.0:
; X64-NEXT: movl %edi, %eax
+; X64-NEXT: leal (%rax,%rax), %ecx
; X64-NEXT: shll $6, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: # kill: def $ax killed $ax killed $eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: # kill: def $ax killed $ax killed $rax
; X64-NEXT: retq
%mul = mul nsw i16 %x, 62
ret i16 %mul
diff --git a/llvm/test/CodeGen/X86/mul-constant-i32.ll b/llvm/test/CodeGen/X86/mul-constant-i32.ll
index 44c140857f4c2..79889b9ace406 100644
--- a/llvm/test/CodeGen/X86/mul-constant-i32.ll
+++ b/llvm/test/CodeGen/X86/mul-constant-i32.ll
@@ -392,19 +392,19 @@ define i32 @test_mul_by_13(i32 %x) {
define i32 @test_mul_by_14(i32 %x) {
; X86-LABEL: test_mul_by_14:
; X86: # %bb.0:
-; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: leal (%eax,%eax), %ecx
; X86-NEXT: shll $4, %eax
; X86-NEXT: subl %ecx, %eax
-; X86-NEXT: subl %ecx, %eax
; X86-NEXT: retl
;
; X64-LABEL: test_mul_by_14:
; X64: # %bb.0:
; X64-NEXT: movl %edi, %eax
+; X64-NEXT: leal (%rax,%rax), %ecx
; X64-NEXT: shll $4, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: subl %edi, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: # kill: def $eax killed $eax killed $rax
; X64-NEXT: retq
;
; X86-NOOPT-LABEL: test_mul_by_14:
@@ -946,19 +946,19 @@ define i32 @test_mul_by_29(i32 %x) {
define i32 @test_mul_by_30(i32 %x) {
; X86-LABEL: test_mul_by_30:
; X86: # %bb.0:
-; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: leal (%eax,%eax), %ecx
; X86-NEXT: shll $5, %eax
; X86-NEXT: subl %ecx, %eax
-; X86-NEXT: subl %ecx, %eax
; X86-NEXT: retl
;
; X64-LABEL: test_mul_by_30:
; X64: # %bb.0:
; X64-NEXT: movl %edi, %eax
+; X64-NEXT: leal (%rax,%rax), %ecx
; X64-NEXT: shll $5, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: subl %edi, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: # kill: def $eax killed $eax killed $rax
; X64-NEXT: retq
;
; X86-NOOPT-LABEL: test_mul_by_30:
@@ -1114,19 +1114,19 @@ define i32 @test_mul_by_41(i32 %x) {
define i32 @test_mul_by_62(i32 %x) {
; X86-LABEL: test_mul_by_62:
; X86: # %bb.0:
-; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: leal (%eax,%eax), %ecx
; X86-NEXT: shll $6, %eax
; X86-NEXT: subl %ecx, %eax
-; X86-NEXT: subl %ecx, %eax
; X86-NEXT: retl
;
; X64-LABEL: test_mul_by_62:
; X64: # %bb.0:
; X64-NEXT: movl %edi, %eax
+; X64-NEXT: leal (%rax,%rax), %ecx
; X64-NEXT: shll $6, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: subl %edi, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: # kill: def $eax killed $eax killed $rax
; X64-NEXT: retq
;
; X86-NOOPT-LABEL: test_mul_by_62:
@@ -1180,9 +1180,8 @@ define i32 @test_mul_by_66(i32 %x) {
; X64-SLM-LABEL: test_mul_by_66:
; X64-SLM: # %bb.0:
; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi
-; X64-SLM-NEXT: movl %edi, %eax
-; X64-SLM-NEXT: shll $6, %eax
-; X64-SLM-NEXT: addl %edi, %eax
+; X64-SLM-NEXT: leal (%rdi,%rdi), %eax
+; X64-SLM-NEXT: shll $6, %edi
; X64-SLM-NEXT: addl %edi, %eax
; X64-SLM-NEXT: retq
%mul = mul nsw i32 %x, 66
diff --git a/llvm/test/CodeGen/X86/mul-constant-i64.ll b/llvm/test/CodeGen/X86/mul-constant-i64.ll
index 031561514f190..fa709689afae2 100644
--- a/llvm/test/CodeGen/X86/mul-constant-i64.ll
+++ b/llvm/test/CodeGen/X86/mul-constant-i64.ll
@@ -402,11 +402,10 @@ define i64 @test_mul_by_13(i64 %x) {
define i64 @test_mul_by_14(i64 %x) {
; X86-LABEL: test_mul_by_14:
; X86: # %bb.0:
-; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: leal (%ecx,%ecx), %eax
; X86-NEXT: shll $4, %ecx
; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: subl %eax, %ecx
; X86-NEXT: movl $14, %eax
; X86-NEXT: mull {{[0-9]+}}(%esp)
; X86-NEXT: addl %ecx, %edx
@@ -1046,11 +1045,10 @@ define i64 @test_mul_by_29(i64 %x) {
define i64 @test_mul_by_30(i64 %x) {
; X86-LABEL: test_mul_by_30:
; X86: # %bb.0:
-; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: leal (%ecx,%ecx), %eax
; X86-NEXT: shll $5, %ecx
; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: subl %eax, %ecx
; X86-NEXT: movl $30, %eax
; X86-NEXT: mull {{[0-9]+}}(%esp)
; X86-NEXT: addl %ecx, %edx
@@ -1232,11 +1230,10 @@ define i64 @test_mul_by_41(i64 %x) {
define i64 @test_mul_by_62(i64 %x) {
; X86-LABEL: test_mul_by_62:
; X86: # %bb.0:
-; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: leal (%ecx,%ecx), %eax
; X86-NEXT: shll $6, %ecx
; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: subl %eax, %ecx
; X86-NEXT: movl $62, %eax
; X86-NEXT: mull {{[0-9]+}}(%esp)
; X86-NEXT: addl %ecx, %edx
@@ -1302,9 +1299,8 @@ define i64 @test_mul_by_66(i64 %x) {
;
; X64-SLM-LABEL: test_mul_by_66:
; X64-SLM: # %bb.0:
-; X64-SLM-NEXT: movq %rdi, %rax
-; X64-SLM-NEXT: shlq $6, %rax
-; X64-SLM-NEXT: addq %rdi, %rax
+; X64-SLM-NEXT: leaq (%rdi,%rdi), %rax
+; X64-SLM-NEXT: shlq $6, %rdi
; X64-SLM-NEXT: addq %rdi, %rax
; X64-SLM-NEXT: retq
;
diff --git a/llvm/test/CodeGen/X86/mul-constant-i8.ll b/llvm/test/CodeGen/X86/mul-constant-i8.ll
index 293d30175e65a..a4fa1ee8c0029 100644
--- a/llvm/test/CodeGen/X86/mul-constant-i8.ll
+++ b/llvm/test/CodeGen/X86/mul-constant-i8.ll
@@ -153,10 +153,10 @@ define i8 @test_mul_by_14(i8 %x) {
; X64-LABEL: test_mul_by_14:
; X64: # %bb.0:
; X64-NEXT: movl %edi, %eax
+; X64-NEXT: leal (%rax,%rax), %ecx
; X64-NEXT: shll $4, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: # kill: def $al killed $al killed $eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: # kill: def $al killed $al killed $rax
; X64-NEXT: retq
%m = mul i8 %x, 14
ret i8 %m
@@ -351,10 +351,10 @@ define i8 @test_mul_by_30(i8 %x) {
; X64-LABEL: test_mul_by_30:
; X64: # %bb.0:
; X64-NEXT: movl %edi, %eax
+; X64-NEXT: leal (%rax,%rax), %ecx
; X64-NEXT: shll $5, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: # kill: def $al killed $al killed $eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: # kill: def $al killed $al killed $rax
; X64-NEXT: retq
%m = mul i8 %x, 30
ret i8 %m
@@ -411,10 +411,10 @@ define i8 @test_mul_by_62(i8 %x) {
; X64-LABEL: test_mul_by_62:
; X64: # %bb.0:
; X64-NEXT: movl %edi, %eax
+; X64-NEXT: leal (%rax,%rax), %ecx
; X64-NEXT: shll $6, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: subl %edi, %eax
-; X64-NEXT: # kill: def $al killed $al killed $eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: # kill: def $al killed $al killed $rax
; X64-NEXT: retq
%m = mul i8 %x, 62
ret i8 %m
diff --git a/llvm/test/CodeGen/X86/mul-constant-result.ll b/llvm/test/CodeGen/X86/mul-constant-result.ll
index 59605ff5d843c..c9a9f83abd6c5 100644
--- a/llvm/test/CodeGen/X86/mul-constant-result.ll
+++ b/llvm/test/CodeGen/X86/mul-constant-result.ll
@@ -55,7 +55,7 @@ define i32 @mult(i32, i32) local_unnamed_addr #0 {
; X86-NEXT: jmp .LBB0_9
; X86-NEXT: .LBB0_13:
; X86-NEXT: leal (,%eax,8), %ecx
-; X86-NEXT: jmp .LBB0_41
+; X86-NEXT: jmp .LBB0_42
; X86-NEXT: .LBB0_14:
; X86-NEXT: shll $3, %eax
; X86-NEXT: popl %esi
@@ -75,31 +75,30 @@ define i32 @mult(i32, i32) local_unnamed_addr #0 {
; X86-NEXT: leal (%eax,%eax,2), %ecx
; X86-NEXT: jmp .LBB0_21
; X86-NEXT: .LBB0_22:
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: shll $4, %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: jmp .LBB0_41
-; X86-NEXT: .LBB0_23:
+; X86-NEXT: leal (%eax,%eax), %ecx
+; X86-NEXT: shll $4, %eax
+; X86-NEXT: jmp .LBB0_23
+; X86-NEXT: .LBB0_24:
; X86-NEXT: leal (%eax,%eax,4), %eax
; X86-NEXT: jmp .LBB0_9
-; X86-NEXT: .LBB0_24:
+; X86-NEXT: .LBB0_25:
; X86-NEXT: shll $4, %eax
; X86-NEXT: popl %esi
; X86-NEXT: .cfi_def_cfa_offset 4
; X86-NEXT: retl
-; X86-NEXT: .LBB0_25:
+; X86-NEXT: .LBB0_26:
; X86-NEXT: .cfi_def_cfa_offset 8
; X86-NEXT: movl %eax, %ecx
; X86-NEXT: shll $4, %ecx
-; X86-NEXT: jmp .LBB0_26
-; X86-NEXT: .LBB0_27:
+; X86-NEXT: jmp .LBB0_27
+; X86-NEXT: .LBB0_28:
; X86-NEXT: addl %eax, %eax
; X86-NEXT: .LBB0_15:
; X86-NEXT: leal (%eax,%eax,8), %eax
; X86-NEXT: popl %esi
; X86-NEXT: .cfi_def_cfa_offset 4
; X86-NEXT: retl
-; X86-NEXT: .LBB0_28:
+; X86-NEXT: .LBB0_29:
; X86-NEXT: .cfi_def_cfa_offset 8
; X86-NEXT: leal (%eax,%eax,8), %ecx
; X86-NEXT: .LBB0_18:
@@ -107,78 +106,82 @@ define i32 @mult(i32, i32) local_unnamed_addr #0 {
; X86-NEXT: popl %esi
; X86-NEXT: .cfi_def_cfa_offset 4
; X86-NEXT: retl
-; X86-NEXT: .LBB0_29:
+; X86-NEXT: .LBB0_30:
; X86-NEXT: .cfi_def_cfa_offset 8
; X86-NEXT: shll $2, %eax
; X86-NEXT: jmp .LBB0_11
-; X86-NEXT: .LBB0_30:
+; X86-NEXT: .LBB0_31:
; X86-NEXT: leal (%eax,%eax,4), %ecx
; X86-NEXT: .LBB0_21:
; X86-NEXT: leal (%eax,%ecx,4), %eax
; X86-NEXT: popl %esi
; X86-NEXT: .cfi_def_cfa_offset 4
; X86-NEXT: retl
-; X86-NEXT: .LBB0_31:
+; X86-NEXT: .LBB0_32:
; X86-NEXT: .cfi_def_cfa_offset 8
; X86-NEXT: leal (%eax,%eax,4), %ecx
; X86-NEXT: leal (%eax,%ecx,4), %ecx
-; X86-NEXT: jmp .LBB0_26
-; X86-NEXT: .LBB0_32:
+; X86-NEXT: jmp .LBB0_27
+; X86-NEXT: .LBB0_33:
; X86-NEXT: leal (%eax,%eax,2), %ecx
; X86-NEXT: shll $3, %ecx
-; X86-NEXT: jmp .LBB0_41
-; X86-NEXT: .LBB0_33:
+; X86-NEXT: jmp .LBB0_42
+; X86-NEXT: .LBB0_34:
; X86-NEXT: shll $3, %eax
; X86-NEXT: jmp .LBB0_9
-; X86-NEXT: .LBB0_34:
+; X86-NEXT: .LBB0_35:
; X86-NEXT: leal (%eax,%eax,4), %eax
; X86-NEXT: .LBB0_11:
; X86-NEXT: leal (%eax,%eax,4), %eax
; X86-NEXT: popl %esi
; X86-NEXT: .cfi_def_cfa_offset 4
; X86-NEXT: retl
-; X86-NEXT: .LBB0_35:
+; X86-NEXT: .LBB0_36:
; X86-NEXT: .cfi_def_cfa_offset 8
; X86-NEXT: leal (%eax,%eax,4), %ecx
; X86-NEXT: leal (%ecx,%ecx,4), %ecx
-; X86-NEXT: jmp .LBB0_26
-; X86-NEXT: .LBB0_36:
+; X86-NEXT: jmp .LBB0_27
+; X86-NEXT: .LBB0_37:
; X86-NEXT: leal (%eax,%eax,8), %eax
; X86-NEXT: .LBB0_9:
; X86-NEXT: leal (%eax,%eax,2), %eax
; X86-NEXT: popl %esi
; X86-NEXT: .cfi_def_cfa_offset 4
; X86-NEXT: retl
-; X86-NEXT: .LBB0_37:
+; X86-NEXT: .LBB0_38:
; X86-NEXT: .cfi_def_cfa_offset 8
; X86-NEXT: leal (%eax,%eax,8), %ecx
; X86-NEXT: leal (%ecx,%ecx,2), %ecx
-; X86-NEXT: jmp .LBB0_26
-; X86-NEXT: .LBB0_38:
+; X86-NEXT: jmp .LBB0_27
+; X86-NEXT: .LBB0_39:
; X86-NEXT: leal (%eax,%eax,8), %ecx
; X86-NEXT: leal (%ecx,%ecx,2), %ecx
; X86-NEXT: addl %eax, %ecx
-; X86-NEXT: .LBB0_26:
+; X86-NEXT: .LBB0_27:
; X86-NEXT: addl %ecx, %eax
; X86-NEXT: popl %esi
; X86-NEXT: .cfi_def_cfa_offset 4
; X86-NEXT: retl
-; X86-NEXT: .LBB0_39:
-; X86-NEXT: .cfi_def_cfa_offset 8
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: shll $5, %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: jmp .LBB0_41
; X86-NEXT: .LBB0_40:
+; X86-NEXT: .cfi_def_cfa_offset 8
+; X86-NEXT: leal (%eax,%eax), %ecx
+; X86-NEXT: shll $5, %eax
+; X86-NEXT: .LBB0_23:
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: popl %esi
+; X86-NEXT: .cfi_def_cfa_offset 4
+; X86-NEXT: retl
+; X86-NEXT: .LBB0_41:
+; X86-NEXT: .cfi_def_cfa_offset 8
; X86-NEXT: movl %eax, %ecx
; X86-NEXT: shll $5, %ecx
-; X86-NEXT: .LBB0_41:
+; X86-NEXT: .LBB0_42:
; X86-NEXT: subl %eax, %ecx
; X86-NEXT: movl %ecx, %eax
; X86-NEXT: popl %esi
; X86-NEXT: .cfi_def_cfa_offset 4
; X86-NEXT: retl
-; X86-NEXT: .LBB0_42:
+; X86-NEXT: .LBB0_43:
; X86-NEXT: .cfi_def_cfa_offset 8
; X86-NEXT: shll $5, %eax
; X86-NEXT: popl %esi
@@ -220,7 +223,7 @@ define i32 @mult(i32, i32) local_unnamed_addr #0 {
; X64-HSW-NEXT: retq
; X64-HSW-NEXT: .LBB0_9:
; X64-HSW-NEXT: leal (,%rax,8), %ecx
-; X64-HSW-NEXT: jmp .LBB0_37
+; X64-HSW-NEXT: jmp .LBB0_38
; X64-HSW-NEXT: .LBB0_10:
; X64-HSW-NEXT: shll $3, %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
@@ -247,98 +250,100 @@ define i32 @mult(i32, i32) local_unnamed_addr #0 {
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
; X64-HSW-NEXT: .LBB0_18:
-; X64-HSW-NEXT: movl %eax, %ecx
-; X64-HSW-NEXT: shll $4, %ecx
-; X64-HSW-NEXT: subl %eax, %ecx
-; X64-HSW-NEXT: jmp .LBB0_37
-; X64-HSW-NEXT: .LBB0_19:
+; X64-HSW-NEXT: leal (%rax,%rax), %ecx
+; X64-HSW-NEXT: shll $4, %eax
+; X64-HSW-NEXT: subl %ecx, %eax
+; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
+; X64-HSW-NEXT: retq
+; X64-HSW-NEXT: .LBB0_20:
; X64-HSW-NEXT: leal (%rax,%rax,4), %eax
; X64-HSW-NEXT: leal (%rax,%rax,2), %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
-; X64-HSW-NEXT: .LBB0_20:
+; X64-HSW-NEXT: .LBB0_21:
; X64-HSW-NEXT: shll $4, %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
-; X64-HSW-NEXT: .LBB0_21:
+; X64-HSW-NEXT: .LBB0_22:
; X64-HSW-NEXT: movl %eax, %ecx
; X64-HSW-NEXT: shll $4, %ecx
-; X64-HSW-NEXT: jmp .LBB0_34
-; X64-HSW-NEXT: .LBB0_22:
+; X64-HSW-NEXT: jmp .LBB0_35
+; X64-HSW-NEXT: .LBB0_23:
; X64-HSW-NEXT: addl %eax, %eax
; X64-HSW-NEXT: .LBB0_11:
; X64-HSW-NEXT: leal (%rax,%rax,8), %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
-; X64-HSW-NEXT: .LBB0_23:
+; X64-HSW-NEXT: .LBB0_24:
; X64-HSW-NEXT: leal (%rax,%rax,8), %ecx
; X64-HSW-NEXT: leal (%rax,%rcx,2), %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
-; X64-HSW-NEXT: .LBB0_24:
+; X64-HSW-NEXT: .LBB0_25:
; X64-HSW-NEXT: shll $2, %eax
; X64-HSW-NEXT: leal (%rax,%rax,4), %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
-; X64-HSW-NEXT: .LBB0_25:
+; X64-HSW-NEXT: .LBB0_26:
; X64-HSW-NEXT: leal (%rax,%rax,4), %ecx
; X64-HSW-NEXT: leal (%rax,%rcx,4), %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
-; X64-HSW-NEXT: .LBB0_26:
+; X64-HSW-NEXT: .LBB0_27:
; X64-HSW-NEXT: leal (%rax,%rax,4), %ecx
; X64-HSW-NEXT: leal (%rax,%rcx,4), %ecx
-; X64-HSW-NEXT: jmp .LBB0_34
-; X64-HSW-NEXT: .LBB0_27:
+; X64-HSW-NEXT: jmp .LBB0_35
+; X64-HSW-NEXT: .LBB0_28:
; X64-HSW-NEXT: leal (%rax,%rax,2), %ecx
; X64-HSW-NEXT: shll $3, %ecx
-; X64-HSW-NEXT: jmp .LBB0_37
-; X64-HSW-NEXT: .LBB0_28:
+; X64-HSW-NEXT: jmp .LBB0_38
+; X64-HSW-NEXT: .LBB0_29:
; X64-HSW-NEXT: shll $3, %eax
; X64-HSW-NEXT: leal (%rax,%rax,2), %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
-; X64-HSW-NEXT: .LBB0_29:
+; X64-HSW-NEXT: .LBB0_30:
; X64-HSW-NEXT: leal (%rax,%rax,4), %eax
; X64-HSW-NEXT: leal (%rax,%rax,4), %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
-; X64-HSW-NEXT: .LBB0_30:
+; X64-HSW-NEXT: .LBB0_31:
; X64-HSW-NEXT: leal (%rax,%rax,4), %ecx
; X64-HSW-NEXT: leal (%rcx,%rcx,4), %ecx
-; X64-HSW-NEXT: jmp .LBB0_34
-; X64-HSW-NEXT: .LBB0_31:
+; X64-HSW-NEXT: jmp .LBB0_35
+; X64-HSW-NEXT: .LBB0_32:
; X64-HSW-NEXT: leal (%rax,%rax,8), %eax
; X64-HSW-NEXT: leal (%rax,%rax,2), %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
-; X64-HSW-NEXT: .LBB0_32:
+; X64-HSW-NEXT: .LBB0_33:
; X64-HSW-NEXT: leal (%rax,%rax,8), %ecx
; X64-HSW-NEXT: leal (%rcx,%rcx,2), %ecx
-; X64-HSW-NEXT: jmp .LBB0_34
-; X64-HSW-NEXT: .LBB0_33:
+; X64-HSW-NEXT: jmp .LBB0_35
+; X64-HSW-NEXT: .LBB0_34:
; X64-HSW-NEXT: leal (%rax,%rax,8), %ecx
; X64-HSW-NEXT: leal (%rcx,%rcx,2), %ecx
; X64-HSW-NEXT: addl %eax, %ecx
-; X64-HSW-NEXT: .LBB0_34:
+; X64-HSW-NEXT: .LBB0_35:
; X64-HSW-NEXT: addl %eax, %ecx
; X64-HSW-NEXT: movl %ecx, %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
-; X64-HSW-NEXT: .LBB0_35:
-; X64-HSW-NEXT: movl %eax, %ecx
-; X64-HSW-NEXT: shll $5, %ecx
-; X64-HSW-NEXT: subl %eax, %ecx
-; X64-HSW-NEXT: jmp .LBB0_37
; X64-HSW-NEXT: .LBB0_36:
+; X64-HSW-NEXT: leal (%rax,%rax), %ecx
+; X64-HSW-NEXT: shll $5, %eax
+; X64-HSW-NEXT: subl %ecx, %eax
+; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
+; X64-HSW-NEXT: retq
+; X64-HSW-NEXT: .LBB0_37:
; X64-HSW-NEXT: movl %eax, %ecx
; X64-HSW-NEXT: shll $5, %ecx
-; X64-HSW-NEXT: .LBB0_37:
+; X64-HSW-NEXT: .LBB0_38:
; X64-HSW-NEXT: subl %eax, %ecx
; X64-HSW-NEXT: movl %ecx, %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
-; X64-HSW-NEXT: .LBB0_39:
+; X64-HSW-NEXT: .LBB0_40:
; X64-HSW-NEXT: shll $5, %eax
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
; X64-HSW-NEXT: retq
More information about the llvm-commits
mailing list