@@ -41,13 +41,18 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
4141
4242#define DEBUG_TYPE " cmabi"
4343
44+ #include " llvmWrapper/Analysis/CallGraph.h"
4445#include " llvmWrapper/IR/CallSite.h"
45- #include " llvmWrapper/Support/Alignment.h"
4646#include " llvmWrapper/IR/DerivedTypes.h"
4747#include " llvmWrapper/IR/Instructions.h"
48+ #include " llvmWrapper/Support/Alignment.h"
49+
50+ #include " Probe/Assertion.h"
4851
4952#include " vc/GenXOpts/GenXOpts.h"
5053#include " vc/GenXOpts/Utils/GenXSTLExtras.h"
54+ #include " vc/Support/BackendConfig.h"
55+
5156#include " llvm/ADT/DenseMap.h"
5257#include " llvm/ADT/PostOrderIterator.h"
5358#include " llvm/ADT/SCCIterator.h"
@@ -76,9 +81,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7681#include " llvm/Support/raw_ostream.h"
7782#include " llvm/Transforms/Scalar.h"
7883
79- #include " llvmWrapper/Analysis/CallGraph.h"
80- #include " Probe/Assertion.h"
81-
8284#include < algorithm>
8385#include < iterator>
8486#include < numeric>
@@ -89,13 +91,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8991
9092using namespace llvm ;
9193
92- using LocalizationLimitT = int32_t ;
93- static constexpr auto LocalizeAll = std::numeric_limits<LocalizationLimitT>::max();
94- static cl::opt<LocalizationLimitT>
95- LocalizationLimit (" cm-abi-issues-localization-limit" ,
96- cl::desc (" maximum size (in bytes) used to localize global variables" ),
97- cl::init(LocalizeAll));
98-
9994STATISTIC (NumArgumentsTransformed, " Number of pointer arguments transformed" );
10095
10196// FIXME: find a propper place for addrspace enum, agree on addrspace politics
@@ -253,6 +248,7 @@ int DiagnosticInfoOverlappingArgs::KindID = 0;
253248class CMABIAnalysis : public ModulePass {
254249 // This map captures all global variables to be localized.
255250 std::vector<LocalizationInfo *> LocalizationInfoObjs;
251+ GlobalsLocalizationConfig::LimitT GlobalsLocalizationLimit;
256252
257253public:
258254 static char ID;
@@ -267,6 +263,7 @@ class CMABIAnalysis : public ModulePass {
267263
268264 void getAnalysisUsage (AnalysisUsage &AU) const override {
269265 AU.addRequired <CallGraphWrapperPass>();
266+ AU.addRequired <GenXBackendConfig>();
270267 AU.setPreservesAll ();
271268 }
272269
@@ -359,10 +356,25 @@ char CMABIAnalysis::ID = 0;
359356INITIALIZE_PASS_BEGIN (CMABIAnalysis, " cmabi-analysis" ,
360357 " helper analysis pass to get info for CMABI" , false , true )
361358INITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass)
359+ INITIALIZE_PASS_DEPENDENCY(GenXBackendConfig)
362360INITIALIZE_PASS_END(CMABIAnalysis, " cmabi-analysis" ,
363361 " Fix ABI issues for the genx backend" , false , true )
364362
363+ static std::size_t
364+ defineGlobalsLocalizationLimit(const GenXBackendConfig &Config) {
365+ if (Config.isGlobalsLocalizationForced ())
366+ return GlobalsLocalizationConfig::NoLimit;
367+
368+ // Half of a size of standard GenX register file in bytes.
369+ // 128 * 32 / 2
370+ constexpr std::size_t HalfGRF = 2048 ;
371+ std::size_t Limit = Config.getGlobalsLocalizationLimit ();
372+ return std::min (Limit, HalfGRF);
373+ }
374+
365375bool CMABIAnalysis::runOnModule (Module &M) {
376+ GlobalsLocalizationLimit =
377+ defineGlobalsLocalizationLimit (getAnalysis<GenXBackendConfig>());
366378 runOnCallGraph (getAnalysis<CallGraphWrapperPass>().getCallGraph ());
367379 return false ;
368380}
@@ -402,7 +414,7 @@ auto selectGlobalsToLocalize(ForwardRange Globals, T Bound,
402414 Globals, [ExcludePred](GVRef GV) { return !ExcludePred (GV); });
403415 using GVWithWeightT = std::pair<GVPtr, int >;
404416
405- if (Bound == LocalizeAll ) {
417+ if (Bound == GlobalsLocalizationConfig::NoLimit ) {
406418 std::vector<GVPtr> ToLocalize;
407419 transform (Unexcluded, std::back_inserter (ToLocalize),
408420 [](GVRef GV) { return &GV; });
@@ -1950,7 +1962,7 @@ void CMABIAnalysis::analyzeGlobals(CallGraph &CG) {
19501962 };
19511963 const auto &DL = M.getDataLayout ();
19521964 std::vector<GlobalVariable *> ToLocalize = selectGlobalsToLocalize (
1953- M.globals (), LocalizationLimit. getValue () ,
1965+ M.globals (), GlobalsLocalizationLimit ,
19541966 [UsesPrintChecker](const GlobalVariable &GV) {
19551967 // don't localize global constant format string if it's used by print_index intrinsic
19561968 bool UsesPrintIndex = std::any_of (GV.use_begin (), GV.use_end (), UsesPrintChecker);
0 commit comments