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

Commit 2bbe261

Browse files
committed
[DAGCombiner] Fold X - (-Y *Z) -> X + (Y * Z)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337518 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 604b45d commit 2bbe261

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

lib/CodeGen/SelectionDAG/DAGCombiner.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -2629,6 +2629,24 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
26292629
return DAG.getNode(ISD::SUB, DL, VT, N0.getOperand(0),
26302630
N0.getOperand(1).getOperand(0));
26312631

2632+
// fold (X - (-Y * Z)) -> (X + (Y * Z))
2633+
if (N1.getOpcode() == ISD::MUL && N1.hasOneUse()) {
2634+
if (N1.getOperand(0).getOpcode() == ISD::SUB &&
2635+
isNullConstantOrNullSplatConstant(N1.getOperand(0).getOperand(0))) {
2636+
SDValue Mul = DAG.getNode(ISD::MUL, DL, VT,
2637+
N1.getOperand(0).getOperand(1),
2638+
N1.getOperand(1));
2639+
return DAG.getNode(ISD::ADD, DL, VT, N0, Mul);
2640+
}
2641+
if (N1.getOperand(1).getOpcode() == ISD::SUB &&
2642+
isNullConstantOrNullSplatConstant(N1.getOperand(1).getOperand(0))) {
2643+
SDValue Mul = DAG.getNode(ISD::MUL, DL, VT,
2644+
N1.getOperand(0),
2645+
N1.getOperand(1).getOperand(1));
2646+
return DAG.getNode(ISD::ADD, DL, VT, N0, Mul);
2647+
}
2648+
}
2649+
26322650
// If either operand of a sub is undef, the result is undef
26332651
if (N0.isUndef())
26342652
return N0;

test/CodeGen/X86/combine-srem.ll

+7-12
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@ define <4 x i32> @combine_vec_srem_by_negone(<4 x i32> %x) {
5555
define i32 @combine_srem_by_minsigned(i32 %x) {
5656
; CHECK-LABEL: combine_srem_by_minsigned:
5757
; CHECK: # %bb.0:
58+
; CHECK-NEXT: # kill: def $edi killed $edi def $rdi
5859
; CHECK-NEXT: movl %edi, %eax
5960
; CHECK-NEXT: sarl $31, %eax
6061
; CHECK-NEXT: shrl %eax
6162
; CHECK-NEXT: addl %edi, %eax
6263
; CHECK-NEXT: andl $-2147483648, %eax # imm = 0x80000000
63-
; CHECK-NEXT: subl %eax, %edi
64-
; CHECK-NEXT: movl %edi, %eax
64+
; CHECK-NEXT: leal (%rax,%rdi), %eax
6565
; CHECK-NEXT: retq
6666
%1 = srem i32 %x, -2147483648
6767
ret i32 %1
@@ -359,10 +359,9 @@ define <4 x i32> @combine_vec_srem_by_pow2b_neg(<4 x i32> %x) {
359359
; SSE-NEXT: psrad $1, %xmm1
360360
; SSE-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
361361
; SSE-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
362-
; SSE-NEXT: pxor %xmm2, %xmm2
363-
; SSE-NEXT: psubd %xmm1, %xmm2
364-
; SSE-NEXT: pmulld {{.*}}(%rip), %xmm2
365-
; SSE-NEXT: psubd %xmm2, %xmm0
362+
; SSE-NEXT: pmulld {{.*}}(%rip), %xmm1
363+
; SSE-NEXT: paddd %xmm0, %xmm1
364+
; SSE-NEXT: movdqa %xmm1, %xmm0
366365
; SSE-NEXT: retq
367366
;
368367
; AVX1-LABEL: combine_vec_srem_by_pow2b_neg:
@@ -383,10 +382,8 @@ define <4 x i32> @combine_vec_srem_by_pow2b_neg(<4 x i32> %x) {
383382
; AVX1-NEXT: vpsrad $1, %xmm1, %xmm1
384383
; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]
385384
; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
386-
; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
387-
; AVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1
388385
; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm1, %xmm1
389-
; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0
386+
; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
390387
; AVX1-NEXT: retq
391388
;
392389
; AVX2-LABEL: combine_vec_srem_by_pow2b_neg:
@@ -395,10 +392,8 @@ define <4 x i32> @combine_vec_srem_by_pow2b_neg(<4 x i32> %x) {
395392
; AVX2-NEXT: vpsrlvd {{.*}}(%rip), %xmm1, %xmm1
396393
; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1
397394
; AVX2-NEXT: vpsravd {{.*}}(%rip), %xmm1, %xmm1
398-
; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
399-
; AVX2-NEXT: vpsubd %xmm1, %xmm2, %xmm1
400395
; AVX2-NEXT: vpmulld {{.*}}(%rip), %xmm1, %xmm1
401-
; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm0
396+
; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
402397
; AVX2-NEXT: retq
403398
%1 = srem <4 x i32> %x, <i32 -2, i32 -4, i32 -8, i32 -16>
404399
ret <4 x i32> %1

0 commit comments

Comments
 (0)