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); |