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

    <tr>
        <th>Summary</th>
        <td>
            [AMDGPU] [NVPTX] Infer Address Spaces pass leaving behind GEP with no operands
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    This crash was found using an IR fuzzer. It looks like Infer Address Spaces only runs under the AMDGPU and NVPTX backends. The only way I've been able to reproduce this was with a byval struct argument in a function that gets inlined. The inlined function is reading the second field of the struct in this case.

```
%struct = type { i64, i64 }

define i64 @bar(ptr byval(%struct) %a) alwaysinline {
  %1 = getelementptr %struct, ptr %a, i64 0, i32 1
  %2 = load i64, ptr %1, align 4
  ret i64 0
}

define i64 @foo(%struct* %arg) {
  %1 = call i64 @bar(%struct* byval(%struct) align 8 %arg)
  ret i64 0
}
```

Compiler Explorer: https://godbolt.org/z/9zW6nnffT

Here's the IR dump before and after the pass:
```
*** IR Dump After Infer address spaces (infer-address-spaces) ***
; Function Attrs: alwaysinline
define i64 @bar(ptr byval(%struct) %a) #0 {
  %1 = getelementptr %struct, ptr %a, i64 0, i32 1
  %2 = load i64, ptr %1, align 4
  ret i64 0
}
*** IR Dump After Infer address spaces (infer-address-spaces) ***
define i64 @foo(ptr %arg) #1 {
  %arg1 = alloca %struct, align 8, addrspace(5)
 call void @llvm.lifetime.start.p5(i64 16, ptr addrspace(5) %arg1)
  call void @llvm.memcpy.p5.p0.i64(ptr addrspace(5) align 1 %arg1, ptr align 1 %arg, i64 16, i1 false)
  %1 = getelementptr
  %2 = load i64, ptr addrspace(5) %1, align 4
  call void @llvm.lifetime.end.p5(i64 16, ptr addrspace(5) %arg1)
  ret i64 0
}
```

Notice how %1 turned into an empty GEP. This will cause an ICE when later passes assume GEP operands.


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVl9vo7gX_TTOy1URmBDIQx7SpplfH36jaqb759XgC3hrbGSbZNNPv7JNpkk3mtHuaqWVomAM99xzD-faZtaKTiFuSHFPit2CTa7XZvPVseZ1p6da4l7q46LW_LR56YWFxjDbw5FZaPWkOExWqA6Ygqcv0E5vb2gSeHIgtX61IMUrwpNq0cCWc4PWwteRNWhBK3kCMykLk-JowPUI2__vPj3_BExx-Pzz88uvULPmFRW3Cbz0GEOO7ARPhJYHhBpRAaslgtNgcDSaTw2C8yw9v6NwPTCoTwcmwTozNQ6Y6aYBlQOhgEE7qcYJrcD1zEGHzoJQUijkMeN88_6esGCQcV-xJ2yx0YpDK1By0G2ci4mEikQaZjEh6Y6k2_l_lc6_eEuLOYLkO3CnEYGU9yBWS0If_AVIubuM59gKhfHJMq2ZIbQanYllElp9AyR0DYQWzF-ZPLKTjeV4_AgF_nkWEnfoUKJXxmNdYDzAPMHOfNIwyClkFyg0oEjN-Jn6HJb5MZOiU7A8v2_QzUixru8V2Gp9XdQ2kDFdKO9GJQ2T8lqdq-CbMkV-1TvyD5l--Ijh_0EPo5Bo4PH3UWqDhuRb6J0bLcm3hO4J3Xea11q6RPss-zdC9-u3X1ZKte3LJdL_0CChpQ2GevoCfBpGqLHVBkN3sNbNLTMyG9BvW2v-eYidh9iGuNiPbO5HG_uR0Er4-bt5_i7ORxOdoSJsfg_7c0NsnTOewJXD_oFRCc3T_7BB_x1Fbzn-XNRsdJpnH2RhpovKMCl1w64lmQ0dhpybkJnQqni3dmiTgxbcp5TyMCRStOjEgIl1zLhkLHwBqyVkq7NaH6HONC4a5s-wAw7NeErGIhnTJEhf3cSKlLN3zDnn1fT5E0dOIoOWSYsX-W_75Yc-uFXZLWN8RzVU_G9q9pcWmc_aiQah18dYq5uM36GEctpvwjiM7gSfHp_9Bub3QSElNGyyGLboh0c49qhAMm9bv3igBWbtNKAPAj2iYX7DvUy54Jucr_M1W-AmK7N1sS4yWi76Td3wZV3Web1cpVmORd0W1aquaJmWWbNerRZiQ1O6TFe0ysqsWuZJs6x5kdfYVDTjZdGQZYoDEzIJWmrTLYS1E27WZVqtFpLVKG04mVCq8AjhIaHUH1TMxsfc1VNn_bcQ1tl3FCecDEeaeKQgxQ5IcR8OFX5880Ti1QCJ7OB39xp7oXjQJBwjlP6mzWIycvNhWReun-qk0QOhe09ivtyNRv-GviX3gbr1C34o7bChfwQAAP__y1_SXg">