[DAG] add convenience function to propagate FMF; NFC
authorSanjay Patel <spatel@rotateright.com>
Fri, 11 May 2018 23:13:36 +0000 (23:13 +0000)
committerSanjay Patel <spatel@rotateright.com>
Fri, 11 May 2018 23:13:36 +0000 (23:13 +0000)
There's only one use of this currently, but that could
change with D46563. Either way, we shouldn't have to
update code outside of the flags struct when those
flag definitions change.

llvm-svn: 332155

llvm/include/llvm/CodeGen/SelectionDAGNodes.h
llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

index f9dd35745ab7bc7b77be1dbcec86ff9bc36813f2..b1f8b8c02babb75a112c62116f1cb99364e80817 100644 (file)
@@ -37,6 +37,7 @@
 #include "llvm/IR/Instruction.h"
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/Metadata.h"
+#include "llvm/IR/Operator.h"
 #include "llvm/Support/AlignOf.h"
 #include "llvm/Support/AtomicOrdering.h"
 #include "llvm/Support/Casting.h"
@@ -374,7 +375,19 @@ public:
       : AnyDefined(false), NoUnsignedWrap(false), NoSignedWrap(false),
         Exact(false), NoNaNs(false), NoInfs(false),
         NoSignedZeros(false), AllowReciprocal(false), VectorReduction(false),
-        AllowContract(false),  ApproximateFuncs(false), AllowReassociation(false) {}
+        AllowContract(false), ApproximateFuncs(false),
+        AllowReassociation(false) {}
+
+  /// Propagate the fast-math-flags from an IR FPMathOperator.
+  void copyFMF(const FPMathOperator &FPMO) {
+    setNoNaNs(FPMO.hasNoNaNs());
+    setNoInfs(FPMO.hasNoInfs());
+    setNoSignedZeros(FPMO.hasNoSignedZeros());
+    setAllowReciprocal(FPMO.hasAllowReciprocal());
+    setAllowContract(FPMO.hasAllowContract());
+    setApproximateFuncs(FPMO.hasApproxFunc());
+    setAllowReassociation(FPMO.hasAllowReassoc());
+  }
 
   /// Sets the state of the flags to the defined state.
   void setDefined() { AnyDefined = true; }
index ee17fb9449513dbcf96f2d3120cda7fc84584ff2..57eadbb4410149d5dedb2eaa1a94bd2b2fd57695 100644 (file)
@@ -2753,13 +2753,7 @@ void SelectionDAGBuilder::visitBinary(const User &I, unsigned Opcode) {
     DEBUG(dbgs() << "Detected a reduction operation:" << I << "\n");
   }
   if (auto *FPOp = dyn_cast<FPMathOperator>(&I)) {
-    Flags.setAllowReciprocal(FPOp->hasAllowReciprocal());
-    Flags.setAllowContract(FPOp->hasAllowContract());
-    Flags.setNoInfs(FPOp->hasNoInfs());
-    Flags.setNoNaNs(FPOp->hasNoNaNs());
-    Flags.setNoSignedZeros(FPOp->hasNoSignedZeros());
-    Flags.setApproximateFuncs(FPOp->hasApproxFunc());
-    Flags.setAllowReassociation(FPOp->hasAllowReassoc());
+    Flags.copyFMF(*FPOp);
   }
 
   SDValue Op1 = getValue(I.getOperand(0));