[Mlir-commits] [mlir] [mlir][acc] Improve acc.loop support as a container (PR #137887)
Erich Keane
llvmlistbot at llvm.org
Tue Apr 29 16:23:49 PDT 2025
================
@@ -2415,6 +2423,15 @@ LogicalResult acc::LoopOp::verify() {
if (getRegion().empty())
return emitError("expected non-empty body.");
+ // When it is container-like - it is expected to hold a loop-like operation.
+ // TODO: Get the collapse attribute into account.
+ if (isContainerLike()) {
----------------
erichkeane wrote:
Does this allow a `cir.scope` around the loop? Clang is creating a scope around our `for` loops so that we can do the initialization of the loop variable:
```
acc.loop {
cir.scope {
%5 = cir.alloca !u32i, !cir.ptr<!u32i>, ["I", init] {alignment = 4 : i64} loc(#loc42)
%6 = cir.const #cir.int<0> : !s32i loc(#loc18)
%7 = cir.cast(integral, %6 : !s32i), !u32i loc(#loc18)
cir.store %7, %5 : !u32i, !cir.ptr<!u32i> loc(#loc42)
cir.for : cond {
%8 = cir.load %5 : !cir.ptr<!u32i>, !u32i loc(#loc19)
%9 = cir.load %3 : !cir.ptr<!s32i>, !s32i loc(#loc20)
%10 = cir.cast(integral, %9 : !s32i), !u32i loc(#loc20)
%11 = cir.cmp(lt, %8, %10) : !u32i, !cir.bool loc(#loc21)
cir.condition(%11) loc(#loc21)
} body {
cir.scope {
%8 = cir.load %5 : !cir.ptr<!u32i>, !u32i loc(#loc23)
%9 = cir.load %1 : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i> loc(#loc24)
%10 = cir.ptr_stride(%9 : !cir.ptr<!s32i>, %8 : !u32i), !cir.ptr<!s32i> loc(#loc25)
%11 = cir.load %10 : !cir.ptr<!s32i>, !s32i loc(#loc24)
%12 = cir.load %5 : !cir.ptr<!u32i>, !u32i loc(#loc26)
%13 = cir.load %2 : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i> loc(#loc27)
%14 = cir.ptr_stride(%13 : !cir.ptr<!s32i>, %12 : !u32i), !cir.ptr<!s32i> loc(#loc28)
%15 = cir.load %14 : !cir.ptr<!s32i>, !s32i loc(#loc27)
%16 = cir.binop(add, %11, %15) nsw : !s32i loc(#loc44)
%17 = cir.load %5 : !cir.ptr<!u32i>, !u32i loc(#loc29)
%18 = cir.load %0 : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i> loc(#loc30)
%19 = cir.ptr_stride(%18 : !cir.ptr<!s32i>, %17 : !u32i), !cir.ptr<!s32i> loc(#loc31)
cir.store %16, %19 : !s32i, !cir.ptr<!s32i> loc(#loc45)
} loc(#loc43)
cir.yield loc(#loc16)
} step {
%8 = cir.load %5 : !cir.ptr<!u32i>, !u32i loc(#loc32)
%9 = cir.unary(inc, %8) : !u32i, !u32i loc(#loc32)
cir.store %9, %5 : !u32i, !cir.ptr<!u32i> loc(#loc46)
cir.yield loc(#loc41)
} loc(#loc41)
} loc(#loc41)
acc.yield loc(#loc34)
} loc(#loc14)
```
https://github.com/llvm/llvm-project/pull/137887
More information about the Mlir-commits
mailing list