Skip to content

Commit

Permalink
Correct register dependencies for x86 tableEvaluator
Browse files Browse the repository at this point in the history
For non-Java projects the register dependencies for GlRegDeps were not
added to the indirect jump instruction, leading to incorrect register
assignment.  Add the appropriate register dependencies.

Signed-off-by: Daryl Maier <maier@ca.ibm.com>
  • Loading branch information
0xdaryl committed Feb 26, 2019
1 parent dba8966 commit c1d9086
Showing 1 changed file with 11 additions and 10 deletions.
21 changes: 11 additions & 10 deletions compiler/x/codegen/ControlFlowEvaluator.cpp
Expand Up @@ -491,22 +491,23 @@ TR::Register *OMR::X86::TreeEvaluator::tableEvaluator(TR::Node *node, TR::CodeGe
}

TR::X86MemTableInstruction *jmpTableInstruction = NULL;
TR::RegisterDependencyConditions *deps = NULL;

if (cg->getLinkage()->getProperties().getMethodMetaDataRegister() != TR::RealRegister::NoReg)
// Add GlRegDep dependencies to indirect jump
//
if (secondChild->getNumChildren() > 0)
{
TR::RegisterDependencyConditions *deps = NULL;

if (secondChild->getNumChildren() > 0)
{
deps = generateRegisterDependencyConditions(secondChild->getFirstChild(), cg, 0, NULL);
deps->stopAddingConditions();
}
deps = generateRegisterDependencyConditions(secondChild->getFirstChild(), cg, 0, NULL);
deps->stopAddingConditions();
}

if (cg->getLinkage()->getProperties().getMethodMetaDataRegister() != TR::RealRegister::NoReg)
{
jmpTableInstruction = generateMemTableInstruction(JMPMem, node, jumpMR, numBranchTableEntries, deps, cg);
}
else
{
generateMemInstruction(JMPMem, node, jumpMR, cg);
generateMemInstruction(JMPMem, node, jumpMR, deps, cg);
}

for (i = 2; i < node->getNumChildren(); ++i)
Expand Down Expand Up @@ -2318,7 +2319,7 @@ static bool virtualGuardHelper(TR::Node *node, TR::CodeGenerator *cg)
{
site = virtualGuard->addNOPSite();
}
else
else
{
site = comp->addSideEffectNOPSite();
}
Expand Down

0 comments on commit c1d9086

Please sign in to comment.