[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