loop.mlir 1.99 KB
// RUN: mlir-opt -convert-gpu-to-spirv %s -o - | FileCheck %s

module attributes {gpu.container_module} {
  func @loop(%arg0 : memref<10xf32>, %arg1 : memref<10xf32>) {
    %c0 = constant 1 : index
    "gpu.launch_func"(%c0, %c0, %c0, %c0, %c0, %c0, %arg0, %arg1) { kernel = "loop_kernel", kernel_module = @kernels} : (index, index, index, index, index, index, memref<10xf32>, memref<10xf32>) -> ()
    return
  }

  module @kernels attributes {gpu.kernel_module} {
    gpu.func @loop_kernel(%arg2 : memref<10xf32>, %arg3 : memref<10xf32>)
    attributes {gpu.kernel} {
      // CHECK: [[LB:%.*]] = spv.constant 4 : i32
      %lb = constant 4 : index
      // CHECK: [[UB:%.*]] = spv.constant 42 : i32
      %ub = constant 42 : index
      // CHECK: [[STEP:%.*]] = spv.constant 2 : i32
      %step = constant 2 : index
      // CHECK:      spv.loop {
      // CHECK-NEXT:   spv.Branch [[HEADER:\^.*]]([[LB]] : i32)
      // CHECK:      [[HEADER]]([[INDVAR:%.*]]: i32):
      // CHECK:        [[CMP:%.*]] = spv.SLessThan [[INDVAR]], [[UB]] : i32
      // CHECK:        spv.BranchConditional [[CMP]], [[BODY:\^.*]], [[MERGE:\^.*]]
      // CHECK:      [[BODY]]:
      // CHECK:        [[STRIDE1:%.*]] = spv.constant 1 : i32
      // CHECK:        [[OFFSET1:%.*]] = spv.IMul [[STRIDE1]], [[INDVAR]] : i32
      // CHECK:        spv.AccessChain {{%.*}}{{\[}}{{%.*}}, [[OFFSET1]]{{\]}} : {{.*}}
      // CHECK:        [[STRIDE2:%.*]] = spv.constant 1 : i32
      // CHECK:        [[OFFSET2:%.*]] = spv.IMul [[STRIDE2]], [[INDVAR]] : i32
      // CHECK:        spv.AccessChain {{%.*}}{{\[}}{{%.*}}, [[OFFSET2]]{{\]}} : {{.*}}
      // CHECK:        [[INCREMENT:%.*]] = spv.IAdd [[INDVAR]], [[STEP]] : i32
      // CHECK:        spv.Branch [[HEADER]]([[INCREMENT]] : i32)
      // CHECK:      [[MERGE]]
      // CHECK:        spv._merge
      // CHECK:      }
      loop.for %arg4 = %lb to %ub step %step {
        %1 = load %arg2[%arg4] : memref<10xf32>
        store %1, %arg3[%arg4] : memref<10xf32>
      }
      gpu.return
    }
  }
}