@@ -832,7 +832,8 @@ static bool isUpdateCounterIntrinsic(Function &F) {
832
832
}
833
833
834
834
void DXILResourceCounterDirectionMap::populate (Module &M, DXILBindingMap &DBM) {
835
- std::vector<std::tuple<dxil::ResourceBindingInfo, ResourceCounterDirection, const Function*, const CallInst*>>
835
+ std::vector<std::tuple<dxil::ResourceBindingInfo, ResourceCounterDirection,
836
+ const Function *, const CallInst *>>
836
837
DiagCounterDirs;
837
838
838
839
for (Function &F : M.functions ()) {
@@ -867,50 +868,61 @@ void DXILResourceCounterDirectionMap::populate(Module &M, DXILBindingMap &DBM) {
867
868
// unknown
868
869
const auto RemoveEnd = std::remove_if (
869
870
DiagCounterDirs.begin (), DiagCounterDirs.end (), [](const auto &Item) {
870
- return std::get<ResourceCounterDirection>(Item) == ResourceCounterDirection::Unknown;
871
+ return std::get<ResourceCounterDirection>(Item) ==
872
+ ResourceCounterDirection::Unknown;
871
873
});
872
874
873
875
// Sort by the Binding and Direction for fast lookup
874
- std::sort (DiagCounterDirs.begin (), RemoveEnd, [](const auto &LHS, const auto &RHS) {
875
- const auto L = std::pair{std::get<dxil::ResourceBindingInfo>(LHS), std::get<ResourceCounterDirection>(LHS)};
876
- const auto R = std::pair{std::get<dxil::ResourceBindingInfo>(RHS), std::get<ResourceCounterDirection>(RHS)};
877
- return L < R;
878
- });
876
+ std::sort (DiagCounterDirs.begin (), RemoveEnd,
877
+ [](const auto &LHS, const auto &RHS) {
878
+ const auto L = std::pair{std::get<dxil::ResourceBindingInfo>(LHS),
879
+ std::get<ResourceCounterDirection>(LHS)};
880
+ const auto R = std::pair{std::get<dxil::ResourceBindingInfo>(RHS),
881
+ std::get<ResourceCounterDirection>(RHS)};
882
+ return L < R;
883
+ });
879
884
880
885
// Remove the duplicate entries. Since direction is considered for equality
881
886
// a unique resource with more than one direction will not be deduped.
882
- const auto UniqueEnd = std::unique (DiagCounterDirs.begin (), RemoveEnd, [](const auto &LHS, const auto &RHS) {
883
- const auto L = std::pair{std::get<dxil::ResourceBindingInfo>(LHS), std::get<ResourceCounterDirection>(LHS)};
884
- const auto R = std::pair{std::get<dxil::ResourceBindingInfo>(RHS), std::get<ResourceCounterDirection>(RHS)};
885
- return L == R;
886
- });
887
+ const auto UniqueEnd = std::unique (
888
+ DiagCounterDirs.begin (), RemoveEnd, [](const auto &LHS, const auto &RHS) {
889
+ const auto L = std::pair{std::get<dxil::ResourceBindingInfo>(LHS),
890
+ std::get<ResourceCounterDirection>(LHS)};
891
+ const auto R = std::pair{std::get<dxil::ResourceBindingInfo>(RHS),
892
+ std::get<ResourceCounterDirection>(RHS)};
893
+ return L == R;
894
+ });
887
895
888
896
// Actually erase the items invalidated by remove_if + unique
889
897
DiagCounterDirs.erase (UniqueEnd, DiagCounterDirs.end ());
890
898
891
899
// If any duplicate entries still exist at this point then it must be a
892
900
// resource that was both incremented and decremented which is not allowed.
893
- const auto DuplicateEntry = std::adjacent_find (
894
- DiagCounterDirs.begin (), DiagCounterDirs.end (),
895
- [](const auto &LHS, const auto &RHS) {
896
- return std::get<dxil::ResourceBindingInfo>(LHS) == std::get<dxil::ResourceBindingInfo>(RHS);
897
- });
901
+ const auto DuplicateEntry =
902
+ std::adjacent_find (DiagCounterDirs.begin (), DiagCounterDirs.end (),
903
+ [](const auto &LHS, const auto &RHS) {
904
+ return std::get<dxil::ResourceBindingInfo>(LHS) ==
905
+ std::get<dxil::ResourceBindingInfo>(RHS);
906
+ });
898
907
899
908
// Copy the results into the final vec
900
909
CounterDirections.clear ();
901
910
CounterDirections.reserve (DiagCounterDirs.size ());
902
- std::transform (DiagCounterDirs.begin (), DiagCounterDirs.end (), std::back_inserter (CounterDirections), [](const auto &Item){
903
- return std::pair{std::get<dxil::ResourceBindingInfo>(Item), std::get<ResourceCounterDirection>(Item)};
904
- });
911
+ std::transform (DiagCounterDirs.begin (), DiagCounterDirs.end (),
912
+ std::back_inserter (CounterDirections), [](const auto &Item) {
913
+ return std::pair{std::get<dxil::ResourceBindingInfo>(Item),
914
+ std::get<ResourceCounterDirection>(Item)};
915
+ });
905
916
906
917
if (DuplicateEntry == DiagCounterDirs.end ())
907
918
return ;
908
919
909
- const Function* F = std::get<const Function*>(*DuplicateEntry);
910
- const CallInst* CI = std::get<const CallInst*>(*DuplicateEntry);
920
+ const Function * F = std::get<const Function *>(*DuplicateEntry);
921
+ const CallInst * CI = std::get<const CallInst *>(*DuplicateEntry);
911
922
StringRef Message = " RWStructuredBuffers may increment or decrement their "
912
923
" counters, but not both." ;
913
- M.getContext ().diagnose (DiagnosticInfoGenericWithLoc (Message, *F, CI->getDebugLoc ()));
924
+ M.getContext ().diagnose (
925
+ DiagnosticInfoGenericWithLoc (Message, *F, CI->getDebugLoc ()));
914
926
}
915
927
916
928
void DXILResourceCounterDirectionWrapperPass::getAnalysisUsage (
0 commit comments