<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/124928>124928</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[SPIR-V] Non-logical pointer generated following an ptrcast
</td>
</tr>
<tr>
<th>Labels</th>
<td>
SPIR-V
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
Keenuts
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Keenuts
</td>
</tr>
</table>
<pre>
Logical SPIR-V is not allowing pointer cast after an `OpAccessChain`.
Given this LLVM IR:
```llvm
define internal spir_func void @baz(ptr addrspace(10) %a, i64 %b) {
%index = getelementptr <4 x i32>, ptr addrspace(10) %a, i64 %b
%load = load <3 x i32>, ptr addrspace(10) %index, align 4
ret void
}
```
In OpenCL SPIR-V, the following instructions would be generated:
```
%index_1 = OpAccessChain %_ptr_Private_v4uint %a_1
%28 = OpBitcast %_ptr_Private_v3uint %index_1
%loadv_1 = OpLoad %v3uint %28 Aligned 4
```
This is not allowed in logical SPIR-V.
For this specific case, what we'd need is to load the initial `<4 x i32>`, then `OpCompositeExtract` and then `OpCompositeConstruct`.
If the types were of the same bit-size, we could to the `OpBitcast`, but on the value after the load.
For other types of cast, we might have to handle this differently (loading the initial member of a struct for ex).
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyMVE2P4zYM_TXKhUhgS87XwYdMZlMMmnYX22KvgWzRtgpFMiQ6mdlfX0hRNjPtHhYwYJkWH8nHR8oQdG8Ra7Z8Ypz_jmgnCoxztnyeyYkG5-tsnDVOvdVH1-tWGvjry8vX-TfQAawjkMa4q7Y9jE5bQg-tDASyi0dpga2Kz-OubTGE_SC1ZatiwYodK3a_6QtaoEEHOB6__QEvX5mIdrYqbo8xlzMrdgo7bRESuJUGwqj9qZtsCxenFbCqaOR3xjcjeZBK-TDKFhnflAXjW2B8KRnfg15V8dwk2_qJFTuI39oqfAUmnqFHQoNntBSBmNhX8ApacCY-Rf9fRC928W2cVAk0H_bi17BSNvGGNLq3UKUsPVKqNFKzfn5P0I3HFwufR7T7Y25M9KcBoXP3zmgbyE8taWcDXN1kFDQIPVr0klBl2j8CAzz4OZWpmA99jD9PI_nTF68vkvB0qSZtKTFyKjMPfJMdnzQlWfzPSdydcqBH5Ejd5UfkYyKSLx8OfAO7yBKqxNN_SPk7yuq9QlGBtmA-SDgL8eD8TYZhxFZ3uo0SxkjjdZAEV2R8rcBihAhA7tbVSLG2mrQ0UeQfBbMqchfyAOzdeXRBE356JS9bYqsCpFU_u7F3uVuPSXnpUjR6GzHAFT2Cu1mCPCM0muZBf78ljNCm_pJLFxJ0Jj8n1UwEzqa_F2kmzKMav2Ndi0yIoyFaU0jXpaHOAc66HwgGecEYZZBWGbzxp3TXoUdL5g0Y30S4KL_3TJ3x3KCPiBJuZULnPETVbxczVQu1FVs5w7pci025KsVWzIa6XXXrFqXcFrgpEde8UKKTbbVulRRiq2a65gVfFiXflpVYCbFYtpVQHeKmE8uiXK5ZVeBZarOIS2XhfD_TIUxYl7za8s3MyAZNyJvwPkZpEfo6esybqQ-sKowOFB4YpMmk_Zldls_wp7Pzu8ruG_HHpL2bSWnjGoi0ziZv6oFoDHEQ-YHxQ69pmJpF686MH9IavL3mo3f_YEuMH1L6gfFDruBS838DAAD__54T0rs">