diff options
author | Craig Topper <craig.topper@intel.com> | 2018-07-20 01:40:03 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-07-20 01:40:03 +0000 |
commit | d8734450a26a8bdf135d56f7ddf6bc7286f8ce05 (patch) | |
tree | efd45526e1675e5e1a2fb82fa8017c7db4a2729e /llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | 4902bde560428d2aa105c10dc606913d3ae28cc9 (diff) | |
download | bcm5719-llvm-d8734450a26a8bdf135d56f7ddf6bc7286f8ce05.tar.gz bcm5719-llvm-d8734450a26a8bdf135d56f7ddf6bc7286f8ce05.zip |
[DAGCombiner] Fold X - (-Y *Z) -> X + (Y * Z)
llvm-svn: 337518
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 8ec1a3ed9fc..9a43aa69fec 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2629,6 +2629,24 @@ SDValue DAGCombiner::visitSUB(SDNode *N) { return DAG.getNode(ISD::SUB, DL, VT, N0.getOperand(0), N0.getOperand(1).getOperand(0)); + // fold (X - (-Y * Z)) -> (X + (Y * Z)) + if (N1.getOpcode() == ISD::MUL && N1.hasOneUse()) { + if (N1.getOperand(0).getOpcode() == ISD::SUB && + isNullConstantOrNullSplatConstant(N1.getOperand(0).getOperand(0))) { + SDValue Mul = DAG.getNode(ISD::MUL, DL, VT, + N1.getOperand(0).getOperand(1), + N1.getOperand(1)); + return DAG.getNode(ISD::ADD, DL, VT, N0, Mul); + } + if (N1.getOperand(1).getOpcode() == ISD::SUB && + isNullConstantOrNullSplatConstant(N1.getOperand(1).getOperand(0))) { + SDValue Mul = DAG.getNode(ISD::MUL, DL, VT, + N1.getOperand(0), + N1.getOperand(1).getOperand(1)); + return DAG.getNode(ISD::ADD, DL, VT, N0, Mul); + } + } + // If either operand of a sub is undef, the result is undef if (N0.isUndef()) return N0; |