Issue 148089
Summary [DirectX] GEPs from memset and memcpy legalization fail to validate due to `Explicit load/store type does not match pointee type of pointer operand`
Labels new issue
Assignees
Reporter Icohedron
    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.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to