Skip to content

Commit 4ae2678

Browse files
authored
[DirectX] Add support for vector type checking in DXIL Shader Flag Analysis (#150532)
Fixes #150482 by replacing all `Instruction.getType()` in DXILShaderFlags.cpp with `Instruction.getType()->getScalarType()` to account for vectors types as suggested by @bogner
1 parent df5b483 commit 4ae2678

File tree

4 files changed

+125
-7
lines changed

4 files changed

+125
-7
lines changed

llvm/lib/Target/DirectX/DXILShaderFlags.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,11 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
106106
DXILResourceTypeMap &DRTM,
107107
const ModuleMetadataInfo &MMDI) {
108108
if (!CSF.Doubles)
109-
CSF.Doubles = I.getType()->isDoubleTy();
109+
CSF.Doubles = I.getType()->getScalarType()->isDoubleTy();
110110

111111
if (!CSF.Doubles) {
112112
for (const Value *Op : I.operands()) {
113-
if (Op->getType()->isDoubleTy()) {
113+
if (Op->getType()->getScalarType()->isDoubleTy()) {
114114
CSF.Doubles = true;
115115
break;
116116
}
@@ -130,12 +130,13 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
130130
}
131131

132132
if (!CSF.LowPrecisionPresent)
133-
CSF.LowPrecisionPresent =
134-
I.getType()->isIntegerTy(16) || I.getType()->isHalfTy();
133+
CSF.LowPrecisionPresent = I.getType()->getScalarType()->isIntegerTy(16) ||
134+
I.getType()->getScalarType()->isHalfTy();
135135

136136
if (!CSF.LowPrecisionPresent) {
137137
for (const Value *Op : I.operands()) {
138-
if (Op->getType()->isIntegerTy(16) || Op->getType()->isHalfTy()) {
138+
if (Op->getType()->getScalarType()->isIntegerTy(16) ||
139+
Op->getType()->getScalarType()->isHalfTy()) {
139140
CSF.LowPrecisionPresent = true;
140141
break;
141142
}
@@ -150,11 +151,11 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
150151
}
151152

152153
if (!CSF.Int64Ops)
153-
CSF.Int64Ops = I.getType()->isIntegerTy(64);
154+
CSF.Int64Ops = I.getType()->getScalarType()->isIntegerTy(64);
154155

155156
if (!CSF.Int64Ops && !isa<LifetimeIntrinsic>(&I)) {
156157
for (const Value *Op : I.operands()) {
157-
if (Op->getType()->isIntegerTy(64)) {
158+
if (Op->getType()->getScalarType()->isIntegerTy(64)) {
158159
CSF.Int64Ops = true;
159160
break;
160161
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
2+
; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
3+
4+
target triple = "dxil-pc-shadermodel6.7-library"
5+
6+
; CHECK: ; Combined Shader Flags for Module
7+
; CHECK-NEXT: ; Shader Flags Value: 0x00000014
8+
; CHECK-NEXT: ;
9+
; CHECK-NEXT: ; Note: shader requires additional functionality:
10+
; CHECK-NEXT: ; Double-precision floating point
11+
; CHECK-NEXT: ; Note: extra DXIL module flags:
12+
; CHECK-NEXT: ; Raw and structured buffers
13+
; CHECK-NEXT: ;
14+
; CHECK-NEXT: ; Shader Flags for Module Functions
15+
16+
; CHECK: Function rawbuf : 0x00000014
17+
define void @rawbuf() "hlsl.export" {
18+
%rb = tail call target("dx.RawBuffer", <4 x double>, 0, 0)
19+
@llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f16_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null)
20+
%load = call { <4 x double>, i1 }
21+
@llvm.dx.resource.load.rawbuffer.v4double.tdx.RawBuffer_v4f16_0_0t(target("dx.RawBuffer", <4 x double>, 0, 0) %rb, i32 0, i32 0)
22+
%extract = extractvalue { <4 x double>, i1 } %load, 0
23+
ret void
24+
}
25+
26+
; Metadata to avoid adding flags not currently of interest to this test
27+
!dx.valver = !{!0}
28+
!0 = !{i32 1, i32 8}
29+
!llvm.module.flags = !{!1}
30+
!1 = !{i32 1, !"dx.resmayalias", i32 1}
31+
32+
; DXC: - Name: SFI0
33+
; DXC-NEXT: Size: 8
34+
; DXC-NEXT: Flags:
35+
; DXC-NEXT: Doubles: true
36+
; DXC: ...
37+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
2+
; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
3+
4+
target triple = "dxil-pc-shadermodel6.7-library"
5+
6+
; CHECK: ; Combined Shader Flags for Module
7+
; CHECK-NEXT: ; Shader Flags Value: 0x00100010
8+
; CHECK-NEXT: ;
9+
; CHECK-NEXT: ; Note: shader requires additional functionality:
10+
; CHECK-NEXT: ; 64-Bit integer
11+
; CHECK-NEXT: ; Note: extra DXIL module flags:
12+
; CHECK-NEXT: ; Raw and structured buffers
13+
; CHECK-NEXT: ;
14+
; CHECK-NEXT: ; Shader Flags for Module Functions
15+
16+
; CHECK: Function rawbuf : 0x00100010
17+
define void @rawbuf() "hlsl.export" {
18+
%rb = tail call target("dx.RawBuffer", <4 x i64>, 0, 0)
19+
@llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f16_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null)
20+
%load = call { <4 x i64>, i1 }
21+
@llvm.dx.resource.load.rawbuffer.v4i64.tdx.RawBuffer_v4f16_0_0t(target("dx.RawBuffer", <4 x i64>, 0, 0) %rb, i32 0, i32 0)
22+
%extract = extractvalue { <4 x i64>, i1 } %load, 0
23+
ret void
24+
}
25+
26+
; Metadata to avoid adding flags not currently of interest to this test
27+
!dx.valver = !{!0}
28+
!0 = !{i32 1, i32 8}
29+
!llvm.module.flags = !{!1}
30+
!1 = !{i32 1, !"dx.resmayalias", i32 1}
31+
32+
; DXC: - Name: SFI0
33+
; DXC-NEXT: Size: 8
34+
; DXC-NEXT: Flags:
35+
; DXC: Int64Ops: true
36+
; DXC: ...
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
2+
; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
3+
4+
target triple = "dxil-pc-shadermodel6.7-library"
5+
6+
; CHECK: ; Combined Shader Flags for Module
7+
; CHECK-NEXT: ; Shader Flags Value: 0x00800030
8+
; CHECK-NEXT: ;
9+
; CHECK-NEXT: ; Note: shader requires additional functionality:
10+
; CHECK-NEXT: ; Native low-precision data types
11+
; CHECK-NEXT: ; Note: extra DXIL module flags:
12+
; CHECK-NEXT: ; Raw and structured buffers
13+
; CHECK-NEXT: ; Low-precision data types present
14+
; CHECK-NEXT: ; Enable native low-precision data types
15+
; CHECK-NEXT: ;
16+
; CHECK-NEXT: ; Shader Flags for Module Functions
17+
18+
; CHECK: Function rawbuf : 0x00800030
19+
define void @rawbuf() "hlsl.export" {
20+
%halfrb = tail call target("dx.RawBuffer", <4 x half>, 0, 0)
21+
@llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f16_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null)
22+
%i16rb = tail call target("dx.RawBuffer", <4 x i16>, 1, 0)
23+
@llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4i16_1_0t(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null)
24+
%loadhalfrb = call { <4 x i16>, i1 }
25+
@llvm.dx.resource.load.rawbuffer.v4i16.tdx.RawBuffer_v4f16_0_0t(target("dx.RawBuffer", <4 x half>, 0, 0) %halfrb, i32 0, i32 0)
26+
%extracti16vec = extractvalue { <4 x i16>, i1 } %loadhalfrb, 0
27+
call void @llvm.dx.resource.store.rawbuffer.tdx.RawBuffer_v4i16_1_0t.v4i16(target("dx.RawBuffer", <4 x i16>, 1, 0) %i16rb, i32 0, i32 0, <4 x i16> %extracti16vec)
28+
ret void
29+
}
30+
31+
; Metadata to avoid adding flags not currently of interest to this test, and
32+
; enable native low precision data types
33+
!dx.valver = !{!0}
34+
!0 = !{i32 1, i32 8}
35+
!llvm.module.flags = !{!1, !2}
36+
!1 = !{i32 1, !"dx.nativelowprec", i32 1}
37+
!2 = !{i32 1, !"dx.resmayalias", i32 1}
38+
39+
; DXC: - Name: SFI0
40+
; DXC-NEXT: Size: 8
41+
; DXC-NEXT: Flags:
42+
; DXC: MinimumPrecision: false
43+
; DXC: NativeLowPrecision: true
44+
; DXC: ...

0 commit comments

Comments
 (0)