Skip to content

Commit

Permalink
Simplify the Power ZEROCHK evaluator
Browse files Browse the repository at this point in the history
Previously, the ZEROCHK evaluator in the Power codegen had a lot of
special casing to try to perform comparisons directly into condition
registers. Since functionality has now been added to perform this
optimization in a more general manner, this code can now be replaced
with a simple call to evaluateToConditionRegister.

Signed-off-by: Ben Thomas <ben@benthomas.ca>
  • Loading branch information
aviansie-ben committed Sep 15, 2020
1 parent ca96a08 commit 7f0cab9
Showing 1 changed file with 5 additions and 58 deletions.
63 changes: 5 additions & 58 deletions compiler/p/codegen/ControlFlowEvaluator.cpp
Expand Up @@ -4613,67 +4613,14 @@ TR::Register *OMR::Power::TreeEvaluator::ZEROCHKEvaluator(TR::Node *node, TR::Co

// Inline instructions for the check
//
TR::Node *valueToCheck = node->getFirstChild();

if (valueToCheck->getOpCode().isBooleanCompare() &&
valueToCheck->getChild(0)->getOpCode().isIntegerOrAddress() &&
valueToCheck->getChild(1)->getOpCode().isIntegerOrAddress() &&
performTransformation(cg->comp(), "O^O CODEGEN Optimizing ZEROCHK+%s %s\n", valueToCheck->getOpCode().getName(), valueToCheck->getName(cg->getDebug())))
{
if (valueToCheck->getOpCode().isCompareForOrder())
{
if (valueToCheck->getChild(0)->getOpCode().is8Byte() ||
valueToCheck->getChild(1)->getOpCode().is8Byte())
{
// switch branches since we want to go to OOL on node evaluating to 0
// which corresponds to an ifcmp fall-through
TR::InstOpCode::Mnemonic branchOp = cmp2branch(valueToCheck->getOpCode().getOpCodeForReverseBranch(), cg);
TR::InstOpCode::Mnemonic reverseBranchOp = cmp2branch(valueToCheck->getOpCodeValue(), cg);
TR::TreeEvaluator::compareLongsForOrder(branchOp, reverseBranchOp, slowPathLabel, valueToCheck, cg,
valueToCheck->getOpCode().isUnsignedCompare(), true, PPCOpProp_BranchUnlikely);
}
else
{
// switch branches since we want to go to OOL on node evaluating to 0
// which corresponds to an ifcmp fall-through
TR::TreeEvaluator::compareIntsForOrder(cmp2branch(valueToCheck->getOpCode().getOpCodeForReverseBranch(), cg),
slowPathLabel, valueToCheck, cg, valueToCheck->getOpCode().isUnsignedCompare(),
true, PPCOpProp_BranchUnlikely);
}
}
else
{
TR_ASSERT(valueToCheck->getOpCode().isCompareForEquality(), "Compare opcode must either be compare for order or for equality");
if (valueToCheck->getChild(0)->getOpCode().is8Byte() ||
valueToCheck->getChild(1)->getOpCode().is8Byte())
{
// switch branches since we want to go to OOL on node evaluating to 0
// which corresponds to an ifcmp fall-through
TR::TreeEvaluator::compareLongsForEquality(cmp2branch(valueToCheck->getOpCode().getOpCodeForReverseBranch(), cg),
slowPathLabel, valueToCheck, cg, true, PPCOpProp_BranchUnlikely);
}
else
{
TR::TreeEvaluator::compareIntsForEquality(cmp2branch(valueToCheck->getOpCode().getOpCodeForReverseBranch(), cg),
slowPathLabel, valueToCheck, cg, true, PPCOpProp_BranchUnlikely);
}
}
}
else
{
TR::Register *value = cg->evaluate(node->getFirstChild());
TR::Register *condReg = cg->allocateRegister(TR_CCR);
if (cg->comp()->target().is64Bit())
generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::cmpi8, node, condReg, value, 0);
else
generateTrg1Src1ImmInstruction(cg, TR::InstOpCode::cmpi4, node, condReg, value, 0);
generateConditionalBranchInstruction(cg, TR::InstOpCode::beq, PPCOpProp_BranchUnlikely, node, slowPathLabel, condReg);
TR::Register *condReg = cg->allocateRegister(TR_CCR);
CompareCondition cond = evaluateToConditionRegister(condReg, node, node->getFirstChild(), cg);

cg->decReferenceCount(node->getFirstChild());
cg->stopUsingRegister(condReg);
}
generateConditionalBranchInstruction(cg, compareConditionToBranch(reverseCondition(cond)), PPCOpProp_BranchUnlikely, node, slowPathLabel, condReg);
generateLabelInstruction(cg, TR::InstOpCode::label, node, restartLabel);

cg->stopUsingRegister(condReg);
cg->decReferenceCount(node->getFirstChild());
return NULL;
}

Expand Down

0 comments on commit 7f0cab9

Please sign in to comment.