summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2019-04-24 18:02:07 +0000
committerCraig Topper <craig.topper@intel.com>2019-04-24 18:02:07 +0000
commit882ca6d48483938bd1f3b42c279f9aa8364149a7 (patch)
treeb44a21e7a28a2e10751610393824f1af161743e8
parent25c6a5073dfc9573bf14dcc0ed1d0f1950175eba (diff)
downloadbcm5719-llvm-882ca6d48483938bd1f3b42c279f9aa8364149a7.tar.gz
bcm5719-llvm-882ca6d48483938bd1f3b42c279f9aa8364149a7.zip
[X86] Remove dead nodes left after ReplaceAllUsesWith calls during address matching
ReplaceAllUsesWith doesn't remove the node that was replaced. So its left around in the graph messing up use counts on other nodes. One thing to note, is that this isn't valid if the node being deleted is the root node of an LEA match that gets rejected. In that case the node needs to stay alive because the isel table walking code would still have a reference to it that its going to try to match next. I don't think that's the case here though because the nodes being deleted here should be "and", "srl", and "zero_extend" none of which can be the root node of an LEA match. Differential Revision: https://reviews.llvm.org/D61048 llvm-svn: 359121
-rw-r--r--llvm/lib/Target/X86/X86ISelDAGToDAG.cpp5
-rw-r--r--llvm/test/CodeGen/X86/fold-and-shift.ll12
-rw-r--r--llvm/test/CodeGen/X86/pr32329.ll40
3 files changed, 31 insertions, 26 deletions
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
index fff6bb8571e..df7f1fc524b 100644
--- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -1375,6 +1375,7 @@ static bool foldMaskAndShiftToExtract(SelectionDAG &DAG, SDValue N,
insertDAGNode(DAG, N, ShlCount);
insertDAGNode(DAG, N, Shl);
DAG.ReplaceAllUsesWith(N, Shl);
+ DAG.RemoveDeadNode(N.getNode());
AM.IndexReg = And;
AM.Scale = (1 << ScaleLog);
return false;
@@ -1441,6 +1442,7 @@ static bool foldMaskedShiftToScaledMask(SelectionDAG &DAG, SDValue N,
insertDAGNode(DAG, N, NewAnd);
insertDAGNode(DAG, N, NewShift);
DAG.ReplaceAllUsesWith(N, NewShift);
+ DAG.RemoveDeadNode(N.getNode());
AM.Scale = 1 << ShiftAmt;
AM.IndexReg = NewAnd;
@@ -1551,6 +1553,7 @@ static bool foldMaskAndShiftToScale(SelectionDAG &DAG, SDValue N,
insertDAGNode(DAG, N, NewSHLAmt);
insertDAGNode(DAG, N, NewSHL);
DAG.ReplaceAllUsesWith(N, NewSHL);
+ DAG.RemoveDeadNode(N.getNode());
AM.Scale = 1 << AMShiftAmt;
AM.IndexReg = NewSRL;
@@ -1609,6 +1612,7 @@ static bool foldMaskedShiftToBEXTR(SelectionDAG &DAG, SDValue N,
insertDAGNode(DAG, N, NewSHLAmt);
insertDAGNode(DAG, N, NewSHL);
DAG.ReplaceAllUsesWith(N, NewSHL);
+ DAG.RemoveDeadNode(N.getNode());
AM.Scale = 1 << AMShiftAmt;
AM.IndexReg = NewAnd;
@@ -1940,6 +1944,7 @@ bool X86DAGToDAGISel::matchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
insertDAGNode(*CurDAG, N, Zext);
insertDAGNode(*CurDAG, N, NewShl);
CurDAG->ReplaceAllUsesWith(N, NewShl);
+ CurDAG->RemoveDeadNode(N.getNode());
return false;
}
}
diff --git a/llvm/test/CodeGen/X86/fold-and-shift.ll b/llvm/test/CodeGen/X86/fold-and-shift.ll
index 39c91d90017..e14e337ea89 100644
--- a/llvm/test/CodeGen/X86/fold-and-shift.ll
+++ b/llvm/test/CodeGen/X86/fold-and-shift.ll
@@ -5,8 +5,8 @@ define i32 @t1(i8* %X, i32 %i) {
; CHECK-LABEL: t1:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-NEXT: movzbl %cl, %ecx
+; CHECK-NEXT: movl $255, %ecx
+; CHECK-NEXT: andl {{[0-9]+}}(%esp), %ecx
; CHECK-NEXT: movl (%eax,%ecx,4), %eax
; CHECK-NEXT: retl
@@ -23,8 +23,8 @@ define i32 @t2(i16* %X, i32 %i) {
; CHECK-LABEL: t2:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-NEXT: movzwl %cx, %ecx
+; CHECK-NEXT: movl $65535, %ecx # imm = 0xFFFF
+; CHECK-NEXT: andl {{[0-9]+}}(%esp), %ecx
; CHECK-NEXT: movl (%eax,%ecx,4), %eax
; CHECK-NEXT: retl
@@ -111,8 +111,8 @@ define i8 @t6(i8* %X, i32 %i) {
; CHECK-LABEL: t6:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-NEXT: andl $-255, %ecx
+; CHECK-NEXT: movl $-255, %ecx
+; CHECK-NEXT: andl {{[0-9]+}}(%esp), %ecx
; CHECK-NEXT: movb (%eax,%ecx,4), %al
; CHECK-NEXT: retl
diff --git a/llvm/test/CodeGen/X86/pr32329.ll b/llvm/test/CodeGen/X86/pr32329.ll
index 21109469723..8323bd1a242 100644
--- a/llvm/test/CodeGen/X86/pr32329.ll
+++ b/llvm/test/CodeGen/X86/pr32329.ll
@@ -29,18 +29,18 @@ define void @foo() local_unnamed_addr {
; X86-NEXT: .cfi_offset %edi, -16
; X86-NEXT: .cfi_offset %ebx, -12
; X86-NEXT: .cfi_offset %ebp, -8
-; X86-NEXT: movl obj, %edx
; X86-NEXT: movsbl var_27, %eax
; X86-NEXT: movzwl var_2, %esi
; X86-NEXT: movl var_310, %ecx
; X86-NEXT: imull %eax, %ecx
; X86-NEXT: addl var_24, %ecx
-; X86-NEXT: andl $4194303, %edx # imm = 0x3FFFFF
-; X86-NEXT: leal (%edx,%edx), %ebx
-; X86-NEXT: subl %eax, %ebx
-; X86-NEXT: movl %ebx, %edi
-; X86-NEXT: subl %esi, %edi
-; X86-NEXT: imull %edi, %ecx
+; X86-NEXT: movl $4194303, %edi # imm = 0x3FFFFF
+; X86-NEXT: andl obj, %edi
+; X86-NEXT: leal (%edi,%edi), %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: movl %edx, %ebx
+; X86-NEXT: subl %esi, %ebx
+; X86-NEXT: imull %ebx, %ecx
; X86-NEXT: addb $113, %cl
; X86-NEXT: movl $9, %esi
; X86-NEXT: xorl %ebp, %ebp
@@ -50,12 +50,12 @@ define void @foo() local_unnamed_addr {
; X86-NEXT: cmovnel %esi, %ebp
; X86-NEXT: movl $0, %ecx
; X86-NEXT: cmovnel %ecx, %esi
-; X86-NEXT: cmpl %edx, %edi
+; X86-NEXT: cmpl %edi, %ebx
; X86-NEXT: movl %ebp, var_50+4
; X86-NEXT: movl %esi, var_50
; X86-NEXT: setge var_205
-; X86-NEXT: imull %eax, %ebx
-; X86-NEXT: movb %bl, var_218
+; X86-NEXT: imull %eax, %edx
+; X86-NEXT: movb %dl, var_218
; X86-NEXT: popl %esi
; X86-NEXT: .cfi_def_cfa_offset 16
; X86-NEXT: popl %edi
@@ -68,24 +68,24 @@ define void @foo() local_unnamed_addr {
;
; X64-LABEL: foo:
; X64: # %bb.0: # %entry
-; X64-NEXT: movl {{.*}}(%rip), %eax
; X64-NEXT: movsbl {{.*}}(%rip), %r9d
; X64-NEXT: movzwl {{.*}}(%rip), %r8d
; X64-NEXT: movl {{.*}}(%rip), %ecx
; X64-NEXT: imull %r9d, %ecx
; X64-NEXT: addl {{.*}}(%rip), %ecx
-; X64-NEXT: andl $4194303, %eax # imm = 0x3FFFFF
-; X64-NEXT: leal (%rax,%rax), %edi
+; X64-NEXT: movl $4194303, %esi # imm = 0x3FFFFF
+; X64-NEXT: andl {{.*}}(%rip), %esi
+; X64-NEXT: leal (%rsi,%rsi), %edi
; X64-NEXT: subl %r9d, %edi
-; X64-NEXT: movl %edi, %esi
-; X64-NEXT: subl %r8d, %esi
-; X64-NEXT: imull %esi, %ecx
+; X64-NEXT: movl %edi, %edx
+; X64-NEXT: subl %r8d, %edx
+; X64-NEXT: imull %edx, %ecx
; X64-NEXT: addb $113, %cl
-; X64-NEXT: movl $9, %edx
+; X64-NEXT: movl $9, %eax
; X64-NEXT: # kill: def $cl killed $cl killed $ecx
-; X64-NEXT: shlq %cl, %rdx
-; X64-NEXT: movq %rdx, {{.*}}(%rip)
-; X64-NEXT: cmpl %eax, %esi
+; X64-NEXT: shlq %cl, %rax
+; X64-NEXT: movq %rax, {{.*}}(%rip)
+; X64-NEXT: cmpl %esi, %edx
; X64-NEXT: setge {{.*}}(%rip)
; X64-NEXT: imull %r9d, %edi
; X64-NEXT: movb %dil, {{.*}}(%rip)
OpenPOWER on IntegriCloud