Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial Commit of the MicroJIT Project #9578

Open
wants to merge 25 commits into
base: master
Choose a base branch
from

Conversation

Scott-Young-6746
Copy link

@Scott-Young-6746 Scott-Young-6746 commented May 15, 2020

MicroJIT is a work-in-progress templated JIT compiler that is a part of a research project between IBM and UNB. This PR is the initial contribution of MicroJIT.

Given an openj9-openjdk-jdk8 repository with support for the --enable-microjit flag, these commits will allow someone to test the current partial implementation of MicroJIT which can compile relatively few methods, however, it is asynchronous and does not prevent TR from compiling.

Compiling this project without the --enable-microjit flag in a supporting openj9-openjdk-jdk8, or in a repository without support for --enable-microjit, does not compile code associated with the MicroJIT project.

When compiling with the --enable-microjit flag in a supporting openj9-openjdk-jdk8 this code modifies the BytecodeInterpreter and the CompilationInfoPerThreadBase to allow methods to be compiled with the prototypical MicroJIT, and execute those compiled methods, without impeding the interpreter's ability to maintain an accurate count for TRs compilation threshold.

This PR also contains additions to several files in openj9/runtime/compiler to support MicroJIT compilation and MetaData structures to support both method compilation and execution of compiled methods.

See also:
ibmruntimes/openj9-openjdk-jdk8#413
Issue #9582

Signed-off-by: Scott Young [email protected]

Copy link
Contributor

@dsouzai dsouzai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a massive PR. Could this be broken up into smaller pieces? Also is there an issue outlining the general design?

@andrewcraik
Copy link
Contributor

This definitely warrants and issue with a design. FYI @mstoodle since this likely is big enought to trigger a higher level eclipse process.

@0xdaryl
Copy link
Contributor

0xdaryl commented May 15, 2020

Perhaps also introducing this work at one of the upcoming OpenJ9 community calls.

@Scott-Young-6746
Copy link
Author

This definitely warrants and issue with a design. FYI @mstoodle since this likely is big enought to trigger a higher level eclipse process.

I had not thought of that, I'll begin creating the issue immediately and link it in the PR 👍

@mstoodle
Copy link
Contributor

yes, the size may warrant a CQ be filled out, as we get closer to the final state of the PR.

@Scott-Young-6746
Copy link
Author

This is a massive PR. Could this be broken up into smaller pieces? Also is there an issue outlining the general design?

An issue has been created and mentioned in the PR. Thank you for the feedback 😄

@andrewcraik
Copy link
Contributor

I think the discussion should move over to the design issue (which needs a lot more details on the proposal) and probably discussion on a community call before a contribution of this size and complexity can be reviewed. @Scott-Young-6746 is the commit history as clean as it could be? It would be nice to have logical commits for the places where the code integrates into OpenJ9 as well as for the various parts of the microjit. At present it seems more like a stream of evoluation which is going to make the review harder since everyone has to look at everything...

@0xdaryl I am guesisng we are going to need some manual ECA verification on this because there are multiple commit authors on this code...

@Scott-Young-6746
Copy link
Author

@Scott-Young-6746 is the commit history as clean as it could be? It would be nice to have logical commits for the places where the code integrates into OpenJ9 as well as for the various parts of the microjit. At present it seems more like a stream of evoluation which is going to make the review harder since everyone has to look at everything...

Thank you for the feedback Andrew. Are there any resources you can point me to that would illustrate how to modify the commit history?

I also received a suggestion late in the creation of the PR to wrap my code in #if defined(J9VM_OPT_MICROJIT) to make it easier to separate my changes from a VM that isn't using MicroJIT. Will that complicate the process of fixing the commit history?

compiler/microjit/x/amd64/AMD64Linkage.cpp \
compiler/microjit/x/amd64/templates/linkage.nasm \
compiler/microjit/x/amd64/templates/bytecodes.nasm
endif
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The line-end is missing here.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, I've updated all file-endings to have the required new-line at EOF.

@@ -288,7 +288,8 @@ ifeq ($(HOST_ARCH),x)
NASM_INCLUDES=\
$(J9SRC)/oti \
$(J9SRC)/compiler \
$(J9SRC)/compiler/x/runtime
$(J9SRC)/compiler/x/runtime \
$(J9SRC)/compiler/microjit/assembly
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this not conditional on J9VM_OPT_MICROJIT?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for catching this, it has been moved into a guarded area.

static void setInitialMJITCountUnsynchronized(J9Method *method, int32_t mjitThreshold, int32_t trThreshold)
{
int32_t value = 0;
if(mjitThreshold < trThreshold)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Formatting: space after if (throughout).

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have updated the formatting of all if statements added by us in this file. Thank you for catching this!

int32_t value = 0;
if(mjitThreshold < trThreshold)
{
value = (trThreshold - mjitThreshold << 1) | 1;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More parentheses required:

    value = ((trThreshold - mjitThreshold) << 1) | 1;

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now, thank you for catching this.


char * jitStackOverflowPatchLocation = NULL;

mjit_cg.setPeakStackSize(romMethod->maxStack * 8);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is 8 here? Does it assume a 64-bit target?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are starting with x86-64, however this should not have been a magic value and we do want to make supporting other architectures easier. I added a method for getting the pointer size from the MicroJIT code generator.

runtime/makelib/targets.mk.linux.inc.ftl Outdated Show resolved Hide resolved
@@ -39,6 +39,10 @@ typedef struct J9SidecarExitFunction {
void (*func)(void);
} J9SidecarExitFunction;

#if defined(J9VM_OPT_MICROJIT)
typedef struct J9JITConfig J9MicroJITConfig;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the value of this definition? Why not just use struct J9JITConfig?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this was a hold-over from the original attempt to port the old MicroJIT. I've removed it and replaced usage with the struct J9JITConfig as suggested.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only remaining change to this file is the copyright date: please revert that - no changes are required here.

@@ -282,7 +282,7 @@ const char * const maciek_JavaBCNames[] = {
"JBunimplemented" /* 240 */,
"JBunimplemented" /* 241 */,
"JBunimplemented" /* 242 */,
"JBreturnToMicroJIT" /* 243 */,
"JBunimplemented" /* 243 */,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this change should be conditional on defined(J9VM_OPT_MICROJIT).

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've replaced it with an if defined() else endif section. This might need to be removed later though; as far as I know JBreturnToMicroJIT was for the old MicroJIT and nothing is using it anymore that I know of.

runtime/vm/BytecodeInterpreter.hpp Outdated Show resolved Hide resolved
runtime/compiler/build/toolcfg/common.mk Outdated Show resolved Hide resolved
@0xdaryl
Copy link
Contributor

0xdaryl commented May 21, 2020

I just took a quick glance over the code so I haven't digested this technically yet. However, one question I do have is other than the compilation control aspects, is there any sharing between the OpenJ9 JIT (i.e., what you find in the compiler directory) and your MicroJIT? Put another way, should microjit be a sibling of compiler rather than a child? My initial feel is that a sibling relationship is more appropriate as it is nearly a stand-alone component and perhaps in the future there could be some JVM environments that can only afford to include a microjit. Perhaps this is a variant of the question @andrewcraik has already raised around interaction with existing technologies in the JVM.

@andrewcraik
Copy link
Contributor

Even if it is standalone in terms of operation of the template part could we share assets from the codegens (like the instruction encoding etc) to save duplication? Could we share some of the linkage implementation? GC mode support for things like read/write barriers?

It would also be good if we could standardize control options and logging formats/styles where reasonable. I would love an overview of where the current version is at. Again, my goal here is to lower the barrier to entry. We could almost even think of the microjit as another opt level below noOpt perhaps?

@Scott-Young-6746
Copy link
Author

I just took a quick glance over the code so I haven't digested this technically yet. However, one question I do have is other than the compilation control aspects, is there any sharing between the OpenJ9 JIT (i.e., what you find in the compiler directory) and your MicroJIT? Put another way, should microjit be a sibling of compiler rather than a child? My initial feel is that a sibling relationship is more appropriate as it is nearly a stand-alone component and perhaps in the future there could be some JVM environments that can only afford to include a microjit. Perhaps this is a variant of the question @andrewcraik has already raised around interaction with existing technologies in the JVM.

Thanks for the feedback Daryl! We do currently use the J9JITConfig, and methods supporting MicroJIT have been added to MetaData creation. We do have our own space for building supporting calls to allow the GC to work, but this area has a lot of work left to do. We will likely be moving towards using the existing Linkage and Properties in TR for MicroJIT as it might help with porting later.

@Scott-Young-6746
Copy link
Author

Even if it is standalone in terms of operation of the template part could we share assets from the codegens (like the instruction encoding etc) to save duplication? Could we share some of the linkage implementation? GC mode support for things like read/write barriers?

It would also be good if we could standardize control options and logging formats/styles where reasonable. I would love an overview of where the current version is at. Again, my goal here is to lower the barrier to entry. We could almost even think of the microjit as another opt level below noOpt perhaps?

Thanks for taking a look at this Andrew! I'll put a quick overview of the project's progress so far here:

Currently the project supports compiling a limited number of leaf methods.
Specifically, we do not yet support floating point operation, stack manipulation operations (e.g. the pop and dup bytecodes), or constant operations (e.g. iconst_0).

We have implemented and tested addition, subtraction, and multiplication of int and long variables and also support setting and loading static variables, though our getstatic and putstatic support is limited to fields that are resolvable at compile-time at this moment.

@Scott-Young-6746
Copy link
Author

Scott-Young-6746 commented May 27, 2020

Even if it is standalone in terms of operation of the template part could we share assets from the codegens (like the instruction encoding etc) to save duplication? Could we share some of the linkage implementation? GC mode support for things like read/write barriers?

It would also be good if we could standardize control options and logging formats/styles where reasonable. I would love an overview of where the current version is at. Again, my goal here is to lower the barrier to entry. We could almost even think of the microjit as another opt level below noOpt perhaps?

A fairly large number of bytecodes not in the PR are being tested and will be PRed once we get everything here up to code. On our internal build we are able to compile methods with the following bytecodes:

  • aload N
  • aload_(0|1|2|3)
  • astore N
  • astore_(0|1|2|3)
  • iload N
  • iload_(0|1|2|3)
  • istore N
  • istore_(0|1|2|3)
  • lload N
  • lload_(0|1|2|3)
  • lstore N
  • lstore_(0|1|2|3)
  • fload N
  • fload_(0|1|2|3)
  • fstore N
  • fstore_(0|1|2|3)
  • dload N
  • dload_(0|1|2|3)
  • dstore N
  • dstore_(0|1|2|3)
  • putfield[4]
  • getstatic
  • putstatic
  • iadd
  • isub
  • imul
  • iand
  • ior
  • ixor
  • idiv[1]
  • ladd
  • lsub
  • lmul
  • land
  • lor
  • lxor
  • return
  • invokestatic
  • iconst_(m1|0|1|2|3|4|5)
  • lconst_(0|1)
  • fconst_(0|1|2)
  • bipush
    [1]: We are currently trying to fix a bug related to the hardware interupt handler for divide-by-zero.
    [4]: Further testing required, also trying to find a way to ensure that GC Heap isn't being corrupted.

We are also trying to clean up as much of the debugging infrastructure so that it is in one place instead of peppered throughout the code.

We currently use the Compilation object for acquiring some meta-data for compilation.

We use a copy&patch approach to templates, which are all written in NASM assembly at the moment.

MicroJIT relies on TR for some data structures and is called by TR in the CompilationThread.cpp, so I don't know how we could cleanly separate the two unless we took the common components used by both and lifted them to a separate folder. Something like:

openj9
+--runtime
|  +--compilers
|  |  +--common
|  |  +--testarossa
|  |  +--MicroJIT

@Scott-Young-6746
Copy link
Author

Issue #9714 details a missing component of MicroJIT, namely support for OSR.

OSR support is not planned for this PR, however, MicroJIT should not cause unexpected behavior when OSR is enabled.

{
value = ((trThreshold - mjitThreshold) << 1) | 1;
}
method->extra2 = reinterpret_cast<void *>(value);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is likely to elicit a warning from the compiler: the cast simultaneously changes both the width and signed-ness.

Comment on lines 8813 to 8815
TR_MethodMetaData* metaData = NULL;
J9Method *method = NULL;
TR::CodeCache* codeCache = NULL;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd like to see better formatting consistency; this method uses three styles:

  TR_ResolvedMethod * compilee
  TR_MethodMetaData* metaData
  J9Method *method

Semantically, the * binds more tightly to the parameter or local name, so the first and third styles are less mis-leading. Pick one (not the second style) and be consistent.

if (_methodBeingCompiled->isDLTCompile())
compiler->setDltBcIndex(static_cast<J9::MethodInProgressDetails &>(_methodBeingCompiled->getMethodDetails()).getByteCodeIndex());

bool volatile haveLockedClassUnloadMonitor = false; // used for compilation without VM acces
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo: acces -> access

addParamIntToStack(RegisterStack* stack, U_16 size)
{
if(!stack->useRAX){
stack->useRAX = size/8;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the range of values for size? If it might be as large as 64, then useRAX must be wider than 2 bits.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the review Keith. This function is called from a function which is checking the parameters that are passed via type signature. It's converting bytes to slots so the range should be {8,16}. Though I am interested in knowing if there are any special cases which might not conform to that on the JIT side.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the review Keith. This function is called from a function which is checking the parameters that are passed via type signature. It's converting bytes to slots so the range should be {8,16}. Though I am interested in knowing if there are any special cases which might not conform to that on the JIT side.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure the space savings here is worth the added complexity: Why not just use uint8_t for fields like useRAX? The name could be improved the 'use' prefix implies 'boolean' to me.

Comment on lines +246 to +250
*(uint32_t *)cursor = e->_instructionStartPC, cursor += 4;
*(uint32_t *)cursor = e->_instructionEndPC, cursor += 4;
*(uint32_t *)cursor = e->_instructionHandlerPC, cursor += 4;
*(uint32_t *)cursor = e->_catchType, cursor += 4;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's no need to use the comma operator here, and the statements should be on separate lines:

  *(uint32_t *)cursor = e->_instructionStartPC;
  cursor += 4;

Likewise, several places below.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks again for the review Keith. This code was created because we needed a function to work on the MJIT_ExceptionTableEntryIterator. There is a nearly identical one used by TR above which was used as a starting point for this. The above lines of code were copied from that location.

Should I leave this code a is, modify both, or only make the change in the createMJITExceptionTable version?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll let someone more familiar with the existing code comment on whether it should be updated, but my suggestion is to avoid the comma operator in new code.


return data;
}
#endif /* J9VM_OPT_MICROJIT */
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Every file should end with a final new-line.

@Scott-Young-6746
Copy link
Author

This PR has been rebased and updated with changes to address the previous review by @keithc-ca

@andrewcraik
Copy link
Contributor

First meeting to discuss microjit in OpenJ9 Friday 19 June 2020 1pm EST on https://ibm.webex.com/join/ajcraik all are welcome
Agenda hosted in https://ibm.box.com/s/gyb8ld476ja2542uyytjr5p4no7mamy4
Call will use my webex: https://ibm.webex.com/join/ajcraik
All are welcome and please feel free to edit the box document to add additional items to the agenda.

@andrewcraik
Copy link
Contributor

The first meeting to discuss the contribution of MicroJIT to the OpenJ9 project has concluded. Overall it was a very positive and informative discussion - thank you everyone who participated and @Scott-Young-6746 for the overview of the current compiler design.

We have agreed to have another call on July 3 at 1pm EST continue discussions. In the meantime I will enumerate here some of the specific areas of integration where the MicroJIT developers are looking to get some specific technical help with integration:

  • compilation control (@mpirvu @DanHeidinga @vijaysun-omr) - specifically avoiding the need for an extra2 field using some kind of GCR-like self counting mechanism in the microJIT code and also how the microjit fits with the OpenJ9 optimization levels etc
  • linkage (@0xdaryl @andrewcraik @liqunl @fjeremic ) - looking to try and make the microJIT follow existing private linkage conventions to let existing tooling work with the compiled bodies more easily
  • stackwalker (@gacholio @DanHeidinga) - looking to make the compiled bodies integrate with these existing pieces of infrastructure

We have not had a discussion around testing, but we do need to consider how the template JIT is tested both at a unit and integration level (@fjeremic @Leonardo2718 @smlambert @LinHu2016 )

There is probably also a need for some documentation of the design in a markdown document to summarize some of the overview provided, but that can wait until the integration discussion/design has progressed.

I will post a link to the follow-on agenda once I have found a home for it as well as a posting to the recording of this meeting on the openj9 youtube channel once it is ready. We will also look to create a microjit channel on the openj9 community slack for further specific technical discussions to avoid this issue getting too large since there are a number of things to be worked through in preparation for a merge.

@vijaysun-omr
Copy link
Contributor

Regarding the compilation control question, I am wondering if there is some indication as to the relative compilation (CPU) time and scratch memory taken for micro JIT compiles in relation to cold and warm compilations in the full JIT. Perhaps @Scott-Young-6746 or @mpirvu have or can collect some data to give some insight that may help with the thought process on how to view these compiles in the overall picture.

Scott-Young-6746 and others added 25 commits May 13, 2022 13:20
…JIT project.

This project aims to introduce a lightweight templated JIT compiler to the OpenJ9 project.
While this feature is not yet production ready, it is usable in short applications from compiling some methods.

Co-authored-by: Eric Coffin <[email protected]>
Co-authored-by: Julie Brown <[email protected]>
Co-authored-by: Shubham Verma <[email protected]>
Co-authored-by: Harpreet Kaur <[email protected]>
Co-authored-by: Aaron Graham <[email protected]>
Signed-off-by: Scott Young <[email protected]>

Added assembly macro to aid in future template generation for a new lightweight templated JIT (MicroJIT)

//Signed-off-by: Scott Young <[email protected]>

Added MicroJIT exception table and included MetaData creation functions for later use by a MicroJIT compiler.

//Signed-off-by: Scott Young <[email protected]>

Added an assert for MicroJIT to identify errors as separate from TR.

//Signed-off-by: Scott Young <[email protected]>

Added first templates to be used by a future MicroJIT code generator for x86_64.

//Signed-off-by: Scott Young <[email protected]>

Added a MicroJIT code generator. This code generator is not yet used to create runnable compiled methods.

//Signed-off-by: Scott Young <[email protected]>

Added links and options to allow MicroJIT code to be generated and executed.

//Signed-off-by: Scott Young <[email protected]>

Cleaned up or correct rebased code where functionality tested on an earlier pull of OpenJ9 no longer integrated correctly. WIP.

//Signed-off-by: Scott Young <[email protected]>

Fixed issue setting initial MicroJIT theshold count for methods.

//Signed-off-by: Scott Young <[email protected]>

Added MicroJIT exception table and included MetaData creation functions for later use by a MicroJIT compiler.

//Signed-off-by: Scott Young <[email protected]>

Added links and options to allow MicroJIT code to be generated and executed.

//Signed-off-by: Scott Young <[email protected]>

Cleaned up or correct rebased code where functionality tested on an earlier pull of OpenJ9 no longer integrated correctly. WIP.

//Signed-off-by: Scott Young <[email protected]>

Fixed issue setting initial MicroJIT theshold count for methods.

//Signed-off-by: Scott Young <[email protected]>

Fixed the Microjit threshold count

The counter in countAndCompile counts down from the TR threshold to zero; we need to set the MJIT threshold to the difference between the TR threshold and the provided MJIT count. For example if the TR threshold is 1000 and the MJIT threshold is 100, this would set the extra2 counter to 900. After 100 iteration MJIT would compile the method.

//Signed-off-by: Eric Coffin <[email protected]>

Log the method signature after the method has compiled

The log message can be used by a test script to ensure the target method has been compiled by the MicroJIT compiler.

//Signed-off-by: Eric Coffin <[email protected]>

Add isub bytecode support for MJIT

//Signed-off-by: Eric Coffin <[email protected]>

Add imul bytecode

//Signed-off-by: Eric Coffin <[email protected]>

Add idiv bytecode

TODO: Add support for ArithmeticException (divide by zero check)
//Signed-off-by: Eric Coffin <[email protected]>

Fix idiv bytecode

Given we're dealing with a  DWORD rather than a QWORD, use eax rather than rax. Ensures sign bit is extended into edx (via cdq).
//Signed-off-by: Eric Coffin <[email protected]>

Added new macros for MicroJIT assembly; Moved peak stack allocation from CompilationInfoPerThreadBase::mjit to AMD64CodeGenerator; Replaced specalized loading for loading tempaltes with generic loading template.

//Signed-off-by: Scott Young <[email protected]>

Fixed an error related to tool assisted merge conflic resolution and a bug related to the initial storing of arguments in the local array.

//Signed-off-by: Scott Young <[email protected]>

Added support for storing in the local array. Cleaned up Bytecode switch statement in generate body for loading and storing bytecodes using helper macros

//Signed-off-by: Scott Young <[email protected]>

Remove unused iload templates

//Signed-off-by: Eric Coffin <[email protected]>

Fixed error in calculating size of stack for MicroJIT

//Signed-off-by: Scott Young <[email protected]>

Changed the stack based parameter map to a table based map.

//Signed-off-by: Scott Young <[email protected]>

Initial commit of CodegenGC files used for creating GCMaps and Stack Atlas for MJIT

//Signed-off-by: Scott Young <[email protected]>

Support recompilation after MJIT failure

//Signed-off-by: Eric Coffin <[email protected]>

Add support for ladd and lreturn

//Signed-off-by: Hapreet Kaur <[email protected]>

Clean up formatting

//Signed-off-by: Eric Coffin <[email protected]>

Add JIT Hooks to mjit

//Signed-off-by: Eric Coffin <[email protected]>

Added Paramater map creation to MJIT AMD64CodegenGC, added aload and getfield bytecodes to templates and CodeGen, added support for storing params on the stack into the local array during prologue.

//Signed-off-by: Scott Young <[email protected]>

Release code cache after MJIT failure

//Signed-off-by: Eric Coffin <[email protected]>

Support long method arguments

TR appears to require  1 slot (8 bytes) when the last argument in a method is a long.

//Signed-off-by: Eric Coffin <[email protected]>

Implemented the getstatic and putstatic bytecode templates. Updated the return templates to support void return type functions and moved the return generation to a separate function similar to the load and store bytecodes.

//Signed-off-by: Scott Young <[email protected]>

Implemented the lsub and lmul bytecodes

//Signed-off-by: Harpreet Kaur <[email protected]>

Added or updated copyright on files created for MJIT. Completed new MJIT specific stack atlas and GC Maps, and supporting side tables.

//Signed-off-by: Scott Young <[email protected]>

Fixed errors created during rebase.

//Signed-off-by: Scott Young <[email protected]>

Added support for compiling OpenJ9 with or without MicroJIT

//Signed-off-by: Scott Young <[email protected]>

Updated outdated copyright information in files modified as part of initial PR to public Eclipse OpenJ9 repository

//Signed-off-by: Scott Young <[email protected]>

Misc changes to MicroJIT files, detailed below:

Guarded against several inclusions of MicroJIT files in build processes using define guards.
Gaurded against changes for MicroJIT in files outside of compiler/microjit using define guards.
Corrected file endings to include a newline at EOF for all modified or added files for MicroJIT.
Removed typedef for J9MicroJITConfig and changed old usages to directly use struct J9JITConfig.
Replaced magic numbers referencing pointer size to use an inlined call instead.
Fixed copyright begin dates for newly created files for MicroJIT.
Repalced accidently removed lines for debug symbol stripping.

//Signed-off-by: Scott Young <[email protected]>

Misc changes to MicroJIT files, detailed below:

Fixed problems with build files incorrectly updating includes
Updated spacing between `if` and opening paren in CompilationThread
Added descriptions to public methods of MJIT::CodeGenerator
Removed duplicate comment in BytecodeInterpreter

//Signed-off-by: Scott Young <[email protected]>

Replaced erronious tab characters with appropreate space counts.

//Signed-off-by: Scott Young <[email protected]>

Replaced erronious tab characters with appropreate space counts in MicroJIT linkage.

//Signed-off-by: Scott Young <[email protected]>

Fixed incorrect usage of spaces over tabs when readding line to strip debug symbols.

//Signed-off-by: Scott Young <[email protected]>

Misc. changes to for MicroJIT detailed below:

Added J9VM_OPT_MICROJIT comments to several `endif` statements.
Fixed incorrectly ordered options in J9Options caused by previous fix to
accidently deleted option.

//Signed-off-by: Scott Young <[email protected]>

Fixed incorrect indexing when making local parameter table in MicroJIT prologue.

//Signed-off-by: Scott Young <[email protected]>

Added newline to end of MetaData.cpp. Changed types in setInitialMJITCountUnsynchronized to prevent compiler warnings about increasing size. Fixed inconsitent placement of pointer specifier in variable declarations in CompilationThread.cpp

//Signed-off-by: Scott Young <[email protected]>

Reverted copyright change in j9generated.h, since file is no longer modified from master version.

//Signed-off-by: Scott Young <[email protected]>

Updated pointer syntax in MicroJIT directory to match usage in CompilationThread.cpp and maintain internal consistency.

//Signed-off-by: Scott Young <[email protected]>

Partial implementation of GCR for MicroJIT

//Signed-off-by: Scott Young <[email protected]>

Modified MicroJIT to use GCR as a recompilation trigger to cause TR to compile. Removed the extra2 field. MicroJIT now shares an extra field with TR.

//Signed-off-by: Scott Young <[email protected]>

Fixed bug causing microjit to compile even when not given the Xjit:mjitEnabled=1 option

//Signed-off-by: Scott Young <[email protected]>

Fixed incorrect options usage when getting the mjitEnabled flag for choosing whether to compile with MicroJIT or TR. Fixed a bug causing the MicroJIT default count overriding the TR count in the extra field when not using mjitEnabled as an xjit option.

//Signed-off-by: Scott Young <[email protected]>

Modified the count setting to correctly set the extra field when using microjit. Changed code formatting of added code in HookedByTheJit for microjit to match surrounding code. Removed gaurd from counting in microjited methods to prevent microjited code from running for too long.

//Signed-off-by: Scott Young <[email protected]>

Fixed problems with patching after removing gaurd in microjit GCR code generation.

//Signed-off-by: Scott Young <[email protected]>

Added support for TR compilations after failing to compile with MicroJIT. Removed TRCount field from J9Method and changed mechanism for setting counts for MicroJIT counting blocks.

//Signed-off-by: Scott Young <[email protected]>

Added CMakeList.txt files to microjit to allow for compilation with CMake

//Signed-off-by: Scott Young <[email protected]>

Fixed issues with CMake build configuration for MicroJIT.\n Updated configuration files that prevented MicroJIT from being compiled correctly with CMake. Removed dead code from BytecodeInterpreter.hpp from previous verion of MicroJIT.

//Signed-off-by: Scott Young <[email protected]>

Added missing Copyright information to newly added CMakeLists.txt files

//Signed-off-by: Scott Young <[email protected]>

Update copyright and removed dead code. Changed boolean to bit flag in J9PersistenInfo. Added debugging text entry for logging in rossa.cpp

//Signed-off-by: Scott Young <[email protected]>

stashed changes for workstation transfer

//Signed-off-by: Scott Young <[email protected]>

Fixed signature logging and stack atlas for MJIT

Added new line to print format string for signature in the mjit method of
CompilationThreadInfoPerThreadBase
The stack atlas creator now correctly skips the second slot of
two slot data types when iterating over the local array.

//Signed-off-by: Scott Young <[email protected]>

Overhauled the creation of CFGs in MicroJIT

The CFG creation in MicroJIT was needlessly terse and did not hold all the information that was
needed for getting profiling data from the interpreter profiler.

The CFG creation process now stores all the required information to get
these values from the profiler when using the
JProfilingBlock optimization.

//Signed-off-by: Scott Young <[email protected]>

Added MicroJIT methods for profiling to CFG.

The J9CFG has recieved new methods which will only exist
and be compiled when using MicroJIT.

These methods will allow for the setting of edge frequencies
without any IL trees in the CFG.

//Signed-off-by: Scott Young <[email protected]>

Custom MJIT ByteCodeIterator

Exposes printByteCodes() for printing entire method and adds helpers for getting the mnemonic and opcode.
Add _printByteCodes boolean to CodeGenerator to limit BC debug statements in MJIT.
Fixes opcode on compilation failure.

//Signed-off-by: Eric Coffin <[email protected]>
//Signed-off-by: Scott Young <[email protected]>

Changed InternalMetaData to MJIT::ByteCodeIterator

//Signed-off-by: Scott Young <[email protected]>

Partial implementation of `invokestatic` support

//Signed-off-by: Scott Young <[email protected]>

Added support for `invokestatic` in MicroJIT code generation.
Fixed problem with integers using full 64-bit registers,
instead of lower 32-bit for MicroJIT code.

//Signed-off-by: Scott Young <[email protected]>

Support for conditionals and goto

Adds initial support for ifne and ificmpge and goto.

//Signed-off-by: Eric Coffin <[email protected]>
//Signed-off-by: Scott Young <[email protected]>

MicroJIT - Add constants and iand

Adds support for:

- iconst_<i>
- lconst_<l>
- fconst_<f>
- bipush
- iand
- land
- ior
- lor
- ixor
- lxor

//Signed-off-by: Julie Brown <[email protected]>

Add ificmpgt to MJIT

Adds ificmpgt and add fixes the missing switch statements for other branching bytecodes.

//Signed-off-by: Eric Coffin <[email protected]>

MicroJIT - Patch missing break statement

This commit patches a previous commit in which there was a missing break
statement

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT - Patch iconst<i> and lconst_<l>

This commit updates the bytecode templates for iconst_<i> and lconst_<l>
to use dword for integer types and qword for long types

//Signed-off-by: Julie Brown <[email protected]>

Added support for iinc bytecode

//Signed-off-by: Harpreet Kaur <[email protected]>

Fixes for MJIT

Fixes ifne by replacing cmp with test.
Allocates correct array size on the stack, which was previously causing a crash.

//Signed-off-by: Eric Coffin <[email protected]>
//Signed-off-by: Scott Young <[email protected]>

Fixed accidental setting of extra field with MicroJIT start address during post compilation phase. Clearing registers in tempaltes before moves to prevent incorrect values from being partially kept. Fixed accidental exclusion of J9VM_OPT_MICROJIT from nasm defines. Now saving caller preserved registers used by MicroJIT before calling.

//Signed-off-by: Scott Young <[email protected]>

MicroJIT - Add support for dup bytecodes

This commit adds bytecode support for:

- dup
- dup_x1
- dup_x2
- dup2
- dup2_x1
- dup2_x2

These bytecodes have not yet been tested for correctness; writing
test files for these will require support for invokespecial and new.

//Signed-off-by: Julie Brown <[email protected]>

Added support for ldiv bytecode

//Signed-off-by: Harpreet Kaur <[email protected]>

MicroJIT - Add support for ineg and lneg

This commit adds support for ineg and lneg bytecodes

//Signed-off-by: Julie Brown <[email protected]>

Log compilation success

//Signed-off-by: Eric Coffin <[email protected]>

Wrap logging in define guards

To improve performance wrap all logging in define guards.

//Signed-off-by: Eric Coffin <[email protected]>
//Signed-off-by: Scott Young <[email protected]>

MicroJIT - Added support for irem and lrem

//Signed-off-by: Harpreet Kaur <[email protected]>

Changed extra2 to act similarly to the extra field to help, fixing a crash caused when not running MicroJIT, but compiling it.

//Signed-off-by: Scott Young <[email protected]>

MicroJIT: Add support for i2l and l2i

This commit adds support for the i2l and l2i bytecodes

//Signed-off-by: Julie Brown <[email protected]>

Fixed errors causing invokestatic to fail in some cases.
MicroJIT now checks if the method has been
compiled with TR before running it from interpreter.

Fixed problem causing invokations of MicroJITed
methods from JITed methods to enter at the interpreters entry point.

//Signed-off-by: Scott Young <[email protected]>

Removed unnecessary comment from j2iTransition.

//Signed-off-by: Scott Young <[email protected]>

Fixed problem with bipush patching.

//Signed-off-by: Scott Young <[email protected]>

MicroJIT - Added support for shift bytecodes

//Signed-off-by: Harpreet Kaur <[email protected]>

Some edits to the long shift bytecodes

//Signed-off-by: Harpreet Kaur <[email protected]>

Fixed long paramters and shortened shift templates

//Signed-off-by: Harpreet Kaur <[email protected]>
//Signed-off-by: Scott Young <[email protected]>

Function Declaration Edit

//Signed-off-by: Harpreet Kaur <[email protected]>

MicroJIT: Add support for i2b and i2s bytecodes

This commit adds support for the i2b and i2s bytecodes.

//Signed-off-by: Julie Brown <[email protected]>
//Signed-off-by: Scott Young <[email protected]>

MicroJIT: Add support for sipush bytecode

This commit adds support for the sipush bytecode.
Also makes some edits to the iconst templates to specify the stack slot
as being qword instead of dword.

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT: Add support for i2c bytecode

This commit adds support for the i2c bytecode

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT: Add support for if<cond> and if_icmp<cond>

This commit adds support for ifeq, iflt, ifle, ifgt, ifge, if_icmpeq,
if_icmpne, if_icmplt, and if_icmple

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT: Add support for lcmp

This commit adds support for the lcmp bytecode

//Signed-off-by: Julie Brown <[email protected]>
//Signed-off-by: Scott Young <[email protected]>

MicroJIT - Added support for fadd, fsub and fmul

//Signed-off-by: Harpreet Kaur <[email protected]>

Added fReturnTemplate for returning floats

//Signed-off-by: Harpreet Kaur <[email protected]>

MicroJIT - Added support for fdiv and fneg bytecodes

//Signed-off-by: Harpreet Kaur <[email protected]>

MicroJIT - Added support for double bytecodes

//Signed-off-by: Harpreet Kaur <[email protected]>

MicroJIT: Add support for fcmpg and fcmpl

This commit adds support for fcmpg and fcmpl. Also makes changes to lcmp
which was not behaving properly.

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT: Remove comment about fconst

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT - Added support for ddiv and dneg

//Signed-off-by: Harpreet Kaur <[email protected]>

MicroJIT - Fixed bug for longs

//Signed-off-by: Harpreet Kaur <[email protected]>
//Signed-off-by: Scott Young <[email protected]>

Change MJIT computation stack longs to single slot

This commit makes changes to the MicroJIT computation stack to use two
slots for longs and doubles. This change is necessary for the stack
bytecodes to work properly. It is also beneficial for future work with
TR, as this will make the MicroJIT computation stack match up with TR

//Signed-off-by: Julie Brown <[email protected]>
//Signed-off-by: Scott Young <[email protected]>

MJIT: Insert missing break statement

This commit patches a previous commit in which a break statement was
omitted

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT: Add support for all stack bytecodes

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT: Add supoort for dcmpl and dcmpg

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT: Add support for dconst

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT: Add support for i2d, l2d, d2i, d2l

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT: Add support ifnull, ifnonnull, if_acmpeq, if_acmpne

Adds support for above listed bytecodes. These are untested

//Signed-off-by: Julie Brown <[email protected]>

MicroJIT - Added support for d2f and f2d bytecodes

//Signed-off-by: Harpreet Kaur <[email protected]>

MicroJIT: Add support for i2f, l2f, f2i, f2l

//Signed-off-by: Harpreet Kaur <[email protected]>

MicroJIT - Added support for frem and drem

//Signed-off-by: Harpreet Kaur <[email protected]>
//Signed-off-by: Scott Young <[email protected]>

MicroJIT - Added support for getfield and putfield

//Signed-off-by: Harpreet Kaur <[email protected]>
//Signed-off-by: Scott Young <[email protected]>

Removed references to the old extra2

During the rebase, references to the old extra2 field reappered
These references were removed.

//Signed-off-by: Scott Young <[email protected]>

Misc. changes to MicroJIT code detailed below

Removed references to the now removed trtlookup IL
Changed signed ints that were not meant to be negative to unsigned
Changed iterator in MicroJIT MetaData creation to the MJIT iterator
Fixed mismatched declaration and definition signatures from rebase
Switched SSE remainder helper calls in MJIT to use the helper lookup

//Signed-off-by: Scott Young <[email protected]>

Changed assertion to log in MJIT

Change an assertion in the logic for finding the stack offsets
to instead log the info and end compilation.

//Signed-off-by: Scott Young <[email protected]>

Readded unintentionally removed newline

//Signed-off-by: Scott Young <[email protected]>

Fixed placement of define guard in J9CFG

//Signed-off-by: Scott Young <[email protected]>

Linkage & Properties Structure Changes

//Signed-off-by: Harpreet Kaur <[email protected]>

Added define guard on include for microjit

//Signed-off-by: Scott Young <[email protected]>

Misc changes to profiling for MicroJIT

Added checks for calling MicroJIT frequency setter on methods
compiled by MJIT.
Fixed incorrect usage of heap memory by supporting classes
for making CFGs in MicroJIT.
Fixed logical errors in the supporting classes used to
generate a CFG in MicroJIT.
Added optimization strategy for MicroJIT.
Added early exit in JProfilingBlock for MicroJIT to allow for early
testing of MicroJIT frequency setting before creation of
counter placement code path for MicroJIT.

//Signed-off-by: Scott Young <[email protected]>

Fixed errors with JNI in MJIT

//Signed-off-by: Scott Young <[email protected]>

Temporarily removed support for addresses in MJIT

//Signed-off-by: Scott Young <[email protected]>

Uncommented disabled BCs and Fixed issue with sipush

//Signed-off-by: Scott Young <[email protected]>

Added GotoW support (Untested)

//Signed-off-by: Shubham Verma <[email protected]>

Changes to Codegen for invokestatic to fix interpreter calling and stack slot count problems.

//Signed-off-by: Scott Young <[email protected]>

MicroJIT - Fix compile errors in gotow

//Signed-off-by: Harpreet Kaur <[email protected]>

Fixed MicroJIT causing crashes when mis-handling object references. Added codesize estimation calculation.

//Signed-off-by: Scott Young <[email protected]>

Fixed GCMap and Invoke static issues.
Slotcount was not being multiplied by slot-size when setting offsets for saving and loading arguments. Local index was being incorrectly assigned when looping over the parameter map in meta-data creation phase.

//Signed-off-by: Scott Young <[email protected]>

Fixed typo in comments for several templates

Fixed slot errors on jumps
Some conditional branches were reducing from 2 to 1 slot when they should have been reducing from 2 to 0.
This has been corrected.

//Signed-off-by: Scott Young <[email protected]>

MicroJIT Linkage Refactoring

//Signed-off-by: Harpreet Kaur <[email protected]>

Replacing MJIT CodeGenerator class parameter with TR Compilation class in linkage constructor

//Signed-off-by: Harpreet Kaur <[email protected]>

Passing comp->cg() as parameter to the linkage constructor

//Signed-off-by: Harpreet Kaur <[email protected]>

Fetching TR properties initialization code

//Signed-off-by: Harpreet Kaur <[email protected]>

Using cg and _properties for function parameters

//Signed-off-by: Harpreet Kaur <[email protected]>

Parameter name changes and passing properties structure as a pointer

TODO: MicroJIT to use the setOffsetToFirstParm method

//Signed-off-by: Harpreet Kaur <[email protected]>

Fetching default return registers from properties structure

//Signed-off-by: Harpreet Kaur <[email protected]>

Handling addresses and patching requisite slots for different datatypes

//Signed-off-by: Harpreet Kaur <[email protected]>

Changes to generateBody

//Signed-off-by: Harpreet Kaur <[email protected]>

Fetching default argument registers from properties structure

//Signed-off-by: Harpreet Kaur <[email protected]>

Getting default return registers from linkage properties in remainder bytecodes

//Signed-off-by: Harpreet Kaur <[email protected]>

Misc. Changes to linkage and bytecodes to fix bugs. Turned off support for get and put field until write barriers can be implemented.

Added verbose log check for mjit log messages

//Signed-off-by: Scott Young <[email protected]>

MJIT DSL for templates and new jmp template

//Signed-off-by: Scott Young <[email protected]>

Added define guards to microjit hook in profiler

//Signed-off-by: Scott Young <[email protected]>

Misc bug fixes to MJIT compiler

Fixed preprologue incorrect use of 5 byte jump instead of 2 byte jump.
Added field to identify uninitialized entries in local and param tables.
Fixed handling of loading and storing of references.
Fixed handling of passing references to callee methods.
Added verbose log checks to verbose logging in MJIT compiler.

//Signed-off-by: Scott Young <[email protected]>

Handle Special Case for Longs and Doubles in the First Slot of the Param Table

//Signed-off-by: Aaron Graham <[email protected]>

Guard Against Negative Indices Being Accessible in the Param, or Local, Table Entries

//Signed-off-by: Aaron Graham <[email protected]>

Fix Initialization Check in Param and Local Table Entries

//Signed-off-by: Aaron Graham <[email protected]>

Fixing compile errors during linkage rebase

//Signed-off-by: Harpreet Kaur <[email protected]>

Changing copyright dates and formatting in bytecodes.nasm

//Signed-off-by: Harpreet Kaur <[email protected]>

Commenting out the untested goto_w bytecode and some copyright changes

//Signed-off-by: Harpreet Kaur <[email protected]>

Fixed holes in codecache. Rewrote side tables.

//Signed-off-by: Scott <[email protected]>

Fixed MJIT issue with references and static fields

//Co-authored-by: Scott <[email protected]>
//Signed-off-by: Harpreet Kaur <[email protected]>

Removed trailing whitespace from modified cpp/hpp/nasm files

//Signed-off-by: Scott Young <[email protected]>

Removed additional whitespace found in .mk files and missed .cpp files.

//Signed-off-by: Scott Young <[email protected]>

Updated Copyright on files changed by this PR that were not changed this year to the current year.

//Signed-off-by: Scott Young <[email protected]>

Fixed additional trailing whitepace missed from previous commits

//Signed-off-by: Scott Young <[email protected]>

Co-authored-by: Eric Coffin <[email protected]>
Co-authored-by: Julie Brown <[email protected]>
Co-authored-by: Shubham Verma <[email protected]>
Co-authored-by: Harpreet Kaur <[email protected]>
Co-authored-by: Aaron Graham <[email protected]>
Signed-off-by: Scott Young <[email protected]>
… and documentation for HW and LW

Signed-off-by: Harpreet Kaur <[email protected]>
Signed-off-by: Harpreet Kaur <[email protected]>
Signed-off-by: Harpreet Kaur <[email protected]>
@harpreetbamrah
Copy link
Contributor

hey @dsouzai, the latest commits address the review points raised, please take a look.
@0xdaryl, it should be good now for a full review.
fyi @mpirvu,
Thanks!

Copy link
Contributor

@dsouzai dsouzai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't go through the codegen/optimizer changes, but the infra and control updates look good.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.