<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/57645>57645</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [MLIR] convert affine for to gpu lowering pipeline encounter error
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          youbenye
      </td>
    </tr>
</table>

<pre>
    Hi, i am trying to lowering from affine.for to gpu.launch, but got an assertsion `"error: 'affine.for' op operand cannot be used as a dimension id "`

Here is a simple testcase to reproduce it:
```mlir
func.func @serving_default(%arg0: memref<2x3xf32> {tf_saved_model.index_path = ["b"]}, %arg1: memref<2x3xf32> {tf_saved_model.index_path = ["a"]}, %arg2: memref<2x3xf32> {tf
   %0 = memref.alloc() {alignment = 128 : i64} : memref<2x3xf32>
   affine.for %arg3 = 0 to 2 {
     affine.for %arg4 = 0 to 3 {
       affine.for %arg5 = affine_map<(d0) -> (d0)>(%arg3) to affine_map<(d0) -> (d0 + 1)>(%arg3) {
         affine.for %arg6 = affine_map<(d0) -> (d0)>(%arg4) to affine_map<(d0) -> (d0 + 1)>(%arg4) {
           %1 = affine.load %arg1[%arg5, %arg6] : memref<2x3xf32>
           %2 = affine.load %arg0[%arg5, %arg6] : memref<2x3xf32>
           %3 = arith.addf %1, %2 : f32
           affine.store %3, %0[%arg5, %arg6] : memref<2x3xf32>
         }
       }
     }
   }
   memref.copy %0, %arg2 : memref<2x3xf32> to memref<2x3xf32>
   return
 }
```

here is full traced error log:
```mlir
 loc("./simple_add/simple_add.mlir":3:10): error: 'affine.for' op operand cannot be used as a dimension id
 // -----// IR Dump After ConvertAffineForToGPU Failed (convert-affine-for-to-gpu) //----- //
 "func.func"() ({
 ^bb0(%arg0: memref<2x3xf32>, %arg1: memref<2x3xf32>, %arg2: memref<2x3xf32>):
   %0 = "memref.alloc"() {alignment = 128 : i64, operand_segment_sizes = array<i32: 0, 0>} : () -> memref<2x3xf32>
   %1 = "arith.constant"() {value = 0 : index} : () -> index
   %2 = "arith.constant"() {value = 2 : index} : () -> index
   %3 = "arith.subi"(%2, %1) : (index, index) -> index
   %4 = "arith.constant"() {value = 1 : index} : () -> index
   %5 = "arith.constant"() {value = 0 : index} : () -> index
   %6 = "arith.constant"() {value = 3 : index} : () -> index
   %7 = "arith.subi"(%6, %5) : (index, index) -> index
   %8 = "arith.constant"() {value = 1 : index} : () -> index
   %9 = "arith.constant"() {value = 1 : index} : () -> index
   "gpu.launch"(%3, %9, %9, %7, %9, %9) ({
   ^bb0(%arg3: index, %arg4: index, %arg5: index, %arg6: index, %arg7: index, %arg8: index, %arg9: index, %arg10: index, %arg11: index, %arg12: index, %arg13: index, %arg14:     index):
     %10 = "arith.addi"(%1, %arg3) : (index, index) -> index
     %11 = "arith.addi"(%5, %arg6) : (index, index) -> index
     "affine.for"(%10, %10) ({
     ^bb0(%arg15: index):
       "affine.for"(%11, %11) ({
       ^bb0(%arg16: index):
         %12 = "affine.load"(%arg1, %arg15, %arg16) {map = affine_map<(d0, d1) -> (d0, d1)>} : (memref<2x3xf32>, index, index) -> f32
         %13 = "affine.load"(%arg0, %arg15, %arg16) {map = affine_map<(d0, d1) -> (d0, d1)>} : (memref<2x3xf32>, index, index) -> f32
         %14 = "arith.addf"(%12, %13) : (f32, f32) -> f32
         "affine.store"(%14, %0, %arg15, %arg16) {map = affine_map<(d0, d1) -> (d0, d1)>} : (f32, memref<2x3xf32>, index, index) -> ()
         "affine.yield"() : () -> ()
       }) {lower_bound = affine_map<(d0) -> (d0)>, step = 1 : index, upper_bound = affine_map<(d0) -> (d0 + 1)>} : (index, index) -> ()
       "affine.yield"() : () -> ()
     }) {lower_bound = affine_map<(d0) -> (d0)>, step = 1 : index, upper_bound = affine_map<(d0) -> (d0 + 1)>} : (index, index) -> ()
     "gpu.terminator"() : () -> ()
   }) {operand_segment_sizes = array<i32: 0, 1, 1, 1, 1, 1, 1, 0>} : (index, index, index, index, index, index) -> ()
   "memref.copy"(%0, %arg2) : (memref<2x3xf32>, memref<2x3xf32>) -> ()
   "func.return"() : () -> ()
 }) {arg_attrs = [{tf_saved_model.index_path = ["b"]}, {tf_saved_model.index_path = ["a"]}, {tf_saved_model.index_path = ["c"]}], function_type = (memref<2x3xf32>, memref<2x3    xf32>, memref<2x3xf32>) -> (), sym_name = "serving_default", tf.entry_function = {control_outputs = "", inputs = "b:0,a:0", outputs = "Add:0"}, tf_saved_model.exported_names     = ["serving_default"]} : () -> ()
```
I am wondering whether additional settings are required before call convert-affine-for-to-gpu.
It would be very nice  if anyone could help me!
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzdWMmO4zYQ_Rr5QtiQqM0--NDLdGaABAiC5CxQEmUzkESFpHra-foUKWqxLdvtnpkASY_Hlri8elUsPi4pzw_bz8zBT4ghUiElDqzeIcVRyb9SoZ8LwStEioLVdFVwoet2TbsqSVtne90xbRXacYVIjYiUVCjJeI2cyHUwpkJw4fgPyMHxiAEviDfwoYLUOcpIXUP_lKJW0hxAEEE5q2htgFgOnbGGc58d96H7_kwFRUw3lKxqSooUlSojkmp6gjaC520GLRTYtv0AwHyqkomuqAAPVvoLOYELxF_B3SSnBWlL5eC1g0Midq5mX9FK0MLxn_Cb_1b42PE_ISd-VEUiySvNk4rntFyxOqdvSUPUHjn-M3LCRyCeavLhsxM_61h1mN43YpIZTHwVs3MYId3YNUhd0xUpS54ZZze6JSnZrobIK9PGw2ukYVkUgC10wcKAPUmSjpNvUFw9JlijDy1n2gZjW_-k7Uzr0LTuipOKNEAInMhd7cbSeG3fNL9-KH1dC_i3usH3I_LmOp_ymmEWfYRZ8C3MgnlmZqy9CZtVyUk-ZKBOJBPJMYUiyKmbgzwBxxfA3e8B3uUOEUztVyTPC-ONhcMGSPc97WjJSMVBHzSK7fGtlPRUm5Ycv0_fps92jmW8OXQkxtl6ya7Ogmt0BFWtqO3rYGsQt6lG7q1GFm1ZgrCTDLTV6DFo--6aLqJeEvDKwS-dwCYwBkcvK9Mea9nx4b_XpfQD-i6K3_uHX-CDlvrPPn_5DT23VYMeCkUFeuL1Kyw4D8bOCxe_859-_QO9EFZSnYzrrKtfdkSWQGSp-BKWLzNlDKIBt8-DWTwsDdpDq47wM0wyJ_yUpu7NReK25N8W8C6u5wIOzI41HL9HxsGcHYRE0p1ukkj2N5V2tglyAOPMN2RMvrqaghV_a8Do0bUkHYRHr1VmBsNASEVqdcTylZQttbJv-Om1bs5WVzFBx3eh4zvR_WN02aasRw6xHTDPWOmQOgC9heoeLuEGd7H27mQd_tCIR3eh-3eix1ciHtmIhx-I-PqHRnzzI9HxdJNtQ9GvZpuT3_i8_ESv0Kli-SOZQYGCmbJwpiyaKYtnytYzZZuZMs-dK_TmCvFc4ZwvnnFG__UpMhXRTqLc4_GDRW3MOm-E8u9NvA7du4J-tAn5ADqerqw94357YZbi0-E_SwBvOrInwblooo-K582aODcSXTPSxWnU8nEjOVg0K-c4qJO4eZGdYbBZvrjlfkK5d7rxtmXHy9qFlfnCgJzvPLUj_g1H3P-KI8FZ5hZjCgwL4HRaaBwoNj9XoPF0ez5CBsMm_V8IkKV6X5w6ob7oz4HRMp_I_om0z_Q2R3fjlLlnSVLewrb4npPjE5KKNmcrC5S3TXMX4tGhcgzU-0Px8UD8j8JgV2w4lVSsJmpUzZthGINw387cu_rlXnfjPQ8X6A7nDn2uHWbx9HA7cfrCPJs_51yyZ05j9uT7vqiOMQU-CVFKyOH-7EP3dh-6mHtfp2zsFJp-2l0FB-FEHRpqtfg9gdRpeF-M9fQ5VElNqt4OPrsHNXKpihUkpDgkPbeuefwIm14leJnwVjWtkj2K7cbqaWEKQ6bThHS_psVJv4c87yu7GJ4EkL41XCh41ZRlN_GGQM5QN2G9mionVydf9C34Vw7jZC6_v-6p2lOB9O5Nu01KJKlSUCVhTlIk6F8tEzRHKS30lVMGZ3F08dZhZW0osNCWuhOChgdUs4zCRrVApD7wGlBM7Z6WDQyig70F3XpRhGMvDuL1It_6-cbfkIViqqRb8P2Xn7_8pu-yrGErdWi8rR9v8xvW0FJX0hqs1PoSxdzYLFpRbvdKNVLv0sxtyA4W_zaFWV7BS1m-9j_LRvA_aQbxfWFStlTCQxhHQbjYb2mMKS0yP8JRnGahG7tpGEbBxks9bx17ZFGSlJZSkwbCC7bFLsbuRv8L43C9SouCZCQMfNcFHyl2ApdWhJUrbXjFxW4htoZD2u4kVJZMKjlWEinZrqa0xyet2nOxPfA2pfWBLgzfrSH7D6T_tEE">