https://github.com/anoopkg6 created 
https://github.com/llvm/llvm-project/pull/175470

Fix #173673: Add flag output operand info to ConstraintInfo enum to distinguish 
getOutputOperandBounds for flag output operand bounds.

>From 2256558aa212324866b62e1444e4180f657d4d21 Mon Sep 17 00:00:00 2001
From: anoopkg6 <[email protected]>
Date: Mon, 12 Jan 2026 00:12:07 +0100
Subject: [PATCH] Fix #173673: Add flag CI_CCOutputOperand to ConstraintInfo
 enum to distinguish getOutputOperandBounds for flag output operand bounds.

---
 clang/include/clang/Basic/TargetInfo.h | 5 +++++
 clang/lib/Basic/Targets/AArch64.cpp    | 1 +
 clang/lib/Basic/Targets/SystemZ.cpp    | 1 +
 clang/lib/Basic/Targets/X86.cpp        | 1 +
 clang/lib/CodeGen/CGStmt.cpp           | 5 ++++-
 5 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 4ff77bb64cf1c..92cf17734511b 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -1131,6 +1131,7 @@ class TargetInfo : public TransferrableTargetInfo,
       CI_HasMatchingInput = 0x08,  // This output operand has a matching input.
       CI_ImmediateConstant = 0x10, // This operand must be an immediate 
constant
       CI_EarlyClobber = 0x20,      // "&" output constraint (early clobber).
+      CI_CCOutputOperand = 0x40,   // "=@cc" sets CC, Flag output operand.
     };
     unsigned Flags;
     int TiedOperand;
@@ -1168,6 +1169,9 @@ class TargetInfo : public TransferrableTargetInfo,
     /// If this returns true then getTiedOperand will indicate which output
     /// operand this is tied to.
     bool hasTiedOperand() const { return TiedOperand != -1; }
+    bool hasFlagOutputOperand() const {
+      return (Flags & CI_CCOutputOperand) != 0;
+    }
     unsigned getTiedOperand() const {
       assert(hasTiedOperand() && "Has no tied operand!");
       return (unsigned)TiedOperand;
@@ -1188,6 +1192,7 @@ class TargetInfo : public TransferrableTargetInfo,
     void setAllowsMemory() { Flags |= CI_AllowsMemory; }
     void setAllowsRegister() { Flags |= CI_AllowsRegister; }
     void setHasMatchingInput() { Flags |= CI_HasMatchingInput; }
+    void setFlagOutputOperand() { Flags |= CI_CCOutputOperand; }
     void setRequiresImmediate(int Min, int Max) {
       Flags |= CI_ImmediateConstant;
       ImmRange.Min = Min;
diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index ecd441be364c2..118563cea6048 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -1570,6 +1570,7 @@ bool AArch64TargetInfo::validateAsmConstraint(
     if (const unsigned Len = matchAsmCCConstraint(Name)) {
       Name += Len - 1;
       Info.setAllowsRegister();
+      Info.setFlagOutputOperand();
       Info.setOutputOperandBounds(0, 2);
       return true;
     }
diff --git a/clang/lib/Basic/Targets/SystemZ.cpp 
b/clang/lib/Basic/Targets/SystemZ.cpp
index ecd12ed34a20c..4723f36ba2ddb 100644
--- a/clang/lib/Basic/Targets/SystemZ.cpp
+++ b/clang/lib/Basic/Targets/SystemZ.cpp
@@ -104,6 +104,7 @@ bool SystemZTargetInfo::validateAsmConstraint(
     if (StringRef(Name) == "@cc") {
       Name += 2;
       Info.setAllowsRegister();
+      Info.setFlagOutputOperand();
       // SystemZ has 2-bits CC, and hence Interval [0, 4).
       Info.setOutputOperandBounds(0, 4);
       return true;
diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp
index f00d435937b92..4d50cb0f813ae 100644
--- a/clang/lib/Basic/Targets/X86.cpp
+++ b/clang/lib/Basic/Targets/X86.cpp
@@ -1512,6 +1512,7 @@ bool X86TargetInfo::validateAsmConstraint(
     if (auto Len = matchAsmCCConstraint(Name)) {
       Name += Len - 1;
       Info.setAllowsRegister();
+      Info.setFlagOutputOperand();
       Info.setOutputOperandBounds(0, 2);
       return true;
     }
diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp
index c050fd41ac0e9..a19e2e68b3ec2 100644
--- a/clang/lib/CodeGen/CGStmt.cpp
+++ b/clang/lib/CodeGen/CGStmt.cpp
@@ -2968,7 +2968,10 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
       ResultRegQualTys.push_back(QTy);
       ResultRegDests.push_back(Dest);
 
-      ResultBounds.emplace_back(Info.getOutputOperandBounds());
+      ResultBounds.emplace_back(
+          Info.hasFlagOutputOperand()
+              ? Info.getOutputOperandBounds()
+              : std::optional<std::pair<unsigned, unsigned>>());
 
       llvm::Type *Ty = ConvertTypeForMem(QTy);
       const bool RequiresCast = Info.allowsRegister() &&

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to