Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Define getOriginalUnimprovedSymRef()
This method returns a version (so to speak) of the given symbol
reference that does not include any "improvements" such as a known
object index. Such improvements are persisted analysis results, and in
cases where the analysis could have been flow-sensitive, they must be
forgotten on copies of nodes created for code motion.

Signed-off-by: Devin Papineau <devinmp@ca.ibm.com>
  • Loading branch information
jdmpapin committed Jul 17, 2019
1 parent 2012e93 commit 0b1535d
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 4 deletions.
42 changes: 39 additions & 3 deletions compiler/compile/OMRSymbolReferenceTable.cpp
Expand Up @@ -112,7 +112,8 @@ OMR::SymbolReferenceTable::SymbolReferenceTable(size_t sizeHint, TR::Compilation
_methodsBySignature(8, comp->allocator("SymRefTab")), // TODO: Determine a suitable default size
_hasImmutable(false),
_hasUserField(false),
_sharedAliasMap(NULL)
_sharedAliasMap(NULL),
_originalUnimprovedSymRefs(std::less<int32_t>(), comp->allocator())
{
_numHelperSymbols = TR_numRuntimeHelpers + 1;;

Expand Down Expand Up @@ -474,14 +475,17 @@ OMR::SymbolReferenceTable::createRefinedArrayShadowSymbolRef(TR::DataType type)
TR::SymbolReference * symRef = getSymRef(getArrayShadowIndex(type));
symRef->setReallySharesSymbol();

return createRefinedArrayShadowSymbolRef(type, (TR::Symbol *) symRef->getSymbol());
return createRefinedArrayShadowSymbolRef(type, (TR::Symbol *) symRef->getSymbol(), symRef);
}



//TODO: to be changed to a special sym ref to be used by intrinsics
TR::SymbolReference *
OMR::SymbolReferenceTable::createRefinedArrayShadowSymbolRef(TR::DataType type, TR::Symbol *sym)
OMR::SymbolReferenceTable::createRefinedArrayShadowSymbolRef(
TR::DataType type,
TR::Symbol *sym,
TR::SymbolReference *original)
{
const bool trace=false;
sym->setArrayShadowSymbol();
Expand Down Expand Up @@ -519,6 +523,8 @@ OMR::SymbolReferenceTable::createRefinedArrayShadowSymbolRef(TR::DataType type,
aliasBuilder.refinedNonIntPrimitiveArrayShadows().print(comp());
traceMsg(comp(),"\n");
}

rememberOriginalUnimprovedSymRef(newRef, original);
return newRef;
}

Expand Down Expand Up @@ -1037,6 +1043,7 @@ OMR::SymbolReferenceTable::findOrCreateSymRefWithKnownObject(TR::SymbolReference
aliasBuilder.immutableArrayElementSymRefs().set(index);
}

rememberOriginalUnimprovedSymRef(result, originalSymRef);
return result;
}

Expand Down Expand Up @@ -2031,3 +2038,32 @@ OMR::SymbolReferenceTable::findOrCreateOSRFearPointHelperSymbolRef()
}
return element(osrFearPointHelperSymbol);
}

TR::SymbolReference *
OMR::SymbolReferenceTable::getOriginalUnimprovedSymRef(TR::SymbolReference *symRef)
{
auto entry = _originalUnimprovedSymRefs.find(symRef->getReferenceNumber());
if (entry == _originalUnimprovedSymRefs.end())
return symRef;
else
return getSymRef(entry->second);
}

void
OMR::SymbolReferenceTable::rememberOriginalUnimprovedSymRef(
TR::SymbolReference *improved,
TR::SymbolReference *original)
{
original = getOriginalUnimprovedSymRef(original);
auto insertResult = _originalUnimprovedSymRefs.insert(
std::make_pair(improved->getReferenceNumber(), original->getReferenceNumber()));

auto entryPreventingInsertion = insertResult.first;
bool insertionSucceeded = insertResult.second;
TR_ASSERT_FATAL(
insertionSucceeded,
"original unimproved symref collision for #%d: originals are #%d and #%d",
improved->getReferenceNumber(),
entryPreventingInsertion->second,
original->getReferenceNumber());
}
15 changes: 14 additions & 1 deletion compiler/compile/OMRSymbolReferenceTable.hpp
Expand Up @@ -604,7 +604,7 @@ class SymbolReferenceTable
TR::SymbolReference * findOrCreateCounterAddressSymbolRef();
TR::SymbolReference * findOrCreateCounterSymRef(char *name, TR::DataType d, void *address);
TR::SymbolReference * createRefinedArrayShadowSymbolRef(TR::DataType);
TR::SymbolReference * createRefinedArrayShadowSymbolRef(TR::DataType, TR::Symbol *); // TODO: to be changed to a special sym ref
TR::SymbolReference * createRefinedArrayShadowSymbolRef(TR::DataType, TR::Symbol *, TR::SymbolReference *original); // TODO: to be changed to a special sym ref
bool isRefinedArrayShadow(TR::SymbolReference *symRef);
bool isImmutableArrayShadow(TR::SymbolReference *symRef);

Expand All @@ -626,6 +626,9 @@ class SymbolReferenceTable
// Retrieve shared aliases bitvector for a given symbol reference
TR_BitVector *getSharedAliases(TR::SymbolReference *sr);

// For code motion
TR::SymbolReference *getOriginalUnimprovedSymRef(TR::SymbolReference *symRef);

protected:
/** \brief
* This function creates the symbol reference given a temp symbol and the known object index
Expand Down Expand Up @@ -665,6 +668,8 @@ class SymbolReferenceTable

char *strdup(const char *arg);

void rememberOriginalUnimprovedSymRef(TR::SymbolReference *improved, TR::SymbolReference *original);

TR::Symbol * _genericIntShadowSymbol;

TR::Symbol * _constantAreaSymbol;
Expand Down Expand Up @@ -704,6 +709,14 @@ class SymbolReferenceTable
typedef std::map<int32_t, TR_BitVector *, std::less<int32_t>, AliasMapAllocator> AliasMap;
AliasMap *_sharedAliasMap;

// _originalUnimprovedSymRefs maps the reference number of an
// improved/refined symbol reference to the reference number of the original
// unimproved/unrefined symbol reference, which is suitable for code motion
// in case the improvement was due to a flow-sensitive analysis.
typedef TR::typed_allocator<std::pair<const int32_t, int32_t>, TR::Allocator> OriginalUnimprovedMapAlloc;
typedef std::map<int32_t, int32_t, std::less<int32_t>, OriginalUnimprovedMapAlloc> OriginalUnimprovedMap;
OriginalUnimprovedMap _originalUnimprovedSymRefs;

TR_FrontEnd *_fe;
TR::Compilation *_compilation;
TR_Memory *_trMemory;
Expand Down
5 changes: 5 additions & 0 deletions compiler/il/OMRSymbolReference.hpp
Expand Up @@ -293,6 +293,11 @@ class OMR_EXTENSIBLE SymbolReference

bool isOSRInductionHelper();

TR::SymbolReference *getOriginalUnimprovedSymRef(TR::Compilation *comp)
{
return comp->getSymRefTab()->getOriginalUnimprovedSymRef(self());
}

protected:

/**
Expand Down

0 comments on commit 0b1535d

Please sign in to comment.