summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2017-09-09 05:57:20 +0000
committerCraig Topper <craig.topper@intel.com>2017-09-09 05:57:20 +0000
commit6bed9de3d538d63b7df39807e14782fd297a1e7e (patch)
tree9877d8e9ec301ed7aa34e4e41f94f0b7111c5ab3 /llvm/lib/Target
parent63c5047a4ecbd03c23356978d6f85e26e81fe07b (diff)
downloadbcm5719-llvm-6bed9de3d538d63b7df39807e14782fd297a1e7e.tar.gz
bcm5719-llvm-6bed9de3d538d63b7df39807e14782fd297a1e7e.zip
[X86] Call removeDeadNode when we're done doing custom isel for mul, div and test
Summary: Once we've done our custom isel for these nodes, I think we should be calling removeDeadNode to prune them out of the DAG. Table driven isel ultimately either calls morphNodeTo which modifies a node and doesn't leave dead nodes. Or it emits new nodes and then calls removeDeadNode as part of Opc_CompleteMatch. If you run a simple multiply test case like this through llc with -debug you'll see a umul_lohi node get printed as part of the dump for Instruction Selection ends. ``` define i64 @foo(i64 %a, i64 %b) local_unnamed_addr #0 { entry: %conv = zext i64 %a to i128 %conv1 = zext i64 %b to i128 %mul = mul nuw nsw i128 %conv1, %conv %shr = lshr i128 %mul, 64 %conv2 = trunc i128 %shr to i64 ret i64 %conv2 } ``` Reviewers: RKSimon, spatel, zvi, guyblank, niravd Reviewed By: niravd Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D37547 llvm-svn: 312857
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/X86/X86ISelDAGToDAG.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
index 48c987a2891..4e75e0c6703 100644
--- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -2612,6 +2612,7 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
DEBUG(dbgs() << "=> "; ResHi.getNode()->dump(CurDAG); dbgs() << '\n');
}
+ CurDAG->RemoveDeadNode(Node);
return;
}
@@ -2796,6 +2797,7 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
ReplaceUses(SDValue(Node, 1), Result);
DEBUG(dbgs() << "=> "; Result.getNode()->dump(CurDAG); dbgs() << '\n');
}
+ CurDAG->RemoveDeadNode(Node);
return;
}
@@ -2854,6 +2856,7 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
// one, do not call ReplaceAllUsesWith.
ReplaceUses(SDValue(Node, (Opcode == X86ISD::SUB ? 1 : 0)),
SDValue(NewNode, 0));
+ CurDAG->RemoveDeadNode(Node);
return;
}
@@ -2889,6 +2892,7 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
// one, do not call ReplaceAllUsesWith.
ReplaceUses(SDValue(Node, (Opcode == X86ISD::SUB ? 1 : 0)),
SDValue(NewNode, 0));
+ CurDAG->RemoveDeadNode(Node);
return;
}
@@ -2909,6 +2913,7 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
// one, do not call ReplaceAllUsesWith.
ReplaceUses(SDValue(Node, (Opcode == X86ISD::SUB ? 1 : 0)),
SDValue(NewNode, 0));
+ CurDAG->RemoveDeadNode(Node);
return;
}
@@ -2929,6 +2934,7 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
// one, do not call ReplaceAllUsesWith.
ReplaceUses(SDValue(Node, (Opcode == X86ISD::SUB ? 1 : 0)),
SDValue(NewNode, 0));
+ CurDAG->RemoveDeadNode(Node);
return;
}
}
OpenPOWER on IntegriCloud