Skip to content

Commit

Permalink
Fix riscv gprClobberEvaluate to ensure correct gc flags are set on ne…
Browse files Browse the repository at this point in the history
…w register

The method gprClobberEvaluate may allocate a new register. In this case, the
new register may need to be flagged as a collected reference or an internal
pointer. This commit ensures that these two flags are propagated from the old
register.

Issue: eclipse-openj9/openj9#8397

Signed-off-by: Ryan Shukla <ryans@ibm.com>
  • Loading branch information
mayshukla committed Sep 2, 2020
1 parent 880d959 commit f3c4501
Showing 1 changed file with 25 additions and 1 deletion.
26 changes: 25 additions & 1 deletion compiler/riscv/codegen/OMRCodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -351,8 +351,32 @@ TR::Register *OMR::RV::CodeGenerator::gprClobberEvaluate(TR::Node *node)
{
if (node->getReferenceCount() > 1)
{
TR::Register *sourceReg = self()->evaluate(node);
TR::Register *targetReg = self()->allocateRegister();
generateITYPE(TR::InstOpCode::_addi, node, targetReg, self()->evaluate(node), 0, self());
generateITYPE(TR::InstOpCode::_addi, node, targetReg, sourceReg, 0, self());

if (sourceReg->containsCollectedReference())
{
if (self()->comp()->getOption(TR_TraceCG))
traceMsg(
self()->comp(),
"Setting containsCollectedReference on register %s\n",
self()->getDebug()->getName(targetRegister));
targetReg->setContainsCollectedReference();
}
if (sourceReg->containsInternalPointer())
{
TR::AutomaticSymbol *pinningArrayPointer = sourceRegister->getPinningArrayPointer();
if (self()->comp()->getOption(TR_TraceCG))
traceMsg(
self()->comp(),
"Setting containsInternalPointer on register %s and setting pinningArrayPointer to " POINTER_PRINTF_FORMAT "\n",
self()->getDebug()->getName(targetRegister),
pinningArrayPointer);
targetReg->setContainsInternalPointer();
targetReg->setPinningArrayPointer(pinningArrayPointer);
}

return targetReg;
}
else
Expand Down

0 comments on commit f3c4501

Please sign in to comment.