1212// ===----------------------------------------------------------------------===//
1313
1414#include " DXILShaderFlags.h"
15+ #include " DXILResourceAnalysis.h"
1516#include " DirectX.h"
1617#include " llvm/ADT/SCCIterator.h"
1718#include " llvm/ADT/SmallVector.h"
@@ -74,6 +75,7 @@ static bool checkWaveOps(Intrinsic::ID IID) {
7475// / \param I Instruction to check.
7576void ModuleShaderFlags::updateFunctionFlags (ComputedShaderFlags &CSF,
7677 const Instruction &I,
78+ const ModuleMetadataInfo &MMDI,
7779 DXILResourceTypeMap &DRTM) {
7880 if (!CSF.Doubles )
7981 CSF.Doubles = I.getType ()->isDoubleTy ();
@@ -117,6 +119,11 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
117119 default :
118120 break ;
119121 case Intrinsic::dx_resource_handlefrombinding:
122+ if (!ResMayAlias && !CSF.ResMayNotAlias &&
123+ MMDI.DXILVersion > VersionTuple (1 , 7 ) &&
124+ DRTM[cast<TargetExtType>(II->getType ())].isUAV ()) {
125+ CSF.ResMayNotAlias = true ;
126+ }
120127 switch (DRTM[cast<TargetExtType>(II->getType ())].getResourceKind ()) {
121128 case dxil::ResourceKind::StructuredBuffer:
122129 case dxil::ResourceKind::RawBuffer:
@@ -151,7 +158,14 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
151158
152159// / Construct ModuleShaderFlags for module Module M
153160void ModuleShaderFlags::initialize (Module &M, DXILResourceTypeMap &DRTM,
154- const ModuleMetadataInfo &MMDI) {
161+ const ModuleMetadataInfo &MMDI,
162+ const dxil::Resources &MDR) {
163+
164+ if (mdconst::extract_or_null<ConstantInt>(
165+ M.getModuleFlag (" dx.resmayalias" ))) {
166+ ResMayAlias = true ;
167+ }
168+
155169 CallGraph CG (M);
156170
157171 // Compute Shader Flags Mask for all functions using post-order visit of SCC
@@ -176,10 +190,15 @@ void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM,
176190 continue ;
177191 }
178192
193+ if (!ResMayAlias && !SCCSF.ResMayNotAlias &&
194+ MMDI.DXILVersion <= VersionTuple (1 , 7 )) {
195+ SCCSF.ResMayNotAlias = MDR.hasUAVs ();
196+ }
197+
179198 ComputedShaderFlags CSF;
180199 for (const auto &BB : *F)
181200 for (const auto &I : BB)
182- updateFunctionFlags (CSF, I, DRTM);
201+ updateFunctionFlags (CSF, I, MMDI, DRTM);
183202 // Update combined shader flags mask for all functions in this SCC
184203 SCCSF.merge (CSF);
185204
@@ -250,9 +269,10 @@ ModuleShaderFlags ShaderFlagsAnalysis::run(Module &M,
250269 ModuleAnalysisManager &AM) {
251270 DXILResourceTypeMap &DRTM = AM.getResult <DXILResourceTypeAnalysis>(M);
252271 const ModuleMetadataInfo MMDI = AM.getResult <DXILMetadataAnalysis>(M);
272+ const dxil::Resources &MDR = AM.getResult <DXILResourceMDAnalysis>(M);
253273
254274 ModuleShaderFlags MSFI;
255- MSFI.initialize (M, DRTM, MMDI);
275+ MSFI.initialize (M, DRTM, MMDI, MDR );
256276
257277 return MSFI;
258278}
@@ -284,14 +304,16 @@ bool ShaderFlagsAnalysisWrapper::runOnModule(Module &M) {
284304 getAnalysis<DXILResourceTypeWrapperPass>().getResourceTypeMap ();
285305 const ModuleMetadataInfo MMDI =
286306 getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata ();
307+ dxil::Resources &MDR = getAnalysis<DXILResourceMDWrapper>().getDXILResource ();
287308
288- MSFI.initialize (M, DRTM, MMDI);
309+ MSFI.initialize (M, DRTM, MMDI, MDR );
289310 return false ;
290311}
291312
292313void ShaderFlagsAnalysisWrapper::getAnalysisUsage (AnalysisUsage &AU) const {
293314 AU.setPreservesAll ();
294315 AU.addRequiredTransitive <DXILResourceTypeWrapperPass>();
316+ AU.addRequired <DXILResourceMDWrapper>();
295317 AU.addRequired <DXILMetadataAnalysisWrapperPass>();
296318}
297319
0 commit comments