[PATCH] D33882: [DAG] Move SelectionDAG::isCommutativeBinOp to TargetLowering.
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 6 21:30:17 PDT 2017
Simon Pilgrim via Phabricator <reviews at reviews.llvm.org> writes:
> RKSimon created this revision.
>
> This will allow commutation of target-specific DAG nodes in future patches
Sounds like a good direction. LGTM.
> Repository:
> rL LLVM
>
> https://reviews.llvm.org/D33882
>
> Files:
> include/llvm/CodeGen/SelectionDAG.h
> include/llvm/Target/TargetLowering.h
> lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> lib/CodeGen/SelectionDAG/TargetLowering.cpp
>
> Index: lib/CodeGen/SelectionDAG/TargetLowering.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/TargetLowering.cpp
> +++ lib/CodeGen/SelectionDAG/TargetLowering.cpp
> @@ -2166,7 +2166,7 @@
> return DAG.getSetCC(dl, VT, N0.getOperand(1), N1.getOperand(1), Cond);
> if (N0.getOperand(1) == N1.getOperand(1))
> return DAG.getSetCC(dl, VT, N0.getOperand(0), N1.getOperand(0), Cond);
> - if (DAG.isCommutativeBinOp(N0.getOpcode())) {
> + if (isCommutativeBinOp(N0.getOpcode())) {
> // If X op Y == Y op X, try other combinations.
> if (N0.getOperand(0) == N1.getOperand(1))
> return DAG.getSetCC(dl, VT, N0.getOperand(1), N1.getOperand(0),
> @@ -2230,7 +2230,7 @@
> return DAG.getSetCC(dl, VT, N0.getOperand(1),
> DAG.getConstant(0, dl, N0.getValueType()), Cond);
> if (N0.getOperand(1) == N1) {
> - if (DAG.isCommutativeBinOp(N0.getOpcode()))
> + if (isCommutativeBinOp(N0.getOpcode()))
> return DAG.getSetCC(dl, VT, N0.getOperand(0),
> DAG.getConstant(0, dl, N0.getValueType()),
> Cond);
> @@ -2257,7 +2257,7 @@
> return DAG.getSetCC(dl, VT, N1.getOperand(1),
> DAG.getConstant(0, dl, N1.getValueType()), Cond);
> if (N1.getOperand(1) == N0) {
> - if (DAG.isCommutativeBinOp(N1.getOpcode()))
> + if (isCommutativeBinOp(N1.getOpcode()))
> return DAG.getSetCC(dl, VT, N1.getOperand(0),
> DAG.getConstant(0, dl, N1.getValueType()), Cond);
> if (N1.getNode()->hasOneUse()) {
> Index: lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> +++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> @@ -3883,7 +3883,7 @@
> // fold (add Sym, c) -> Sym+c
> if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Cst1))
> return FoldSymbolOffset(Opcode, VT, GA, Cst2);
> - if (isCommutativeBinOp(Opcode))
> + if (TLI->isCommutativeBinOp(Opcode))
> if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Cst2))
> return FoldSymbolOffset(Opcode, VT, GA, Cst1);
>
> @@ -4029,7 +4029,7 @@
> ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
>
> // Canonicalize constant to RHS if commutative.
> - if (isCommutativeBinOp(Opcode)) {
> + if (TLI->isCommutativeBinOp(Opcode)) {
> if (N1C && !N2C) {
> std::swap(N1C, N2C);
> std::swap(N1, N2);
> @@ -4413,7 +4413,7 @@
>
> // Canonicalize an UNDEF to the RHS, even over a constant.
> if (N1.isUndef()) {
> - if (isCommutativeBinOp(Opcode)) {
> + if (TLI->isCommutativeBinOp(Opcode)) {
> std::swap(N1, N2);
> } else {
> switch (Opcode) {
> Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> +++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> @@ -1563,7 +1563,7 @@
>
> // If N is a commutative binary node, try commuting it to enable more
> // sdisel CSE.
> - if (!RV.getNode() && SelectionDAG::isCommutativeBinOp(N->getOpcode()) &&
> + if (!RV.getNode() && TLI.isCommutativeBinOp(N->getOpcode()) &&
> N->getNumValues() == 1) {
> SDValue N0 = N->getOperand(0);
> SDValue N1 = N->getOperand(1);
> Index: include/llvm/Target/TargetLowering.h
> ===================================================================
> --- include/llvm/Target/TargetLowering.h
> +++ include/llvm/Target/TargetLowering.h
> @@ -1876,6 +1876,39 @@
> return false;
> }
>
> + /// Returns true if the opcode is a commutative binary operation.
> + virtual bool isCommutativeBinOp(unsigned Opcode) const {
> + // FIXME: This should get its info from the td file, so that we can include
> + // target info.
> + switch (Opcode) {
> + case ISD::ADD:
> + case ISD::SMIN:
> + case ISD::SMAX:
> + case ISD::UMIN:
> + case ISD::UMAX:
> + case ISD::MUL:
> + case ISD::MULHU:
> + case ISD::MULHS:
> + case ISD::SMUL_LOHI:
> + case ISD::UMUL_LOHI:
> + case ISD::FADD:
> + case ISD::FMUL:
> + case ISD::AND:
> + case ISD::OR:
> + case ISD::XOR:
> + case ISD::SADDO:
> + case ISD::UADDO:
> + case ISD::ADDC:
> + case ISD::ADDE:
> + case ISD::FMINNUM:
> + case ISD::FMAXNUM:
> + case ISD::FMINNAN:
> + case ISD::FMAXNAN:
> + return true;
> + default: return false;
> + }
> + }
> +
> /// Return true if it's free to truncate a value of type FromTy to type
> /// ToTy. e.g. On x86 it's free to truncate a i32 value in register EAX to i16
> /// by referencing its sub-register AX.
> Index: include/llvm/CodeGen/SelectionDAG.h
> ===================================================================
> --- include/llvm/CodeGen/SelectionDAG.h
> +++ include/llvm/CodeGen/SelectionDAG.h
> @@ -1229,39 +1229,6 @@
> AllNodes.insert(Position, AllNodes.remove(N));
> }
>
> - /// Returns true if the opcode is a commutative binary operation.
> - static bool isCommutativeBinOp(unsigned Opcode) {
> - // FIXME: This should get its info from the td file, so that we can include
> - // target info.
> - switch (Opcode) {
> - case ISD::ADD:
> - case ISD::SMIN:
> - case ISD::SMAX:
> - case ISD::UMIN:
> - case ISD::UMAX:
> - case ISD::MUL:
> - case ISD::MULHU:
> - case ISD::MULHS:
> - case ISD::SMUL_LOHI:
> - case ISD::UMUL_LOHI:
> - case ISD::FADD:
> - case ISD::FMUL:
> - case ISD::AND:
> - case ISD::OR:
> - case ISD::XOR:
> - case ISD::SADDO:
> - case ISD::UADDO:
> - case ISD::ADDC:
> - case ISD::ADDE:
> - case ISD::FMINNUM:
> - case ISD::FMAXNUM:
> - case ISD::FMINNAN:
> - case ISD::FMAXNAN:
> - return true;
> - default: return false;
> - }
> - }
> -
> /// Returns an APFloat semantics tag appropriate for the given type. If VT is
> /// a vector type, the element semantics are returned.
> static const fltSemantics &EVTToAPFloatSemantics(EVT VT) {
More information about the llvm-commits
mailing list