<div dir="ltr">Thanks, Nick. That sounds like a good way to make progress. I'll update the FMF patch to only activate via a flag.<br><br>I've sent a patch for the known crasher here:<br><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D9893&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=bAyzwf0jbmAoW1ZLXEDZ0dqiHVkGp7cRMrC00lq9lew&s=gZLnV85gEOoCRWjjbw7HiqkqQOw0TuwF42Dffg8C4I8&e=">http://reviews.llvm.org/D9893</a><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, May 20, 2015 at 2:36 PM, Nick Lewycky <span dir="ltr"><<a href="mailto:nlewycky@google.com" target="_blank">nlewycky@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class="">On 20 May 2015 at 13:24, Sanjay Patel <span dir="ltr"><<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">I think I see 2 bugs in the existing visitFDIV() code that lead to the crash. I don't think they are visible without the fast-math-flags patch though. <br><br>I'll send a bug fix patch for review shortly...but this could be bad news for FMF in the backend. There are likely more latent bugs like this, but we won't hit them without applying the FMF patch first.<br></div></blockquote><div><br></div></span><div>I see. Could you add FMF under a flag and then let me test it before turning it on? I can test for compiler crashes in 24 hours, or for miscompiles over a weekend.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>Nick</div></font></span><div><div class="h5"><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"></div><div><div><div class="gmail_extra"><div class="gmail_quote">On Thu, May 14, 2015 at 10:18 AM, Sanjay Patel <span dir="ltr"><<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div>Thanks, Nick. I'll hope the 3rd time's the charm!<br><br></div>The failure case can be reduced to just this:<br><br>define double @foo(double %x, double %y) {<br>  %div1 = fdiv fast double 1.000000e+00, %y     ; remove the 'fast' and there's no problem<br>  %div2 = fdiv double %x, %y<br>  %ret = fadd double %div2, %div1<br>  ret double %ret<br>}<br><br>$ ./llc -enable-unsafe-fp-math crash.ll -o -<div><div><br><div><div><div class="gmail_extra"><br><br><br><div class="gmail_quote">On Wed, May 13, 2015 at 5:16 PM, Nick Lewycky <span dir="ltr"><<a href="mailto:nlewycky@google.com" target="_blank">nlewycky@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span>On 11 May 2015 at 14:07, Sanjay Patel <span dir="ltr"><<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Author: spatel<br>
Date: Mon May 11 16:07:09 2015<br>
New Revision: 237046<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D237046-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=bAyzwf0jbmAoW1ZLXEDZ0dqiHVkGp7cRMrC00lq9lew&s=pMkRVuAb_zjZ3vCkzNbZf1tU1pAm9GG2puI0tHQJJrw&e=" target="_blank">http://llvm.org/viewvc/llvm-project?rev=237046&view=rev</a><br>
Log:<br>
propagate IR-level fast-math-flags to DAG nodes; 2nd try; NFC<br>
<br>
This is a less ambitious version of:<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_rL236546&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=bAyzwf0jbmAoW1ZLXEDZ0dqiHVkGp7cRMrC00lq9lew&s=jl7gzUAOtGHGWPzapaF5MRgPdRHOlV-3QeOYkaXvYyU&e=" target="_blank">http://reviews.llvm.org/rL236546</a><br>
<br>
because that was reverted in:<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_rL236600&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=bAyzwf0jbmAoW1ZLXEDZ0dqiHVkGp7cRMrC00lq9lew&s=pxkHv729WqV34oP-7zcf2HPCl6CMiLFjLT2TuBZCcWQ&e=" target="_blank">http://reviews.llvm.org/rL236600</a><br>
<br>
because it caused memory corruption that wasn't related to FMF<br>
but was actually due to making nodes with 2 operands derive from a<br>
plain SDNode rather than a BinarySDNode.<br>
<br>
This patch adds the minimum plumbing necessary to use IR-level<br>
fast-math-flags (FMF) in the backend without actually using<br>
them for anything yet. This is a follow-on to:<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_rL235997&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=bAyzwf0jbmAoW1ZLXEDZ0dqiHVkGp7cRMrC00lq9lew&s=NOOU7ndVf1Wvk_-Touerlwy_cJ9MBishUkrkr_QFTOg&e=" target="_blank">http://reviews.llvm.org/rL235997</a><br>
<br>
...which split the existing nsw / nuw / exact flags and FMF<br>
into their own struct.<br></blockquote><div><br></div></span><div>I have bad news. This patch caused a regression where clang crashes.</div><div><br></div><div><div>$ cat a.c</div></div><div><div>void print(double);</div><div>void test(double v1, double v2) {</div><div>  print(1.0 / v2);</div><div>  print(v1 / v2);</div><div>}</div></div><div>$ clang -ffast-math -O1 a.c -c -o a.o<br></div><div><div>fatal error: error in backend: Cannot select: 0x29399e0: f64 =</div><div>      ConstantFP<1.000000e+00> [ID=14]</div><div>In function: test</div><div><br></div></div><div>on an x86-64 linux machine.</div><div><br></div><div>I'm going to go ahead and revert this patch, but please feel free to reapply once it's fixed. Let me know if you need anything more from me to reproduce the problem!</div><span><font color="#888888"><div><br></div><div>Nick</div></font></span><div><div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Modified:<br>
    llvm/trunk/include/llvm/CodeGen/SelectionDAG.h<br>
    llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAG.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_CodeGen_SelectionDAG.h-3Frev-3D237046-26r1-3D237045-26r2-3D237046-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=bAyzwf0jbmAoW1ZLXEDZ0dqiHVkGp7cRMrC00lq9lew&s=BP13Ik1pxSyFPnSkhNpQbzacskU_hEiWhMWHqZF_5FM&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAG.h?rev=237046&r1=237045&r2=237046&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/CodeGen/SelectionDAG.h (original)<br>
+++ llvm/trunk/include/llvm/CodeGen/SelectionDAG.h Mon May 11 16:07:09 2015<br>
@@ -665,7 +665,7 @@ public:<br>
   SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT);<br>
   SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N);<br>
   SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1, SDValue N2,<br>
-                  bool nuw = false, bool nsw = false, bool exact = false);<br>
+                  const SDNodeFlags *Flags = nullptr);<br>
   SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1, SDValue N2,<br>
                   SDValue N3);<br>
   SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1, SDValue N2,<br>
@@ -982,8 +982,7 @@ public:<br>
<br>
   /// Get the specified node if it's already available, or else return NULL.<br>
   SDNode *getNodeIfExists(unsigned Opcode, SDVTList VTs, ArrayRef<SDValue> Ops,<br>
-                          bool nuw = false, bool nsw = false,<br>
-                          bool exact = false);<br>
+                          const SDNodeFlags *Flags = nullptr);<br>
<br>
   /// Creates a SDDbgValue node.<br>
   SDDbgValue *getDbgValue(MDNode *Var, MDNode *Expr, SDNode *N, unsigned R,<br>
@@ -1241,8 +1240,8 @@ private:<br>
   void allnodes_clear();<br>
<br>
   BinarySDNode *GetBinarySDNode(unsigned Opcode, SDLoc DL, SDVTList VTs,<br>
-                                SDValue N1, SDValue N2, bool nuw, bool nsw,<br>
-                                bool exact);<br>
+                                SDValue N1, SDValue N2,<br>
+                                const SDNodeFlags *Flags = nullptr);<br>
<br>
   /// List of non-single value types.<br>
   FoldingSet<SDVTListNode> VTListMap;<br>
<br>
Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_CodeGen_SelectionDAGNodes.h-3Frev-3D237046-26r1-3D237045-26r2-3D237046-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=bAyzwf0jbmAoW1ZLXEDZ0dqiHVkGp7cRMrC00lq9lew&s=T9zU93hqx-NKqq6PyITUOYW0zxrbKpUooXNNYA92TfY&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h?rev=237046&r1=237045&r2=237046&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h (original)<br>
+++ llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h Mon May 11 16:07:09 2015<br>
@@ -1017,6 +1017,11 @@ static bool isBinOpWithFlags(unsigned Op<br>
   case ISD::ADD:<br>
   case ISD::SUB:<br>
   case ISD::SHL:<br>
+  case ISD::FADD:<br>
+  case ISD::FDIV:<br>
+  case ISD::FMUL:<br>
+  case ISD::FREM:<br>
+  case ISD::FSUB:<br>
     return true;<br>
   default:<br>
     return false;<br>
@@ -1029,8 +1034,8 @@ class BinaryWithFlagsSDNode : public Bin<br>
 public:<br>
   SDNodeFlags Flags;<br>
   BinaryWithFlagsSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs,<br>
-                        SDValue X, SDValue Y)<br>
-      : BinarySDNode(Opc, Order, dl, VTs, X, Y), Flags() {}<br>
+                        SDValue X, SDValue Y, const SDNodeFlags &NodeFlags)<br>
+      : BinarySDNode(Opc, Order, dl, VTs, X, Y), Flags(NodeFlags) {}<br>
   static bool classof(const SDNode *N) {<br>
     return isBinOpWithFlags(N->getOpcode());<br>
   }<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_SelectionDAG_DAGCombiner.cpp-3Frev-3D237046-26r1-3D237045-26r2-3D237046-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=bAyzwf0jbmAoW1ZLXEDZ0dqiHVkGp7cRMrC00lq9lew&s=zx8erEj27klldOFcA0AqxEuwEcwO5gKQyYJc_Sx49U8&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=237046&r1=237045&r2=237046&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon May 11 16:07:09 2015<br>
@@ -1452,12 +1452,9 @@ SDValue DAGCombiner::combine(SDNode *N)<br>
     if (isa<ConstantSDNode>(N0) || !isa<ConstantSDNode>(N1)) {<br>
       SDValue Ops[] = {N1, N0};<br>
       SDNode *CSENode;<br>
-      if (const BinaryWithFlagsSDNode *BinNode =<br>
-              dyn_cast<BinaryWithFlagsSDNode>(N)) {<br>
+      if (const auto *BinNode = dyn_cast<BinaryWithFlagsSDNode>(N)) {<br>
         CSENode = DAG.getNodeIfExists(N->getOpcode(), N->getVTList(), Ops,<br>
-                                      BinNode->Flags.hasNoUnsignedWrap(),<br>
-                                      BinNode->Flags.hasNoSignedWrap(),<br>
-                                      BinNode->Flags.hasExact());<br>
+                                      &BinNode->Flags);<br>
       } else {<br>
         CSENode = DAG.getNodeIfExists(N->getOpcode(), N->getVTList(), Ops);<br>
       }<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_SelectionDAG_SelectionDAG.cpp-3Frev-3D237046-26r1-3D237045-26r2-3D237046-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=bAyzwf0jbmAoW1ZLXEDZ0dqiHVkGp7cRMrC00lq9lew&s=TbCRJN-U8Wnn-pWs82urHTR51zhYxSlTe2UeYuvJCpI&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=237046&r1=237045&r2=237046&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Mon May 11 16:07:09 2015<br>
@@ -399,19 +399,22 @@ static void AddNodeIDOperands(FoldingSet<br>
     ID.AddInteger(Op.getResNo());<br>
   }<br>
 }<br>
-<br>
-static void AddBinaryNodeIDCustom(FoldingSetNodeID &ID, bool nuw, bool nsw,<br>
-                                  bool exact) {<br>
-  ID.AddBoolean(nuw);<br>
-  ID.AddBoolean(nsw);<br>
-  ID.AddBoolean(exact);<br>
+/// Add logical or fast math flag values to FoldingSetNodeID value.<br>
+static void AddNodeIDFlags(FoldingSetNodeID &ID, unsigned Opcode,<br>
+                           const SDNodeFlags *Flags) {<br>
+  if (!Flags || !isBinOpWithFlags(Opcode))<br>
+    return;<br>
+<br>
+  unsigned RawFlags = Flags->getRawFlags();<br>
+  // If no flags are set, do not alter the ID. This saves time and allows<br>
+  // a gradual increase in API usage of the optional optimization flags.<br>
+  if (RawFlags != 0)<br>
+    ID.AddInteger(RawFlags);<br>
 }<br>
<br>
-/// AddBinaryNodeIDCustom - Add BinarySDNodes special infos<br>
-static void AddBinaryNodeIDCustom(FoldingSetNodeID &ID, unsigned Opcode,<br>
-                                  bool nuw, bool nsw, bool exact) {<br>
-  if (isBinOpWithFlags(Opcode))<br>
-    AddBinaryNodeIDCustom(ID, nuw, nsw, exact);<br>
+static void AddNodeIDFlags(FoldingSetNodeID &ID, const SDNode *N) {<br>
+  if (auto *Node = dyn_cast<BinaryWithFlagsSDNode>(N))<br>
+    AddNodeIDFlags(ID, Node->getOpcode(), &Node->Flags);<br>
 }<br>
<br>
 static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned short OpC,<br>
@@ -506,20 +509,6 @@ static void AddNodeIDCustom(FoldingSetNo<br>
     ID.AddInteger(ST->getPointerInfo().getAddrSpace());<br>
     break;<br>
   }<br>
-  case ISD::SDIV:<br>
-  case ISD::UDIV:<br>
-  case ISD::SRA:<br>
-  case ISD::SRL:<br>
-  case ISD::MUL:<br>
-  case ISD::ADD:<br>
-  case ISD::SUB:<br>
-  case ISD::SHL: {<br>
-    const BinaryWithFlagsSDNode *BinNode = cast<BinaryWithFlagsSDNode>(N);<br>
-    AddBinaryNodeIDCustom(<br>
-        ID, N->getOpcode(), BinNode->Flags.hasNoUnsignedWrap(),<br>
-        BinNode->Flags.hasNoSignedWrap(), BinNode->Flags.hasExact());<br>
-    break;<br>
-  }<br>
   case ISD::ATOMIC_CMP_SWAP:<br>
   case ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS:<br>
   case ISD::ATOMIC_SWAP:<br>
@@ -563,6 +552,8 @@ static void AddNodeIDCustom(FoldingSetNo<br>
   }<br>
   } // end switch (N->getOpcode())<br>
<br>
+  AddNodeIDFlags(ID, N);<br>
+<br>
   // Target specific memory nodes could also have address spaces to check.<br>
   if (N->isTargetMemoryOpcode())<br>
     ID.AddInteger(cast<MemSDNode>(N)->getPointerInfo().getAddrSpace());<br>
@@ -959,14 +950,16 @@ void SelectionDAG::allnodes_clear() {<br>
<br>
 BinarySDNode *SelectionDAG::GetBinarySDNode(unsigned Opcode, SDLoc DL,<br>
                                             SDVTList VTs, SDValue N1,<br>
-                                            SDValue N2, bool nuw, bool nsw,<br>
-                                            bool exact) {<br>
+                                            SDValue N2,<br>
+                                            const SDNodeFlags *Flags) {<br>
   if (isBinOpWithFlags(Opcode)) {<br>
+    // If no flags were passed in, use a default flags object.<br>
+    SDNodeFlags F;<br>
+    if (Flags == nullptr)<br>
+      Flags = &F;<br>
+<br>
     BinaryWithFlagsSDNode *FN = new (NodeAllocator) BinaryWithFlagsSDNode(<br>
-        Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs, N1, N2);<br>
-    FN->Flags.setNoUnsignedWrap(nuw);<br>
-    FN->Flags.setNoSignedWrap(nsw);<br>
-    FN->Flags.setExact(exact);<br>
+        Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs, N1, N2, *Flags);<br>
<br>
     return FN;<br>
   }<br>
@@ -3201,7 +3194,7 @@ SDValue SelectionDAG::FoldConstantArithm<br>
 }<br>
<br>
 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1,<br>
-                              SDValue N2, bool nuw, bool nsw, bool exact) {<br>
+                              SDValue N2, const SDNodeFlags *Flags) {<br>
   ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode());<br>
   ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.getNode());<br>
   switch (Opcode) {<br>
@@ -3665,22 +3658,20 @@ SDValue SelectionDAG::getNode(unsigned O<br>
   // Memoize this node if possible.<br>
   BinarySDNode *N;<br>
   SDVTList VTs = getVTList(VT);<br>
-  const bool BinOpHasFlags = isBinOpWithFlags(Opcode);<br>
   if (VT != MVT::Glue) {<br>
     SDValue Ops[] = {N1, N2};<br>
     FoldingSetNodeID ID;<br>
     AddNodeIDNode(ID, Opcode, VTs, Ops);<br>
-    if (BinOpHasFlags)<br>
-      AddBinaryNodeIDCustom(ID, Opcode, nuw, nsw, exact);<br>
+    AddNodeIDFlags(ID, Opcode, Flags);<br>
     void *IP = nullptr;<br>
     if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))<br>
       return SDValue(E, 0);<br>
<br>
-    N = GetBinarySDNode(Opcode, DL, VTs, N1, N2, nuw, nsw, exact);<br>
+    N = GetBinarySDNode(Opcode, DL, VTs, N1, N2, Flags);<br>
<br>
     CSEMap.InsertNode(N, IP);<br>
   } else {<br>
-    N = GetBinarySDNode(Opcode, DL, VTs, N1, N2, nuw, nsw, exact);<br>
+    N = GetBinarySDNode(Opcode, DL, VTs, N1, N2, Flags);<br>
   }<br>
<br>
   InsertNode(N);<br>
@@ -5984,13 +5975,12 @@ SelectionDAG::getTargetInsertSubreg(int<br>
 /// getNodeIfExists - Get the specified node if it's already available, or<br>
 /// else return NULL.<br>
 SDNode *SelectionDAG::getNodeIfExists(unsigned Opcode, SDVTList VTList,<br>
-                                      ArrayRef<SDValue> Ops, bool nuw, bool nsw,<br>
-                                      bool exact) {<br>
+                                      ArrayRef<SDValue> Ops,<br>
+                                      const SDNodeFlags *Flags) {<br>
   if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {<br>
     FoldingSetNodeID ID;<br>
     AddNodeIDNode(ID, Opcode, VTList, Ops);<br>
-    if (isBinOpWithFlags(Opcode))<br>
-      AddBinaryNodeIDCustom(ID, nuw, nsw, exact);<br>
+    AddNodeIDFlags(ID, Opcode, Flags);<br>
     void *IP = nullptr;<br>
     if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP))<br>
       return E;<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_SelectionDAG_SelectionDAGBuilder.cpp-3Frev-3D237046-26r1-3D237045-26r2-3D237046-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=bAyzwf0jbmAoW1ZLXEDZ0dqiHVkGp7cRMrC00lq9lew&s=Vf83fHZ0g-npqpdbdK6p3OWv3ZJRlTzcQsZESMpydk0&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=237046&r1=237045&r2=237046&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Mon May 11 16:07:09 2015<br>
@@ -2139,6 +2139,8 @@ void SelectionDAGBuilder::visitBinary(co<br>
   bool nuw = false;<br>
   bool nsw = false;<br>
   bool exact = false;<br>
+  FastMathFlags FMF;<br>
+<br>
   if (const OverflowingBinaryOperator *OFBinOp =<br>
           dyn_cast<const OverflowingBinaryOperator>(&I)) {<br>
     nuw = OFBinOp->hasNoUnsignedWrap();<br>
@@ -2147,9 +2149,20 @@ void SelectionDAGBuilder::visitBinary(co<br>
   if (const PossiblyExactOperator *ExactOp =<br>
           dyn_cast<const PossiblyExactOperator>(&I))<br>
     exact = ExactOp->isExact();<br>
-<br>
+  if (const FPMathOperator *FPOp = dyn_cast<const FPMathOperator>(&I))<br>
+    FMF = FPOp->getFastMathFlags();<br>
+<br>
+  SDNodeFlags Flags;<br>
+  Flags.setExact(exact);<br>
+  Flags.setNoSignedWrap(nsw);<br>
+  Flags.setNoUnsignedWrap(nuw);<br>
+  Flags.setAllowReciprocal(FMF.allowReciprocal());<br>
+  Flags.setNoInfs(FMF.noInfs());<br>
+  Flags.setNoNaNs(FMF.noNaNs());<br>
+  Flags.setNoSignedZeros(FMF.noSignedZeros());<br>
+  Flags.setUnsafeAlgebra(FMF.unsafeAlgebra());<br>
   SDValue BinNodeValue = DAG.getNode(OpCode, getCurSDLoc(), Op1.getValueType(),<br>
-                                     Op1, Op2, nuw, nsw, exact);<br>
+                                     Op1, Op2, &Flags);<br>
   setValue(&I, BinNodeValue);<br>
 }<br>
<br>
@@ -2197,9 +2210,12 @@ void SelectionDAGBuilder::visitShift(con<br>
             dyn_cast<const PossiblyExactOperator>(&I))<br>
       exact = ExactOp->isExact();<br>
   }<br>
-<br>
+  SDNodeFlags Flags;<br>
+  Flags.setExact(exact);<br>
+  Flags.setNoSignedWrap(nsw);<br>
+  Flags.setNoUnsignedWrap(nuw);<br>
   SDValue Res = DAG.getNode(Opcode, getCurSDLoc(), Op1.getValueType(), Op1, Op2,<br>
-                            nuw, nsw, exact);<br>
+                            &Flags);<br>
   setValue(&I, Res);<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_SelectionDAG_TargetLowering.cpp-3Frev-3D237046-26r1-3D237045-26r2-3D237046-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=bAyzwf0jbmAoW1ZLXEDZ0dqiHVkGp7cRMrC00lq9lew&s=Gh5CWEqAQtGMDwE2vdzNoMZ9PxA7N52My8uwJVzMyOg&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=237046&r1=237045&r2=237046&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon May 11 16:07:09 2015<br>
@@ -2660,8 +2660,9 @@ SDValue TargetLowering::BuildExactSDIV(S<br>
     // TODO: For UDIV use SRL instead of SRA.<br>
     SDValue Amt =<br>
         DAG.getConstant(ShAmt, dl, getShiftAmountTy(Op1.getValueType()));<br>
-    Op1 = DAG.getNode(ISD::SRA, dl, Op1.getValueType(), Op1, Amt, false, false,<br>
-                      true);<br>
+    SDNodeFlags Flags;<br>
+    Flags.setExact(true);<br>
+    Op1 = DAG.getNode(ISD::SRA, dl, Op1.getValueType(), Op1, Amt, &Flags);<br>
     d = d.ashr(ShAmt);<br>
   }<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br></a><br>
</blockquote></div></div></div></div></div>
</blockquote></div><br></div></div></div></div></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div></div></div><br></div></div>
</blockquote></div><br></div>