[Mlir-commits] [mlir] [mlir][gpu] Add gpu.rotate operation (PR #142796)
Jakub Kuderski
llvmlistbot at llvm.org
Wed Jun 18 13:58:48 PDT 2025
================
@@ -1364,6 +1364,53 @@ def GPU_ShuffleOp : GPU_Op<
];
}
+def GPU_RotateOp : GPU_Op<
+ "rotate", [Pure, AllTypesMatch<["value", "rotateResult"]>]>,
+ Arguments<(ins AnyIntegerOrFloatOr1DVector:$value, I32:$offset, I32:$width)>,
+ Results<(outs AnyIntegerOrFloatOr1DVector:$rotateResult, I1:$valid)> {
+ let summary = "Rotate values within a subgroup.";
+ let description = [{
+ The "rotate" op moves values across lanes (a.k.a., invocations, work items)
+ within the same subgroup. The `width` argument specifies the number of lanes
+ that participate in the rotation, and must be uniform across all lanes.
+ Further, the first `width` lanes of the subgroup must be active.
+
+ `width` must be a power of two, and `offset` must be in the range
+ `[0, width)`.
+
+ Return the `rotateResult` of the invocation whose id within the group is
+ calculated as follows:
+
+ ```mlir
+ Invocation ID = ((LaneId + offset) & (width - 1)) + (LaneId & ~(width - 1))
+ ```
+
+ Returns the `rotateResult` and `true` if the current lane id is smaller than
+ `width`, and an unspecified value and `false` otherwise.
----------------
kuhar wrote:
I think this should return `ub.poison` so that we know what are the valid operations over these values.
https://github.com/llvm/llvm-project/pull/142796
More information about the Mlir-commits
mailing list