From c6a824885774ef92d897e89f8fc0a71c90d96314 Mon Sep 17 00:00:00 2001 From: Annabelle Huo Date: Tue, 23 Nov 2021 17:10:57 -0500 Subject: [PATCH] Do not rematerialize register for class pointer or method pointer Do not rematerialize register for class pointer or method pointer if it's AOT compilation because it doesn't have node info in register rematerialization to create relocation record for the class pointer or the method pointer. Signed-off-by: Annabelle Huo --- compiler/x/codegen/OMRTreeEvaluator.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/compiler/x/codegen/OMRTreeEvaluator.cpp b/compiler/x/codegen/OMRTreeEvaluator.cpp index 0f9d50a1b3f..00788ae4b61 100644 --- a/compiler/x/codegen/OMRTreeEvaluator.cpp +++ b/compiler/x/codegen/OMRTreeEvaluator.cpp @@ -392,7 +392,12 @@ TR::Register *OMR::X86::TreeEvaluator::loadConstant(TR::Node * node, intptr_t va TR::Instruction *instr = TR::TreeEvaluator::insertLoadConstant(node, targetRegister, value, type, cg); - if (cg->enableRematerialisation()) + // Do not rematerialize register for class pointer or method pointer if + // it's AOT compilation because it doesn't have node info in register + // rematerialization to create relocation record for the class pointer + // or the method pointer. + if (cg->enableRematerialisation() && + !(cg->comp()->compileRelocatableCode() && node && node->getOpCodeValue() == TR::aconst && (node->isClassPointerConstant() || node->isMethodPointerConstant()))) { if (node && node->getOpCode().hasSymbolReference() && node->getSymbol() && node->getSymbol()->isClassObject()) (TR::Compiler->om.generateCompressedObjectHeaders() || cg->comp()->target().is32Bit()) ? type = TR_RematerializableInt : type = TR_RematerializableLong;