From 0d51300de9df41233c99685b13cc22b255ec2a1f Mon Sep 17 00:00:00 2001 From: Michael Berg Date: Mon, 3 Jun 2019 21:53:26 +0000 Subject: [PATCH] Propagate fmf for setcc in SDAG for select folds git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362448 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 11 +++++++---- lib/CodeGen/SelectionDAG/LegalizeTypes.cpp | 1 + test/CodeGen/X86/fmf-propagation.ll | 8 ++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 4f7d14ab67e..ed6b95640b4 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3445,6 +3445,7 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) { DAG.getConstant(0, dl, Tmp1.getValueType()), Tmp2, Tmp3, ISD::SETNE); } + Tmp1->setFlags(Node->getFlags()); Results.push_back(Tmp1); break; case ISD::BR_JT: { @@ -3528,7 +3529,7 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) { // condition code, create a new SETCC node. if (Tmp3.getNode()) Tmp1 = DAG.getNode(ISD::SETCC, dl, Node->getValueType(0), - Tmp1, Tmp2, Tmp3); + Tmp1, Tmp2, Tmp3, Node->getFlags()); // If we expanded the SETCC by inverting the condition code, then wrap // the existing SETCC in a NOT to restore the intended condition. @@ -3556,6 +3557,7 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) { DAG.getConstant(TrueValue, dl, VT), DAG.getConstant(0, dl, VT), Tmp3); + Tmp1->setFlags(Node->getFlags()); Results.push_back(Tmp1); break; } @@ -3577,7 +3579,7 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) { "expanded."); EVT CCVT = TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), CmpVT); - SDValue Cond = DAG.getNode(ISD::SETCC, dl, CCVT, Tmp1, Tmp2, CC); + SDValue Cond = DAG.getNode(ISD::SETCC, dl, CCVT, Tmp1, Tmp2, CC, Node->getFlags()); Results.push_back(DAG.getSelect(dl, VT, Cond, Tmp3, Tmp4)); break; } @@ -4246,6 +4248,7 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) { Tmp3 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(2)); // Perform the larger operation, then round down. Tmp1 = DAG.getSelect(dl, NVT, Tmp1, Tmp2, Tmp3); + Tmp1->setFlags(Node->getFlags()); if (TruncOp != ISD::FP_ROUND) Tmp1 = DAG.getNode(TruncOp, dl, Node->getValueType(0), Tmp1); else @@ -4276,8 +4279,8 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) { } Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0)); Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1)); - Results.push_back(DAG.getNode(ISD::SETCC, dl, Node->getValueType(0), - Tmp1, Tmp2, Node->getOperand(2))); + Results.push_back(DAG.getNode(ISD::SETCC, dl, Node->getValueType(0), Tmp1, + Tmp2, Node->getOperand(2), Node->getFlags())); break; } case ISD::BR_CC: { diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp index 03ec64d5933..14fd5be23cc 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp @@ -707,6 +707,7 @@ void DAGTypeLegalizer::SetPromotedInteger(SDValue Op, SDValue Result) { auto &OpIdEntry = PromotedIntegers[getTableId(Op)]; assert((OpIdEntry == 0) && "Node is already promoted!"); OpIdEntry = getTableId(Result); + Result->setFlags(Op->getFlags()); DAG.transferDbgValues(Op, Result); } diff --git a/test/CodeGen/X86/fmf-propagation.ll b/test/CodeGen/X86/fmf-propagation.ll index 56e813f371c..8d16e1acda7 100644 --- a/test/CodeGen/X86/fmf-propagation.ll +++ b/test/CodeGen/X86/fmf-propagation.ll @@ -28,3 +28,11 @@ define float @fmf_transfer(float %x, float %y) { ret float %f8 } +; CHECK: Optimized type-legalized selection DAG: %bb.0 'fmf_setcc:' +; CHECK: t13: i8 = setcc nnan ninf nsz arcp contract afn reassoc t2, ConstantFP:f32<0.000000e+00>, setlt:ch + +define float @fmf_setcc(float %x, float %y) { + %cmp = fcmp fast ult float %x, 0.0 + %ret = select i1 %cmp, float %x, float %y + ret float %ret +} -- 2.50.1