[Mlir-commits] [mlir] [mlir][AsmParser] Fix parseOptionalAttribute consuming loc() as an attribute (PR #180668)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Feb 11 18:48:48 PST 2026
https://github.com/XiaoleiShi-NV updated https://github.com/llvm/llvm-project/pull/180668
>From 1a29b0d22b810f962750cd67eb67f9f5d5215c4c Mon Sep 17 00:00:00 2001
From: Xiaolei Shi <xiaoleis at nvidia.com>
Date: Mon, 9 Feb 2026 18:29:40 -0800
Subject: [PATCH 1/2] init
---
mlir/lib/AsmParser/AttributeParser.cpp | 1 -
.../test/Dialect/LLVMIR/nvvm-barrier-loc.mlir | 32 +++++++++++++++++++
2 files changed, 32 insertions(+), 1 deletion(-)
create mode 100644 mlir/test/Dialect/LLVMIR/nvvm-barrier-loc.mlir
diff --git a/mlir/lib/AsmParser/AttributeParser.cpp b/mlir/lib/AsmParser/AttributeParser.cpp
index 519609a38be6e..4ef4c52d992f0 100644
--- a/mlir/lib/AsmParser/AttributeParser.cpp
+++ b/mlir/lib/AsmParser/AttributeParser.cpp
@@ -253,7 +253,6 @@ OptionalParseResult Parser::parseOptionalAttribute(Attribute &attribute,
case Token::kw_dense:
case Token::kw_dense_resource:
case Token::kw_false:
- case Token::kw_loc:
case Token::kw_sparse:
case Token::kw_true:
case Token::kw_unit:
diff --git a/mlir/test/Dialect/LLVMIR/nvvm-barrier-loc.mlir b/mlir/test/Dialect/LLVMIR/nvvm-barrier-loc.mlir
new file mode 100644
index 0000000000000..f6516a467eade
--- /dev/null
+++ b/mlir/test/Dialect/LLVMIR/nvvm-barrier-loc.mlir
@@ -0,0 +1,32 @@
+// RUN: mlir-opt %s | mlir-opt | FileCheck %s
+
+// Verify that nvvm.barrier roundtrips correctly when loc() annotations use
+// forward-referencing #loc aliases (defined after the module body).
+// This is a regression test for a bug where parseOptionalAttribute would
+// speculatively consume loc(#locN) as an attribute, failing on forward
+// references instead of leaving it for the trailing location parser.
+
+// CHECK-LABEL: @barrier_loc_forward_ref
+module {
+ llvm.func @barrier_loc_forward_ref(%barId : i32, %numThreads : i32, %pred : i32) {
+ // CHECK: nvvm.barrier
+ nvvm.barrier loc(#loc1)
+
+ // CHECK: nvvm.barrier id = %{{.*}}
+ nvvm.barrier id = %barId loc(#loc2)
+
+ // CHECK: nvvm.barrier id = %{{.*}} number_of_threads = %{{.*}}
+ nvvm.barrier id = %barId number_of_threads = %numThreads loc(#loc1)
+
+ // CHECK: %{{.*}} = nvvm.barrier #nvvm.reduction<and> %{{.*}} -> i32
+ %0 = nvvm.barrier #nvvm.reduction<and> %pred -> i32 loc(#loc2)
+
+ // CHECK: %{{.*}} = nvvm.barrier #nvvm.reduction<popc> %{{.*}} -> i32
+ %1 = nvvm.barrier #nvvm.reduction<popc> %pred -> i32 loc(#loc1)
+
+ llvm.return
+ } loc(#loc0)
+} loc(#loc0)
+#loc0 = loc(unknown)
+#loc1 = loc("barrier_test"(#loc0))
+#loc2 = loc("barrier_with_id"(#loc0))
>From 9f0a40a8eec9010654d4efd95e5ced5f7d9e5a3a Mon Sep 17 00:00:00 2001
From: Xiaolei Shi <xiaoleis at nvidia.com>
Date: Wed, 11 Feb 2026 18:34:23 -0800
Subject: [PATCH 2/2] use test dialect for testing
---
.../test/Dialect/LLVMIR/nvvm-barrier-loc.mlir | 32 -------------------
mlir/test/IR/loc-attr-disambiguation.mlir | 15 +++++++++
mlir/test/lib/Dialect/Test/TestOps.td | 6 ++++
3 files changed, 21 insertions(+), 32 deletions(-)
delete mode 100644 mlir/test/Dialect/LLVMIR/nvvm-barrier-loc.mlir
create mode 100644 mlir/test/IR/loc-attr-disambiguation.mlir
diff --git a/mlir/test/Dialect/LLVMIR/nvvm-barrier-loc.mlir b/mlir/test/Dialect/LLVMIR/nvvm-barrier-loc.mlir
deleted file mode 100644
index f6516a467eade..0000000000000
--- a/mlir/test/Dialect/LLVMIR/nvvm-barrier-loc.mlir
+++ /dev/null
@@ -1,32 +0,0 @@
-// RUN: mlir-opt %s | mlir-opt | FileCheck %s
-
-// Verify that nvvm.barrier roundtrips correctly when loc() annotations use
-// forward-referencing #loc aliases (defined after the module body).
-// This is a regression test for a bug where parseOptionalAttribute would
-// speculatively consume loc(#locN) as an attribute, failing on forward
-// references instead of leaving it for the trailing location parser.
-
-// CHECK-LABEL: @barrier_loc_forward_ref
-module {
- llvm.func @barrier_loc_forward_ref(%barId : i32, %numThreads : i32, %pred : i32) {
- // CHECK: nvvm.barrier
- nvvm.barrier loc(#loc1)
-
- // CHECK: nvvm.barrier id = %{{.*}}
- nvvm.barrier id = %barId loc(#loc2)
-
- // CHECK: nvvm.barrier id = %{{.*}} number_of_threads = %{{.*}}
- nvvm.barrier id = %barId number_of_threads = %numThreads loc(#loc1)
-
- // CHECK: %{{.*}} = nvvm.barrier #nvvm.reduction<and> %{{.*}} -> i32
- %0 = nvvm.barrier #nvvm.reduction<and> %pred -> i32 loc(#loc2)
-
- // CHECK: %{{.*}} = nvvm.barrier #nvvm.reduction<popc> %{{.*}} -> i32
- %1 = nvvm.barrier #nvvm.reduction<popc> %pred -> i32 loc(#loc1)
-
- llvm.return
- } loc(#loc0)
-} loc(#loc0)
-#loc0 = loc(unknown)
-#loc1 = loc("barrier_test"(#loc0))
-#loc2 = loc("barrier_with_id"(#loc0))
diff --git a/mlir/test/IR/loc-attr-disambiguation.mlir b/mlir/test/IR/loc-attr-disambiguation.mlir
new file mode 100644
index 0000000000000..0111cd0eb7d51
--- /dev/null
+++ b/mlir/test/IR/loc-attr-disambiguation.mlir
@@ -0,0 +1,15 @@
+// RUN: mlir-opt %s | mlir-opt | FileCheck %s
+
+// Verify that forward-referencing loc() aliases are not consumed by
+// parseOptionalAttribute when probing for optional attribute groups.
+
+// CHECK-LABEL: @loc_forward_ref_with_optional_group
+func.func @loc_forward_ref_with_optional_group() {
+ // CHECK: test.optional_loc_group
+ test.optional_loc_group loc(#loc_fwd)
+ // CHECK: test.optional_loc_group 42 : i64
+ test.optional_loc_group 42 : i64 loc(#loc_fwd)
+ return
+} loc(#loc_base)
+#loc_base = loc(unknown)
+#loc_fwd = loc("forward_ref_test"(#loc_base))
diff --git a/mlir/test/lib/Dialect/Test/TestOps.td b/mlir/test/lib/Dialect/Test/TestOps.td
index 62a374e08ec1c..b770b860a5122 100644
--- a/mlir/test/lib/Dialect/Test/TestOps.td
+++ b/mlir/test/lib/Dialect/Test/TestOps.td
@@ -1205,6 +1205,12 @@ def TestLocationAttrOp : TEST_Op<"op_with_loc_attr"> {
let assemblyFormat = "$loc_attr attr-dict";
}
+def TestOptionalLocGroupOp : TEST_Op<"optional_loc_group"> {
+ let summary = "op with optional attr group for loc() disambiguation testing";
+ let arguments = (ins OptionalAttr<AnyAttr>:$opt_attr);
+ let assemblyFormat = "($opt_attr^)? attr-dict";
+}
+
//===----------------------------------------------------------------------===//
// Test Patterns
//===----------------------------------------------------------------------===//
More information about the Mlir-commits
mailing list