[PATCH] D133866: [SelectionDAG] Add helper function to check whether a SDValue is neutral element. NFC.
Yeting Kuo via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 14 08:19:18 PDT 2022
fakepaper56 created this revision.
Herald added subscribers: frasercrmck, ecnelises, luismarques, apazos, sameer.abuasal, s.egerton, Jim, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, jrtc27, niosHD, sabuasal, simoncook, johnrusso, rbar, asb, hiraditya, arichardson.
Herald added a project: All.
fakepaper56 requested review of this revision.
Herald added subscribers: llvm-commits, pcwang-thead, MaskRay.
Herald added a project: LLVM.
Using this helper makes work about neutral elements more easier. Although I only
find one case now, I think it will have more chance to be used since so many
combine works are related to neutral elements.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D133866
Files:
llvm/include/llvm/CodeGen/SelectionDAGNodes.h
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
Index: llvm/lib/Target/RISCV/RISCVISelLowering.cpp
===================================================================
--- llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -7968,17 +7968,9 @@
if (!isOneConstant(ScalarV.getOperand(2)))
return SDValue();
- // TODO: Deal with value other than neutral element.
- auto IsRVVNeutralElement = [Opc, &DAG](SDNode *N, SDValue V) {
- if (Opc == ISD::FADD && N->getFlags().hasNoSignedZeros() &&
- isNullFPConstant(V))
- return true;
- return DAG.getNeutralElement(Opc, SDLoc(V), V.getSimpleValueType(),
- N->getFlags()) == V;
- };
-
// Check the scalar of ScalarV is neutral element
- if (!IsRVVNeutralElement(N, ScalarV.getOperand(1)))
+ // TODO: Deal with value other than neutral element.
+ if (!isNeutralConstant(N->getOpcode(), N->getFlags(), ScalarV.getOperand(1)))
return SDValue();
if (!ScalarV.hasOneUse())
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -10735,6 +10735,50 @@
return Const != nullptr && Const->isMinSignedValue();
}
+bool llvm::isNeutralConstant(unsigned Opcode, SDNodeFlags Flags, SDValue V) {
+ if (auto *Const = dyn_cast<ConstantSDNode>(V)) {
+ switch (Opcode) {
+ case ISD::ADD:
+ case ISD::OR:
+ case ISD::XOR:
+ case ISD::UMAX:
+ return Const->isZero();
+ case ISD::MUL:
+ return Const->isOne();
+ case ISD::AND:
+ case ISD::UMIN:
+ return Const->isAllOnes();
+ case ISD::SMAX:
+ return Const->isMinSignedValue();
+ case ISD::SMIN:
+ return Const->isMaxSignedValue();
+ }
+ } else if (auto *ConstFP = dyn_cast<ConstantFPSDNode>(V)) {
+ switch (Opcode) {
+ case ISD::FADD:
+ if (Flags.hasNoSignedZeros())
+ return ConstFP->isZero();
+ return ConstFP->isExactlyValue(-0.0);
+ case ISD::FMUL:
+ return ConstFP->isExactlyValue(1.0);
+ case ISD::FMINNUM:
+ case ISD::FMAXNUM: {
+ // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
+ EVT VT = V.getValueType();
+ const fltSemantics &Semantics = SelectionDAG::EVTToAPFloatSemantics(VT);
+ APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics)
+ : !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
+ : APFloat::getLargest(Semantics);
+ if (Opcode == ISD::FMAXNUM)
+ NeutralAF.changeSign();
+
+ return ConstFP->isExactlyValue(NeutralAF);
+ }
+ }
+ }
+ return false;
+}
+
SDValue llvm::peekThroughBitcasts(SDValue V) {
while (V.getOpcode() == ISD::BITCAST)
V = V.getOperand(0);
Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h
===================================================================
--- llvm/include/llvm/CodeGen/SelectionDAGNodes.h
+++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h
@@ -1689,6 +1689,9 @@
/// Returns true if \p V is a constant min signed integer value.
bool isMinSignedConstant(SDValue V);
+/// Returns true if \p V is a neutral element of Opc with Flags.
+bool isNeutralConstant(unsigned Opc, SDNodeFlags Flags, SDValue V);
+
/// Return the non-bitcasted source operand of \p V if it exists.
/// If \p V is not a bitcasted value, it is returned as-is.
SDValue peekThroughBitcasts(SDValue V);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D133866.460103.patch
Type: text/x-patch
Size: 3514 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220914/0a794602/attachment.bin>
More information about the llvm-commits
mailing list