summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorAlex Bradbury <asb@lowrisc.org>2018-10-03 23:30:16 +0000
committerAlex Bradbury <asb@lowrisc.org>2018-10-03 23:30:16 +0000
commit5ac0a2fc48bdfc1165ca66b157cc0c46ba04e6e2 (patch)
tree466b296baa84f2264040df8fb060c958aa1f5c9d /llvm/lib/Target
parent150ca5309e7c321689527a60e6e7b8d636f20a79 (diff)
downloadbcm5719-llvm-5ac0a2fc48bdfc1165ca66b157cc0c46ba04e6e2.tar.gz
bcm5719-llvm-5ac0a2fc48bdfc1165ca66b157cc0c46ba04e6e2.zip
[RISCV] Handle redundant SplitF64+BuildPairF64 pairs in a DAGCombine
r343712 performed this optimisation during instruction selection. As Eli Friedman pointed out in post-commit review, implementing this as a DAGCombine might allow opportunities for further optimisations. llvm-svn: 343741
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp12
-rw-r--r--llvm/lib/Target/RISCV/RISCVISelLowering.cpp18
-rw-r--r--llvm/lib/Target/RISCV/RISCVISelLowering.h2
3 files changed, 20 insertions, 12 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
index e61086bf0d3..e355b208a75 100644
--- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
@@ -96,18 +96,6 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
ReplaceNode(Node, CurDAG->getMachineNode(RISCV::ADDI, DL, VT, TFI, Imm));
return;
}
- case RISCVISD::SplitF64: {
- // If the input to SplitF64 is just BuildPairF64 then the operation is
- // redundant. Instead, use BuildPairF64's operands directly. This pattern
- // can't be written in tablegen due to the multiple outputs.
- SDValue Op0 = Node->getOperand(0);
- if (Op0->getOpcode() != RISCVISD::BuildPairF64)
- break;
- ReplaceUses(SDValue(Node, 0), Op0.getOperand(0));
- ReplaceUses(SDValue(Node, 1), Op0.getOperand(1));
- CurDAG->RemoveDeadNode(Node);
- return;
- }
}
// Select the default instruction.
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 69569752183..550c9061eb4 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -494,6 +494,24 @@ SDValue RISCVTargetLowering::LowerRETURNADDR(SDValue Op,
return DAG.getCopyFromReg(DAG.getEntryNode(), DL, Reg, XLenVT);
}
+SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
+ DAGCombinerInfo &DCI) const {
+ switch (N->getOpcode()) {
+ default:
+ break;
+ case RISCVISD::SplitF64: {
+ // If the input to SplitF64 is just BuildPairF64 then the operation is
+ // redundant. Instead, use BuildPairF64's operands directly.
+ SDValue Op0 = N->getOperand(0);
+ if (Op0->getOpcode() != RISCVISD::BuildPairF64)
+ break;
+ return DCI.CombineTo(N, Op0.getOperand(0), Op0.getOperand(1));
+ }
+ }
+
+ return SDValue();
+}
+
static MachineBasicBlock *emitSplitF64Pseudo(MachineInstr &MI,
MachineBasicBlock *BB) {
assert(MI.getOpcode() == RISCV::SplitF64Pseudo && "Unexpected instruction");
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.h b/llvm/lib/Target/RISCV/RISCVISelLowering.h
index e21951140b3..47dbc1af969 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.h
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.h
@@ -58,6 +58,8 @@ public:
// Provide custom lowering hooks for some operations.
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
+ SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
+
// This method returns the name of a target specific DAG node.
const char *getTargetNodeName(unsigned Opcode) const override;
OpenPOWER on IntegriCloud