From e86a1975cc69f69861279df2df8701401bac0a80 Mon Sep 17 00:00:00 2001 From: Filip Jeremic Date: Wed, 17 Oct 2018 15:28:04 -0400 Subject: [PATCH] Fix ICF assert in pdcmpgt vector evaluator The vector registers in question are marked as part of the ICF which is certainly not the case. RA will assert that we are trying to assign registers within ICF. To alleviate this we add a label right after the vector compare instruction and set ICF on the label. Signed-off-by: Filip Jeremic --- .../compiler/z/codegen/J9BCDTreeEvaluator.cpp | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/runtime/compiler/z/codegen/J9BCDTreeEvaluator.cpp b/runtime/compiler/z/codegen/J9BCDTreeEvaluator.cpp index 002fefaad44..83674753872 100644 --- a/runtime/compiler/z/codegen/J9BCDTreeEvaluator.cpp +++ b/runtime/compiler/z/codegen/J9BCDTreeEvaluator.cpp @@ -2701,8 +2701,8 @@ J9::Z::TreeEvaluator::pdcmpVectorEvaluatorHelper(TR::Node *node, TR::CodeGenerat generateRRInstruction(cg, TR::Compiler->target.is64Bit() ? TR::InstOpCode::XGR : TR::InstOpCode::XR, node, resultReg, resultReg); generateLoad32BitConstant(cg, node, 1, resultReg, true); - TR::RegisterDependencyConditions* deps = new(cg->trHeapMemory()) TR::RegisterDependencyConditions(0, 1, cg); - TR::LabelSymbol* doneCompareLabel = TR::LabelSymbol::create(cg->trHeapMemory(), cg); + TR::RegisterDependencyConditions* deps = new(cg->trHeapMemory()) TR::RegisterDependencyConditions(0, 2, cg); + deps->addPostConditionIfNotAlreadyInserted(resultReg, TR::RealRegister::AssignAny); TR::Node* pd1Node = node->getFirstChild(); TR::Node* pd2Node = node->getSecondChild(); @@ -2713,40 +2713,45 @@ J9::Z::TreeEvaluator::pdcmpVectorEvaluatorHelper(TR::Node *node, TR::CodeGenerat // TODO: should we correct bad sign before comparing them TR::Instruction* cursor = generateVRRhInstruction(cg, TR::InstOpCode::VCP, node, pd1Value, pd2Value, 0); + TR::LabelSymbol* ifcStartLabel = generateLabelSymbol(cg); + cursor = generateS390LabelInstruction(cg, TR::InstOpCode::LABEL, node, ifcStartLabel); cursor->setStartInternalControlFlow(); - deps->addPostConditionIfNotAlreadyInserted(resultReg, TR::RealRegister::AssignAny); + + TR::LabelSymbol* icfEndLabel = generateLabelSymbol(cg); // Generate Branch Instructions switch(node->getOpCodeValue()) { case TR::pdcmpeq: - generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC0, node, doneCompareLabel); + cursor = generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC0, node, icfEndLabel); break; case TR::pdcmpne: - generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC1, node, doneCompareLabel); - generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC2, node, doneCompareLabel); + cursor = generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC1, node, icfEndLabel); + cursor = generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC2, node, icfEndLabel); break; case TR::pdcmplt: - generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC1, node, doneCompareLabel); + cursor = generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC1, node, icfEndLabel); break; case TR::pdcmple: - generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC0, node, doneCompareLabel); - generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC1, node, doneCompareLabel); + cursor = generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC0, node, icfEndLabel); + cursor = generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC1, node, icfEndLabel); break; case TR::pdcmpgt: - generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC2, node, doneCompareLabel); + cursor = generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC2, node, icfEndLabel); break; case TR::pdcmpge: - generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC0, node, doneCompareLabel); - generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC2, node, doneCompareLabel); + cursor = generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC0, node, icfEndLabel); + cursor = generateS390BranchInstruction(cg, TR::InstOpCode::BRC, TR::InstOpCode::COND_CC2, node, icfEndLabel); break; default: TR_ASSERT(0, "Unrecognized op code in pd cmp vector evaluator helper."); } - cursor = generateLoad32BitConstant(cg, node, 0, resultReg, true); - cursor = generateS390LabelInstruction(cg, TR::InstOpCode::LABEL, node, doneCompareLabel); - cursor->setDependencyConditions(deps); + // TODO: The only reason we keep track of the cursor here is because `deps` has to be passed in after `cursor`. We + // don't really need this restriction however if we rearrange the parameters. + cursor = generateLoad32BitConstant(cg, node, 0, resultReg, true, cursor, deps); + + cursor = generateS390LabelInstruction(cg, TR::InstOpCode::LABEL, node, icfEndLabel, deps); cursor->setEndInternalControlFlow(); node->setRegister(resultReg);