|
38 | 38 | #include "llvm/CodeGen/MachineFunction.h"
|
39 | 39 | #include "llvm/CodeGen/MachineMemOperand.h"
|
40 | 40 | #include "llvm/CodeGen/RuntimeLibcalls.h"
|
| 41 | +#include "llvm/CodeGen/SDPatternMatch.h" |
41 | 42 | #include "llvm/CodeGen/SelectionDAG.h"
|
42 | 43 | #include "llvm/CodeGen/SelectionDAGAddressAnalysis.h"
|
43 | 44 | #include "llvm/CodeGen/SelectionDAGNodes.h"
|
|
79 | 80 | #include "MatchContext.h"
|
80 | 81 |
|
81 | 82 | using namespace llvm;
|
| 83 | +using namespace llvm::SDPatternMatch; |
82 | 84 |
|
83 | 85 | #define DEBUG_TYPE "dagcombine"
|
84 | 86 |
|
@@ -2697,52 +2699,45 @@ SDValue DAGCombiner::visitADDLike(SDNode *N) {
|
2697 | 2699 | reassociateReduction(ISD::VECREDUCE_ADD, ISD::ADD, DL, VT, N0, N1))
|
2698 | 2700 | return SD;
|
2699 | 2701 | }
|
| 2702 | + |
| 2703 | + SDValue A, B, C; |
| 2704 | + |
2700 | 2705 | // fold ((0-A) + B) -> B-A
|
2701 |
| - if (N0.getOpcode() == ISD::SUB && isNullOrNullSplat(N0.getOperand(0))) |
2702 |
| - return DAG.getNode(ISD::SUB, DL, VT, N1, N0.getOperand(1)); |
| 2706 | + if (sd_match(N0, m_Sub(m_Zero(), m_Value(A)))) |
| 2707 | + return DAG.getNode(ISD::SUB, DL, VT, N1, A); |
2703 | 2708 |
|
2704 | 2709 | // fold (A + (0-B)) -> A-B
|
2705 |
| - if (N1.getOpcode() == ISD::SUB && isNullOrNullSplat(N1.getOperand(0))) |
2706 |
| - return DAG.getNode(ISD::SUB, DL, VT, N0, N1.getOperand(1)); |
| 2710 | + if (sd_match(N1, m_Sub(m_Zero(), m_Value(B)))) |
| 2711 | + return DAG.getNode(ISD::SUB, DL, VT, N0, B); |
2707 | 2712 |
|
2708 | 2713 | // fold (A+(B-A)) -> B
|
2709 |
| - if (N1.getOpcode() == ISD::SUB && N0 == N1.getOperand(1)) |
2710 |
| - return N1.getOperand(0); |
| 2714 | + if (sd_match(N1, m_Sub(m_Value(B), m_Specific(N0)))) |
| 2715 | + return B; |
2711 | 2716 |
|
2712 | 2717 | // fold ((B-A)+A) -> B
|
2713 |
| - if (N0.getOpcode() == ISD::SUB && N1 == N0.getOperand(1)) |
2714 |
| - return N0.getOperand(0); |
| 2718 | + if (sd_match(N0, m_Sub(m_Value(B), m_Specific(N1)))) |
| 2719 | + return B; |
2715 | 2720 |
|
2716 | 2721 | // fold ((A-B)+(C-A)) -> (C-B)
|
2717 |
| - if (N0.getOpcode() == ISD::SUB && N1.getOpcode() == ISD::SUB && |
2718 |
| - N0.getOperand(0) == N1.getOperand(1)) |
2719 |
| - return DAG.getNode(ISD::SUB, DL, VT, N1.getOperand(0), |
2720 |
| - N0.getOperand(1)); |
| 2722 | + if (sd_match(N0, m_Sub(m_Value(A), m_Value(B))) && |
| 2723 | + sd_match(N1, m_Sub(m_Value(C), m_Specific(A)))) |
| 2724 | + return DAG.getNode(ISD::SUB, DL, VT, C, B); |
2721 | 2725 |
|
2722 | 2726 | // fold ((A-B)+(B-C)) -> (A-C)
|
2723 |
| - if (N0.getOpcode() == ISD::SUB && N1.getOpcode() == ISD::SUB && |
2724 |
| - N0.getOperand(1) == N1.getOperand(0)) |
2725 |
| - return DAG.getNode(ISD::SUB, DL, VT, N0.getOperand(0), |
2726 |
| - N1.getOperand(1)); |
| 2727 | + if (sd_match(N0, m_Sub(m_Value(A), m_Value(B))) && |
| 2728 | + sd_match(N1, m_Sub(m_Specific(B), m_Value(C)))) |
| 2729 | + return DAG.getNode(ISD::SUB, DL, VT, A, C); |
2727 | 2730 |
|
2728 | 2731 | // fold (A+(B-(A+C))) to (B-C)
|
2729 |
| - if (N1.getOpcode() == ISD::SUB && N1.getOperand(1).getOpcode() == ISD::ADD && |
2730 |
| - N0 == N1.getOperand(1).getOperand(0)) |
2731 |
| - return DAG.getNode(ISD::SUB, DL, VT, N1.getOperand(0), |
2732 |
| - N1.getOperand(1).getOperand(1)); |
2733 |
| - |
2734 | 2732 | // fold (A+(B-(C+A))) to (B-C)
|
2735 |
| - if (N1.getOpcode() == ISD::SUB && N1.getOperand(1).getOpcode() == ISD::ADD && |
2736 |
| - N0 == N1.getOperand(1).getOperand(1)) |
2737 |
| - return DAG.getNode(ISD::SUB, DL, VT, N1.getOperand(0), |
2738 |
| - N1.getOperand(1).getOperand(0)); |
| 2733 | + if (sd_match(N1, m_Sub(m_Value(B), m_Add(m_Specific(N0), m_Value(C))))) |
| 2734 | + return DAG.getNode(ISD::SUB, DL, VT, B, C); |
2739 | 2735 |
|
2740 | 2736 | // fold (A+((B-A)+or-C)) to (B+or-C)
|
2741 |
| - if ((N1.getOpcode() == ISD::SUB || N1.getOpcode() == ISD::ADD) && |
2742 |
| - N1.getOperand(0).getOpcode() == ISD::SUB && |
2743 |
| - N0 == N1.getOperand(0).getOperand(1)) |
2744 |
| - return DAG.getNode(N1.getOpcode(), DL, VT, N1.getOperand(0).getOperand(0), |
2745 |
| - N1.getOperand(1)); |
| 2737 | + if (sd_match(N1, |
| 2738 | + m_AnyOf(m_Add(m_Sub(m_Value(B), m_Specific(N0)), m_Value(C)), |
| 2739 | + m_Sub(m_Sub(m_Value(B), m_Specific(N0)), m_Value(C))))) |
| 2740 | + return DAG.getNode(N1.getOpcode(), DL, VT, B, C); |
2746 | 2741 |
|
2747 | 2742 | // fold (A-B)+(C-D) to (A+C)-(B+D) when A or C is constant
|
2748 | 2743 | if (N0.getOpcode() == ISD::SUB && N1.getOpcode() == ISD::SUB &&
|
|
0 commit comments