[llvm] 9abb0e8 - [NFC, StackSafety] Remove unnecessary data
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Tue May 26 14:13:33 PDT 2020
Author: Vitaly Buka
Date: 2020-05-26T14:13:20-07:00
New Revision: 9abb0e8d5be2ffad06ccfcc2d5530997ad093b81
URL: https://github.com/llvm/llvm-project/commit/9abb0e8d5be2ffad06ccfcc2d5530997ad093b81
DIFF: https://github.com/llvm/llvm-project/commit/9abb0e8d5be2ffad06ccfcc2d5530997ad093b81.diff
LOG: [NFC, StackSafety] Remove unnecessary data
Added:
Modified:
llvm/include/llvm/Analysis/StackSafetyAnalysis.h
llvm/lib/Analysis/StackSafetyAnalysis.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/StackSafetyAnalysis.h b/llvm/include/llvm/Analysis/StackSafetyAnalysis.h
index 9158f42481bf..33a4b2c149c3 100644
--- a/llvm/include/llvm/Analysis/StackSafetyAnalysis.h
+++ b/llvm/include/llvm/Analysis/StackSafetyAnalysis.h
@@ -35,7 +35,7 @@ class StackSafetyInfo {
const InfoTy &getInfo() const { return *Info; }
// TODO: Add useful for client methods.
- void print(raw_ostream &O) const;
+ void print(raw_ostream &O, const GlobalValue &F) const;
};
/// StackSafetyInfo wrapper for the new pass manager.
@@ -60,6 +60,7 @@ class StackSafetyPrinterPass : public PassInfoMixin<StackSafetyPrinterPass> {
/// StackSafetyInfo wrapper for the legacy pass manager
class StackSafetyInfoWrapperPass : public FunctionPass {
Optional<StackSafetyInfo> SSI;
+ const Function *F = nullptr;
public:
static char ID;
diff --git a/llvm/lib/Analysis/StackSafetyAnalysis.cpp b/llvm/lib/Analysis/StackSafetyAnalysis.cpp
index b98a0e588046..31f30d4b5d56 100644
--- a/llvm/lib/Analysis/StackSafetyAnalysis.cpp
+++ b/llvm/lib/Analysis/StackSafetyAnalysis.cpp
@@ -13,6 +13,7 @@
#include "llvm/IR/InstIterator.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/InitializePasses.h"
+#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/raw_ostream.h"
#include <memory>
@@ -98,35 +99,6 @@ raw_ostream &operator<<(raw_ostream &OS, const UseInfo &U) {
return OS;
}
-struct AllocaInfo {
- AllocaInst *AI = nullptr;
- uint64_t Size = 0;
- UseInfo Use;
-
- AllocaInfo(unsigned PointerSize, AllocaInst *AI, uint64_t Size)
- : AI(AI), Size(Size), Use(PointerSize) {}
-
- StringRef getName() const { return AI->getName(); }
-};
-
-raw_ostream &operator<<(raw_ostream &OS, const AllocaInfo &A) {
- return OS << A.getName() << "[" << A.Size << "]: " << A.Use;
-}
-
-struct ParamInfo {
- const Argument *Arg = nullptr;
- UseInfo Use;
-
- explicit ParamInfo(unsigned PointerSize, const Argument *Arg)
- : Arg(Arg), Use(PointerSize) {}
-
- StringRef getName() const { return Arg ? Arg->getName() : "<N/A>"; }
-};
-
-raw_ostream &operator<<(raw_ostream &OS, const ParamInfo &P) {
- return OS << P.getName() << "[]: " << P.Use;
-}
-
/// Calculate the allocation size of a given alloca. Returns 0 if the
/// size can not be statically determined.
uint64_t getStaticAllocaAllocationSize(const AllocaInst *AI) {
@@ -146,20 +118,16 @@ uint64_t getStaticAllocaAllocationSize(const AllocaInst *AI) {
/// Describes uses of allocas and parameters inside of a single function.
struct FunctionInfo {
- // May be a Function or a GlobalAlias
+ SmallVector<UseInfo, 4> Allocas;
+ SmallVector<UseInfo, 4> Params;
const GlobalValue *GV = nullptr;
- // Informations about allocas uses.
- SmallVector<AllocaInfo, 4> Allocas;
- // Informations about parameters uses.
- SmallVector<ParamInfo, 4> Params;
// TODO: describe return value as depending on one or more of its arguments.
// StackSafetyDataFlowAnalysis counter stored here for faster access.
int UpdateCount = 0;
FunctionInfo() = default;
- explicit FunctionInfo(const Function *F) : GV(F){};
- // Creates FunctionInfo that forwards all the parameters to the aliasee.
+ FunctionInfo(const Function *F) : GV(F){};
explicit FunctionInfo(const GlobalAlias *A);
bool IsDSOLocal() const { return GV->isDSOLocal(); };
@@ -168,17 +136,36 @@ struct FunctionInfo {
StringRef getName() const { return GV->getName(); }
- void print(raw_ostream &O) const {
+ void print(raw_ostream &O, StringRef Name, const Function *F) const {
// TODO: Consider
diff erent printout format after
// StackSafetyDataFlowAnalysis. Calls and parameters are irrelevant then.
- O << " @" << getName() << (IsDSOLocal() ? "" : " dso_preemptable")
+ O << " @" << Name << (IsDSOLocal() ? "" : " dso_preemptable")
<< (IsInterposable() ? " interposable" : "") << "\n";
+
O << " args uses:\n";
- for (auto &P : Params)
- O << " " << P << "\n";
+ size_t Pos = 0;
+ for (auto &P : Params) {
+ StringRef Name = "<N/A>";
+ if (F)
+ Name = F->getArg(Pos)->getName();
+ O << " " << Name << "[]: " << P << "\n";
+ ++Pos;
+ }
+
O << " allocas uses:\n";
- for (auto &AS : Allocas)
- O << " " << AS << "\n";
+ if (F) {
+ size_t Pos = 0;
+ for (auto &I : instructions(F)) {
+ if (auto AI = dyn_cast<AllocaInst>(&I)) {
+ auto &AS = Allocas[Pos];
+ O << " " << AI->getName() << "["
+ << getStaticAllocaAllocationSize(AI) << "]: " << AS << "\n";
+ ++Pos;
+ }
+ }
+ } else {
+ assert(Allocas.empty());
+ }
}
};
@@ -188,8 +175,8 @@ FunctionInfo::FunctionInfo(const GlobalAlias *A) : GV(A) {
const FunctionType *Type = cast<FunctionType>(Aliasee->getValueType());
// 'Forward' all parameters to this alias to the aliasee
for (unsigned ArgNo = 0; ArgNo < Type->getNumParams(); ArgNo++) {
- Params.emplace_back(PointerSize, nullptr);
- UseInfo &US = Params.back().Use;
+ Params.emplace_back(PointerSize);
+ UseInfo &US = Params.back();
US.Calls.emplace_back(Aliasee, ArgNo, ConstantRange(APInt(PointerSize, 0)));
}
}
@@ -394,21 +381,20 @@ FunctionInfo StackSafetyLocalAnalysis::run() {
for (auto &I : instructions(F)) {
if (auto AI = dyn_cast<AllocaInst>(&I)) {
- Info.Allocas.emplace_back(PointerSize, AI,
- getStaticAllocaAllocationSize(AI));
- AllocaInfo &AS = Info.Allocas.back();
- analyzeAllUses(AI, AS.Use);
+ Info.Allocas.emplace_back(PointerSize);
+ UseInfo &AS = Info.Allocas.back();
+ analyzeAllUses(AI, AS);
}
}
for (const Argument &A : make_range(F.arg_begin(), F.arg_end())) {
- Info.Params.emplace_back(PointerSize, &A);
- ParamInfo &PS = Info.Params.back();
- analyzeAllUses(&A, PS.Use);
+ Info.Params.emplace_back(PointerSize);
+ UseInfo &PS = Info.Params.back();
+ analyzeAllUses(&A, PS);
}
+ LLVM_DEBUG(Info.print(dbgs(), F.getName(), &F));
LLVM_DEBUG(dbgs() << "[StackSafety] done\n");
- LLVM_DEBUG(Info.print(dbgs()));
return Info;
}
@@ -473,7 +459,7 @@ StackSafetyDataFlowAnalysis::getArgumentAccessRange(const GlobalValue *Callee,
return UnknownRange;
if (ParamNo >= FS.Params.size()) // possibly vararg
return UnknownRange;
- return FS.Params[ParamNo].Use.Range;
+ return FS.Params[ParamNo].Range;
}
bool StackSafetyDataFlowAnalysis::updateOneUse(UseInfo &US,
@@ -501,14 +487,14 @@ void StackSafetyDataFlowAnalysis::updateOneNode(const GlobalValue *Callee,
bool UpdateToFullSet = FS.UpdateCount > StackSafetyMaxIterations;
bool Changed = false;
for (auto &AS : FS.Allocas)
- Changed |= updateOneUse(AS.Use, UpdateToFullSet);
+ Changed |= updateOneUse(AS, UpdateToFullSet);
for (auto &PS : FS.Params)
- Changed |= updateOneUse(PS.Use, UpdateToFullSet);
+ Changed |= updateOneUse(PS, UpdateToFullSet);
if (Changed) {
LLVM_DEBUG(dbgs() << "=== update [" << FS.UpdateCount
- << (UpdateToFullSet ? ", full-set" : "") << "] "
- << FS.getName() << "\n");
+ << (UpdateToFullSet ? ", full-set" : "") << "] " << &FS
+ << "\n");
// Callers of this function may need updating.
for (auto &CallerID : Callers[Callee])
WorkList.insert(CallerID);
@@ -526,10 +512,10 @@ void StackSafetyDataFlowAnalysis::runDataFlow() {
Callees.clear();
FunctionInfo &FS = F.second;
for (auto &AS : FS.Allocas)
- for (auto &CS : AS.Use.Calls)
+ for (auto &CS : AS.Calls)
Callees.push_back(CS.Callee);
for (auto &PS : FS.Params)
- for (auto &CS : PS.Use.Calls)
+ for (auto &CS : PS.Calls)
Callees.push_back(CS.Callee);
llvm::sort(Callees);
@@ -566,22 +552,6 @@ StackSafetyGlobalInfo StackSafetyDataFlowAnalysis::run() {
return SSI;
}
-void print(const StackSafetyGlobalInfo &SSI, raw_ostream &O, const Module &M) {
- size_t Count = 0;
- for (auto &F : M.functions())
- if (!F.isDeclaration()) {
- SSI.find(&F)->second.print(O);
- O << "\n";
- ++Count;
- }
- for (auto &A : M.aliases()) {
- SSI.find(&A)->second.print(O);
- O << "\n";
- ++Count;
- }
- assert(Count == SSI.size() && "Unexpected functions in the result");
-}
-
bool setStackSafetyMetadata(Module &M, const StackSafetyGlobalInfo &SSGI) {
bool Changed = false;
unsigned Width = M.getDataLayout().getPointerSizeInBits();
@@ -592,12 +562,18 @@ bool setStackSafetyMetadata(Module &M, const StackSafetyGlobalInfo &SSGI) {
if (Iter == SSGI.end())
continue;
const FunctionInfo &Summary = Iter->second.getInfo().Info;
- for (auto &AS : Summary.Allocas) {
- ConstantRange AllocaRange{APInt(Width, 0), APInt(Width, AS.Size)};
- if (AllocaRange.contains(AS.Use.Range)) {
- AS.AI->setMetadata(M.getMDKindID("stack-safe"),
- MDNode::get(M.getContext(), None));
- Changed = true;
+ size_t Pos = 0;
+ for (auto &I : instructions(F)) {
+ if (auto AI = dyn_cast<AllocaInst>(&I)) {
+ auto &AS = Summary.Allocas[Pos];
+ ConstantRange AllocaRange{
+ APInt(Width, 0), APInt(Width, getStaticAllocaAllocationSize(AI))};
+ if (AllocaRange.contains(AS.Range)) {
+ AI->setMetadata(M.getMDKindID("stack-safe"),
+ MDNode::get(M.getContext(), None));
+ Changed = true;
+ }
+ ++Pos;
}
}
}
@@ -614,7 +590,26 @@ StackSafetyInfo::StackSafetyInfo(InfoTy Info)
StackSafetyInfo::~StackSafetyInfo() = default;
-void StackSafetyInfo::print(raw_ostream &O) const { Info->Info.print(O); }
+void StackSafetyInfo::print(raw_ostream &O, const GlobalValue &F) const {
+ Info->Info.print(O, F.getName(), dyn_cast<Function>(&F));
+}
+
+static void print(const StackSafetyGlobalInfo &SSI, raw_ostream &O,
+ const Module &M) {
+ size_t Count = 0;
+ for (auto &F : M.functions())
+ if (!F.isDeclaration()) {
+ SSI.find(&F)->second.print(O, F);
+ O << "\n";
+ ++Count;
+ }
+ for (auto &A : M.aliases()) {
+ SSI.find(&A)->second.print(O, A);
+ O << "\n";
+ ++Count;
+ }
+ assert(Count == SSI.size() && "Unexpected functions in the result");
+}
AnalysisKey StackSafetyAnalysis::Key;
@@ -627,7 +622,7 @@ StackSafetyInfo StackSafetyAnalysis::run(Function &F,
PreservedAnalyses StackSafetyPrinterPass::run(Function &F,
FunctionAnalysisManager &AM) {
OS << "'Stack Safety Local Analysis' for function '" << F.getName() << "'\n";
- AM.getResult<StackSafetyAnalysis>(F).print(OS);
+ AM.getResult<StackSafetyAnalysis>(F).print(OS, F);
return PreservedAnalyses::all();
}
@@ -643,13 +638,14 @@ void StackSafetyInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
}
void StackSafetyInfoWrapperPass::print(raw_ostream &O, const Module *M) const {
- SSI->print(O);
+ SSI->print(O, *F);
}
bool StackSafetyInfoWrapperPass::runOnFunction(Function &F) {
StackSafetyLocalAnalysis SSLA(
F, getAnalysis<ScalarEvolutionWrapperPass>().getSE());
SSI = makeSSI(SSLA.run());
+ this->F = &F;
return false;
}
More information about the llvm-commits
mailing list