@@ -74,7 +74,8 @@ static bool checkWaveOps(Intrinsic::ID IID) {
7474// / \param I Instruction to check.
7575void ModuleShaderFlags::updateFunctionFlags (ComputedShaderFlags &CSF,
7676 const Instruction &I,
77- DXILResourceTypeMap &DRTM) {
77+ DXILResourceTypeMap &DRTM,
78+ const ModuleMetadataInfo &MMDI) {
7879 if (!CSF.Doubles )
7980 CSF.Doubles = I.getType ()->isDoubleTy ();
8081
@@ -128,8 +129,15 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
128129 switch (II->getIntrinsicID ()) {
129130 default :
130131 break ;
131- case Intrinsic::dx_resource_handlefrombinding:
132- switch (DRTM[cast<TargetExtType>(II->getType ())].getResourceKind ()) {
132+ case Intrinsic::dx_resource_handlefrombinding: {
133+ dxil::ResourceTypeInfo &RTI = DRTM[cast<TargetExtType>(II->getType ())];
134+
135+ // Set ResMayNotAlias if DXIL version >= 1.8 and function uses UAVs
136+ if (!CSF.ResMayNotAlias && CanSetResMayNotAlias &&
137+ MMDI.DXILVersion >= VersionTuple (1 , 8 ) && RTI.isUAV ())
138+ CSF.ResMayNotAlias = true ;
139+
140+ switch (RTI.getResourceKind ()) {
133141 case dxil::ResourceKind::StructuredBuffer:
134142 case dxil::ResourceKind::RawBuffer:
135143 CSF.EnableRawAndStructuredBuffers = true ;
@@ -138,6 +146,7 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
138146 break ;
139147 }
140148 break ;
149+ }
141150 case Intrinsic::dx_resource_load_typedbuffer: {
142151 dxil::ResourceTypeInfo &RTI =
143152 DRTM[cast<TargetExtType>(II->getArgOperand (0 )->getType ())];
@@ -163,7 +172,18 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
163172
164173// / Construct ModuleShaderFlags for module Module M
165174void ModuleShaderFlags::initialize (Module &M, DXILResourceTypeMap &DRTM,
175+ DXILResourceMap &DRM,
166176 const ModuleMetadataInfo &MMDI) {
177+
178+ CanSetResMayNotAlias = MMDI.DXILVersion >= VersionTuple (1 , 7 );
179+
180+ // Check if -res-may-alias was provided on the command line.
181+ // The command line option will set the dx.resmayalias module flag to 1.
182+ if (auto *RMA = mdconst::extract_or_null<ConstantInt>(
183+ M.getModuleFlag (" dx.resmayalias" )))
184+ if (RMA->getValue () != 0 )
185+ CanSetResMayNotAlias = false ;
186+
167187 CallGraph CG (M);
168188
169189 // Compute Shader Flags Mask for all functions using post-order visit of SCC
@@ -188,6 +208,11 @@ void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM,
188208 continue ;
189209 }
190210
211+ // Set ResMayNotAlias to true if DXIL version < 1.8 and there are UAVs
212+ // present globally.
213+ if (CanSetResMayNotAlias && MMDI.DXILVersion < VersionTuple (1 , 8 ))
214+ SCCSF.ResMayNotAlias = !DRM.uavs ().empty ();
215+
191216 // Set UseNativeLowPrecision using dx.nativelowprec module metadata
192217 if (auto *NativeLowPrec = mdconst::extract_or_null<ConstantInt>(
193218 M.getModuleFlag (" dx.nativelowprec" )))
@@ -198,7 +223,7 @@ void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM,
198223 ComputedShaderFlags CSF;
199224 for (const auto &BB : *F)
200225 for (const auto &I : BB)
201- updateFunctionFlags (CSF, I, DRTM);
226+ updateFunctionFlags (CSF, I, DRTM, MMDI );
202227 // Update combined shader flags mask for all functions in this SCC
203228 SCCSF.merge (CSF);
204229
@@ -268,10 +293,11 @@ AnalysisKey ShaderFlagsAnalysis::Key;
268293ModuleShaderFlags ShaderFlagsAnalysis::run (Module &M,
269294 ModuleAnalysisManager &AM) {
270295 DXILResourceTypeMap &DRTM = AM.getResult <DXILResourceTypeAnalysis>(M);
296+ DXILResourceMap &DRM = AM.getResult <DXILResourceAnalysis>(M);
271297 const ModuleMetadataInfo MMDI = AM.getResult <DXILMetadataAnalysis>(M);
272298
273299 ModuleShaderFlags MSFI;
274- MSFI.initialize (M, DRTM, MMDI);
300+ MSFI.initialize (M, DRTM, DRM, MMDI);
275301
276302 return MSFI;
277303}
@@ -301,16 +327,18 @@ PreservedAnalyses ShaderFlagsAnalysisPrinter::run(Module &M,
301327bool ShaderFlagsAnalysisWrapper::runOnModule (Module &M) {
302328 DXILResourceTypeMap &DRTM =
303329 getAnalysis<DXILResourceTypeWrapperPass>().getResourceTypeMap ();
330+ DXILResourceMap &DRM = getAnalysis<DXILResourceWrapperPass>().getBindingMap ();
304331 const ModuleMetadataInfo MMDI =
305332 getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata ();
306333
307- MSFI.initialize (M, DRTM, MMDI);
334+ MSFI.initialize (M, DRTM, DRM, MMDI);
308335 return false ;
309336}
310337
311338void ShaderFlagsAnalysisWrapper::getAnalysisUsage (AnalysisUsage &AU) const {
312339 AU.setPreservesAll ();
313340 AU.addRequiredTransitive <DXILResourceTypeWrapperPass>();
341+ AU.addRequiredTransitive <DXILResourceWrapperPass>();
314342 AU.addRequired <DXILMetadataAnalysisWrapperPass>();
315343}
316344
0 commit comments