<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/148089>148089</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[DirectX] GEPs from memset and memcpy legalization fail to validate due to `Explicit load/store type does not match pointee type of pointer operand`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Icohedron
</td>
</tr>
</table>
<pre>
After fixing #147114 I noticed there were still instances of the `Explicit load/store type does not match pointee type of pointer operand` validation error.
There are up to 78 DML shaders failing to validate due to GEPs introduced by memset and memcpy legalization in `DXILLegalizePass.cpp`
Example affected DML shader: `Cast_float16_native_accum16_uint8_packed32_256_Strided4D.dat`
Sample shader reproducing the issue: https://godbolt.org/z/68T5fWvfG
```hlsl
RWStructuredBuffer<uint32_t> output;
[numthreads(1, 1, 1)]
void CSMain(uint3 dtid : SV_DispatchThreadId) {
uint32_t bar = 0;
for (uint i = 0; i < 2; i++) {
bool baz = false;
uint foo[] = {0, 0, 0};
for (uint j = dtid.x; j; j--)
baz = baz || foo[j];
if (baz)
bar = i;
}
output[0] = bar;
}
```
`-mllvm -stop-before=dxil-legalize`
```llvm
%1 = alloca [3 x i32], align 4, !DIAssignID !55
...
call void @llvm.memset.p0.i32(ptr noundef nonnull align 4 dereferenceable(12) %1, i8 0, i32 12, i1 false), !dbg !104, !DIAssignID !101
```
`-mllvm -stop-after=dxil-legalize`
```llvm
%1 = alloca [3 x i32], align 4, !DIAssignID !55
...
%5 = getelementptr i32, ptr %1, i32 0, !dbg !104
store i32 0, ptr %5, align 4, !dbg !104
%6 = getelementptr i32, ptr %1, i32 1, !dbg !104
store i32 0, ptr %6, align 4, !dbg !104
%7 = getelementptr i32, ptr %1, i32 2, !dbg !104
store i32 0, ptr %7, align 4, !dbg !104
```
Validation error
```
Explicit gep type does not match pointee type of pointer operand
Validation failed.
```
The issue is that the GEPs use a scalar (i32) type to index an array-typed ([3 x i32]) pointer operand.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEVl2P2yoT_jXkZhQL4_gjF7nIx6ZaqZWqd1dt7yJsxgn7YrAAb7P764_ATtqmK3XP0ZFOFAE2M88zM4xn4M7Jo0ZckXxD8t2MD_5k7Oq-MScU1uhZbcTLat16tNDKs9RHICxLF2WaLuAetPGyQQH-hBbhexicl0qB1M5z3aAD04ZdIAW9O_dKNtKDMlwQtnfeWAT_0iMIgy6AQcd9c4LeSO1x2jPt9GzB9Gi5FqSg8MyVFNxLowGtNTYhdE3o-jEawi3C0IM3UFaw-_QR3IkLtA5aLlXwwZsLAIIYMDx_uPvsQGpvjRiCS_ULdNg59MC1CMumfwGFR67k68grdfBq9-3-48fxNX7mziVN35OCjubcnXnXKwTetth4FD8ZQ7J1UN9y5w-tMtynxUFzL5_xwJtm6NLiMEjtq0PPm_-jyNiB5cXhwVspUCx2ieD-SvMwsozAYLGPTkRHTwjSuQED3cn73pFsTdiesP3RiNoonxh7JGz_Sti-qB7z9utz-yGgFnT8n5RThK7_9_XB26Hxg0WxGdo2OLANBmbs4El2B2bw_eBJtgnK-UYPnT9Z5MIRVqWEbeEyLEm-I3T9bKSA7cMnLjVhVUQC4aWAYOnDl8NOuj4kw2NEuReELYGUAR3gwgs1t0CyHdCRF6A1FiY4kNetuNwCi0vCNvH_Aw6gNkZBzV-jRsuVwwvgSAatMeMXEiVIuaHBm2kodz-kfzbgKQoHp5JzoH6Kw3weYkDXV744l1tSbieapxChK6JsA2DNXye1-Ls4Li9ywYgwT8eQb-jF2Jrb6VSiyPVgx9QhBZ13Sj13MHfe9PMaW2ORZDtxlmo-5TtO4hfVID-ysjyNJFwp03Ag-SaDM8iMBRfYFriSRw2LsCQs3d2vY72534WnPI8YSZLEueFKQcwKsogMyfj9JT1NAiCrem9Bm0ELbEEbrQelLgQg0GKLFnWDvFYYko7FM2Z5TDxZjaclMwZhZwsynU6aLSfzRB2qW5rSt-1Nafrn-PFQKv-L8BGW5xHriB4Vdqh9iFeM3BbC8hqKjI2x-NVluoaxIl_3J6X8d0t-VQtCxfu507dB3iYv3kNevp-c_R3y8g_kN7nw5aYn3Uhc-98R-3_U9n5hCK0MRfK7FY-Xkg_SgT9xH5tAbG-DQ-DgGq54rFIxRsuRzxuQWuAZuAZuLX-Zh9ciiN2k5fLWsGQmVplYZks-w1Va5ixdpmVFZ6dVyauCVXlR11WzrNK8bvKiLdtUpGLRNuViJleMspyWKWVZXjCasLIqymaxKChiVqYlWVDsuFRJrAjGHmfRt1W6qGi1nCleo3Lx9sKYxu9Ts2PB0pldBaV5PRxdKCnSefcDxkuv4rVnJy02_lsolzFIrTXdn1p_CP5bl4h_-ZYzG6xa3XRt6U9DnTSmI2wfC8k4zXtrnrDxhO1jCBxh-ylGzyv2VwAAAP__Vq_zmQ">