llvm-project/llvm/lib/CodeGen/StaticDataAnnotator.cpp
Mingming Liu 13e563e5c6
[NFCI][StaticDataLayout] Get rid of section prefix validation in codegen (#162349)
The section prefix validation was initially added when global variable's
section prefix is only added in the codegen pass.

Now the optimizer pass MemProfUse can annotate data section prefix by
making use of data access profiles, so we can remove the validation.
Also calls `setSectionPrefix` which returns whether section prefix is
updated.

This is the 3rd patch as a split of
https://github.com/llvm/llvm-project/pull/155337
2025-10-13 19:02:53 +00:00

97 lines
3.5 KiB
C++

//===- StaticDataAnnotator - Annotate static data's section prefix --------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// To reason about module-wide data hotness in a module granularity, this file
// implements a module pass StaticDataAnnotator to work coordinately with the
// StaticDataSplitter pass.
//
// The StaticDataSplitter pass is a machine function pass. It analyzes data
// hotness based on code and adds counters in StaticDataProfileInfo via its
// wrapper pass StaticDataProfileInfoWrapper.
// The StaticDataProfileInfoWrapper sits in the middle between the
// StaticDataSplitter and StaticDataAnnotator passes.
// The StaticDataAnnotator pass is a module pass. It iterates global variables
// in the module, looks up counters from StaticDataProfileInfo and sets the
// section prefix based on profiles.
//
// The three-pass structure is implemented for practical reasons, to work around
// the limitation that a module pass based on legacy pass manager cannot make
// use of MachineBlockFrequencyInfo analysis. In the future, we can consider
// porting the StaticDataSplitter pass to a module-pass using the new pass
// manager framework. That way, analysis are lazily computed as opposed to
// eagerly scheduled, and a module pass can use MachineBlockFrequencyInfo.
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/StaticDataProfileInfo.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/IR/Analysis.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#define DEBUG_TYPE "static-data-annotator"
using namespace llvm;
/// A module pass which iterates global variables in the module and annotates
/// their section prefixes based on profile-driven analysis.
class StaticDataAnnotator : public ModulePass {
public:
static char ID;
StaticDataProfileInfo *SDPI = nullptr;
const ProfileSummaryInfo *PSI = nullptr;
StaticDataAnnotator() : ModulePass(ID) {
initializeStaticDataAnnotatorPass(*PassRegistry::getPassRegistry());
}
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addRequired<StaticDataProfileInfoWrapperPass>();
AU.addRequired<ProfileSummaryInfoWrapperPass>();
AU.setPreservesAll();
ModulePass::getAnalysisUsage(AU);
}
StringRef getPassName() const override { return "Static Data Annotator"; }
bool runOnModule(Module &M) override;
};
bool StaticDataAnnotator::runOnModule(Module &M) {
SDPI = &getAnalysis<StaticDataProfileInfoWrapperPass>()
.getStaticDataProfileInfo();
PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
if (!PSI->hasProfileSummary())
return false;
bool Changed = false;
for (auto &GV : M.globals()) {
if (!llvm::memprof::IsAnnotationOK(GV))
continue;
StringRef SectionPrefix = SDPI->getConstantSectionPrefix(&GV, PSI);
// setSectionPrefix returns true if the section prefix is updated.
Changed |= GV.setSectionPrefix(SectionPrefix);
}
return Changed;
}
char StaticDataAnnotator::ID = 0;
INITIALIZE_PASS(StaticDataAnnotator, DEBUG_TYPE, "Static Data Annotator", false,
false)
ModulePass *llvm::createStaticDataAnnotatorPass() {
return new StaticDataAnnotator();
}