-
Notifications
You must be signed in to change notification settings - Fork 15.5k
[ROCDL] Added s_wakeup_barrier (GFX1250) #172320
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
|
@llvm/pr-subscribers-backend-amdgpu @llvm/pr-subscribers-mlir-llvm Author: Ravil Dorozhinskii (ravil-mobile) ChangesThis PR adds Full diff: https://github.com/llvm/llvm-project/pull/172320.diff 3 Files Affected:
diff --git a/mlir/include/mlir/Dialect/LLVMIR/ROCDLOps.td b/mlir/include/mlir/Dialect/LLVMIR/ROCDLOps.td
index 99cc6da0ec304..23d16e4697f6b 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/ROCDLOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/ROCDLOps.td
@@ -328,28 +328,28 @@ def ROCDL_BarrierOp : ROCDL_Op<"barrier"> {
def ROCDLGlobalBuffer : LLVM_PointerInAddressSpace<1>;
def ROCDLBufferLDS : LLVM_PointerInAddressSpace<3>;
-def ROCDL_BarrierInitOp : ROCDL_IntrOp<"s.barrier.init", [], [], [], 0, 0, 0, 0, [1], ["id"]>,
- Arguments<(ins Arg<ROCDLBufferLDS, "", []>:$ptr, I32Attr:$id)> {
+def ROCDL_BarrierInitOp : ROCDL_IntrOp<"s.barrier.init", [], [], [], 0, 0, 0, 0, [1], ["memberCnt"]>,
+ Arguments<(ins Arg<ROCDLBufferLDS, "", []>:$ptr, I32Attr:$memberCnt)> {
let description = [{
Available on gfx1250+.
}];
let results = (outs);
- let assemblyFormat = "$ptr `,` $id attr-dict";
+ let assemblyFormat = "$ptr `member_cnt` `=` $memberCnt attr-dict `:` qualified(type($ptr))";
}
def ROCDL_BarrierSignalOp : ROCDL_ConcreteNonMemIntrOp<"s.barrier.signal", [], 0, [0], ["id"]>,
Arguments<(ins I32Attr:$id)> {
let results = (outs);
- let assemblyFormat = "$id attr-dict";
+ let assemblyFormat = "`id` `=` $id attr-dict";
}
-def ROCDL_BarrierSignalVarOp : ROCDL_IntrOp<"s.barrier.signal.var", [], [], [], 0, 0, 0, 0, [1], ["id"]>,
- Arguments<(ins Arg<ROCDLBufferLDS, "", []>:$ptr, I32Attr:$id)> {
+def ROCDL_BarrierSignalVarOp : ROCDL_IntrOp<"s.barrier.signal.var", [], [], [], 0, 0, 0, 0, [1], ["memberCnt"]>,
+ Arguments<(ins Arg<ROCDLBufferLDS, "", []>:$ptr, I32Attr:$memberCnt)> {
let description = [{
Available on gfx1250+.
}];
let results = (outs);
- let assemblyFormat = "$ptr `,` $id attr-dict";
+ let assemblyFormat = "$ptr `member_cnt` `=` $memberCnt attr-dict `:` qualified(type($ptr))";
}
def ROCDL_BarrierJoinOp : ROCDL_IntrOp<"s.barrier.join", [], [], [], 0>,
@@ -358,7 +358,7 @@ def ROCDL_BarrierJoinOp : ROCDL_IntrOp<"s.barrier.join", [], [], [], 0>,
Available on gfx1250+.
}];
let results = (outs);
- let assemblyFormat = "$ptr attr-dict";
+ let assemblyFormat = "$ptr attr-dict `:` qualified(type($ptr))";
}
def ROCDL_BarrierLeaveOp : ROCDL_ConcreteNonMemIntrOp<"s.barrier.leave", [], 0, [0], ["id"]>,
@@ -367,13 +367,13 @@ def ROCDL_BarrierLeaveOp : ROCDL_ConcreteNonMemIntrOp<"s.barrier.leave", [], 0,
Available on gfx1250+.
}];
let results = (outs);
- let assemblyFormat = "$id attr-dict";
+ let assemblyFormat = "`id` `=` $id attr-dict";
}
def ROCDL_BarrierWaitOp : ROCDL_ConcreteNonMemIntrOp<"s.barrier.wait", [], 0, [0], ["id"]>,
Arguments<(ins I16Attr:$id)> {
let results = (outs);
- let assemblyFormat = "$id attr-dict";
+ let assemblyFormat = "`id` `=` $id attr-dict";
}
def ROCDL_BarrierSignalIsfirstOp : ROCDL_ConcreteNonMemIntrOp<"s.barrier.signal.isfirst", [], 1, [0], ["id"]>,
@@ -382,7 +382,7 @@ def ROCDL_BarrierSignalIsfirstOp : ROCDL_ConcreteNonMemIntrOp<"s.barrier.signal.
Available on gfx1250+.
}];
let results = (outs I1:$res);
- let assemblyFormat = "$id attr-dict `:` type($res)";
+ let assemblyFormat = "`id` `=` $id attr-dict `->` type($res)";
}
def ROCDL_GetBarrierStateOp : ROCDL_ConcreteNonMemIntrOp<"s.get.barrier.state", [], 1, [0], ["id"]>,
@@ -391,7 +391,7 @@ def ROCDL_GetBarrierStateOp : ROCDL_ConcreteNonMemIntrOp<"s.get.barrier.state",
Available on gfx1250+.
}];
let results = (outs I32:$res);
- let assemblyFormat = "$id attr-dict `:` type($res)";
+ let assemblyFormat = "`id` `=` $id attr-dict `->` type($res)";
}
def ROCDL_GetNamedBarrierStateOp : ROCDL_ConcreteNonMemIntrOp<"s.get.named.barrier.state", [], 1, [], []>,
@@ -400,7 +400,15 @@ def ROCDL_GetNamedBarrierStateOp : ROCDL_ConcreteNonMemIntrOp<"s.get.named.barri
Available on gfx1250+.
}];
let results = (outs I32:$res);
- let assemblyFormat = "$ptr attr-dict `:` type($res)";
+ let assemblyFormat = "$ptr attr-dict `:` qualified(type($ptr)) `->` type($res)";
+}
+
+def ROCDL_WakeupBarrierOp : ROCDL_ConcreteNonMemIntrOp<"s.wakeup.barrier", [], 0, [], []>,
+ Arguments<(ins Arg<ROCDLBufferLDS, "", []>:$ptr)> {
+ let description = [{
+ Available on gfx1250+.
+ }];
+ let assemblyFormat = "$ptr attr-dict `:` qualified(type($ptr))";
}
def ROCDL_WaitDscntOp: ROCDL_ConcreteNonMemIntrOp<"s.wait.dscnt", [], 0, [0], ["count"]>,
diff --git a/mlir/test/Dialect/LLVMIR/rocdl.mlir b/mlir/test/Dialect/LLVMIR/rocdl.mlir
index 3ddadde944965..750ba1c2a5eea 100644
--- a/mlir/test/Dialect/LLVMIR/rocdl.mlir
+++ b/mlir/test/Dialect/LLVMIR/rocdl.mlir
@@ -1199,64 +1199,71 @@ llvm.func @rocdl.s.barrier() {
llvm.func @rocdl.s.barrier.init(%ptr : !llvm.ptr<3>) {
// CHECK-LABEL: rocdl.s.barrier.init
- // CHECK: rocdl.s.barrier.init %[[PTR:.+]], 1
- rocdl.s.barrier.init %ptr, 1
+ // CHECK: rocdl.s.barrier.init %{{.*}} member_cnt = 1 : !llvm.ptr<3>
+ rocdl.s.barrier.init %ptr member_cnt = 1 : !llvm.ptr<3>
llvm.return
}
llvm.func @rocdl.s.barrier.signal() {
// CHECK-LABEL: rocdl.s.barrier.signal
- // CHECK: rocdl.s.barrier.signal -1
- rocdl.s.barrier.signal -1
+ // CHECK: rocdl.s.barrier.signal id = -1
+ rocdl.s.barrier.signal id = -1
llvm.return
}
llvm.func @rocdl.s.barrier.signal.var(%ptr : !llvm.ptr<3>) {
// CHECK-LABEL: rocdl.s.barrier.signal.var
- // CHECK: rocdl.s.barrier.signal.var %[[PTR:.+]], 1
- rocdl.s.barrier.signal.var %ptr, 1
+ // CHECK: rocdl.s.barrier.signal.var %{{.*}} member_cnt = 1 : !llvm.ptr<3>
+ rocdl.s.barrier.signal.var %ptr member_cnt = 1 : !llvm.ptr<3>
llvm.return
}
llvm.func @rocdl.s.barrier.join(%ptr : !llvm.ptr<3>) {
// CHECK-LABEL: rocdl.s.barrier.join
- // CHECK: rocdl.s.barrier.join %[[PTR:.+]]
- rocdl.s.barrier.join %ptr
+ // CHECK: rocdl.s.barrier.join %{{.*}} : !llvm.ptr<3>
+ rocdl.s.barrier.join %ptr : !llvm.ptr<3>
llvm.return
}
llvm.func @rocdl.s.barrier.leave() {
// CHECK-LABEL: rocdl.s.barrier.leave
- // CHECK: rocdl.s.barrier.leave 1
- rocdl.s.barrier.leave 1
+ // CHECK: rocdl.s.barrier.leave id = 1
+ rocdl.s.barrier.leave id = 1
llvm.return
}
llvm.func @rocdl.s.barrier.wait() {
// CHECK-LABEL: rocdl.s.barrier.wait
- // CHECK: rocdl.s.barrier.wait -1
- rocdl.s.barrier.wait -1
+ // CHECK: rocdl.s.barrier.wait id = -1
+ rocdl.s.barrier.wait id = -1
llvm.return
}
llvm.func @rocdl.s.barrier.signal.isfirst() {
// CHECK-LABEL: rocdl.s.barrier.signal.isfirst
- // CHECK: rocdl.s.barrier.signal.isfirst 1
- %0 = rocdl.s.barrier.signal.isfirst 1 : i1
+ // CHECK: rocdl.s.barrier.signal.isfirst id = 1 -> i1
+ %0 = rocdl.s.barrier.signal.isfirst id = 1 -> i1
llvm.return
}
llvm.func @rocdl.s.get.barrier.state() {
// CHECK-LABEL: rocdl.s.get.barrier.state
- // CHECK: rocdl.s.get.barrier.state 1
- %0 = rocdl.s.get.barrier.state 1 : i32
+ // CHECK: rocdl.s.get.barrier.state id = 1 -> i32
+ %0 = rocdl.s.get.barrier.state id = 1 -> i32
llvm.return
}
llvm.func @rocdl.s.get.named.barrier.state(%ptr : !llvm.ptr<3>) {
// CHECK-LABEL: rocdl.s.get.named.barrier.state
- // CHECK: rocdl.s.get.named.barrier.state %[[PTR:.+]]
- %0 = rocdl.s.get.named.barrier.state %ptr : i32
+ // CHECK: rocdl.s.get.named.barrier.state %{{.*}} : !llvm.ptr<3> -> i32
+ %0 = rocdl.s.get.named.barrier.state %ptr : !llvm.ptr<3> -> i32
+ llvm.return
+}
+
+llvm.func @rocdl.s.wakeup.barrier(%ptr : !llvm.ptr<3>) {
+ // CHECK-LABEL: rocdl.s.wakeup.barrier
+ // CHECK: rocdl.s.wakeup.barrier %{{.*}} : !llvm.ptr<3>
+ rocdl.s.wakeup.barrier %ptr : !llvm.ptr<3>
llvm.return
}
diff --git a/mlir/test/Target/LLVMIR/rocdl.mlir b/mlir/test/Target/LLVMIR/rocdl.mlir
index 5e1d857bd2a5d..1aba52f6cdaa8 100644
--- a/mlir/test/Target/LLVMIR/rocdl.mlir
+++ b/mlir/test/Target/LLVMIR/rocdl.mlir
@@ -253,64 +253,71 @@ llvm.func @rocdl.barrier() {
llvm.func @rocdl.s.barrier.init(%ptr : !llvm.ptr<3>) {
// CHECK-LABEL: rocdl.s.barrier.init
- // CHECK: call void @llvm.amdgcn.s.barrier.init(ptr addrspace(3) %[[PTR:.+]], i32 1)
- rocdl.s.barrier.init %ptr, 1
+ // CHECK: call void @llvm.amdgcn.s.barrier.init(ptr addrspace(3) %{{.*}}, i32 1)
+ rocdl.s.barrier.init %ptr member_cnt = 1 : !llvm.ptr<3>
llvm.return
}
llvm.func @rocdl.s.barrier.signal() {
// CHECK-LABEL: rocdl.s.barrier.signal
// CHECK-NEXT: call void @llvm.amdgcn.s.barrier.signal(i32 -1)
- rocdl.s.barrier.signal -1
+ rocdl.s.barrier.signal id = -1
llvm.return
}
llvm.func @rocdl.s.barrier.signal.var(%ptr : !llvm.ptr<3>) {
// CHECK-LABEL: rocdl.s.barrier.signal.var
- // CHECK: call void @llvm.amdgcn.s.barrier.signal.var(ptr addrspace(3) %[[PTR:.+]], i32 1)
- rocdl.s.barrier.signal.var %ptr, 1
+ // CHECK: call void @llvm.amdgcn.s.barrier.signal.var(ptr addrspace(3) %{{.*}}, i32 1)
+ rocdl.s.barrier.signal.var %ptr member_cnt = 1 : !llvm.ptr<3>
llvm.return
}
llvm.func @rocdl.s.barrier.join(%ptr : !llvm.ptr<3>) {
// CHECK-LABEL: rocdl.s.barrier.join
- // CHECK: call void @llvm.amdgcn.s.barrier.join(ptr addrspace(3) %[[PTR:.+]])
- rocdl.s.barrier.join %ptr
+ // CHECK: call void @llvm.amdgcn.s.barrier.join(ptr addrspace(3) %{{.*}})
+ rocdl.s.barrier.join %ptr : !llvm.ptr<3>
llvm.return
}
llvm.func @rocdl.s.barrier.leave() {
// CHECK-LABEL: rocdl.s.barrier.leave
// CHECK: call void @llvm.amdgcn.s.barrier.leave(i16 1)
- rocdl.s.barrier.leave 1
+ rocdl.s.barrier.leave id = 1
llvm.return
}
llvm.func @rocdl.s.barrier.wait() {
// CHECK-LABEL: rocdl.s.barrier.wait
// CHECK-NEXT: call void @llvm.amdgcn.s.barrier.wait(i16 -1)
- rocdl.s.barrier.wait -1
+ rocdl.s.barrier.wait id = -1
llvm.return
}
llvm.func @rocdl.s.barrier.signal.isfirst() {
// CHECK-LABEL: rocdl.s.barrier.signal.isfirst
- // CHECK: %[[OUT:.+]] = call i1 @llvm.amdgcn.s.barrier.signal.isfirst(i32 1)
- %0 = rocdl.s.barrier.signal.isfirst 1 : i1
+ // CHECK: %{{.*}} = call i1 @llvm.amdgcn.s.barrier.signal.isfirst(i32 1)
+ %0 = rocdl.s.barrier.signal.isfirst id = 1 -> i1
llvm.return
}
llvm.func @rocdl.s.get.barrier.state() {
// CHECK-LABEL: rocdl.s.get.barrier.state
- // CHECK: %[[STATE:.+]] = call i32 @llvm.amdgcn.s.get.barrier.state(i32 1)
- %0 = rocdl.s.get.barrier.state 1 : i32
+ // CHECK: %{{.*}} = call i32 @llvm.amdgcn.s.get.barrier.state(i32 1)
+ %0 = rocdl.s.get.barrier.state id = 1 -> i32
llvm.return
}
llvm.func @rocdl.s.get.named.barrier.state(%ptr : !llvm.ptr<3>) {
// CHECK-LABEL: rocdl.s.get.named.barrier.state
- // CHECK: %[[STATE:.+]] = call i32 @llvm.amdgcn.s.get.named.barrier.state(ptr addrspace(3) %[[PTR:.+]])
- %0 = rocdl.s.get.named.barrier.state %ptr : i32
+ // CHECK: %{{.*}} = call i32 @llvm.amdgcn.s.get.named.barrier.state(ptr addrspace(3) %{{.*}})
+ %0 = rocdl.s.get.named.barrier.state %ptr : !llvm.ptr<3> -> i32
+ llvm.return
+}
+
+llvm.func @rocdl.s.wakeup.barrier(%ptr : !llvm.ptr<3>) {
+ // CHECK-LABEL: rocdl.s.wakeup.barrier
+ // CHECK: call void @llvm.amdgcn.s.wakeup.barrier(ptr addrspace(3) %{{.*}})
+ rocdl.s.wakeup.barrier %ptr : !llvm.ptr<3>
llvm.return
}
|
🐧 Linux x64 Test Results
✅ The build succeeded and all tests passed. |
🪟 Windows x64 Test Results
✅ The build succeeded and all tests passed. |
b97aba0 to
2aa5039
Compare
krzysz00
left a comment
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.
Minor documentation notes, overall I think this is a good idea
|
|
||
| def ROCDL_WakeupBarrierOp : ROCDL_ConcreteNonMemIntrOp<"s.wakeup.barrier", [], 0, [], []>, | ||
| Arguments<(ins Arg<ROCDLBufferLDS, "", []>:$ptr)> { | ||
| let description = [{ |
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.
A bit more description of what this does could be useful?
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.
Sure. Added
2aa5039 to
833714a
Compare
krzysz00
left a comment
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.
lgtm
This PR adds
s_wakeup_barrierop for GFX1250. Additionally, refactoring of the split/named barriers regarding the types in asm was performed.