| Index: src/IceOperand.cpp
|
| diff --git a/src/IceOperand.cpp b/src/IceOperand.cpp
|
| index 5d7aa426086648cb51b8cde2ee150eb94d9378d2..3485b602c6d8115b4a7367fb3353a71e56a4dd87 100644
|
| --- a/src/IceOperand.cpp
|
| +++ b/src/IceOperand.cpp
|
| @@ -299,9 +299,10 @@ void VariableTracking::markDef(MetadataKind TrackingKind, const Inst *Instr,
|
| markUse(TrackingKind, Instr, Node, IsImplicit);
|
| if (TrackingKind == VMK_Uses)
|
| return;
|
| - if (FirstOrSingleDefinition == nullptr)
|
| + if (FirstOrSingleDefinition == nullptr) {
|
| FirstOrSingleDefinition = Instr;
|
| - else if (TrackingKind == VMK_All)
|
| + FirstOrSingleDefinitionNode = Node;
|
| + } else if (TrackingKind == VMK_All)
|
| Definitions.push_back(Instr);
|
| switch (MultiDef) {
|
| case MDS_Unknown:
|
| @@ -357,6 +358,19 @@ const Inst *VariableTracking::getSingleDefinition() const {
|
| return nullptr;
|
| }
|
|
|
| +const CfgNode *VariableTracking::getSingleDefinitionNode() const {
|
| + switch (MultiDef) {
|
| + case MDS_Unknown:
|
| + case MDS_MultiDefMultiBlock:
|
| + case MDS_MultiDefSingleBlock:
|
| + return nullptr;
|
| + case MDS_SingleDef:
|
| + assert(FirstOrSingleDefinitionNode);
|
| + return FirstOrSingleDefinitionNode;
|
| + }
|
| + return nullptr;
|
| +}
|
| +
|
| const Inst *VariableTracking::getFirstDefinition() const {
|
| switch (MultiDef) {
|
| case MDS_Unknown:
|
| @@ -498,6 +512,15 @@ const Inst *VariablesMetadata::getSingleDefinition(const Variable *Var) const {
|
| return Metadata[VarNum].getSingleDefinition();
|
| }
|
|
|
| +const CfgNode *
|
| +VariablesMetadata::getSingleDefinitionNode(const Variable *Var) const {
|
| + assert(Kind != VMK_Uses);
|
| + if (!isTracked(Var))
|
| + return nullptr; // conservative answer
|
| + SizeT VarNum = Var->getIndex();
|
| + return Metadata[VarNum].getSingleDefinitionNode();
|
| +}
|
| +
|
| const Inst *VariablesMetadata::getFirstDefinition(const Variable *Var) const {
|
| assert(Kind != VMK_Uses);
|
| if (!isTracked(Var))
|
|
|