[llvm] ba8df39 - Add SDNodeFlag::NoConvergent (#179323)

via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 4 10:21:50 PST 2026


Author: Stanislav Mekhanoshin
Date: 2026-02-04T10:21:45-08:00
New Revision: ba8df39898dea2003770163ffc43b6b911f71f2b

URL: https://github.com/llvm/llvm-project/commit/ba8df39898dea2003770163ffc43b6b911f71f2b
DIFF: https://github.com/llvm/llvm-project/commit/ba8df39898dea2003770163ffc43b6b911f71f2b.diff

LOG: Add SDNodeFlag::NoConvergent (#179323)

Added: 
    

Modified: 
    llvm/include/llvm/CodeGen/SelectionDAGNodes.h
    llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
    llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
index a50bd8dab5407..3bbafe2d124e7 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
@@ -428,6 +428,9 @@ struct SDNodeFlags {
     // that affect the provenance may have been optimized away.
     InBounds = 1 << 15,
 
+    // Call does not require convergence guarantees.
+    NoConvergent = 1 << 16,
+
     // NOTE: Please update LargestValue in LLVM_DECLARE_ENUM_AS_BITMASK below
     // the class definition when adding new flags.
 
@@ -468,6 +471,7 @@ struct SDNodeFlags {
   void setNoFPExcept(bool b) { setFlag<NoFPExcept>(b); }
   void setUnpredictable(bool b) { setFlag<Unpredictable>(b); }
   void setInBounds(bool b) { setFlag<InBounds>(b); }
+  void setNoConvergent(bool b) { setFlag<NoConvergent>(b); }
 
   // These are accessors for each flag.
   bool hasNoUnsignedWrap() const { return Flags & NoUnsignedWrap; }
@@ -486,6 +490,7 @@ struct SDNodeFlags {
   bool hasNoFPExcept() const { return Flags & NoFPExcept; }
   bool hasUnpredictable() const { return Flags & Unpredictable; }
   bool hasInBounds() const { return Flags & InBounds; }
+  bool hasNoConvergent() const { return Flags & NoConvergent; }
 
   bool operator==(const SDNodeFlags &Other) const {
     return Flags == Other.Flags;
@@ -495,7 +500,7 @@ struct SDNodeFlags {
 };
 
 LLVM_DECLARE_ENUM_AS_BITMASK(decltype(SDNodeFlags::None),
-                             SDNodeFlags::InBounds);
+                             SDNodeFlags::NoConvergent);
 
 inline SDNodeFlags operator|(SDNodeFlags LHS, SDNodeFlags RHS) {
   LHS |= RHS;

diff  --git a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
index d9d847d747334..a404dcc2660be 100644
--- a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
@@ -1120,6 +1120,9 @@ EmitMachineNode(SDNode *Node, bool IsClone, bool IsCloned,
 
     if (Flags.hasSameSign())
       MI->setFlag(MachineInstr::MIFlag::SameSign);
+
+    if (Flags.hasNoConvergent())
+      MI->setFlag(MachineInstr::MIFlag::NoConvergent);
   }
 
   // Emit all of the actual operands of this instruction, adding them to the

diff  --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
index a213396f3df90..2690256eefadf 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
@@ -733,6 +733,9 @@ void SDNode::print_details(raw_ostream &OS, const SelectionDAG *G) const {
   if (getFlags().hasNoFPExcept())
     OS << " nofpexcept";
 
+  if (getFlags().hasNoConvergent())
+    OS << " noconvergent";
+
   if (const MachineSDNode *MN = dyn_cast<MachineSDNode>(this)) {
     if (!MN->memoperands_empty()) {
       OS << "<";


        


More information about the llvm-commits mailing list