mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-12-20 03:17:48 +00:00
propagate IR-level fast-math-flags to DAG nodes; 2nd try; NFC
This is a less ambitious version of: http://reviews.llvm.org/rL236546 because that was reverted in: http://reviews.llvm.org/rL236600 because it caused memory corruption that wasn't related to FMF but was actually due to making nodes with 2 operands derive from a plain SDNode rather than a BinarySDNode. This patch adds the minimum plumbing necessary to use IR-level fast-math-flags (FMF) in the backend without actually using them for anything yet. This is a follow-on to: http://reviews.llvm.org/rL235997 ...which split the existing nsw / nuw / exact flags and FMF into their own struct. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237046 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -665,7 +665,7 @@ public:
|
||||
SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT);
|
||||
SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N);
|
||||
SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1, SDValue N2,
|
||||
bool nuw = false, bool nsw = false, bool exact = false);
|
||||
const SDNodeFlags *Flags = nullptr);
|
||||
SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1, SDValue N2,
|
||||
SDValue N3);
|
||||
SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1, SDValue N2,
|
||||
@@ -982,8 +982,7 @@ public:
|
||||
|
||||
/// Get the specified node if it's already available, or else return NULL.
|
||||
SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs, ArrayRef<SDValue> Ops,
|
||||
bool nuw = false, bool nsw = false,
|
||||
bool exact = false);
|
||||
const SDNodeFlags *Flags = nullptr);
|
||||
|
||||
/// Creates a SDDbgValue node.
|
||||
SDDbgValue *getDbgValue(MDNode *Var, MDNode *Expr, SDNode *N, unsigned R,
|
||||
@@ -1241,8 +1240,8 @@ private:
|
||||
void allnodes_clear();
|
||||
|
||||
BinarySDNode *GetBinarySDNode(unsigned Opcode, SDLoc DL, SDVTList VTs,
|
||||
SDValue N1, SDValue N2, bool nuw, bool nsw,
|
||||
bool exact);
|
||||
SDValue N1, SDValue N2,
|
||||
const SDNodeFlags *Flags = nullptr);
|
||||
|
||||
/// List of non-single value types.
|
||||
FoldingSet<SDVTListNode> VTListMap;
|
||||
|
||||
@@ -1017,6 +1017,11 @@ static bool isBinOpWithFlags(unsigned Opcode) {
|
||||
case ISD::ADD:
|
||||
case ISD::SUB:
|
||||
case ISD::SHL:
|
||||
case ISD::FADD:
|
||||
case ISD::FDIV:
|
||||
case ISD::FMUL:
|
||||
case ISD::FREM:
|
||||
case ISD::FSUB:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
@@ -1029,8 +1034,8 @@ class BinaryWithFlagsSDNode : public BinarySDNode {
|
||||
public:
|
||||
SDNodeFlags Flags;
|
||||
BinaryWithFlagsSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs,
|
||||
SDValue X, SDValue Y)
|
||||
: BinarySDNode(Opc, Order, dl, VTs, X, Y), Flags() {}
|
||||
SDValue X, SDValue Y, const SDNodeFlags &NodeFlags)
|
||||
: BinarySDNode(Opc, Order, dl, VTs, X, Y), Flags(NodeFlags) {}
|
||||
static bool classof(const SDNode *N) {
|
||||
return isBinOpWithFlags(N->getOpcode());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user