Print this page
rev 6860 : 8046268: compiler/whitebox/ tests fail : must be osr_compiled
Summary: Added code to 'warm up' the methods before triggering OSR compilation by executing them a limited number of times. Like this, the profile information marks the loop exit as taken and we don't add an uncommon trap.
Reviewed-by: kvn, dlong, iignatyev
rev 6861 : 8060454: [TESTBUG] Whitebox tests fail with -XX:CompileThreshold=100
Summary: Move the call to 'waitAndDeoptimize' from the warmup methods to the osr triggering methods to make sure that no non-osr compilation is in the queue after warmup.
Reviewed-by: kvn
rev 6862 : 8061486: [TESTBUG] compiler/whitebox/ tests fail : must be osr_compiled (reappeared in nightlies)
Summary: Call warmup code from OSR triggering method to make sure no non-OSR compilation is triggered in the loop.
Reviewed-by: kvn
rev 6863 : 8061983: [TESTBUG] compiler/whitebox/MakeMethodNotCompilableTest.java fails with "must not be in queue"
Summary: Added a method checkNotCompiled(boolean isOsr) to either check if the method is OSR compiled or to check if it is non-OSR compiled.
Reviewed-by: kvn

Split Split Close
Expand all
Collapse all
          --- old/test/compiler/whitebox/CompilerWhiteBoxTest.java
          +++ new/test/compiler/whitebox/CompilerWhiteBoxTest.java
↓ open down ↓ 64 lines elided ↑ open up ↑
  65   65              = Boolean.valueOf(getVMOption("BackgroundCompilation", "true"));
  66   66      /** Value of {@code -XX:TieredCompilation} */
  67   67      protected static final boolean TIERED_COMPILATION
  68   68              = Boolean.valueOf(getVMOption("TieredCompilation", "false"));
  69   69      /** Value of {@code -XX:TieredStopAtLevel} */
  70   70      protected static final int TIERED_STOP_AT_LEVEL
  71   71              = Integer.parseInt(getVMOption("TieredStopAtLevel", "0"));
  72   72      /** Flag for verbose output, true if {@code -Dverbose} specified */
  73   73      protected static final boolean IS_VERBOSE
  74   74              = System.getProperty("verbose") != null;
  75      -    /** count of invocation to triger compilation */
       75 +    /** invocation count to trigger compilation */
  76   76      protected static final int THRESHOLD;
  77      -    /** count of invocation to triger OSR compilation */
       77 +    /** invocation count to trigger OSR compilation */
  78   78      protected static final long BACKEDGE_THRESHOLD;
  79   79      /** Value of {@code java.vm.info} (interpreted|mixed|comp mode) */
  80   80      protected static final String MODE = System.getProperty("java.vm.info");
  81   81  
  82   82      static {
  83   83          if (TIERED_COMPILATION) {
  84   84              BACKEDGE_THRESHOLD = THRESHOLD = 150000;
  85   85          } else {
  86   86              THRESHOLD = COMPILE_THRESHOLD;
  87   87              BACKEDGE_THRESHOLD = COMPILE_THRESHOLD * Long.parseLong(getVMOption(
↓ open down ↓ 111 lines elided ↑ open up ↑
 199  199      /**
 200  200       * Checks, that {@linkplain #method} is not compiled at the given compilation
 201  201       * level or above.
 202  202       *
 203  203       * @param compLevel
 204  204       *
 205  205       * @throws RuntimeException if {@linkplain #method} is in compiler queue or
 206  206       *                          is compiled, or if {@linkplain #method} has zero
 207  207       *                          compilation level.
 208  208       */
 209      -
 210  209      protected final void checkNotCompiled(int compLevel) {
 211  210          if (WHITE_BOX.isMethodQueuedForCompilation(method)) {
 212  211              throw new RuntimeException(method + " must not be in queue");
 213  212          }
 214  213          if (WHITE_BOX.getMethodCompilationLevel(method, false) >= compLevel) {
 215  214              throw new RuntimeException(method + " comp_level must be >= maxCompLevel");
 216  215          }
 217  216          if (WHITE_BOX.getMethodCompilationLevel(method, true) >= compLevel) {
 218  217              throw new RuntimeException(method + " osr_comp_level must be >= maxCompLevel");
 219  218          }
 220  219      }
 221  220  
 222  221      /**
 223  222       * Checks, that {@linkplain #method} is not compiled.
 224  223       *
 225  224       * @throws RuntimeException if {@linkplain #method} is in compiler queue or
 226  225       *                          is compiled, or if {@linkplain #method} has zero
 227  226       *                          compilation level.
 228  227       */
 229  228      protected final void checkNotCompiled() {
      229 +        checkNotCompiled(true);
      230 +        checkNotCompiled(false);
      231 +    }
      232 +
      233 +    /**
      234 +     * Checks, that {@linkplain #method} is not (OSR-)compiled.
      235 +     *
      236 +     * @param isOsr Check for OSR compilation if true
      237 +     * @throws RuntimeException if {@linkplain #method} is in compiler queue or
      238 +     *                          is compiled, or if {@linkplain #method} has zero
      239 +     *                          compilation level.
      240 +     */
      241 +    protected final void checkNotCompiled(boolean isOsr) {
      242 +        waitBackgroundCompilation();
 230  243          if (WHITE_BOX.isMethodQueuedForCompilation(method)) {
 231  244              throw new RuntimeException(method + " must not be in queue");
 232  245          }
 233      -        if (WHITE_BOX.isMethodCompiled(method, false)) {
 234      -            throw new RuntimeException(method + " must be not compiled");
 235      -        }
 236      -        if (WHITE_BOX.getMethodCompilationLevel(method, false) != 0) {
 237      -            throw new RuntimeException(method + " comp_level must be == 0");
 238      -        }
 239      -        if (WHITE_BOX.isMethodCompiled(method, true)) {
 240      -            throw new RuntimeException(method + " must be not osr_compiled");
 241      -        }
 242      -        if (WHITE_BOX.getMethodCompilationLevel(method, true) != 0) {
 243      -            throw new RuntimeException(method + " osr_comp_level must be == 0");
      246 +        if (WHITE_BOX.isMethodCompiled(method, isOsr)) {
      247 +            throw new RuntimeException(method + " must not be " +
      248 +                                       (isOsr ? "osr_" : "") + "compiled");
      249 +        }
      250 +        if (WHITE_BOX.getMethodCompilationLevel(method, isOsr) != 0) {
      251 +            throw new RuntimeException(method + (isOsr ? " osr_" : " ") +
      252 +                                       "comp_level must be == 0");
 244  253          }
 245  254      }
 246  255  
 247  256      /**
 248  257       * Checks, that {@linkplain #method} is compiled.
 249  258       *
 250  259       * @throws RuntimeException if {@linkplain #method} isn't in compiler queue
 251  260       *                          and isn't compiled, or if {@linkplain #method}
 252  261       *                          has nonzero compilation level
 253  262       */
↓ open down ↓ 45 lines elided ↑ open up ↑
 299  308      }
 300  309  
 301  310      protected final void makeNotCompilable(int compLevel) {
 302  311          WHITE_BOX.makeMethodNotCompilable(method, compLevel, testCase.isOsr());
 303  312      }
 304  313  
 305  314      /**
 306  315       * Waits for completion of background compilation of {@linkplain #method}.
 307  316       */
 308  317      protected final void waitBackgroundCompilation() {
      318 +        waitBackgroundCompilation(method);
      319 +    }
      320 +
      321 +    /**
      322 +     * Waits for completion of background compilation of the given executable.
      323 +     *
      324 +     * @param executable Executable
      325 +     */
      326 +    protected static final void waitBackgroundCompilation(Executable executable) {
 309  327          if (!BACKGROUND_COMPILATION) {
 310  328              return;
 311  329          }
 312  330          final Object obj = new Object();
 313  331          for (int i = 0; i < 10
 314      -                && WHITE_BOX.isMethodQueuedForCompilation(method); ++i) {
      332 +                && WHITE_BOX.isMethodQueuedForCompilation(executable); ++i) {
 315  333              synchronized (obj) {
 316  334                  try {
 317  335                      obj.wait(1000);
 318  336                  } catch (InterruptedException e) {
 319  337                      Thread.currentThread().interrupt();
 320  338                  }
 321  339              }
 322  340          }
 323  341      }
 324  342  
↓ open down ↓ 93 lines elided ↑ open up ↑
 418  436                      testCase.name(), CompilerWhiteBoxTest.MODE);
 419  437          }
 420  438          return result;
 421  439      }
 422  440  }
 423  441  
 424  442  enum SimpleTestCase implements CompilerWhiteBoxTest.TestCase {
 425  443      /** constructor test case */
 426  444      CONSTRUCTOR_TEST(Helper.CONSTRUCTOR, Helper.CONSTRUCTOR_CALLABLE, false),
 427  445      /** method test case */
 428      -    METOD_TEST(Helper.METHOD, Helper.METHOD_CALLABLE, false),
      446 +    METHOD_TEST(Helper.METHOD, Helper.METHOD_CALLABLE, false),
 429  447      /** static method test case */
 430  448      STATIC_TEST(Helper.STATIC, Helper.STATIC_CALLABLE, false),
 431  449      /** OSR constructor test case */
 432  450      OSR_CONSTRUCTOR_TEST(Helper.OSR_CONSTRUCTOR,
 433  451              Helper.OSR_CONSTRUCTOR_CALLABLE, true),
 434  452      /** OSR method test case */
 435      -    OSR_METOD_TEST(Helper.OSR_METHOD, Helper.OSR_METHOD_CALLABLE, true),
      453 +    OSR_METHOD_TEST(Helper.OSR_METHOD, Helper.OSR_METHOD_CALLABLE, true),
 436  454      /** OSR static method test case */
 437  455      OSR_STATIC_TEST(Helper.OSR_STATIC, Helper.OSR_STATIC_CALLABLE, true);
 438  456  
 439  457      private final Executable executable;
 440  458      private final Callable<Integer> callable;
 441  459      private final boolean isOsr;
 442  460  
 443  461      private SimpleTestCase(Executable executable, Callable<Integer> callable,
 444  462              boolean isOsr) {
 445  463          this.executable = executable;
↓ open down ↓ 41 lines elided ↑ open up ↑
 487  505              @Override
 488  506              public Integer call() throws Exception {
 489  507                  return staticMethod();
 490  508              }
 491  509          };
 492  510  
 493  511          private static final Callable<Integer> OSR_CONSTRUCTOR_CALLABLE
 494  512                  = new Callable<Integer>() {
 495  513              @Override
 496  514              public Integer call() throws Exception {
 497      -                return new Helper(null).hashCode();
      515 +                return new Helper(null, CompilerWhiteBoxTest.BACKEDGE_THRESHOLD).hashCode();
 498  516              }
 499  517          };
 500  518  
 501  519          private static final Callable<Integer> OSR_METHOD_CALLABLE
 502  520                  = new Callable<Integer>() {
 503  521              private final Helper helper = new Helper();
 504  522  
 505  523              @Override
 506  524              public Integer call() throws Exception {
 507      -                return helper.osrMethod();
      525 +                return helper.osrMethod(CompilerWhiteBoxTest.BACKEDGE_THRESHOLD);
 508  526              }
 509  527          };
 510  528  
 511  529          private static final Callable<Integer> OSR_STATIC_CALLABLE
 512  530                  = new Callable<Integer>() {
 513  531              @Override
 514  532              public Integer call() throws Exception {
 515      -                return osrStaticMethod();
      533 +                return osrStaticMethod(CompilerWhiteBoxTest.BACKEDGE_THRESHOLD);
 516  534              }
 517  535          };
 518  536  
 519  537          private static final Constructor CONSTRUCTOR;
 520  538          private static final Constructor OSR_CONSTRUCTOR;
 521  539          private static final Method METHOD;
 522  540          private static final Method STATIC;
 523  541          private static final Method OSR_METHOD;
 524  542          private static final Method OSR_STATIC;
 525  543  
 526  544          static {
 527  545              try {
 528  546                  CONSTRUCTOR = Helper.class.getDeclaredConstructor(int.class);
 529  547              } catch (NoSuchMethodException | SecurityException e) {
 530  548                  throw new RuntimeException(
 531  549                          "exception on getting method Helper.<init>(int)", e);
 532  550              }
 533  551              try {
 534  552                  OSR_CONSTRUCTOR = Helper.class.getDeclaredConstructor(
 535      -                        Object.class);
      553 +                        Object.class, long.class);
 536  554              } catch (NoSuchMethodException | SecurityException e) {
 537  555                  throw new RuntimeException(
 538      -                        "exception on getting method Helper.<init>(Object)", e);
      556 +                        "exception on getting method Helper.<init>(Object, long)", e);
 539  557              }
 540  558              METHOD = getMethod("method");
 541  559              STATIC = getMethod("staticMethod");
 542      -            OSR_METHOD = getMethod("osrMethod");
 543      -            OSR_STATIC = getMethod("osrStaticMethod");
      560 +            OSR_METHOD = getMethod("osrMethod", long.class);
      561 +            OSR_STATIC = getMethod("osrStaticMethod", long.class);
 544  562          }
 545  563  
 546      -        private static Method getMethod(String name) {
      564 +        private static Method getMethod(String name, Class<?>... parameterTypes) {
 547  565              try {
 548      -                return Helper.class.getDeclaredMethod(name);
      566 +                return Helper.class.getDeclaredMethod(name, parameterTypes);
 549  567              } catch (NoSuchMethodException | SecurityException e) {
 550  568                  throw new RuntimeException(
 551  569                          "exception on getting method Helper." + name, e);
 552  570              }
 553      -
 554  571          }
 555  572  
 556  573          private static int staticMethod() {
 557  574              return 1138;
 558  575          }
 559  576  
 560  577          private int method() {
 561  578              return 42;
 562  579          }
 563  580  
 564      -        private static int osrStaticMethod() {
      581 +        /**
      582 +         * Deoptimizes all non-osr versions of the given executable after
      583 +         * compilation finished.
      584 +         *
      585 +         * @param e Executable
      586 +         * @throws Exception
      587 +         */
      588 +        private static void waitAndDeoptimize(Executable e) {
      589 +            CompilerWhiteBoxTest.waitBackgroundCompilation(e);
      590 +            if (WhiteBox.getWhiteBox().isMethodQueuedForCompilation(e)) {
      591 +                throw new RuntimeException(e + " must not be in queue");
      592 +            }
      593 +            // Deoptimize non-osr versions of executable
      594 +            WhiteBox.getWhiteBox().deoptimizeMethod(e, false);
      595 +        }
      596 +
      597 +        /**
      598 +         * Executes the method multiple times to make sure we have
      599 +         * enough profiling information before triggering an OSR
      600 +         * compilation. Otherwise the C2 compiler may add uncommon traps.
      601 +         *
      602 +         * @param m Method to be executed
      603 +         * @return Number of times the method was executed
      604 +         * @throws Exception
      605 +         */
      606 +        private static int warmup(Method m) throws Exception {
      607 +            waitAndDeoptimize(m);
      608 +            Helper helper = new Helper();
      609 +            int result = 0;
      610 +            for (long i = 0; i < CompilerWhiteBoxTest.THRESHOLD; ++i) {
      611 +                result += (int)m.invoke(helper, 1);
      612 +            }
      613 +            // Wait to make sure OSR compilation is not blocked by
      614 +            // non-OSR compilation in the compile queue
      615 +            CompilerWhiteBoxTest.waitBackgroundCompilation(m);
      616 +            return result;
      617 +        }
      618 +
      619 +        /**
      620 +         * Executes the constructor multiple times to make sure we
      621 +         * have enough profiling information before triggering an OSR
      622 +         * compilation. Otherwise the C2 compiler may add uncommon traps.
      623 +         *
      624 +         * @param c Constructor to be executed
      625 +         * @return Number of times the constructor was executed
      626 +         * @throws Exception
      627 +         */
      628 +        private static int warmup(Constructor c) throws Exception {
      629 +            waitAndDeoptimize(c);
 565  630              int result = 0;
 566      -            for (long i = 0; i < CompilerWhiteBoxTest.BACKEDGE_THRESHOLD; ++i) {
      631 +            for (long i = 0; i < CompilerWhiteBoxTest.THRESHOLD; ++i) {
      632 +                result += c.newInstance(null, 1).hashCode();
      633 +            }
      634 +            // Wait to make sure OSR compilation is not blocked by
      635 +            // non-OSR compilation in the compile queue
      636 +            CompilerWhiteBoxTest.waitBackgroundCompilation(c);
      637 +            return result;
      638 +        }
      639 +
      640 +        private static int osrStaticMethod(long limit) throws Exception {
      641 +            int result = 0;
      642 +            if (limit != 1) {
      643 +                result = warmup(OSR_STATIC);
      644 +            }
      645 +            // Trigger osr compilation
      646 +            for (long i = 0; i < limit; ++i) {
 567  647                  result += staticMethod();
 568  648              }
 569  649              return result;
 570  650          }
 571  651  
 572      -        private int osrMethod() {
      652 +        private int osrMethod(long limit) throws Exception {
 573  653              int result = 0;
 574      -            for (long i = 0; i < CompilerWhiteBoxTest.BACKEDGE_THRESHOLD; ++i) {
      654 +            if (limit != 1) {
      655 +                result = warmup(OSR_METHOD);
      656 +            }
      657 +            // Trigger osr compilation
      658 +            for (long i = 0; i < limit; ++i) {
 575  659                  result += method();
 576  660              }
 577  661              return result;
 578  662          }
 579  663  
 580  664          private final int x;
 581  665  
 582  666          // for method and OSR method test case
 583  667          public Helper() {
 584  668              x = 0;
 585  669          }
 586  670  
 587  671          // for OSR constructor test case
 588      -        private Helper(Object o) {
      672 +        private Helper(Object o, long limit) throws Exception {
 589  673              int result = 0;
 590      -            for (long i = 0; i < CompilerWhiteBoxTest.BACKEDGE_THRESHOLD; ++i) {
      674 +            if (limit != 1) {
      675 +                result = warmup(OSR_CONSTRUCTOR);
      676 +            }
      677 +            // Trigger osr compilation
      678 +            for (long i = 0; i < limit; ++i) {
 591  679                  result += method();
 592  680              }
 593  681              x = result;
 594  682          }
 595  683  
 596  684          // for constructor test case
 597  685          private Helper(int x) {
 598  686              this.x = x;
 599  687          }
 600  688  
 601  689          @Override
 602  690          public int hashCode() {
 603  691              return x;
 604  692          }
 605  693      }
 606  694  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX