https://github.com/madhur13490 updated 
https://github.com/llvm/llvm-project/pull/213902

>From d3e75a3d27341c34c12c41ae3df172c9ac124a97 Mon Sep 17 00:00:00 2001
From: Madhur Amilkanthwar <[email protected]>
Date: Mon, 3 Aug 2026 01:39:14 -0700
Subject: [PATCH 1/2] Enforce single-operand form for
 llvm.loop.vectorize.predicate metadata

Replace the two-operand boolean form
!{!"llvm.loop.vectorize.predicate.enable", i1 0/1} with a single-operand
enable/disable pair:

  !{!"llvm.loop.vectorize.predicate.enable"}
  !{!"llvm.loop.vectorize.predicate.disable"}

The Verifier rejects the two-operand form, AutoUpgrade rewrites old
bitcode, and the readers and producers in LLVM, Clang and MLIR are
updated.

Please refer to RFC:
https://discourse.llvm.org/t/rfc-enforce-single-operand-format-for-all-enable-metadata-nodes/90571/
---
 clang/lib/CodeGen/CGLoopInfo.cpp              |  10 +-
 .../test/CodeGenCXX/pragma-loop-predicate.cpp |   4 +-
 llvm/docs/LangRef.md                          |   9 +-
 llvm/include/llvm/IR/AutoUpgrade.h            |  12 +--
 llvm/lib/IR/AutoUpgrade.cpp                   |  92 +++++++++---------
 llvm/lib/IR/Verifier.cpp                      |   9 ++
 .../Vectorize/LoopVectorizationLegality.cpp   |   4 +
 ...upgrade-loop-vectorize-predicate-enable.ll |  37 +++++++
 ...rade-loop-vectorize-predicate-enable.ll.bc | Bin 0 -> 2368 bytes
 .../AArch64/low_trip_count_predicates.ll      |   2 +-
 .../partial-reduce-dot-product-epilogue.ll    |   2 +-
 .../partial-reduce-dot-product-mixed.ll       |   2 +-
 .../partial-reduce-dot-product-neon.ll        |   2 +-
 .../AArch64/partial-reduce-dot-product.ll     |   2 +-
 .../AArch64/partial-reduce-sub.ll             |   2 +-
 .../LoopVectorize/AArch64/partial-reduce.ll   |   2 +-
 .../LoopVectorize/AArch64/predicated-costs.ll |   2 +-
 .../LoopVectorize/AArch64/strict-fadd.ll      |   2 +-
 .../LoopVectorize/AArch64/sve2-histcnt.ll     |   2 +-
 .../AArch64/tail-folding-styles.ll            |   2 +-
 .../widen-gep-all-indices-invariant.ll        |   2 +-
 .../ARM/prefer-tail-loop-folding.ll           |   2 +-
 .../ARM/tail-folding-loop-hint.ll             |   2 +-
 .../ARM/tail-folding-prefer-flag.ll           |   2 +-
 .../VPlan/AArch64/sve-tail-folding-forced.ll  |   2 +-
 .../VPlan/AArch64/vplan-printing.ll           |   4 +-
 .../LoopVectorize/VPlan/constant-fold.ll      |   2 +-
 .../LoopVectorize/X86/induction-costs.ll      |   2 +-
 .../X86/tail_folding_and_assume_safety.ll     |   4 +-
 .../LoopVectorize/X86/tail_loop_folding.ll    |   4 +-
 ...o-fold-tail-by-masking-iv-external-uses.ll |   2 +-
 .../LoopVectorize/reduction-inloop-uf4.ll     |   2 +-
 .../LoopVectorize/reduction-inloop.ll         |   2 +-
 .../use-scalar-epilogue-if-tp-fails.ll        |   2 +-
 ...kedge-elimination-predicated-early-exit.ll |   2 +-
 .../Verifier/llvm.loop.vectorize.predicate.ll |  41 ++++++++
 .../Target/LLVMIR/LoopAnnotationImporter.cpp  |   3 +-
 .../LLVMIR/LoopAnnotationTranslation.cpp      |  36 ++++---
 .../Target/LLVMIR/Import/metadata-loop.ll     |   2 +-
 mlir/test/Target/LLVMIR/loop-metadata.mlir    |   2 +-
 40 files changed, 208 insertions(+), 111 deletions(-)
 create mode 100644 llvm/test/Bitcode/upgrade-loop-vectorize-predicate-enable.ll
 create mode 100644 
llvm/test/Bitcode/upgrade-loop-vectorize-predicate-enable.ll.bc
 create mode 100644 llvm/test/Verifier/llvm.loop.vectorize.predicate.ll

diff --git a/clang/lib/CodeGen/CGLoopInfo.cpp b/clang/lib/CodeGen/CGLoopInfo.cpp
index 93857f9aaab8d..23eff005f7004 100644
--- a/clang/lib/CodeGen/CGLoopInfo.cpp
+++ b/clang/lib/CodeGen/CGLoopInfo.cpp
@@ -226,11 +226,11 @@ clang::CodeGen::LoopInfo::createLoopVectorizeMetadata(
     IsVectorPredicateEnabled =
         (Attrs.VectorizePredicateEnable == LoopAttributes::Enable);
 
-    Metadata *Vals[] = {
-        MDString::get(Ctx, "llvm.loop.vectorize.predicate.enable"),
-        ConstantAsMetadata::get(ConstantInt::get(llvm::Type::getInt1Ty(Ctx),
-                                                 IsVectorPredicateEnabled))};
-    Args.push_back(MDNode::get(Ctx, Vals));
+    Args.push_back(MDNode::get(
+        Ctx,
+        {MDString::get(Ctx, IsVectorPredicateEnabled
+                                ? "llvm.loop.vectorize.predicate.enable"
+                                : "llvm.loop.vectorize.predicate.disable")}));
   }
 
   // Setting vectorize.width
diff --git a/clang/test/CodeGenCXX/pragma-loop-predicate.cpp 
b/clang/test/CodeGenCXX/pragma-loop-predicate.cpp
index 421110fd9f867..cb7dfdb810215 100644
--- a/clang/test/CodeGenCXX/pragma-loop-predicate.cpp
+++ b/clang/test/CodeGenCXX/pragma-loop-predicate.cpp
@@ -106,10 +106,10 @@ void test9(int *List, int Length) {
 // CHECK-NEXT: [[GEN3]] = !{!"llvm.loop.vectorize.enable"}
 
 // CHECK-NEXT: ![[LOOP1]] = distinct !{![[LOOP1]], [[MP]], [[GEN6:![0-9]+]], 
[[GEN3]]}
-// CHECK-NEXT: [[GEN6]] = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+// CHECK-NEXT: [[GEN6]] = !{!"llvm.loop.vectorize.predicate.enable"}
 
 // CHECK-NEXT: ![[LOOP2]] = distinct !{![[LOOP2]], [[MP]], [[GEN8:![0-9]+]], 
[[GEN3]]}
-// CHECK-NEXT: [[GEN8]] = !{!"llvm.loop.vectorize.predicate.enable", i1 false}
+// CHECK-NEXT: [[GEN8]] = !{!"llvm.loop.vectorize.predicate.disable"}
 
 // CHECK-NEXT: ![[LOOP3]] = distinct !{![[LOOP3]], [[MP]], [[GEN6]], [[GEN3]]}
 
diff --git a/llvm/docs/LangRef.md b/llvm/docs/LangRef.md
index 6a3194271b838..b625d387fa60b 100644
--- a/llvm/docs/LangRef.md
+++ b/llvm/docs/LangRef.md
@@ -8079,14 +8079,11 @@ node has a single operand containing the name string:
 
 This metadata selectively enables or disables creating predicated instructions
 for the loop, which can enable folding of the scalar epilogue loop into the
-main loop. The first operand is the string
-`llvm.loop.vectorize.predicate.enable` and the second operand is a bit. If
-the bit operand value is 1 predication is enabled. A value of 0 disables
-predication:
+main loop. Each node has a single operand containing the name string:
 
 ```llvm
-!0 = !{!"llvm.loop.vectorize.predicate.enable", i1 0}
-!1 = !{!"llvm.loop.vectorize.predicate.enable", i1 1}
+!0 = !{!"llvm.loop.vectorize.predicate.enable"}
+!1 = !{!"llvm.loop.vectorize.predicate.disable"}
 ```
 
 Additionally, enabling predication implicitly enables vectorization.
diff --git a/llvm/include/llvm/IR/AutoUpgrade.h 
b/llvm/include/llvm/IR/AutoUpgrade.h
index 12aeb2793f705..8f10733de4ae5 100644
--- a/llvm/include/llvm/IR/AutoUpgrade.h
+++ b/llvm/include/llvm/IR/AutoUpgrade.h
@@ -112,14 +112,14 @@ namespace llvm {
 
   /// Check whether a string looks like an old loop attachment tag.
   inline bool mayBeOldLoopAttachmentTag(StringRef Name) {
-    // "llvm.loop.distribute.enable" and "llvm.loop.vectorize.enable" are
-    // intentionally included: the current single-operand form shares the tag
-    // with the removed two-operand form (!{!"...", i1 X}), so we can only
-    // decide by inspecting the operands, which happens in
-    // upgradeLoopArgument().
+    // The enable tags below are intentionally included: the current
+    // single-operand form shares the tag with the removed two-operand form
+    // (!{!"...", i1 X}), so we can only decide by inspecting the operands,
+    // which happens in upgradeLoopArgument().
     return Name.starts_with("llvm.vectorizer.") ||
            Name == "llvm.loop.distribute.enable" ||
-           Name == "llvm.loop.vectorize.enable";
+           Name == "llvm.loop.vectorize.enable" ||
+           Name == "llvm.loop.vectorize.predicate.enable";
   }
 
   /// Upgrade the loop attachment metadata node.
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index d2216e4072337..389a2cb80c7bf 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -7074,37 +7074,46 @@ void llvm::copyModuleAttrToFunctions(Module &M) {
   }
 }
 
-// Old two-operand form: !{!"llvm.loop.distribute.enable", i1 X}. The new
-// single-operand form uses "llvm.loop.distribute.enable" for X = true and
-// "llvm.loop.distribute.disable" for X = false.
-static bool isOldDistributeEnable(const MDTuple *T) {
-  if (T->getNumOperands() != 2)
-    return false;
-  auto *Tag = dyn_cast_or_null<MDString>(T->getOperand(0));
-  if (!Tag || Tag->getString() != "llvm.loop.distribute.enable")
-    return false;
-  return mdconst::hasa<ConstantInt>(T->getOperand(1));
+namespace {
+// Single-operand tags replacing a removed two-operand form
+// !{!"<Enable>", i1 X}: X = true selects Enable, X = false selects Disable.
+struct BooleanLoopTags {
+  StringLiteral Enable;
+  StringLiteral Disable;
+};
+} // namespace
+
+static constexpr BooleanLoopTags OldBooleanLoopTags[] = {
+    {"llvm.loop.distribute.enable", "llvm.loop.distribute.disable"},
+    {"llvm.loop.vectorize.enable", "llvm.loop.vectorize.disable"},
+    {"llvm.loop.vectorize.predicate.enable",
+     "llvm.loop.vectorize.predicate.disable"}};
+
+// Return the replacement tags for the enable tag \p Name, or nullptr.
+static const BooleanLoopTags *findBooleanLoopTags(StringRef Name) {
+  const auto *Tags =
+      find_if(OldBooleanLoopTags, [Name](const BooleanLoopTags &Candidate) {
+        return Candidate.Enable == Name;
+      });
+  return Tags == std::end(OldBooleanLoopTags) ? nullptr : Tags;
 }
 
-/// Old two-operand form: !{!"llvm.loop.vectorize.enable", i1 X}. The new
-/// single-operand form uses "llvm.loop.vectorize.enable" for X = true and
-/// "llvm.loop.vectorize.disable" for X = false.
-static bool isOldVectorizeEnable(const MDTuple *T) {
-  if (T->getNumOperands() != 2)
-    return false;
+// Return the replacement tags if \p T still uses a removed two-operand form.
+static const BooleanLoopTags *getOldBooleanLoopTags(const MDTuple *T) {
+  if (T->getNumOperands() != 2 || 
!mdconst::hasa<ConstantInt>(T->getOperand(1)))
+    return nullptr;
   auto *Tag = dyn_cast_or_null<MDString>(T->getOperand(0));
-  if (!Tag || Tag->getString() != "llvm.loop.vectorize.enable")
-    return false;
-  return mdconst::hasa<ConstantInt>(T->getOperand(1));
+  return Tag ? findBooleanLoopTags(Tag->getString()) : nullptr;
 }
 
-/// Build the single-operand vectorize enable/disable node that replaces a
-/// boolean operand: nonzero -> enable, zero -> disable.
-static Metadata *makeVectorizeEnableNode(LLVMContext &C, const MDOperand &Op) {
+/// Build the single-operand node that replaces a boolean operand: nonzero
+/// selects the enable tag, zero the disable tag.
+static Metadata *makeBooleanLoopNode(LLVMContext &C,
+                                     const BooleanLoopTags &Tags,
+                                     const MDOperand &Op) {
   bool Enable = !mdconst::extract<ConstantInt>(Op)->isZero();
-  return MDTuple::get(
-      C, {MDString::get(C, Enable ? "llvm.loop.vectorize.enable"
-                                  : "llvm.loop.vectorize.disable")});
+  return MDTuple::get(C,
+                      {MDString::get(C, Enable ? Tags.Enable : Tags.Disable)});
 }
 
 static bool isOldLoopArgument(Metadata *MD) {
@@ -7118,7 +7127,7 @@ static bool isOldLoopArgument(Metadata *MD) {
     return false;
   if (S->getString().starts_with("llvm.vectorizer."))
     return true;
-  return isOldDistributeEnable(T) || isOldVectorizeEnable(T);
+  return getOldBooleanLoopTags(T) != nullptr;
 }
 
 static MDString *upgradeLoopTag(LLVMContext &C, StringRef OldTag) {
@@ -7145,18 +7154,9 @@ static Metadata *upgradeLoopArgument(Metadata *MD) {
 
   LLVMContext &C = T->getContext();
 
-  // Rewrite the old two-operand distribute form to the single-operand pair.
-  if (isOldDistributeEnable(T)) {
-    bool Enable = !mdconst::extract<ConstantInt>(T->getOperand(1))->isZero();
-    return MDTuple::get(
-        C, {MDString::get(C, Enable ? "llvm.loop.distribute.enable"
-                                    : "llvm.loop.distribute.disable")});
-  }
-
-  // Rewrite the modern two-operand vectorize.enable form to the single-operand
-  // enable/disable pair.
-  if (isOldVectorizeEnable(T))
-    return makeVectorizeEnableNode(C, T->getOperand(1));
+  // Rewrite a removed two-operand boolean form to the single-operand pair.
+  if (const BooleanLoopTags *Tags = getOldBooleanLoopTags(T))
+    return makeBooleanLoopNode(C, *Tags, T->getOperand(1));
 
   if (!OldTag->getString().starts_with("llvm.vectorizer."))
     return MD;
@@ -7166,9 +7166,9 @@ static Metadata *upgradeLoopArgument(Metadata *MD) {
 
   // The legacy !{!"llvm.vectorizer.enable", i1 X} maps onto the single-operand
   // vectorize.enable/disable pair, not a two-operand enable node.
-  if (NewTag->getString() == "llvm.loop.vectorize.enable" &&
-      T->getNumOperands() == 2 && mdconst::hasa<ConstantInt>(T->getOperand(1)))
-    return makeVectorizeEnableNode(C, T->getOperand(1));
+  if (T->getNumOperands() == 2 && mdconst::hasa<ConstantInt>(T->getOperand(1)))
+    if (const BooleanLoopTags *Tags = findBooleanLoopTags(NewTag->getString()))
+      return makeBooleanLoopNode(C, *Tags, T->getOperand(1));
 
   SmallVector<Metadata *, 8> Ops;
   Ops.reserve(T->getNumOperands());
@@ -7187,14 +7187,14 @@ MDNode *llvm::upgradeInstructionLoopAttachment(MDNode 
&N) {
   if (none_of(T->operands(), isOldLoopArgument))
     return &N;
 
-  // Fix the old two-operand distribute/vectorize.enable nodes in place: the
-  // Verifier rejects any MDNode carrying those tags with more than one 
operand,
-  // so a leftover reference (from the distinct loop-ID) would still trigger a
-  // diagnostic. In-place mutation is safe on distinct MDNodes.
+  // Fix the removed two-operand boolean nodes in place: the Verifier rejects
+  // any MDNode carrying those tags with more than one operand, so a leftover
+  // reference (from the distinct loop-ID) would still trigger a diagnostic.
+  // In-place mutation is safe on distinct MDNodes.
   if (T->isDistinct()) {
     for (unsigned I = 0, E = T->getNumOperands(); I < E; ++I) {
       auto *OpT = dyn_cast_or_null<MDTuple>(T->getOperand(I));
-      if (OpT && (isOldDistributeEnable(OpT) || isOldVectorizeEnable(OpT)))
+      if (OpT && getOldBooleanLoopTags(OpT))
         T->replaceOperandWith(I, upgradeLoopArgument(OpT));
     }
     if (none_of(T->operands(), isOldLoopArgument))
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 44d1843aa56a9..6c79e49490e63 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -1024,6 +1024,15 @@ void Verifier::visitMDNode(const MDNode &BaseMD,
       Check(CurrentMD->getNumOperands() == 1,
             "Expecting only the metadata name", CurrentMD);
 
+    // Enforce the single-operand form of the vectorize predication metadata.
+    if (CurrentMD->getNumOperands() > 0 &&
+        (CurrentMD->getOperand(0).equalsStr(
+             "llvm.loop.vectorize.predicate.enable") ||
+         CurrentMD->getOperand(0).equalsStr(
+             "llvm.loop.vectorize.predicate.disable")))
+      Check(CurrentMD->getNumOperands() == 1,
+            "Expecting only the metadata name", CurrentMD);
+
     // Check these last, so we diagnose problems in operands first.
     Check(!CurrentMD->isTemporary(), "Expected no forward declarations!",
           CurrentMD);
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp 
b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
index 9086880599231..82fe38a235c87 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
@@ -293,6 +293,10 @@ void LoopVectorizeHints::getHintsFromMetadata() {
         Force.Value = FK_Enabled;
       else if (Name == "llvm.loop.vectorize.disable")
         Force.Value = FK_Disabled;
+      else if (Name == "llvm.loop.vectorize.predicate.enable")
+        Predicate.Value = FK_Enabled;
+      else if (Name == "llvm.loop.vectorize.predicate.disable")
+        Predicate.Value = FK_Disabled;
       continue;
     }
     if (Args.size() == 1)
diff --git a/llvm/test/Bitcode/upgrade-loop-vectorize-predicate-enable.ll 
b/llvm/test/Bitcode/upgrade-loop-vectorize-predicate-enable.ll
new file mode 100644
index 0000000000000..20e1f264e559c
--- /dev/null
+++ b/llvm/test/Bitcode/upgrade-loop-vectorize-predicate-enable.ll
@@ -0,0 +1,37 @@
+; Test that older bitcode carrying the two-operand form of
+; "llvm.loop.vectorize.predicate.enable" is auto-upgraded to the
+; single-operand enable/disable pair on load.
+;
+; RUN: llvm-dis < %s.bc | FileCheck %s
+; RUN: verify-uselistorder < %s.bc
+
+define void @enable_true() {
+entry:
+  br label %body
+body:
+  br i1 0, label %body, label %exit, !llvm.loop !0
+exit:
+  ret void
+}
+
+define void @enable_false() {
+entry:
+  br label %body
+body:
+  br i1 0, label %body, label %exit, !llvm.loop !2
+exit:
+  ret void
+}
+
+; i1 true  -> single-operand enable.
+; i1 false -> disable.
+; CHECK: !{!"llvm.loop.vectorize.predicate.enable"}
+; CHECK: !{!"llvm.loop.vectorize.predicate.disable"}
+; The old two-operand nodes must be gone from the module.
+; CHECK-NOT: llvm.loop.vectorize.predicate.enable", i1
+; CHECK-NOT: llvm.loop.vectorize.predicate.disable", i1
+
+!0 = distinct !{!0, !1}
+!1 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!2 = distinct !{!2, !3}
+!3 = !{!"llvm.loop.vectorize.predicate.enable", i1 false}
diff --git a/llvm/test/Bitcode/upgrade-loop-vectorize-predicate-enable.ll.bc 
b/llvm/test/Bitcode/upgrade-loop-vectorize-predicate-enable.ll.bc
new file mode 100644
index 
0000000000000000000000000000000000000000..d8de6672e251bca832b2fa87a4b5980618df926e
GIT binary patch
literal 2368
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
aJ0vUn(3i?S^rf;7Z6Da!-(RW>p??9IL0519

literal 0
HcmV?d00001

diff --git 
a/llvm/test/Transforms/LoopVectorize/AArch64/low_trip_count_predicates.ll 
b/llvm/test/Transforms/LoopVectorize/AArch64/low_trip_count_predicates.ll
index 1138b19bd3471..c68421ac4a2a4 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/low_trip_count_predicates.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/low_trip_count_predicates.ll
@@ -528,7 +528,7 @@ exit:
 
 
 !0 = distinct !{!0, !1}
-!1 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!1 = !{!"llvm.loop.vectorize.predicate.enable"}
 !2 = !{!"branch_weights", i32 10, i32 30}
 
 ;.
diff --git 
a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-epilogue.ll
 
b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-epilogue.ll
index 0282a9cac5c8d..f493914d294a1 100644
--- 
a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-epilogue.ll
+++ 
b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-epilogue.ll
@@ -447,7 +447,7 @@ exit:
 
 !7 = distinct !{!7, !8, !9, !10}
 !8 = !{!"llvm.loop.mustprogress"}
-!9 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!9 = !{!"llvm.loop.vectorize.predicate.enable"}
 !10 = !{!"llvm.loop.vectorize.enable"}
 
 attributes #0 = { vscale_range(1,16) "target-features"="+sve" }
diff --git 
a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-mixed.ll
 
b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-mixed.ll
index 339aea4551d6b..97cc8e50b62c7 100644
--- 
a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-mixed.ll
+++ 
b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-mixed.ll
@@ -393,7 +393,7 @@ for.exit:
 
 !7 = distinct !{!7, !8, !9, !10}
 !8 = !{!"llvm.loop.mustprogress"}
-!9 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!9 = !{!"llvm.loop.vectorize.predicate.enable"}
 !10 = !{!"llvm.loop.vectorize.enable"}
 attributes #0 = { vscale_range(1,16) "target-features"="+sve" }
 attributes #1 = { "target-features"="+neon" }
diff --git 
a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-neon.ll 
b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-neon.ll
index 3ba46e2fd46d6..aa9ca9a265605 100644
--- 
a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-neon.ll
+++ 
b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product-neon.ll
@@ -2394,5 +2394,5 @@ exit:
 
 !7 = distinct !{!7, !8, !9, !10}
 !8 = !{!"llvm.loop.mustprogress"}
-!9 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!9 = !{!"llvm.loop.vectorize.predicate.enable"}
 !10 = !{!"llvm.loop.vectorize.enable"}
diff --git 
a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product.ll 
b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product.ll
index f19db4519c09a..c074982766e6d 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-dot-product.ll
@@ -2691,7 +2691,7 @@ for.body:
 
 !7 = distinct !{!7, !8, !9, !10}
 !8 = !{!"llvm.loop.mustprogress"}
-!9 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!9 = !{!"llvm.loop.vectorize.predicate.enable"}
 !10 = !{!"llvm.loop.vectorize.enable"}
 attributes #0 = { vscale_range(1,16) "target-features"="+sve" }
 attributes #1 = { vscale_range(1,16) "target-features"="+neon,+dotprod,+sve" 
"target-cpu"="neoverse-v2" }
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-sub.ll 
b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-sub.ll
index 641d6db59147d..61f4e4098a8bf 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-sub.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce-sub.ll
@@ -523,7 +523,7 @@ for.exit:
 
 !7 = distinct !{!7, !8, !9, !10}
 !8 = !{!"llvm.loop.mustprogress"}
-!9 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!9 = !{!"llvm.loop.vectorize.predicate.enable"}
 !10 = !{!"llvm.loop.vectorize.enable"}
 
 attributes #0 = { vscale_range(1,16) "target-features"="+sve" }
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce.ll 
b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce.ll
index 03938490e465c..9aa27cee2ecb8 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/partial-reduce.ll
@@ -1285,7 +1285,7 @@ exit:
 
 
 !0 = distinct !{!0, !1}
-!1 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!1 = !{!"llvm.loop.vectorize.predicate.enable"}
 attributes #0 = { vscale_range(1,16) "target-features"="+sve" }
 attributes #1 = { vscale_range(1,16) "target-features"="+neon,+dotprod,+sve" 
"target-cpu"="neoverse-v2" }
 attributes #2 = { "target-features"="+neon,+dotprod" }
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/predicated-costs.ll 
b/llvm/test/Transforms/LoopVectorize/AArch64/predicated-costs.ll
index 3c47627e5f45f..31f6e49c835b9 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/predicated-costs.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/predicated-costs.ll
@@ -370,7 +370,7 @@ attributes #1 = { "target-cpu"="neoverse-v2" }
 
 !0 = distinct !{!0, !1, !2, !3}
 !1 = !{!"llvm.loop.mustprogress"}
-!2 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!2 = !{!"llvm.loop.vectorize.predicate.enable"}
 !3 = !{!"llvm.loop.vectorize.enable"}
 
 ; BFI computes if is taken 20 times, and loop 32 times. Make sure we round the
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/strict-fadd.ll 
b/llvm/test/Transforms/LoopVectorize/AArch64/strict-fadd.ll
index b79cc7cf2bcee..b689914508b25 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/strict-fadd.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/strict-fadd.ll
@@ -1417,5 +1417,5 @@ for.cond.cleanup:
 !9 = !{!"llvm.loop.interleave.count", i32 1}
 !10 = !{!"llvm.loop.interleave.count", i32 4}
 !11 = !{!"llvm.loop.vectorize.enable"}
-!12 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!12 = !{!"llvm.loop.vectorize.predicate.enable"}
 !13 = distinct !{!13, !6, !9, !11}
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/sve2-histcnt.ll 
b/llvm/test/Transforms/LoopVectorize/AArch64/sve2-histcnt.ll
index e0a1b2bb6a03e..88a4ea2366d60 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/sve2-histcnt.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/sve2-histcnt.ll
@@ -876,7 +876,7 @@ attributes #0 = { "target-features"="+sve2" 
vscale_range(1,16) }
 !0 = distinct !{!0, !1}
 !1 = !{!"llvm.loop.interleave.count", i32 2}
 !2 = distinct !{!2, !3}
-!3 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!3 = !{!"llvm.loop.vectorize.predicate.enable"}
 !4 = distinct !{!4, !5}
 !5 = !{!"llvm.loop.interleave.count", i32 1}
 !6 = !{!7}
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/tail-folding-styles.ll 
b/llvm/test/Transforms/LoopVectorize/AArch64/tail-folding-styles.ll
index 0b783375a33e1..d323dce104e66 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/tail-folding-styles.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/tail-folding-styles.ll
@@ -150,7 +150,7 @@ while.end.loopexit:
 }
 
 !0 = distinct !{!0, !1, !2, !3, !4}
-!1 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!1 = !{!"llvm.loop.vectorize.predicate.enable"}
 !2 = !{!"llvm.loop.vectorize.scalable.enable", i1 true}
 !3 = !{!"llvm.loop.interleave.count", i32 1}
 !4 = !{!"llvm.loop.vectorize.width", i32 4}
diff --git 
a/llvm/test/Transforms/LoopVectorize/AArch64/widen-gep-all-indices-invariant.ll 
b/llvm/test/Transforms/LoopVectorize/AArch64/widen-gep-all-indices-invariant.ll
index 3b29335c36301..18712ad5d1fba 100644
--- 
a/llvm/test/Transforms/LoopVectorize/AArch64/widen-gep-all-indices-invariant.ll
+++ 
b/llvm/test/Transforms/LoopVectorize/AArch64/widen-gep-all-indices-invariant.ll
@@ -55,7 +55,7 @@ attributes #0 = { "target-cpu"="neoverse-v2" }
 
 !0 = distinct !{!0, !1, !2}
 !1 = !{!"llvm.loop.vectorize.enable"}
-!2 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!2 = !{!"llvm.loop.vectorize.predicate.enable"}
 ;.
 ; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], 
[[META2:![0-9]+]]}
 ; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
diff --git a/llvm/test/Transforms/LoopVectorize/ARM/prefer-tail-loop-folding.ll 
b/llvm/test/Transforms/LoopVectorize/ARM/prefer-tail-loop-folding.ll
index 75862d9c72e00..46dbb741a1ee0 100644
--- a/llvm/test/Transforms/LoopVectorize/ARM/prefer-tail-loop-folding.ll
+++ b/llvm/test/Transforms/LoopVectorize/ARM/prefer-tail-loop-folding.ll
@@ -425,7 +425,7 @@ attributes #0 = { nofree norecurse nounwind 
"target-features"="+armv8.1-m.main,+
 !6 = !{!"llvm.loop.vectorize.enable"}
 
 !7 = distinct !{!7, !8}
-!8 = !{!"llvm.loop.vectorize.predicate.enable", i1 false}
+!8 = !{!"llvm.loop.vectorize.predicate.disable"}
 
 !10 = distinct !{!10, !11}
 !11 = !{!"llvm.loop.vectorize.width", i32 4}
diff --git a/llvm/test/Transforms/LoopVectorize/ARM/tail-folding-loop-hint.ll 
b/llvm/test/Transforms/LoopVectorize/ARM/tail-folding-loop-hint.ll
index 3038b7fd935d3..e0bcaba596768 100644
--- a/llvm/test/Transforms/LoopVectorize/ARM/tail-folding-loop-hint.ll
+++ b/llvm/test/Transforms/LoopVectorize/ARM/tail-folding-loop-hint.ll
@@ -80,5 +80,5 @@ for.body:
 ; CHECK-NEXT: [[VEC_LOOP2]] = distinct !{[[VEC_LOOP2]], [[MD_IS_VEC]], 
[[MD_RT_UNROLL_DIS]]}
 
 !6 = distinct !{!6, !7, !8}
-!7 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!7 = !{!"llvm.loop.vectorize.predicate.enable"}
 !8 = !{!"llvm.loop.vectorize.enable"}
diff --git a/llvm/test/Transforms/LoopVectorize/ARM/tail-folding-prefer-flag.ll 
b/llvm/test/Transforms/LoopVectorize/ARM/tail-folding-prefer-flag.ll
index a477fee265d59..8d4f990c09e84 100644
--- a/llvm/test/Transforms/LoopVectorize/ARM/tail-folding-prefer-flag.ll
+++ b/llvm/test/Transforms/LoopVectorize/ARM/tail-folding-prefer-flag.ll
@@ -101,7 +101,7 @@ for.body:
 }
 
 !10 = distinct !{!10, !11, !12}
-!11 = !{!"llvm.loop.vectorize.predicate.enable", i1 false}
+!11 = !{!"llvm.loop.vectorize.predicate.disable"}
 !12 = !{!"llvm.loop.vectorize.enable"}
 
 !14 = distinct !{!14, !15}
diff --git 
a/llvm/test/Transforms/LoopVectorize/VPlan/AArch64/sve-tail-folding-forced.ll 
b/llvm/test/Transforms/LoopVectorize/VPlan/AArch64/sve-tail-folding-forced.ll
index 592dbbb2b5c52..15e57eda91e0e 100644
--- 
a/llvm/test/Transforms/LoopVectorize/VPlan/AArch64/sve-tail-folding-forced.ll
+++ 
b/llvm/test/Transforms/LoopVectorize/VPlan/AArch64/sve-tail-folding-forced.ll
@@ -85,4 +85,4 @@ while.end.loopexit:
 attributes #0 = { "target-features"="+sve" }
 
 !0 = distinct !{!0, !1}
-!1 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!1 = !{!"llvm.loop.vectorize.predicate.enable"}
diff --git a/llvm/test/Transforms/LoopVectorize/VPlan/AArch64/vplan-printing.ll 
b/llvm/test/Transforms/LoopVectorize/VPlan/AArch64/vplan-printing.ll
index 5445a5e835fb6..91cb168e423ef 100644
--- a/llvm/test/Transforms/LoopVectorize/VPlan/AArch64/vplan-printing.ll
+++ b/llvm/test/Transforms/LoopVectorize/VPlan/AArch64/vplan-printing.ll
@@ -282,5 +282,5 @@ exit:
 !0 = distinct !{!0, !2, !3}
 !1 = distinct !{!1, !2, !4}
 !2 = !{!"llvm.loop.interleave.count", i32 1}
-!3 = !{!"llvm.loop.vectorize.predicate.enable", i1 false}
-!4 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!3 = !{!"llvm.loop.vectorize.predicate.disable"}
+!4 = !{!"llvm.loop.vectorize.predicate.enable"}
diff --git a/llvm/test/Transforms/LoopVectorize/VPlan/constant-fold.ll 
b/llvm/test/Transforms/LoopVectorize/VPlan/constant-fold.ll
index 4ec0ec66d4321..cb00f39754036 100644
--- a/llvm/test/Transforms/LoopVectorize/VPlan/constant-fold.ll
+++ b/llvm/test/Transforms/LoopVectorize/VPlan/constant-fold.ll
@@ -319,4 +319,4 @@ exit:
 !1 = distinct !{!1, !2, !3, !4}
 !2 = !{!"llvm.loop.vectorize.width", i32 4}
 !3 = !{!"llvm.loop.vectorize.enable"}
-!4 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!4 = !{!"llvm.loop.vectorize.predicate.enable"}
diff --git a/llvm/test/Transforms/LoopVectorize/X86/induction-costs.ll 
b/llvm/test/Transforms/LoopVectorize/X86/induction-costs.ll
index 815d13351d15d..92b95f2256ebf 100644
--- a/llvm/test/Transforms/LoopVectorize/X86/induction-costs.ll
+++ b/llvm/test/Transforms/LoopVectorize/X86/induction-costs.ll
@@ -643,7 +643,7 @@ exit:
 !1 = distinct !{!1, !2, !3, !4}
 !2 = !{!"llvm.loop.vectorize.width", i32 4}
 !3 = !{!"llvm.loop.vectorize.enable"}
-!4 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!4 = !{!"llvm.loop.vectorize.predicate.enable"}
 
 define void @wide_iv_trunc_reuse(ptr %dst) {
 ; CHECK-LABEL: define void @wide_iv_trunc_reuse(
diff --git 
a/llvm/test/Transforms/LoopVectorize/X86/tail_folding_and_assume_safety.ll 
b/llvm/test/Transforms/LoopVectorize/X86/tail_folding_and_assume_safety.ll
index a1def726e10ed..ca8b382556009 100644
--- a/llvm/test/Transforms/LoopVectorize/X86/tail_folding_and_assume_safety.ll
+++ b/llvm/test/Transforms/LoopVectorize/X86/tail_folding_and_assume_safety.ll
@@ -146,9 +146,9 @@ attributes #0 = { 
"target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "use-soft-float
 !7 = !{!"llvm.loop.vectorize.enable"}
 
 !8 = distinct !{!8, !9}
-!9 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!9 = !{!"llvm.loop.vectorize.predicate.enable"}
 
 !10 = distinct !{}
 !11 = distinct !{!11, !12, !13}
 !12 = !{!"llvm.loop.parallel_accesses", !10}
-!13 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!13 = !{!"llvm.loop.vectorize.predicate.enable"}
diff --git a/llvm/test/Transforms/LoopVectorize/X86/tail_loop_folding.ll 
b/llvm/test/Transforms/LoopVectorize/X86/tail_loop_folding.ll
index e5b88dd5219db..e42b16098776c 100644
--- a/llvm/test/Transforms/LoopVectorize/X86/tail_loop_folding.ll
+++ b/llvm/test/Transforms/LoopVectorize/X86/tail_loop_folding.ll
@@ -171,8 +171,8 @@ for.cond.cleanup:
 attributes #0 = { optsize "target-cpu"="core-avx2" 
"target-features"="+avx,+avx2" }
 
 !6 = distinct !{!6, !7, !8}
-!7 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!7 = !{!"llvm.loop.vectorize.predicate.enable"}
 !8 = !{!"llvm.loop.vectorize.enable"}
 
 !10 = distinct !{!10, !11}
-!11 = !{!"llvm.loop.vectorize.predicate.enable", i1 false}
+!11 = !{!"llvm.loop.vectorize.predicate.disable"}
diff --git 
a/llvm/test/Transforms/LoopVectorize/no-fold-tail-by-masking-iv-external-uses.ll
 
b/llvm/test/Transforms/LoopVectorize/no-fold-tail-by-masking-iv-external-uses.ll
index 6a80b02aaf50e..7e6247033a875 100644
--- 
a/llvm/test/Transforms/LoopVectorize/no-fold-tail-by-masking-iv-external-uses.ll
+++ 
b/llvm/test/Transforms/LoopVectorize/no-fold-tail-by-masking-iv-external-uses.ll
@@ -128,7 +128,7 @@ done:
 
 !0 = distinct !{!0, !1, !2, !3}
 !1 = !{!"llvm.loop.unroll.disable"}
-!2 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!2 = !{!"llvm.loop.vectorize.predicate.enable"}
 !3 = !{!"llvm.loop.vectorize.enable"}
 ;.
 ; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], 
[[META2:![0-9]+]], [[META3:![0-9]+]]}
diff --git a/llvm/test/Transforms/LoopVectorize/reduction-inloop-uf4.ll 
b/llvm/test/Transforms/LoopVectorize/reduction-inloop-uf4.ll
index 4751570432927..2737e3accf37a 100644
--- a/llvm/test/Transforms/LoopVectorize/reduction-inloop-uf4.ll
+++ b/llvm/test/Transforms/LoopVectorize/reduction-inloop-uf4.ll
@@ -611,5 +611,5 @@ for.end:
 }
 
 !6 = distinct !{!6, !7, !8}
-!7 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!7 = !{!"llvm.loop.vectorize.predicate.enable"}
 !8 = !{!"llvm.loop.vectorize.enable"}
diff --git a/llvm/test/Transforms/LoopVectorize/reduction-inloop.ll 
b/llvm/test/Transforms/LoopVectorize/reduction-inloop.ll
index 73ce57b156952..abf0100a2440a 100644
--- a/llvm/test/Transforms/LoopVectorize/reduction-inloop.ll
+++ b/llvm/test/Transforms/LoopVectorize/reduction-inloop.ll
@@ -3138,5 +3138,5 @@ for.exit:
 
 
 !6 = distinct !{!6, !7, !8}
-!7 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!7 = !{!"llvm.loop.vectorize.predicate.enable"}
 !8 = !{!"llvm.loop.vectorize.enable"}
diff --git 
a/llvm/test/Transforms/LoopVectorize/use-scalar-epilogue-if-tp-fails.ll 
b/llvm/test/Transforms/LoopVectorize/use-scalar-epilogue-if-tp-fails.ll
index 5d65362df3cc2..6135464eaca14 100644
--- a/llvm/test/Transforms/LoopVectorize/use-scalar-epilogue-if-tp-fails.ll
+++ b/llvm/test/Transforms/LoopVectorize/use-scalar-epilogue-if-tp-fails.ll
@@ -244,5 +244,5 @@ end:
 }
 
 !1 = distinct !{!1, !2, !3}
-!2 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!2 = !{!"llvm.loop.vectorize.predicate.enable"}
 !3 = !{!"llvm.loop.vectorize.enable"}
diff --git 
a/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-predicated-early-exit.ll
 
b/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-predicated-early-exit.ll
index ce0da2efcab20..be0a9c5b7e7d7 100644
--- 
a/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-predicated-early-exit.ll
+++ 
b/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-predicated-early-exit.ll
@@ -50,5 +50,5 @@ exit:
 
 !0 = distinct !{!0, !1, !2, !3}
 !1 = !{!"llvm.loop.mustprogress"}
-!2 = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+!2 = !{!"llvm.loop.vectorize.predicate.enable"}
 !3 = !{!"llvm.loop.vectorize.enable"}
diff --git a/llvm/test/Verifier/llvm.loop.vectorize.predicate.ll 
b/llvm/test/Verifier/llvm.loop.vectorize.predicate.ll
new file mode 100644
index 0000000000000..943efa88c22ad
--- /dev/null
+++ b/llvm/test/Verifier/llvm.loop.vectorize.predicate.ll
@@ -0,0 +1,41 @@
+; Test "llvm.loop.vectorize.predicate.enable" /
+; "llvm.loop.vectorize.predicate.disable" single-operand validation.
+
+; DEFINE: %{VERIFY} = llvm-as -disable-output %t 2>&1
+
+define void @test() {
+entry:
+  br label %body
+body:
+  br i1 0, label %body, label %exit, !llvm.loop !0
+exit:
+  ret void
+}
+!0 = distinct !{!0, !1}
+
+;      BAD: Expecting only the metadata name
+
+; Single-operand enable.
+; RUN: cat %s > %t
+; RUN: echo '!1 = !{!"llvm.loop.vectorize.predicate.enable"}' >> %t
+; RUN: %{VERIFY}
+
+; Single-operand disable.
+; RUN: cat %s > %t
+; RUN: echo '!1 = !{!"llvm.loop.vectorize.predicate.disable"}' >> %t
+; RUN: %{VERIFY}
+
+; Two-operand enable with boolean false (legacy form, now rejected).
+; RUN: cat %s > %t
+; RUN: echo '!1 = !{!"llvm.loop.vectorize.predicate.enable", i1 0}' >> %t
+; RUN: not %{VERIFY} | FileCheck %s -check-prefix=BAD
+
+; Two-operand enable with boolean true (legacy form, now rejected).
+; RUN: cat %s > %t
+; RUN: echo '!1 = !{!"llvm.loop.vectorize.predicate.enable", i1 1}' >> %t
+; RUN: not %{VERIFY} | FileCheck %s -check-prefix=BAD
+
+; Two-operand disable (rejected).
+; RUN: cat %s > %t
+; RUN: echo '!1 = !{!"llvm.loop.vectorize.predicate.disable", i1 0}' >> %t
+; RUN: not %{VERIFY} | FileCheck %s -check-prefix=BAD
diff --git a/mlir/lib/Target/LLVMIR/LoopAnnotationImporter.cpp 
b/mlir/lib/Target/LLVMIR/LoopAnnotationImporter.cpp
index 7f80b5be28b0b..1bf3400614cf5 100644
--- a/mlir/lib/Target/LLVMIR/LoopAnnotationImporter.cpp
+++ b/mlir/lib/Target/LLVMIR/LoopAnnotationImporter.cpp
@@ -289,7 +289,8 @@ FailureOr<LoopVectorizeAttr> 
LoopMetadataConversion::convertVectorizeAttr() {
       "llvm.loop.vectorize.enable", "llvm.loop.vectorize.disable",
       /*negated=*/true);
   FailureOr<BoolAttr> predicateEnable =
-      lookupBoolNode("llvm.loop.vectorize.predicate.enable");
+      lookupBooleanUnitNode("llvm.loop.vectorize.predicate.enable",
+                            "llvm.loop.vectorize.predicate.disable");
   FailureOr<BoolAttr> scalableEnable =
       lookupBoolNode("llvm.loop.vectorize.scalable.enable");
   FailureOr<IntegerAttr> width = lookupIntNode("llvm.loop.vectorize.width");
diff --git a/mlir/lib/Target/LLVMIR/LoopAnnotationTranslation.cpp 
b/mlir/lib/Target/LLVMIR/LoopAnnotationTranslation.cpp
index 7420142957d4c..7641810251cf7 100644
--- a/mlir/lib/Target/LLVMIR/LoopAnnotationTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/LoopAnnotationTranslation.cpp
@@ -31,6 +31,8 @@ struct LoopAnnotationConversion {
   void addUnitNode(StringRef name, BoolAttr attr);
   void addI32NodeWithVal(StringRef name, uint32_t val);
   void convertBoolNode(StringRef name, BoolAttr attr, bool negated = false);
+  void convertBooleanUnitNode(StringRef enableName, StringRef disableName,
+                              BoolAttr attr, bool negated = false);
   void convertI32Node(StringRef name, IntegerAttr attr);
   void convertFollowupNode(StringRef name, LoopAnnotationAttr attr);
   void convertLocation(FusedLoc attr);
@@ -83,6 +85,17 @@ void LoopAnnotationConversion::convertBoolNode(StringRef 
name, BoolAttr attr,
                               llvm::ConstantAsMetadata::get(cstValue)}));
 }
 
+/// Emits the single-operand node of an enable/disable pair. As in
+/// convertBoolNode, \p negated ^ the attribute value is the enable bit.
+void LoopAnnotationConversion::convertBooleanUnitNode(StringRef enableName,
+                                                      StringRef disableName,
+                                                      BoolAttr attr,
+                                                      bool negated) {
+  if (!attr)
+    return;
+  addUnitNode((negated ^ attr.getValue()) ? enableName : disableName);
+}
+
 void LoopAnnotationConversion::convertI32Node(StringRef name,
                                               IntegerAttr attr) {
   if (!attr)
@@ -103,14 +116,12 @@ void 
LoopAnnotationConversion::convertFollowupNode(StringRef name,
 }
 
 void LoopAnnotationConversion::convertLoopOptions(LoopVectorizeAttr options) {
-  if (auto disable = options.getDisable()) {
-    if (disable.getValue())
-      addUnitNode("llvm.loop.vectorize.disable");
-    else
-      addUnitNode("llvm.loop.vectorize.enable");
-  }
-  convertBoolNode("llvm.loop.vectorize.predicate.enable",
-                  options.getPredicateEnable());
+  convertBooleanUnitNode("llvm.loop.vectorize.enable",
+                         "llvm.loop.vectorize.disable", options.getDisable(),
+                         /*negated=*/true);
+  convertBooleanUnitNode("llvm.loop.vectorize.predicate.enable",
+                         "llvm.loop.vectorize.predicate.disable",
+                         options.getPredicateEnable());
   convertBoolNode("llvm.loop.vectorize.scalable.enable",
                   options.getScalableEnable());
   convertI32Node("llvm.loop.vectorize.width", options.getWidth());
@@ -167,12 +178,9 @@ void 
LoopAnnotationConversion::convertLoopOptions(LoopLICMAttr options) {
 }
 
 void LoopAnnotationConversion::convertLoopOptions(LoopDistributeAttr options) {
-  if (auto disable = options.getDisable()) {
-    if (disable.getValue())
-      addUnitNode("llvm.loop.distribute.disable");
-    else
-      addUnitNode("llvm.loop.distribute.enable");
-  }
+  convertBooleanUnitNode("llvm.loop.distribute.enable",
+                         "llvm.loop.distribute.disable", options.getDisable(),
+                         /*negated=*/true);
   convertFollowupNode("llvm.loop.distribute.followup_coincident",
                       options.getFollowupCoincident());
   convertFollowupNode("llvm.loop.distribute.followup_sequential",
diff --git a/mlir/test/Target/LLVMIR/Import/metadata-loop.ll 
b/mlir/test/Target/LLVMIR/Import/metadata-loop.ll
index d64a96c1b1422..7b4a6d7fa5263 100644
--- a/mlir/test/Target/LLVMIR/Import/metadata-loop.ll
+++ b/mlir/test/Target/LLVMIR/Import/metadata-loop.ll
@@ -87,7 +87,7 @@ end:
 
 !1 = distinct !{!1, !2, !3, !4, !5, !6, !7, !8}
 !2 = !{!"llvm.loop.vectorize.enable"}
-!3 = !{!"llvm.loop.vectorize.predicate.enable", i1 1}
+!3 = !{!"llvm.loop.vectorize.predicate.enable"}
 !4 = !{!"llvm.loop.vectorize.scalable.enable", i1 0}
 !5 = !{!"llvm.loop.vectorize.width", i32 16}
 !6 = !{!"llvm.loop.vectorize.followup_vectorized", !9}
diff --git a/mlir/test/Target/LLVMIR/loop-metadata.mlir 
b/mlir/test/Target/LLVMIR/loop-metadata.mlir
index ada830e103a2c..50293246d34d5 100644
--- a/mlir/test/Target/LLVMIR/loop-metadata.mlir
+++ b/mlir/test/Target/LLVMIR/loop-metadata.mlir
@@ -56,7 +56,7 @@ llvm.func @vectorizeOptions() {
 // CHECK-DAG: ![[FOLLOWUP:[0-9]+]] = distinct !{![[FOLLOWUP]], ![[NON_FORCED]]}
 // CHECK-DAG: ![[LOOP_NODE]] = distinct !{![[LOOP_NODE]], !{{[0-9]+}}, 
!{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}}
 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.enable"}
-// CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.predicate.enable", i1 true}
+// CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.predicate.enable"}
 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.scalable.enable", i1 false}
 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.width", i32 16}
 // CHECK-DAG: !{{[0-9]+}} = !{!"llvm.loop.vectorize.followup_vectorized", 
![[FOLLOWUP]]}

>From cab498b14278ff3318c8c992ff5918d2199e6043 Mon Sep 17 00:00:00 2001
From: Madhur Amilkanthwar <[email protected]>
Date: Wed, 5 Aug 2026 23:00:58 -0700
Subject: [PATCH 2/2] fixup! Enforce single-operand form for
 llvm.loop.vectorize.predicate metadata

---
 llvm/docs/LangRef.md                          |  2 +-
 llvm/include/llvm/IR/AutoUpgrade.h            | 34 ++++++++++++++-----
 .../Vectorize/LoopVectorizationLegality.h     | 24 +++++--------
 llvm/lib/IR/AutoUpgrade.cpp                   | 28 ++-------------
 llvm/lib/IR/Verifier.cpp                      | 26 ++++----------
 .../Vectorize/LoopVectorizationLegality.cpp   | 27 +++++++--------
 llvm/test/Verifier/llvm.loop.distribute.ll    |  2 +-
 .../LLVMIR/LoopAnnotationTranslation.cpp      |  4 ++-
 8 files changed, 60 insertions(+), 87 deletions(-)

diff --git a/llvm/docs/LangRef.md b/llvm/docs/LangRef.md
index b625d387fa60b..d57f619042f22 100644
--- a/llvm/docs/LangRef.md
+++ b/llvm/docs/LangRef.md
@@ -8075,7 +8075,7 @@ node has a single operand containing the name string:
 !1 = !{!"llvm.loop.vectorize.disable"}
 ```
 
-#### '`llvm.loop.vectorize.predicate.enable`' Metadata
+#### '`llvm.loop.vectorize.predicate.enable`' and 
'`llvm.loop.vectorize.predicate.disable`' Metadata
 
 This metadata selectively enables or disables creating predicated instructions
 for the loop, which can enable folding of the scalar epilogue loop into the
diff --git a/llvm/include/llvm/IR/AutoUpgrade.h 
b/llvm/include/llvm/IR/AutoUpgrade.h
index 8f10733de4ae5..1f1b3c4c27815 100644
--- a/llvm/include/llvm/IR/AutoUpgrade.h
+++ b/llvm/include/llvm/IR/AutoUpgrade.h
@@ -110,16 +110,34 @@ namespace llvm {
   ///  - sign-return-address-with-bkey
   LLVM_ABI void copyModuleAttrToFunctions(Module &M);
 
+  /// Single-operand tags replacing a removed two-operand form
+  /// !{!"<Enable>", i1 X}: X = true selects Enable, X = false selects Disable.
+  struct BooleanLoopTags {
+    StringLiteral Enable;
+    StringLiteral Disable;
+  };
+
+  inline constexpr BooleanLoopTags OldBooleanLoopTags[] = {
+      {"llvm.loop.distribute.enable", "llvm.loop.distribute.disable"},
+      {"llvm.loop.vectorize.enable", "llvm.loop.vectorize.disable"},
+      {"llvm.loop.vectorize.predicate.enable",
+       "llvm.loop.vectorize.predicate.disable"}};
+
+  /// Return the replacement tags for the enable tag \p Name, or nullptr.
+  inline const BooleanLoopTags *findBooleanLoopTags(StringRef Name) {
+    for (const BooleanLoopTags &Tags : OldBooleanLoopTags)
+      if (Tags.Enable == Name)
+        return &Tags;
+    return nullptr;
+  }
+
   /// Check whether a string looks like an old loop attachment tag.
   inline bool mayBeOldLoopAttachmentTag(StringRef Name) {
-    // The enable tags below are intentionally included: the current
-    // single-operand form shares the tag with the removed two-operand form
-    // (!{!"...", i1 X}), so we can only decide by inspecting the operands,
-    // which happens in upgradeLoopArgument().
-    return Name.starts_with("llvm.vectorizer.") ||
-           Name == "llvm.loop.distribute.enable" ||
-           Name == "llvm.loop.vectorize.enable" ||
-           Name == "llvm.loop.vectorize.predicate.enable";
+    // The enable tags are intentionally included: the current single-operand
+    // form shares the tag with the removed two-operand form (!{!"...", i1 X}),
+    // so we can only decide by inspecting the operands, which happens in
+    // upgradeLoopArgument().
+    return Name.starts_with("llvm.vectorizer.") || findBooleanLoopTags(Name);
   }
 
   /// Upgrade the loop attachment metadata node.
diff --git a/llvm/include/llvm/Transforms/Vectorize/LoopVectorizationLegality.h 
b/llvm/include/llvm/Transforms/Vectorize/LoopVectorizationLegality.h
index 3e8db73fd79d2..502fec920ece9 100644
--- a/llvm/include/llvm/Transforms/Vectorize/LoopVectorizationLegality.h
+++ b/llvm/include/llvm/Transforms/Vectorize/LoopVectorizationLegality.h
@@ -58,14 +58,7 @@ class Type;
 /// for example 'force', means a decision has been made. So, we need to be
 /// careful NOT to add them if the user hasn't specifically asked so.
 class LoopVectorizeHints {
-  enum HintKind {
-    HK_WIDTH,
-    HK_INTERLEAVE,
-    HK_FORCE,
-    HK_ISVECTORIZED,
-    HK_PREDICATE,
-    HK_SCALABLE
-  };
+  enum HintKind { HK_WIDTH, HK_INTERLEAVE, HK_ISVECTORIZED, HK_SCALABLE };
 
   /// Hint - associates name and validation with the hint value.
   struct Hint {
@@ -85,14 +78,15 @@ class LoopVectorizeHints {
   /// Vectorization interleave factor.
   Hint Interleave;
 
-  /// Vectorization forced
-  Hint Force;
+  /// Vectorization forced; one of ForceKind. Carried as a plain value because
+  /// the enable/disable pair is a standalone tag with no operand to validate.
+  unsigned Force;
 
   /// Already Vectorized
   Hint IsVectorized;
 
-  /// Vector Predicate
-  Hint Predicate;
+  /// Vector Predicate; one of ForceKind, carried as a plain value like Force.
+  unsigned Predicate;
 
   /// Says whether we should use fixed width or scalable vectorization.
   Hint Scalable;
@@ -155,12 +149,12 @@ class LoopVectorizeHints {
     return 0;
   }
   unsigned getIsVectorized() const { return IsVectorized.Value; }
-  unsigned getPredicate() const { return Predicate.Value; }
+  unsigned getPredicate() const { return Predicate; }
   enum ForceKind getForce() const {
-    if ((ForceKind)Force.Value == FK_Undefined &&
+    if ((ForceKind)Force == FK_Undefined &&
         hasDisableAllTransformsHint(TheLoop))
       return FK_Disabled;
-    return (ForceKind)Force.Value;
+    return (ForceKind)Force;
   }
 
   /// \return true if scalable vectorization has been explicitly disabled.
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 389a2cb80c7bf..5c4d38bd52bdb 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -7074,31 +7074,7 @@ void llvm::copyModuleAttrToFunctions(Module &M) {
   }
 }
 
-namespace {
-// Single-operand tags replacing a removed two-operand form
-// !{!"<Enable>", i1 X}: X = true selects Enable, X = false selects Disable.
-struct BooleanLoopTags {
-  StringLiteral Enable;
-  StringLiteral Disable;
-};
-} // namespace
-
-static constexpr BooleanLoopTags OldBooleanLoopTags[] = {
-    {"llvm.loop.distribute.enable", "llvm.loop.distribute.disable"},
-    {"llvm.loop.vectorize.enable", "llvm.loop.vectorize.disable"},
-    {"llvm.loop.vectorize.predicate.enable",
-     "llvm.loop.vectorize.predicate.disable"}};
-
-// Return the replacement tags for the enable tag \p Name, or nullptr.
-static const BooleanLoopTags *findBooleanLoopTags(StringRef Name) {
-  const auto *Tags =
-      find_if(OldBooleanLoopTags, [Name](const BooleanLoopTags &Candidate) {
-        return Candidate.Enable == Name;
-      });
-  return Tags == std::end(OldBooleanLoopTags) ? nullptr : Tags;
-}
-
-// Return the replacement tags if \p T still uses a removed two-operand form.
+/// Return the replacement tags if \p T still uses a removed two-operand form.
 static const BooleanLoopTags *getOldBooleanLoopTags(const MDTuple *T) {
   if (T->getNumOperands() != 2 || 
!mdconst::hasa<ConstantInt>(T->getOperand(1)))
     return nullptr;
@@ -7154,7 +7130,7 @@ static Metadata *upgradeLoopArgument(Metadata *MD) {
 
   LLVMContext &C = T->getContext();
 
-  // Rewrite a removed two-operand boolean form to the single-operand pair.
+  /// Rewrite a removed two-operand boolean form to the single-operand pair.
   if (const BooleanLoopTags *Tags = getOldBooleanLoopTags(T))
     return makeBooleanLoopNode(C, *Tags, T->getOperand(1));
 
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 6c79e49490e63..09429024e3ae8 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -64,6 +64,7 @@
 #include "llvm/IR/Argument.h"
 #include "llvm/IR/AttributeMask.h"
 #include "llvm/IR/Attributes.h"
+#include "llvm/IR/AutoUpgrade.h"
 #include "llvm/IR/BasicBlock.h"
 #include "llvm/IR/BundleAttributes.h"
 #include "llvm/IR/CFG.h"
@@ -1009,27 +1010,12 @@ void Verifier::visitMDNode(const MDNode &BaseMD,
             CurrentMD);
     }
 
-    // Enforce the single-operand form of llvm.loop.distribute metadata.
+    // Enforce the single-operand form of the loop enable/disable pairs.
     if (CurrentMD->getNumOperands() > 0 &&
-        (CurrentMD->getOperand(0).equalsStr("llvm.loop.distribute.enable") ||
-         CurrentMD->getOperand(0).equalsStr("llvm.loop.distribute.disable")))
-      Check(CurrentMD->getNumOperands() == 1,
-            "Expected one operand for llvm.loop.distribute metadata",
-            CurrentMD);
-
-    // Enforce the single-operand form of llvm.loop.vectorize.enable metadata.
-    if (CurrentMD->getNumOperands() > 0 &&
-        (CurrentMD->getOperand(0).equalsStr("llvm.loop.vectorize.enable") ||
-         CurrentMD->getOperand(0).equalsStr("llvm.loop.vectorize.disable")))
-      Check(CurrentMD->getNumOperands() == 1,
-            "Expecting only the metadata name", CurrentMD);
-
-    // Enforce the single-operand form of the vectorize predication metadata.
-    if (CurrentMD->getNumOperands() > 0 &&
-        (CurrentMD->getOperand(0).equalsStr(
-             "llvm.loop.vectorize.predicate.enable") ||
-         CurrentMD->getOperand(0).equalsStr(
-             "llvm.loop.vectorize.predicate.disable")))
+        any_of(OldBooleanLoopTags, [CurrentMD](const BooleanLoopTags &Tags) {
+          return CurrentMD->getOperand(0).equalsStr(Tags.Enable) ||
+                 CurrentMD->getOperand(0).equalsStr(Tags.Disable);
+        }))
       Check(CurrentMD->getNumOperands() == 1,
             "Expecting only the metadata name", CurrentMD);
 
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp 
b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
index 82fe38a235c87..c2c6ac7953d82 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
@@ -90,10 +90,7 @@ bool LoopVectorizeHints::Hint::validate(unsigned Val) {
     return isPowerOf2_32(Val) && Val <= VectorizerParams::MaxVectorWidth;
   case HK_INTERLEAVE:
     return isPowerOf2_32(Val) && Val <= MaxInterleaveFactor;
-  case HK_FORCE:
-    return (Val <= 1);
   case HK_ISVECTORIZED:
-  case HK_PREDICATE:
   case HK_SCALABLE:
     return (Val == 0 || Val == 1);
   }
@@ -107,9 +104,8 @@ LoopVectorizeHints::LoopVectorizeHints(const Loop *L,
     : Width("vectorize.width",
             VectorizerParams::VectorizationFactor.getKnownMinValue(), 
HK_WIDTH),
       Interleave("interleave.count", InterleaveOnlyWhenForced, HK_INTERLEAVE),
-      Force("vectorize.enable", FK_Undefined, HK_FORCE),
-      IsVectorized("isvectorized", 0, HK_ISVECTORIZED),
-      Predicate("vectorize.predicate.enable", FK_Undefined, HK_PREDICATE),
+      Force(FK_Undefined), IsVectorized("isvectorized", 0, HK_ISVECTORIZED),
+      Predicate(FK_Undefined),
       Scalable("vectorize.scalable.enable", SK_Unspecified, HK_SCALABLE),
       TheLoop(L), ORE(ORE) {
   // Populate values with existing loop metadata.
@@ -182,7 +178,7 @@ void LoopVectorizeHints::reportDisallowedVectorization(
 bool LoopVectorizeHints::allowVectorization(
     Function *F, Loop *L, bool VectorizeOnlyWhenForced) const {
   if (getForce() == LoopVectorizeHints::FK_Disabled) {
-    if (Force.Value == LoopVectorizeHints::FK_Disabled) {
+    if (Force == LoopVectorizeHints::FK_Disabled) {
       reportDisallowedVectorization("#pragma vectorize disable",
                                     "MissedExplicitlyDisabled",
                                     "vectorization is explicitly disabled", L);
@@ -226,7 +222,7 @@ void LoopVectorizeHints::emitRemarkWithHints() const {
   using namespace ore;
 
   ORE.emit([&]() {
-    if (Force.Value == LoopVectorizeHints::FK_Disabled)
+    if (Force == LoopVectorizeHints::FK_Disabled)
       return OptimizationRemarkMissed(LV_NAME, "MissedExplicitlyDisabled",
                                       TheLoop->getStartLoc(),
                                       TheLoop->getHeader())
@@ -235,7 +231,7 @@ void LoopVectorizeHints::emitRemarkWithHints() const {
     OptimizationRemarkMissed R(LV_NAME, "MissedDetails", 
TheLoop->getStartLoc(),
                                TheLoop->getHeader());
     R << "loop not vectorized";
-    if (Force.Value == LoopVectorizeHints::FK_Enabled) {
+    if (Force == LoopVectorizeHints::FK_Enabled) {
       R << " (Force=" << NV("Force", true);
       if (Width.Value != 0)
         R << ", Vector Width=" << NV("VectorWidth", getWidth());
@@ -290,13 +286,13 @@ void LoopVectorizeHints::getHintsFromMetadata() {
     // The single-operand enable/disable pair carries no argument.
     if (Args.empty()) {
       if (Name == "llvm.loop.vectorize.enable")
-        Force.Value = FK_Enabled;
+        Force = FK_Enabled;
       else if (Name == "llvm.loop.vectorize.disable")
-        Force.Value = FK_Disabled;
+        Force = FK_Disabled;
       else if (Name == "llvm.loop.vectorize.predicate.enable")
-        Predicate.Value = FK_Enabled;
+        Predicate = FK_Enabled;
       else if (Name == "llvm.loop.vectorize.predicate.disable")
-        Predicate.Value = FK_Disabled;
+        Predicate = FK_Disabled;
       continue;
     }
     if (Args.size() == 1)
@@ -313,8 +309,9 @@ void LoopVectorizeHints::setHint(StringRef Name, Metadata 
*Arg) {
     return;
   unsigned Val = C->getZExtValue();
 
-  Hint *Hints[] = {&Width,        &Interleave, &Force,
-                   &IsVectorized, &Predicate,  &Scalable};
+  // Force and Predicate are omitted: they are only spelled as single-operand
+  // enable/disable nodes, which never reach setHint().
+  Hint *Hints[] = {&Width, &Interleave, &IsVectorized, &Scalable};
   for (auto *H : Hints) {
     if (Name == H->Name) {
       if (H->validate(Val))
diff --git a/llvm/test/Verifier/llvm.loop.distribute.ll 
b/llvm/test/Verifier/llvm.loop.distribute.ll
index 65ca27720542b..81cf6bb6b3e27 100644
--- a/llvm/test/Verifier/llvm.loop.distribute.ll
+++ b/llvm/test/Verifier/llvm.loop.distribute.ll
@@ -13,7 +13,7 @@ exit:
 }
 !0 = distinct !{!0, !1}
 
-;      BAD: Expected one operand for llvm.loop.distribute metadata
+;      BAD: Expecting only the metadata name
 
 ; Single-operand enable.
 ; RUN: cat %s > %t
diff --git a/mlir/lib/Target/LLVMIR/LoopAnnotationTranslation.cpp 
b/mlir/lib/Target/LLVMIR/LoopAnnotationTranslation.cpp
index 7641810251cf7..cf0e56df2c2b3 100644
--- a/mlir/lib/Target/LLVMIR/LoopAnnotationTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/LoopAnnotationTranslation.cpp
@@ -86,7 +86,9 @@ void LoopAnnotationConversion::convertBoolNode(StringRef 
name, BoolAttr attr,
 }
 
 /// Emits the single-operand node of an enable/disable pair. As in
-/// convertBoolNode, \p negated ^ the attribute value is the enable bit.
+/// convertBoolNode, the attribute is tri-state: a null \p attr emits no node
+/// at all, otherwise \p negated ^ the attribute value is the enable bit and
+/// selects which of the two names is emitted.
 void LoopAnnotationConversion::convertBooleanUnitNode(StringRef enableName,
                                                       StringRef disableName,
                                                       BoolAttr attr,

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

Reply via email to