diff --git a/runtime/compiler/env/j9method.cpp b/runtime/compiler/env/j9method.cpp index 4998b07c35b..c56da934e22 100644 --- a/runtime/compiler/env/j9method.cpp +++ b/runtime/compiler/env/j9method.cpp @@ -8516,31 +8516,29 @@ TR_J9ByteCodeIlGenerator::walkReferenceChain(TR::Node *node, uintptrj_t receiver { TR_J9VMBase *fej9 = (TR_J9VMBase *)(comp()->fe()); uintptrj_t result = 0; - switch (node->getOpCodeValue()) + if (node->getOpCode().isLoadDirect() && node->getType() == TR::Address) { - case TR::aload: - TR_ASSERT(node->getSymbolReference()->getCPIndex() == 0, "walkReferenceChain expecting aload of 'this'; found aload of %s", comp()->getDebug()->getName(node->getSymbolReference())); - result = receiver; - break; - case TR::aloadi: + TR_ASSERT(node->getSymbolReference()->getCPIndex() == 0, "walkReferenceChain expecting aload of 'this'; found aload of %s", comp()->getDebug()->getName(node->getSymbolReference())); + result = receiver; + } + else if (node->getOpCode().isLoadIndirect() && node->getType() == TR::Address) + { + TR::SymbolReference *symRef = node->getSymbolReference(); + if (symRef->isUnresolved()) { - TR::SymbolReference *symRef = node->getSymbolReference(); - if (symRef->isUnresolved()) - { - if (comp()->getOption(TR_TraceILGen)) - traceMsg(comp(), " walkReferenceChain hit unresolved symref %s; aborting\n", symRef->getName(comp()->getDebug())); - comp()->failCompilation("Symbol reference is unresolved"); - } - TR::Symbol *sym = symRef->getSymbol(); - TR_ASSERT(sym->isShadow() && symRef->getCPIndex() > 0, "walkReferenceChain expecting field load; found load of %s", comp()->getDebug()->getName(symRef)); - uintptrj_t fieldOffset = symRef->getOffset() - sizeof(J9Object); // blah - result = fej9->getReferenceFieldAt(walkReferenceChain(node->getFirstChild(), receiver), fieldOffset); + if (comp()->getOption(TR_TraceILGen)) + traceMsg(comp(), " walkReferenceChain hit unresolved symref %s; aborting\n", symRef->getName(comp()->getDebug())); + comp()->failCompilation("Symbol reference is unresolved"); } - break; - default: - TR_ASSERT(0, "Unexpected opcode in walkReferenceChain: %s", node->getOpCode().getName()); - comp()->failCompilation("Unexpected opcode in walkReferenceChain"); - break; + TR::Symbol *sym = symRef->getSymbol(); + TR_ASSERT(sym->isShadow() && symRef->getCPIndex() > 0, "walkReferenceChain expecting field load; found load of %s", comp()->getDebug()->getName(symRef)); + uintptrj_t fieldOffset = symRef->getOffset() - sizeof(J9Object); // blah + result = fej9->getReferenceFieldAt(walkReferenceChain(node->getFirstChild(), receiver), fieldOffset); + } + else + { + TR_ASSERT(0, "Unexpected opcode in walkReferenceChain: %s", node->getOpCode().getName()); + comp()->failCompilation("Unexpected opcode in walkReferenceChain"); } if (comp()->getOption(TR_TraceILGen))