Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit e2033fe

Browse files
committed
[X86] Change multiply by 26 to use two multiplies by 5 and an add instead of multiply by 3 and 9 and a subtract.
Same number of operations, but ending in an add is friendlier due to it being commutable. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337869 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 222b8be commit e2033fe

File tree

5 files changed

+41
-37
lines changed

5 files changed

+41
-37
lines changed

lib/Target/X86/X86ISelLowering.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33698,10 +33698,10 @@ static SDValue combineMulSpecial(uint64_t MulAmt, SDNode *N, SelectionDAG &DAG,
3369833698
return Result;
3369933699
};
3370033700

33701-
auto combineMulMulAddOrSub = [&](bool isAdd) {
33701+
auto combineMulMulAddOrSub = [&](int Mul1, int Mul2, bool isAdd) {
3370233702
SDValue Result = DAG.getNode(X86ISD::MUL_IMM, DL, VT, N->getOperand(0),
33703-
DAG.getConstant(9, DL, VT));
33704-
Result = DAG.getNode(ISD::MUL, DL, VT, Result, DAG.getConstant(3, DL, VT));
33703+
DAG.getConstant(Mul1, DL, VT));
33704+
Result = DAG.getNode(ISD::MUL, DL, VT, Result, DAG.getConstant(Mul2, DL, VT));
3370533705
Result = DAG.getNode(isAdd ? ISD::ADD : ISD::SUB, DL, VT, Result,
3370633706
N->getOperand(0));
3370733707
return Result;
@@ -33730,15 +33730,15 @@ static SDValue combineMulSpecial(uint64_t MulAmt, SDNode *N, SelectionDAG &DAG,
3373033730
// mul x, 23 => sub ((shl (mul x, 3), 3), x)
3373133731
return combineMulShlAddOrSub(3, 3, /*isAdd*/ false);
3373233732
case 26:
33733-
// mul x, 26 => sub ((mul (mul x, 9), 3), x)
33734-
return combineMulMulAddOrSub(/*isAdd*/ false);
33733+
// mul x, 26 => add ((mul (mul x, 5), 5), x)
33734+
return combineMulMulAddOrSub(5, 5, /*isAdd*/ true);
3373533735
case 28:
3373633736
// mul x, 28 => add ((mul (mul x, 9), 3), x)
33737-
return combineMulMulAddOrSub(/*isAdd*/ true);
33737+
return combineMulMulAddOrSub(9, 3, /*isAdd*/ true);
3373833738
case 29:
3373933739
// mul x, 29 => add (add ((mul (mul x, 9), 3), x), x)
3374033740
return DAG.getNode(ISD::ADD, DL, VT, N->getOperand(0),
33741-
combineMulMulAddOrSub(/*isAdd*/ true));
33741+
combineMulMulAddOrSub(9, 3, /*isAdd*/ true));
3374233742
}
3374333743
return SDValue();
3374433744
}

test/CodeGen/X86/mul-constant-i16.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -494,18 +494,18 @@ define i16 @test_mul_by_26(i16 %x) {
494494
; X86-LABEL: test_mul_by_26:
495495
; X86: # %bb.0:
496496
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
497-
; X86-NEXT: leal (%ecx,%ecx,8), %eax
498-
; X86-NEXT: leal (%eax,%eax,2), %eax
499-
; X86-NEXT: subl %ecx, %eax
497+
; X86-NEXT: leal (%ecx,%ecx,4), %eax
498+
; X86-NEXT: leal (%eax,%eax,4), %eax
499+
; X86-NEXT: addl %ecx, %eax
500500
; X86-NEXT: # kill: def $ax killed $ax killed $eax
501501
; X86-NEXT: retl
502502
;
503503
; X64-LABEL: test_mul_by_26:
504504
; X64: # %bb.0:
505505
; X64-NEXT: # kill: def $edi killed $edi def $rdi
506-
; X64-NEXT: leal (%rdi,%rdi,8), %eax
507-
; X64-NEXT: leal (%rax,%rax,2), %eax
508-
; X64-NEXT: subl %edi, %eax
506+
; X64-NEXT: leal (%rdi,%rdi,4), %eax
507+
; X64-NEXT: leal (%rax,%rax,4), %eax
508+
; X64-NEXT: addl %edi, %eax
509509
; X64-NEXT: # kill: def $ax killed $ax killed $eax
510510
; X64-NEXT: retq
511511
%mul = mul nsw i16 %x, 26

test/CodeGen/X86/mul-constant-i32.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,25 +1304,25 @@ define i32 @test_mul_by_26(i32 %x) {
13041304
; X86-LABEL: test_mul_by_26:
13051305
; X86: # %bb.0:
13061306
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
1307-
; X86-NEXT: leal (%ecx,%ecx,8), %eax
1308-
; X86-NEXT: leal (%eax,%eax,2), %eax
1309-
; X86-NEXT: subl %ecx, %eax
1307+
; X86-NEXT: leal (%ecx,%ecx,4), %eax
1308+
; X86-NEXT: leal (%eax,%eax,4), %eax
1309+
; X86-NEXT: addl %ecx, %eax
13101310
; X86-NEXT: retl
13111311
;
13121312
; X64-HSW-LABEL: test_mul_by_26:
13131313
; X64-HSW: # %bb.0:
13141314
; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi
1315-
; X64-HSW-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50]
1316-
; X64-HSW-NEXT: leal (%rax,%rax,2), %eax # sched: [1:0.50]
1317-
; X64-HSW-NEXT: subl %edi, %eax # sched: [1:0.25]
1315+
; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50]
1316+
; X64-HSW-NEXT: leal (%rax,%rax,4), %eax # sched: [1:0.50]
1317+
; X64-HSW-NEXT: addl %edi, %eax # sched: [1:0.25]
13181318
; X64-HSW-NEXT: retq # sched: [7:1.00]
13191319
;
13201320
; X64-JAG-LABEL: test_mul_by_26:
13211321
; X64-JAG: # %bb.0:
13221322
; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi
1323-
; X64-JAG-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00]
1324-
; X64-JAG-NEXT: leal (%rax,%rax,2), %eax # sched: [2:1.00]
1325-
; X64-JAG-NEXT: subl %edi, %eax # sched: [1:0.50]
1323+
; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00]
1324+
; X64-JAG-NEXT: leal (%rax,%rax,4), %eax # sched: [2:1.00]
1325+
; X64-JAG-NEXT: addl %edi, %eax # sched: [1:0.50]
13261326
; X64-JAG-NEXT: retq # sched: [4:1.00]
13271327
;
13281328
; X86-NOOPT-LABEL: test_mul_by_26:

test/CodeGen/X86/mul-constant-i64.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1358,26 +1358,26 @@ define i64 @test_mul_by_26(i64 %x) {
13581358
; X86-LABEL: test_mul_by_26:
13591359
; X86: # %bb.0:
13601360
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1361-
; X86-NEXT: leal (%eax,%eax,8), %ecx
1362-
; X86-NEXT: leal (%ecx,%ecx,2), %ecx
1363-
; X86-NEXT: subl %eax, %ecx
1361+
; X86-NEXT: leal (%eax,%eax,4), %ecx
1362+
; X86-NEXT: leal (%ecx,%ecx,4), %ecx
1363+
; X86-NEXT: addl %eax, %ecx
13641364
; X86-NEXT: movl $26, %eax
13651365
; X86-NEXT: mull {{[0-9]+}}(%esp)
13661366
; X86-NEXT: addl %ecx, %edx
13671367
; X86-NEXT: retl
13681368
;
13691369
; X64-HSW-LABEL: test_mul_by_26:
13701370
; X64-HSW: # %bb.0:
1371-
; X64-HSW-NEXT: leaq (%rdi,%rdi,8), %rax # sched: [1:0.50]
1372-
; X64-HSW-NEXT: leaq (%rax,%rax,2), %rax # sched: [1:0.50]
1373-
; X64-HSW-NEXT: subq %rdi, %rax # sched: [1:0.25]
1371+
; X64-HSW-NEXT: leaq (%rdi,%rdi,4), %rax # sched: [1:0.50]
1372+
; X64-HSW-NEXT: leaq (%rax,%rax,4), %rax # sched: [1:0.50]
1373+
; X64-HSW-NEXT: addq %rdi, %rax # sched: [1:0.25]
13741374
; X64-HSW-NEXT: retq # sched: [7:1.00]
13751375
;
13761376
; X64-JAG-LABEL: test_mul_by_26:
13771377
; X64-JAG: # %bb.0:
1378-
; X64-JAG-NEXT: leaq (%rdi,%rdi,8), %rax # sched: [2:1.00]
1379-
; X64-JAG-NEXT: leaq (%rax,%rax,2), %rax # sched: [2:1.00]
1380-
; X64-JAG-NEXT: subq %rdi, %rax # sched: [1:0.50]
1378+
; X64-JAG-NEXT: leaq (%rdi,%rdi,4), %rax # sched: [2:1.00]
1379+
; X64-JAG-NEXT: leaq (%rax,%rax,4), %rax # sched: [2:1.00]
1380+
; X64-JAG-NEXT: addq %rdi, %rax # sched: [1:0.50]
13811381
; X64-JAG-NEXT: retq # sched: [4:1.00]
13821382
;
13831383
; X86-NOOPT-LABEL: test_mul_by_26:

test/CodeGen/X86/mul-constant-result.ll

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,14 @@ define i32 @mult(i32, i32) local_unnamed_addr #0 {
193193
; X86-NEXT: retl
194194
; X86-NEXT: .LBB0_32:
195195
; X86-NEXT: .cfi_def_cfa_offset 8
196-
; X86-NEXT: leal (%eax,%eax,8), %ecx
197-
; X86-NEXT: leal (%ecx,%ecx,2), %ecx
198-
; X86-NEXT: jmp .LBB0_12
196+
; X86-NEXT: leal (%eax,%eax,4), %ecx
197+
; X86-NEXT: leal (%ecx,%ecx,4), %ecx
198+
; X86-NEXT: addl %ecx, %eax
199+
; X86-NEXT: popl %esi
200+
; X86-NEXT: .cfi_def_cfa_offset 4
201+
; X86-NEXT: retl
199202
; X86-NEXT: .LBB0_33:
203+
; X86-NEXT: .cfi_def_cfa_offset 8
200204
; X86-NEXT: leal (%eax,%eax,8), %eax
201205
; X86-NEXT: leal (%eax,%eax,2), %eax
202206
; X86-NEXT: popl %esi
@@ -369,9 +373,9 @@ define i32 @mult(i32, i32) local_unnamed_addr #0 {
369373
; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax
370374
; X64-HSW-NEXT: retq
371375
; X64-HSW-NEXT: .LBB0_29:
372-
; X64-HSW-NEXT: leal (%rax,%rax,8), %ecx
373-
; X64-HSW-NEXT: leal (%rcx,%rcx,2), %ecx
374-
; X64-HSW-NEXT: jmp .LBB0_8
376+
; X64-HSW-NEXT: leal (%rax,%rax,4), %ecx
377+
; X64-HSW-NEXT: leal (%rcx,%rcx,4), %ecx
378+
; X64-HSW-NEXT: jmp .LBB0_20
375379
; X64-HSW-NEXT: .LBB0_30:
376380
; X64-HSW-NEXT: leal (%rax,%rax,8), %eax
377381
; X64-HSW-NEXT: leal (%rax,%rax,2), %eax

0 commit comments

Comments
 (0)