Subzero: Speed up VariablesMetadata initialization.
Currently, O2 calls VariablesMetadata::init() 4 times:
- Twice for liveness analysis, where only multi-block use information is needed for dealing with sparse bit vectors.
- Once for address mode inference, where single-definition information is needed.
- Once for register allocation, where all information is needed, including the set of all definitions which is needed for determining AllowOverlap.
So we limit the amount of data we gather based on the actual need.
BUG= none
R=jvoung@chromium.org
Review URL: https://codereview.chromium.org/650613003
diff --git a/src/IceRegAlloc.cpp b/src/IceRegAlloc.cpp
index b5c3315..1b4d0c2 100644
--- a/src/IceRegAlloc.cpp
+++ b/src/IceRegAlloc.cpp
@@ -32,7 +32,10 @@
bool overlapsDefs(const Cfg *Func, const Variable *Item, const Variable *Var) {
const bool UseTrimmed = true;
VariablesMetadata *VMetadata = Func->getVMetadata();
- const InstDefList &Defs = VMetadata->getDefinitions(Var);
+ if (const Inst *FirstDef = VMetadata->getFirstDefinition(Var))
+ if (Item->getLiveRange().overlapsInst(FirstDef->getNumber(), UseTrimmed))
+ return true;
+ const InstDefList &Defs = VMetadata->getLatterDefinitions(Var);
for (size_t i = 0; i < Defs.size(); ++i) {
if (Item->getLiveRange().overlapsInst(Defs[i]->getNumber(), UseTrimmed))
return true;
@@ -47,11 +50,11 @@
Ostream &Str = Func->getContext()->getStrDump();
Str << "Disabling Overlap due to " << Reason << " " << *Var
<< " LIVE=" << Var->getLiveRange() << " Defs=";
- const InstDefList &Defs = VMetadata->getDefinitions(Var);
+ if (const Inst *FirstDef = VMetadata->getFirstDefinition(Var))
+ Str << FirstDef->getNumber();
+ const InstDefList &Defs = VMetadata->getLatterDefinitions(Var);
for (size_t i = 0; i < Defs.size(); ++i) {
- if (i > 0)
- Str << ",";
- Str << Defs[i]->getNumber();
+ Str << "," << Defs[i]->getNumber();
}
Str << "\n";
}