Skip to content

Commit 1dda593

Browse files
committed
[DirectX] Set Shader Flag DisableOptimizations.
Disabling optimizations using the option -Od to clang-dxc results in generation of named metadata "dx.disable_optimizations". - Detect metadata "dx.disable_optimizations" as part of Metadata Analysis pass and set a new bool field ModuleMetadatainfo::DisableOptimization accordingly. - Add DXILMetadataAnalysis as required pass for the pass ShaderFlags that sets shader flags mask. - Set shader flag DisableOptimization based on the value of ModuleMetadatainfo::DisableOptimization. Updated llc-pipeline.ll to reflect changes in output resulting from addition of Metadata Analysis pass as required by ShaderFlags pass.
1 parent 7ad8a3d commit 1dda593

File tree

6 files changed

+58
-5
lines changed

6 files changed

+58
-5
lines changed

llvm/include/llvm/Analysis/DXILMetadataAnalysis.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ struct ModuleMetadataInfo {
3737
Triple::EnvironmentType ShaderProfile{Triple::UnknownEnvironment};
3838
VersionTuple ValidatorVersion{};
3939
SmallVector<EntryProperties> EntryPropertyVec{};
40+
bool DisableOptimizations{false};
4041
void print(raw_ostream &OS) const;
4142
};
4243

llvm/lib/Analysis/DXILMetadataAnalysis.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,22 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
6868
}
6969
MMDAI.EntryPropertyVec.push_back(EFP);
7070
}
71+
72+
// Set shader flags based on Module properties
73+
SmallVector<llvm::Module::ModuleFlagEntry> FlagEntries;
74+
M.getModuleFlagsMetadata(FlagEntries);
75+
for (const auto &Flag : FlagEntries) {
76+
if (Flag.Behavior != Module::ModFlagBehavior::Override)
77+
continue;
78+
if (Flag.Key->getString().compare("dx.disable_optimizations") == 0) {
79+
const auto *V = mdconst::extract<llvm::ConstantInt>(Flag.Val);
80+
if (V->isOne()) {
81+
MMDAI.DisableOptimizations = true;
82+
break;
83+
}
84+
}
85+
}
86+
7187
return MMDAI;
7288
}
7389

llvm/lib/Target/DirectX/DXILShaderFlags.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
9696
}
9797

9898
/// Construct ModuleShaderFlags for module Module M
99-
void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM) {
99+
void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM,
100+
const ModuleMetadataInfo &MMDI) {
100101
CallGraph CG(M);
101102

102103
// Compute Shader Flags Mask for all functions using post-order visit of SCC
@@ -142,6 +143,9 @@ void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM) {
142143
// Merge SCCSF with that of F
143144
FunctionFlags[F].merge(SCCSF);
144145
}
146+
147+
// Set shader flags based on Module properties based on module metadata
148+
CombinedSFMask.DisableOptimizations = MMDI.DisableOptimizations;
145149
}
146150

147151
void ComputedShaderFlags::print(raw_ostream &OS) const {
@@ -180,9 +184,10 @@ AnalysisKey ShaderFlagsAnalysis::Key;
180184
ModuleShaderFlags ShaderFlagsAnalysis::run(Module &M,
181185
ModuleAnalysisManager &AM) {
182186
DXILResourceTypeMap &DRTM = AM.getResult<DXILResourceTypeAnalysis>(M);
187+
const ModuleMetadataInfo MMDI = AM.getResult<DXILMetadataAnalysis>(M);
183188

184189
ModuleShaderFlags MSFI;
185-
MSFI.initialize(M, DRTM);
190+
MSFI.initialize(M, DRTM, MMDI);
186191

187192
return MSFI;
188193
}
@@ -212,20 +217,24 @@ PreservedAnalyses ShaderFlagsAnalysisPrinter::run(Module &M,
212217
bool ShaderFlagsAnalysisWrapper::runOnModule(Module &M) {
213218
DXILResourceTypeMap &DRTM =
214219
getAnalysis<DXILResourceTypeWrapperPass>().getResourceTypeMap();
220+
const ModuleMetadataInfo MMDI =
221+
getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
215222

216-
MSFI.initialize(M, DRTM);
223+
MSFI.initialize(M, DRTM, MMDI);
217224
return false;
218225
}
219226

220227
void ShaderFlagsAnalysisWrapper::getAnalysisUsage(AnalysisUsage &AU) const {
221228
AU.setPreservesAll();
222229
AU.addRequiredTransitive<DXILResourceTypeWrapperPass>();
230+
AU.addRequired<DXILMetadataAnalysisWrapperPass>();
223231
}
224232

225233
char ShaderFlagsAnalysisWrapper::ID = 0;
226234

227235
INITIALIZE_PASS_BEGIN(ShaderFlagsAnalysisWrapper, "dx-shader-flag-analysis",
228236
"DXIL Shader Flag Analysis", true, true)
229237
INITIALIZE_PASS_DEPENDENCY(DXILResourceTypeWrapperPass)
238+
INITIALIZE_PASS_DEPENDENCY(DXILMetadataAnalysisWrapperPass)
230239
INITIALIZE_PASS_END(ShaderFlagsAnalysisWrapper, "dx-shader-flag-analysis",
231240
"DXIL Shader Flag Analysis", true, true)

llvm/lib/Target/DirectX/DXILShaderFlags.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#ifndef LLVM_TARGET_DIRECTX_DXILSHADERFLAGS_H
1515
#define LLVM_TARGET_DIRECTX_DXILSHADERFLAGS_H
1616

17+
#include "llvm/Analysis/DXILMetadataAnalysis.h"
1718
#include "llvm/IR/Function.h"
1819
#include "llvm/IR/PassManager.h"
1920
#include "llvm/Pass.h"
@@ -83,7 +84,8 @@ struct ComputedShaderFlags {
8384
};
8485

8586
struct ModuleShaderFlags {
86-
void initialize(Module &, DXILResourceTypeMap &DRTM);
87+
void initialize(Module &, DXILResourceTypeMap &DRTM,
88+
const ModuleMetadataInfo &MMDI);
8789
const ComputedShaderFlags &getFunctionFlags(const Function *) const;
8890
const ComputedShaderFlags &getCombinedFlags() const { return CombinedSFMask; }
8991

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
2+
3+
target triple = "dxilv1.6-unknown-shadermodel6.6-library"
4+
5+
; CHECK: ; Combined Shader Flags for Module
6+
; CHECK-NEXT: ; Shader Flags Value: 0x00000001
7+
8+
; CHECK: ; Note: extra DXIL module flags:
9+
; CHECK-NEXT: ; D3D11_1_SB_GLOBAL_FLAG_SKIP_OPTIMIZATION
10+
11+
; CHECK: ; Shader Flags for Module Functions
12+
13+
target triple = "dxilv1.6-unknown-shadermodel6.6-library"
14+
15+
; CHECK: ; Function main : 0x00000000
16+
define void @main() {
17+
entry:
18+
ret void
19+
}
20+
21+
!llvm.module.flags = !{!0}
22+
23+
!0 = !{i32 4, !"dx.disable_optimizations", i32 1}
24+
25+

llvm/test/CodeGen/DirectX/llc-pipeline.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
; CHECK-NEXT: Scalarize vector operations
2424
; CHECK-NEXT: DXIL Resource Binding Analysis
2525
; CHECK-NEXT: DXIL resource Information
26-
; CHECK-NEXT: DXIL Shader Flag Analysis
2726
; CHECK-NEXT: DXIL Module Metadata analysis
27+
; CHECK-NEXT: DXIL Shader Flag Analysis
2828
; CHECK-NEXT: DXIL Translate Metadata
2929
; CHECK-NEXT: DXIL Op Lowering
3030
; CHECK-NEXT: DXIL Prepare Module

0 commit comments

Comments
 (0)