diff options
author | Alex Bradbury <asb@lowrisc.org> | 2018-10-03 23:30:16 +0000 |
---|---|---|
committer | Alex Bradbury <asb@lowrisc.org> | 2018-10-03 23:30:16 +0000 |
commit | 5ac0a2fc48bdfc1165ca66b157cc0c46ba04e6e2 (patch) | |
tree | 466b296baa84f2264040df8fb060c958aa1f5c9d /llvm/lib/Target/RISCV/RISCVISelLowering.cpp | |
parent | 150ca5309e7c321689527a60e6e7b8d636f20a79 (diff) | |
download | bcm5719-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/RISCV/RISCVISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
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"); |