| // 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 |
| } |
| } |
| } |