Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Unified Diff: src/IceOperand.cpp

Issue 1381563004: Subzero: Fix a bug in register allocator overlap computation. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix the asserts() guard Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/IceOperand.h ('k') | src/IceRegAlloc.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceOperand.cpp
diff --git a/src/IceOperand.cpp b/src/IceOperand.cpp
index 125c6925307465a811253e374b6c6350f2c9f408..66321c29f1c7e4f5347f858a63e939ce9bbd855d 100644
--- a/src/IceOperand.cpp
+++ b/src/IceOperand.cpp
@@ -213,15 +213,16 @@ void VariableTracking::markDef(MetadataKind TrackingKind, const Inst *Instr,
// omit all uses of the variable if markDef() and markUse() both use this
// optimization.
assert(Node);
-// Verify that instructions are added in increasing order.
-#ifndef NDEBUG
- if (TrackingKind == VMK_All) {
- const Inst *LastInstruction =
- Definitions.empty() ? FirstOrSingleDefinition : Definitions.back();
- assert(LastInstruction == nullptr ||
- Instr->getNumber() >= LastInstruction->getNumber());
+ // Verify that instructions are added in increasing order.
+ if (BuildDefs::asserts()) {
+ if (TrackingKind == VMK_All) {
+ const Inst *LastInstruction =
+ Definitions.empty() ? FirstOrSingleDefinition : Definitions.back();
+ (void)LastInstruction;
+ assert(LastInstruction == nullptr ||
+ Instr->getNumber() >= LastInstruction->getNumber());
+ }
}
-#endif
constexpr bool IsImplicit = false;
markUse(TrackingKind, Instr, Node, IsImplicit);
if (TrackingKind == VMK_Uses)
@@ -258,7 +259,7 @@ void VariableTracking::markDef(MetadataKind TrackingKind, const Inst *Instr,
}
}
-const Inst *VariableTracking::getFirstDefinition() const {
+const Inst *VariableTracking::getFirstDefinitionSingleBlock() const {
switch (MultiDef) {
case MDS_Unknown:
case MDS_MultiDefMultiBlock:
@@ -284,6 +285,19 @@ const Inst *VariableTracking::getSingleDefinition() const {
return nullptr;
}
+const Inst *VariableTracking::getFirstDefinition() const {
+ switch (MultiDef) {
+ case MDS_Unknown:
+ return nullptr;
+ case MDS_MultiDefMultiBlock:
+ case MDS_SingleDef:
+ case MDS_MultiDefSingleBlock:
+ assert(FirstOrSingleDefinition);
+ return FirstOrSingleDefinition;
+ }
+ return nullptr;
+}
+
void VariablesMetadata::init(MetadataKind TrackingKind) {
TimerMarker T(TimerStack::TT_vmetadata, Func);
Kind = TrackingKind;
@@ -303,7 +317,7 @@ void VariablesMetadata::init(MetadataKind TrackingKind) {
}
void VariablesMetadata::addNode(CfgNode *Node) {
- if (Func->getNumVariables() >= Metadata.size())
+ if (Func->getNumVariables() > Metadata.size())
Metadata.resize(Func->getNumVariables());
for (Inst &I : Node->getPhis()) {
@@ -364,12 +378,13 @@ bool VariablesMetadata::isMultiBlock(const Variable *Var) const {
return Metadata[VarNum].getMultiBlock() != VariableTracking::MBS_SingleBlock;
}
-const Inst *VariablesMetadata::getFirstDefinition(const Variable *Var) const {
+const Inst *
+VariablesMetadata::getFirstDefinitionSingleBlock(const Variable *Var) const {
assert(Kind != VMK_Uses);
if (!isTracked(Var))
return nullptr; // conservative answer
SizeT VarNum = Var->getIndex();
- return Metadata[VarNum].getFirstDefinition();
+ return Metadata[VarNum].getFirstDefinitionSingleBlock();
}
const Inst *VariablesMetadata::getSingleDefinition(const Variable *Var) const {
@@ -380,6 +395,14 @@ const Inst *VariablesMetadata::getSingleDefinition(const Variable *Var) const {
return Metadata[VarNum].getSingleDefinition();
}
+const Inst *VariablesMetadata::getFirstDefinition(const Variable *Var) const {
+ assert(Kind != VMK_Uses);
+ if (!isTracked(Var))
+ return nullptr; // conservative answer
+ SizeT VarNum = Var->getIndex();
+ return Metadata[VarNum].getFirstDefinition();
+}
+
const InstDefList &
VariablesMetadata::getLatterDefinitions(const Variable *Var) const {
assert(Kind == VMK_All);
« no previous file with comments | « src/IceOperand.h ('k') | src/IceRegAlloc.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698