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

    <tr>
        <th>Summary</th>
        <td>
            [DirectX] Validation Failure: Explicit gep 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>
          farzonl
      </td>
    </tr>
</table>

<pre>
    ```bash
clang-dxc DirectML/Product/Shaders/Generated/Cast_float16_native_accum16_uint8_packed32_256_Strided4D.hlsl -E CSMain -T cs_6_2  -enable-16bit-types  -O3 -D DXC_COMPILER=1 -D __SHADER_TARGET_MAJOR=6 -D __SHADER_TARGET_MINOR=2 -I DirectML/Product/Shaders/ -Fo Cast_float16_native_accum16_uint8_packed32_256_Strided4D.dat
lldb -- dxv validation/Cast_float16_native_accum16_uint8_packed32_256_Strided4D.dat
```
```gdb
(lldb) expr *(BasePtr->getType()->getScalarType())
(llvm::Type) $18 = {
  Context = 0x000000016fdfdce0
  IDAndSubclassData = 14
  NumContainedTys = 1
 ContainedTys = 0x000000015280e5b8
}
(lldb) expr *Ty
(llvm::Type) $19 = {
 Context = 0x000000016fdfdce0
  IDAndSubclassData = 2058
  NumContainedTys = 0
  ContainedTys = nullptr
}
```
## Validation Error
https://github.com/microsoft/DirectXShaderCompiler/blob/adffd31eb02f690d9d1afe86c7fa6f12b4e70aa1/lib/Bitcode/Reader/BitcodeReader.cpp#L3931

## Function failing to validate

```llvm
 Materializable
; Function Attrs: noinline nounwind
define void @CSMain() unnamed_addr #1 {
  %1 = alloca [4 x i32], align 4
  %2 = alloca [4 x i32], align 4
  %3 = alloca [4 x i32], align 4
  %4 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 0, i1 false) #2
  %5 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 0, i1 false) #2
  %6 = call i32 @dx.op.threadId.i32(i32 93, i32 0) #3
  %7 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 10) #2
  %8 = extractvalue %dx.types.CBufRet.i32 %7, 3
  %9 = add i32 %8, %6
  %10 = shl i32 %9, 2
  %11 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 10) #2
  %12 = extractvalue %dx.types.CBufRet.i32 %11, 2
  %13 = icmp ult i32 %10, %12
 br i1 %13, label %14, label %46

; <label>:14 ; preds = %0
  %15 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 1, i32 1, i1 false) #2
  %16 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 5) #2
  %17 = extractvalue %dx.types.CBufRet.i32 %16, 1
  %18 = extractvalue %dx.types.CBufRet.i32 %16, 2
  %19 = extractvalue %dx.types.CBufRet.i32 %16, 3
  %20 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 9) #2
  %21 = extractvalue %dx.types.CBufRet.i32 %20, 0
  %22 = extractvalue %dx.types.CBufRet.i32 %20, 1
  %23 = extractvalue %dx.types.CBufRet.i32 %20, 2
  %24 = extractvalue %dx.types.CBufRet.i32 %20, 3
  %25 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 1) #2
  %26 = extractvalue %dx.types.CBufRet.i32 %25, 0
  %27 = extractvalue %dx.types.CBufRet.i32 %25, 1
  %28 = extractvalue %dx.types.CBufRet.i32 %25, 2
  %29 = extractvalue %dx.types.CBufRet.i32 %25, 3
  %30 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 3) #2
  %31 = extractvalue %dx.types.CBufRet.i32 %30, 0
  %32 = extractvalue %dx.types.CBufRet.i32 %30, 1
  %33 = extractvalue %dx.types.CBufRet.i32 %30, 2
  %34 = extractvalue %dx.types.CBufRet.i32 %30, 3
  %35 = call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32(i32 139, %dx.types.Handle %15, i32 %9, i32 0, i8 1, i32 4)
  %36 = extractvalue %dx.types.ResRet.i32 %35, 0
  %37 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 10) #2
  %38 = extractvalue %dx.types.CBufRet.i32 %37, 1
 ; No predecessors!
 ; No predecessors!
 ; No predecessors!
                                                  ; No predecessors!
                                                  ; No predecessors!
                                                  ; No predecessors!
                                                  ; No predecessors!

; <label>:46                                      ; preds = %0
}
```

## Basic Block failing to validate
```llvm
(lldb) expr getLastInstruction->CurBB->dump()

; <label>:14 ; preds = %0
  %15 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 1, i32 1, i1 false) #2
  %16 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 5) #2
  %17 = extractvalue %dx.types.CBufRet.i32 %16, 1
  %18 = extractvalue %dx.types.CBufRet.i32 %16, 2
  %19 = extractvalue %dx.types.CBufRet.i32 %16, 3
  %20 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 9) #2
  %21 = extractvalue %dx.types.CBufRet.i32 %20, 0
  %22 = extractvalue %dx.types.CBufRet.i32 %20, 1
  %23 = extractvalue %dx.types.CBufRet.i32 %20, 2
  %24 = extractvalue %dx.types.CBufRet.i32 %20, 3
  %25 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 1) #2
  %26 = extractvalue %dx.types.CBufRet.i32 %25, 0
  %27 = extractvalue %dx.types.CBufRet.i32 %25, 1
  %28 = extractvalue %dx.types.CBufRet.i32 %25, 2
  %29 = extractvalue %dx.types.CBufRet.i32 %25, 3
  %30 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 3) #2
  %31 = extractvalue %dx.types.CBufRet.i32 %30, 0
  %32 = extractvalue %dx.types.CBufRet.i32 %30, 1
  %33 = extractvalue %dx.types.CBufRet.i32 %30, 2
  %34 = extractvalue %dx.types.CBufRet.i32 %30, 3
  %35 = call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32(i32 139, %dx.types.Handle %15, i32 %9, i32 0, i8 1, i32 4)
  %36 = extractvalue %dx.types.ResRet.i32 %35, 0
  %37 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %5, i32 10) #2
  %38 = extractvalue %dx.types.CBufRet.i32 %37, 1
```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWctu2zwWfhp6Q8jgRZKthRe-_s0gaYskGHRnUCRlc0qLAkmlTp9-QMmW7VzaUTrTYvDHMGDp8Ny-w4_UocWcU5tSyglIZiBZDFjtt8ZOCma_m1IPciMeJyBF7TdnbgvQlGtWbiKx53ChrOT-5hqQ1WdrRM09IKu7LRPSOkBWf8lSWualAGQ1Z86vC22Yx-m6ZF49yDXjvN7hdF2r0o_XFeNfpaBkTZJ0feetElLEi-FWOw2jJZzf3TBVwugecrdO1wTCSJYs1zLCaa585B8r6SCMPlEYLeDiy3w9_3Tz-ep6eQvoAgfZen33YbpY3q7vp7d_Le_XN9N_fAqD6YuDVx-bQQKjq5_hhNHKwDcDFMwDNNVa5DCKoNg_wAemlWBemfJXCtf67Sbv_Hoj8nBLxiEqIBmU-8pCQIJoxpz87G0E6HIj_f1jJQEZA5IdBHecaWZP4vA9uHrYAToFdNoOZhCQGI8hoAsIRjOAphDOTenl3jcytEftB6eFKASXqFG5WkxLcVfnXDPnFsyzRhnHzeDHehdcMFVKcf_o2qEw8kx68p6QMZJJPg5ZjhYvw75__BGG7BzDmyEQlIxfBYG68lyIy1rryttT6ueTSSggFP6z4wpcWmuC7tb7ygUYZAXIaqP8ts6H3OwAWe0Ut8aZIvC3JfWXlsZzs6uUlhaQVa5NDsiKiaIQFMsckSLNkMgEZoUcp3xUsLTAJI_lCDGGAVlpFQxmynMjJCCrWxlcnkTt_ZBXFSD0mmY0zNkJwqoueQOgYEqrcgO9OS4BeVA84m4mCE3hDfPSKqbV97ADBA06O_mZem9DAWBpVKlVKWFp6vKbKgVAUyGLIHkwSkAQo3ZbabkM67JkOynWTIjAC4o75gKS4GZKmNaGMwiSWQz3UFECkgUgc8i02pQwPiqTPsq0j3LcKHOmdbgT-2Gz8Q0_sFJoGRCJ_dBUQ24l87KVAjJWlMBkFNypMcTNLyUQXV5gWDDtDryn5Bgx-fWIpF_E9BQx6HYh_NZKJq7EMFSnDZHRM4-NF3r0Mno57_msLm6lH1545nldFNJeGyau5Ybxx7MQSRZCvASdJMkxOkZPQbRbn9x7y7h_YLqWr6dB2kp1qbdbDhMCHobHhxTSjo2oUXFbfVRpsuyiY_xn0WPSCz7Gl9m3S0LxXQVr7Y8QMTrkghvN3AYGNepBrlkuG7A4vriN08MuQmcQ0HkjB3QJ6BSHxTSDlZWi3XABSVCXw3-B991Ke3LxCu9x-jsnLXkWftRvztLgCXfW_QjfWp9iZ2-w7tYLQb-zcNnTwhHcK3nS0LgjGum3VFrrruyEvsH6lHn8ButT2V9ZIv-jTeZZ2dN-ySeXZe_H9tb6VPZ-bG-tT5n3Y3tr3ZWd_la206dlp_3YTi_ZTvuxnV6ynfZjO71kO-3HdnrJdvoK22-le1Z1y77NurqfVRzTH5QcdzU_Ps5PndLZsyRuz1xtTj9ZAue5BQSXU_GHOyTabw3RUUeF8NT-aJoHt-TSORPO4W8e6f35-7p6sY2K0__c67Ne64WTbXcynDGnOJxpw7--djh8cjJ8erjfSH_NnL8qnbd1czqMAF3OazubhQtR76rD_xjvLeJ7i_jeIr63iO8t4nuL-N4i_t-3iOcNxUBMqMhoxgZygkfxKCEUZWiwnWQxpwkjNEkKXEicYcwZT4p0hMYFRowM1IQgkqAEjwhFcYKGdFzksSCjOEnGKBtzECO5Y0oPQ_8xNHYzUM7VcoJjFONk0DQSrnm5Rkgpv8FmFBACksXAToJRlNcbB2KklfPu5MYrr5u3coe_6UGyOP-vf8WUrq0EdAqX-0orrjzcyAqGqkBhpIOl8XDHPN_CyqjSS9mOmeJwb6GppGWlGNRWT37wzqDprNqfqLLmX7J5-9UAcYCsDkgfJuTfAQAA__8hv_xw">