Skip to content

[DirectX] Validation Failure: Explicit gep type does not match pointee type of pointer operand #140415

Open
@farzonl

Description

@farzonl
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
(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

 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

(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

Metadata

Metadata

Assignees

Type

Projects

Status

Planning

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions