7
7
// ===----------------------------------------------------------------------===//
8
8
9
9
#include " DXILPostOptimizationValidation.h"
10
- #include " DXILConstants.h"
11
- #include " DXILIntrinsicExpansion.h"
12
- #include " DXILOpBuilder.h"
13
10
#include " DXILShaderFlags.h"
14
11
#include " DirectX.h"
15
- #include " llvm/ADT/SmallVector.h"
16
12
#include " llvm/Analysis/DXILMetadataAnalysis.h"
17
13
#include " llvm/Analysis/DXILResource.h"
18
- #include " llvm/CodeGen/Passes.h"
19
14
#include " llvm/IR/DiagnosticInfo.h"
20
- #include " llvm/IR/Function.h"
21
- #include " llvm/IR/IRBuilder.h"
22
- #include " llvm/IR/Instruction.h"
23
15
#include " llvm/IR/Instructions.h"
24
- #include " llvm/IR/Intrinsics.h"
25
16
#include " llvm/IR/IntrinsicsDirectX.h"
26
17
#include " llvm/IR/Module.h"
27
- #include " llvm/IR/PassManager.h"
28
18
#include " llvm/InitializePasses.h"
29
- #include " llvm/Pass.h"
30
- #include " llvm/Support/ErrorHandling.h"
31
- #include < cstdio>
32
19
33
20
#define DEBUG_TYPE " dxil-post-optimization-validation"
34
21
35
22
using namespace llvm ;
36
23
using namespace llvm ::dxil;
37
24
38
25
namespace {
39
- class DXILValidator {
40
- Module &M;
41
- DXILResourceMap &DRM;
42
26
43
- public:
44
- DXILValidator (Module &M, DXILResourceMap &DRM) : M(M), DRM(DRM) {}
45
-
46
- void validate () {
47
- for (const auto &UAV : DRM.uavs ()) {
48
- if (UAV.CounterDirection != ResourceCounterDirection::Invalid)
49
- continue ;
27
+ static void reportInvalidDirection (Module &M, DXILResourceMap &DRM) {
28
+ for (const auto &UAV : DRM.uavs ()) {
29
+ if (UAV.CounterDirection != ResourceCounterDirection::Invalid)
30
+ continue ;
50
31
51
- CallInst *ResourceHandle = nullptr ;
52
- for (CallInst *MaybeHandle : DRM.calls ()) {
53
- if (*DRM.find (MaybeHandle) == UAV) {
54
- ResourceHandle = MaybeHandle;
55
- break ;
56
- }
32
+ CallInst *ResourceHandle = nullptr ;
33
+ for (CallInst *MaybeHandle : DRM.calls ()) {
34
+ if (*DRM.find (MaybeHandle) == UAV) {
35
+ ResourceHandle = MaybeHandle;
36
+ break ;
57
37
}
38
+ }
58
39
59
- StringRef Message =
60
- " RWStructuredBuffers may increment or decrement their "
61
- " counters, but not both." ;
62
- for (const auto &U : ResourceHandle->users ()) {
63
- const CallInst *CI = dyn_cast<CallInst>(U);
64
- if (!CI && CI->getIntrinsicID () != Intrinsic::dx_resource_updatecounter)
65
- continue ;
40
+ StringRef Message = " RWStructuredBuffers may increment or decrement their "
41
+ " counters, but not both." ;
42
+ for (const auto &U : ResourceHandle->users ()) {
43
+ const CallInst *CI = dyn_cast<CallInst>(U);
44
+ if (!CI && CI->getIntrinsicID () != Intrinsic::dx_resource_updatecounter)
45
+ continue ;
66
46
67
- M.getContext ().diagnose (DiagnosticInfoGenericWithLoc (
68
- Message, *CI->getFunction (), CI->getDebugLoc ()));
69
- }
47
+ M.getContext ().diagnose (DiagnosticInfoGenericWithLoc (
48
+ Message, *CI->getFunction (), CI->getDebugLoc ()));
70
49
}
71
50
}
72
- };
51
+ }
52
+
73
53
} // namespace
74
54
75
55
PreservedAnalyses
76
56
DXILPostOptimizationValidation::run (Module &M, ModuleAnalysisManager &MAM) {
77
57
DXILResourceMap &DRM = MAM.getResult <DXILResourceAnalysis>(M);
78
58
79
- DXILValidator (M, DRM).validate ();
59
+ if (DRM.hasInvalidCounterDirection ())
60
+ reportInvalidDirection (M, DRM);
61
+
80
62
return PreservedAnalyses::all ();
81
63
}
82
64
@@ -87,7 +69,8 @@ class DXILPostOptimizationValidationLegacy : public ModulePass {
87
69
DXILResourceMap &DRM =
88
70
getAnalysis<DXILResourceWrapperPass>().getResourceMap ();
89
71
90
- DXILValidator (M, DRM).validate ();
72
+ if (DRM.hasInvalidCounterDirection ())
73
+ reportInvalidDirection (M, DRM);
91
74
92
75
return false ;
93
76
}
0 commit comments