JDK-8246024 : Obsolete LIRFillDelaySlot
  • Type: CSR
  • Component: hotspot
  • Sub-Component: compiler
  • Priority: P4
  • Status: Closed
  • Resolution: Approved
  • Fix Versions: 15
  • Submitted: 2020-05-27
  • Updated: 2020-05-28
  • Resolved: 2020-05-27
Related Reports
CSR :  
Description
Summary
-------

Obsolete the -XX:+LIRFillDelaySlot flag.

Problem
-------

After the removal of Solaris and SPARC in JDK-8241787 the LIRFillDelaySlot flag no longer has any relevant effect and should be removed. Since the flag was only really used for SPARC the flag will go directly to obsolete, skipping the deprecation step.

Solution
--------

The LIRFillDelaySlot flag will be obsoleted, meaning it will still be recognized but a warning will be generated at startup if it is specified on the command line.

Specification
-------------

Mark the flag as obsoleted:

    diff -r 99b3e9be062a src/hotspot/share/runtime/arguments.cpp
    --- a/src/hotspot/share/runtime/arguments.cpp   Wed May 27 14:31:23 2020 -0700
    +++ b/src/hotspot/share/runtime/arguments.cpp   Wed May 27 15:31:59 2020 -0700
    @@ -564,6 +564,7 @@
       { "UseBarriersForVolatile",        JDK_Version::undefined(), JDK_Version::jdk(15), JDK_Version::jdk(16) },
     #endif
       { "UseLWPSynchronization",         JDK_Version::undefined(), JDK_Version::jdk(15), JDK_Version::jdk(16) },
    +  { "LIRFillDelaySlots",             JDK_Version::undefined(), JDK_Version::jdk(15), JDK_Version::jdk(16) },

     #ifdef TEST_VERIFY_SPECIAL_JVM_FLAGS
       // These entries will generate build errors.  Their purpose is to test the macros.

And remove it from the C1 global flags:

    diff -r 99b3e9be062a src/hotspot/share/c1/c1_globals.hpp
    --- a/src/hotspot/share/c1/c1_globals.hpp       Wed May 27 14:31:23 2020 -0700
    +++ b/src/hotspot/share/c1/c1_globals.hpp       Wed May 27 15:31:59 2020 -0700
    @@ -211,9 +211,6 @@
       develop(bool, LIRTraceExecution, false,                                   \
               "add LIR code which logs the execution of blocks")                \
                                                                                 \
    -  product_pd(bool, LIRFillDelaySlots,                                       \
    -             "fill delays on on SPARC with LIR")                            \
    -                                                                            \
       develop_pd(bool, CSEArrayLength,                                          \
               "Create separate nodes for length in array accesses")             \
                                                                                 \

Remove all the platform specific flag initialization code, for example for x86 (the same pattern repeats for the other CPU architectures):

    diff -r 99b3e9be062a src/hotspot/cpu/x86/c1_globals_x86.hpp
    --- a/src/hotspot/cpu/x86/c1_globals_x86.hpp    Wed May 27 14:31:23 2020 -0700
    +++ b/src/hotspot/cpu/x86/c1_globals_x86.hpp    Wed May 27 15:31:59 2020 -0700
    @@ -60,7 +60,6 @@
     #endif // !TIERED
     define_pd_global(bool, UseTypeProfile,                 false);

    -define_pd_global(bool, LIRFillDelaySlots,              false);
     define_pd_global(bool, OptimizeSinglePrecision,        true );
     define_pd_global(bool, CSEArrayLength,                 false);
     define_pd_global(bool, TwoOperandLIRForm,              true );

And finally, remove the only actual use of the flag:

    diff -r 99b3e9be062a src/hotspot/share/c1/c1_LIR.hpp
    --- a/src/hotspot/share/c1/c1_LIR.hpp   Wed May 27 14:31:23 2020 -0700
    +++ b/src/hotspot/share/c1/c1_LIR.hpp   Wed May 27 15:31:59 2020 -0700
    @@ -1805,7 +1805,7 @@
       LIR_OpDelay(LIR_Op* op, CodeEmitInfo* info):
         LIR_Op(lir_delay_slot, LIR_OprFact::illegalOpr, info),
         _op(op) {
    -    assert(op->code() == lir_nop || LIRFillDelaySlots, "should be filling with nops");
    +    assert(op->code() == lir_nop, "should be filling with nops");
       }
       virtual void emit_code(LIR_Assembler* masm);
       virtual LIR_OpDelay* as_OpDelay() { return this; }

Comments
Approving for JDK 15.
27-05-2020

As the only use of the flag on non-Sparc is within an assertion I agree that it can be immediately obsoleted.
27-05-2020