-
Notifications
You must be signed in to change notification settings - Fork 14.4k
[mlir][xegpu] Fix seg-fault caused by setting a null attribute #146002
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
state.addAttribute(attr.getName(), layout.dropSgLayoutAndData()); | ||
else | ||
if (auto layout = dyn_cast<xegpu::LayoutAttr>(attr.getValue())) { | ||
if (auto newLayout = layout.dropSgLayoutAndData()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is "else" required here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think so. if the newLayout is null, we don't need to keep it in the op
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, you're right, sorry for the noise
@llvm/pr-subscribers-mlir-gpu @llvm/pr-subscribers-mlir Author: Chao Chen (chencha3) ChangesFull diff: https://github.com/llvm/llvm-project/pull/146002.diff 2 Files Affected:
diff --git a/mlir/lib/Dialect/XeGPU/Transforms/XeGPUWgToSgDistribute.cpp b/mlir/lib/Dialect/XeGPU/Transforms/XeGPUWgToSgDistribute.cpp
index e3563d10bc6f1..20932e05985ed 100644
--- a/mlir/lib/Dialect/XeGPU/Transforms/XeGPUWgToSgDistribute.cpp
+++ b/mlir/lib/Dialect/XeGPU/Transforms/XeGPUWgToSgDistribute.cpp
@@ -376,10 +376,12 @@ struct WgToSgElementwiseOp : public ConversionPattern {
// Copy all attributes, but update "layout_result_0" to drop
// sgLayout/sgData
for (auto attr : op->getAttrs()) {
- if (auto layout = dyn_cast<xegpu::LayoutAttr>(attr.getValue()))
- state.addAttribute(attr.getName(), layout.dropSgLayoutAndData());
- else
+ if (auto layout = dyn_cast<xegpu::LayoutAttr>(attr.getValue())) {
+ if (auto newLayout = layout.dropSgLayoutAndData())
+ state.addAttribute(attr.getName(), newLayout);
+ } else {
state.addAttribute(attr.getName(), attr.getValue());
+ }
}
Operation *newOp = rewriter.create(state);
newResults.push_back(newOp->getResult(0));
diff --git a/mlir/test/Dialect/XeGPU/xegpu-wg-to-sg-elemwise.mlir b/mlir/test/Dialect/XeGPU/xegpu-wg-to-sg-elemwise.mlir
index 64f01d61d6e80..09df1e4da43e2 100644
--- a/mlir/test/Dialect/XeGPU/xegpu-wg-to-sg-elemwise.mlir
+++ b/mlir/test/Dialect/XeGPU/xegpu-wg-to-sg-elemwise.mlir
@@ -1,6 +1,25 @@
// RUN: mlir-opt --xegpu-wg-to-sg-distribute -split-input-file %s | FileCheck %s
gpu.module @test_elementwise_ops {
+
+ // CHECK-LABEL: unary_ops_sg_layout_only
+ gpu.func @unary_ops_sg_layout_only(%a: memref<24x32xf32>) {
+ %tdesc_a = xegpu.create_nd_tdesc %a[0, 0] : memref<24x32xf32>
+ -> !xegpu.tensor_desc<24x32xf32, #xegpu.layout<sg_layout = [2, 4], sg_data = [12, 8]>>
+ %load_a = xegpu.load_nd %tdesc_a
+ : !xegpu.tensor_desc<24x32xf32, #xegpu.layout<sg_layout = [2, 4], sg_data = [12, 8]>>
+ -> vector<24x32xf32>
+ // CHECK: math.exp {{.*}} : vector<12x8xf32>
+ %exp = math.exp %load_a
+ {layout_result_0 = #xegpu.layout<sg_layout = [2, 4], sg_data = [12, 8]>}
+ : vector<24x32xf32>
+ // CHECK: arith.negf {{.*}} : vector<12x8xf32>
+ %negf = arith.negf %load_a
+ {layout_result_0 = #xegpu.layout<sg_layout = [2, 4], sg_data = [12, 8]>}
+ : vector<24x32xf32>
+ gpu.return
+ }
+
// CHECK-LABEL: unary_ops
gpu.func @unary_ops(%a: memref<24x32xf32>) {
%tdesc_a = xegpu.create_nd_tdesc %a[0, 0] : memref<24x32xf32>
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isn't there potentially the same issue with:
if (!isa<scf::IfOp, scf::ForOp, scf::WhileOp, scf::ConditionOp>(op))
op->setAttr(name, layout.dropSgLayoutAndData());
at the end of XeGPUWgToSgDistributePass::runOnOperation
?
Thanks for the catch up, it is fix. |
A bug fix in Wg2SgElemwiseOpPattern, check the updated attribute is not null before assigning it.