diff --git a/.hgtags b/.hgtags index 9c18df1be18..479d7b40b59 100644 --- a/.hgtags +++ b/.hgtags @@ -525,3 +525,4 @@ dc1f9dec2018a37fedba47d8a2aedef99faaec64 jdk-12+19 40098289d5804c3b5e7074bc75501a81e70d9b0d jdk-12+20 f8fb0c86f2b3d24294d39c5685a628e1beb14ba7 jdk-12+21 732bec44c89e8b93a38296bf690f97b7230c5b6d jdk-12+22 +eef755718cb24813031a842bbfc716a6cea18e9a jdk-12+23 diff --git a/doc/building.html b/doc/building.html index 07914b7c418..f0453251952 100644 --- a/doc/building.html +++ b/doc/building.html @@ -396,9 +396,9 @@ CC: Sun C++ 5.13 SunOS_i386 151846-10 2015/10/30

X11

Certain X11 libraries and include files are required on Linux and Solaris.

Use --with-x=<path> if configure does not properly locate your X11 files.

ALSA

@@ -662,6 +662,7 @@ dpkg-deb -x /tmp/libasound2-dev_1.0.25-4_armhf.deb .
  • libice-dev
  • libxrender
  • libxrender-dev
  • +
  • libxrandr-dev
  • libsm-dev
  • libxt-dev
  • libx11
  • @@ -693,7 +694,7 @@ cp: cannot stat `arm-linux-gnueabihf/libXt.so': No such file or directoryapt install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu
  • Create chroot on the build system, configuring it for target system:

    sudo qemu-debootstrap --arch=arm64 --verbose \
    -   --include=fakeroot,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng12-dev \
    +   --include=fakeroot,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng12-dev \
        --resolve-deps jessie /chroots/arm64 http://httpredir.debian.org/debian/
  • Configure and build with newly created chroot as sysroot/toolchain-path:

    CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ sh ./configure --openjdk-target=aarch64-linux-gnu --with-sysroot=/chroots/arm64/ --with-toolchain-path=/chroots/arm64/
    diff --git a/doc/building.md b/doc/building.md
    index ef06dc7a83b..62d0c1cddb7 100644
    --- a/doc/building.md
    +++ b/doc/building.md
    @@ -488,15 +488,15 @@ Certain [X11](http://www.x.org/) libraries and include files are required on
     Linux and Solaris.
     
       * To install on an apt-based Linux, try running `sudo apt-get install
    -    libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev`.
    +    libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev`.
       * To install on an rpm-based Linux, try running `sudo yum install
    -    libXtst-devel libXt-devel libXrender-devel libXi-devel`.
    +    libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel`.
       * To install on Solaris, try running `pkg install x11/header/x11-protocols
         x11/library/libice x11/library/libpthread-stubs x11/library/libsm
         x11/library/libx11 x11/library/libxau x11/library/libxcb
         x11/library/libxdmcp x11/library/libxevie x11/library/libxext
    -    x11/library/libxrender x11/library/libxscrnsaver x11/library/libxtst
    -    x11/library/toolkit/libxt`.
    +    x11/library/libxrender x11/library/libxrandr x11/library/libxscrnsaver
    +    x11/library/libxtst x11/library/toolkit/libxt`.
     
     Use `--with-x=` if `configure` does not properly locate your X11 files.
     
    @@ -1062,6 +1062,7 @@ Note that X11 is needed even if you only want to build a headless JDK.
           * libice-dev
           * libxrender
           * libxrender-dev
    +      * libxrandr-dev
           * libsm-dev
           * libxt-dev
           * libx11
    @@ -1112,7 +1113,7 @@ apt install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu
       * Create chroot on the *build* system, configuring it for *target* system:
     ```
     sudo qemu-debootstrap --arch=arm64 --verbose \
    -       --include=fakeroot,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng12-dev \
    +       --include=fakeroot,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng12-dev \
            --resolve-deps jessie /chroots/arm64 http://httpredir.debian.org/debian/
     ```
     
    diff --git a/make/CompileJavaModules.gmk b/make/CompileJavaModules.gmk
    index 1763f31c06e..f56f0e0ab48 100644
    --- a/make/CompileJavaModules.gmk
    +++ b/make/CompileJavaModules.gmk
    @@ -481,7 +481,6 @@ jdk.internal.vm.compiler_EXCLUDES += \
         org.graalvm.compiler.processor \
         org.graalvm.compiler.replacements.jdk12.test \
         org.graalvm.compiler.replacements.jdk9.test \
    -    org.graalvm.compiler.replacements.jdk9_11.test \
         org.graalvm.compiler.replacements.processor \
         org.graalvm.compiler.replacements.test \
         org.graalvm.compiler.serviceprovider.processor \
    diff --git a/make/autoconf/hotspot.m4 b/make/autoconf/hotspot.m4
    index d7ebc918419..10b0056a2ce 100644
    --- a/make/autoconf/hotspot.m4
    +++ b/make/autoconf/hotspot.m4
    @@ -25,7 +25,7 @@
     
     # All valid JVM features, regardless of platform
     VALID_JVM_FEATURES="compiler1 compiler2 zero minimal dtrace jvmti jvmci \
    -    graal vm-structs jni-check services management cmsgc epsilongc g1gc parallelgc serialgc zgc nmt cds \
    +    graal vm-structs jni-check services management cmsgc epsilongc g1gc parallelgc serialgc shenandoahgc zgc nmt cds \
         static-build link-time-opt aot jfr"
     
     # Deprecated JVM features (these are ignored, but with a warning)
    @@ -325,6 +325,15 @@ AC_DEFUN_ONCE([HOTSPOT_SETUP_JVM_FEATURES],
         fi
       fi
     
    +  # Only enable Shenandoah on supported arches
    +  AC_MSG_CHECKING([if shenandoah can be built])
    +  if test "x$OPENJDK_TARGET_CPU_ARCH" = "xx86" || test "x$OPENJDK_TARGET_CPU" = "xaarch64" ; then
    +    AC_MSG_RESULT([yes])
    +  else
    +    DISABLED_JVM_FEATURES="$DISABLED_JVM_FEATURES shenandoahgc"
    +    AC_MSG_RESULT([no, platform not supported])
    +  fi
    +
       # Only enable ZGC on supported platforms
       AC_MSG_CHECKING([if zgc can be built])
       if test "x$OPENJDK_TARGET_OS" = "xlinux" && test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then
    @@ -336,7 +345,7 @@ AC_DEFUN_ONCE([HOTSPOT_SETUP_JVM_FEATURES],
     
       # Disable unsupported GCs for Zero
       if HOTSPOT_CHECK_JVM_VARIANT(zero); then
    -    DISABLED_JVM_FEATURES="$DISABLED_JVM_FEATURES epsilongc g1gc zgc"
    +    DISABLED_JVM_FEATURES="$DISABLED_JVM_FEATURES epsilongc g1gc zgc shenandoahgc"
       fi
     
       # Turn on additional features based on other parts of configure
    @@ -470,7 +479,7 @@ AC_DEFUN_ONCE([HOTSPOT_SETUP_JVM_FEATURES],
       fi
     
       # All variants but minimal (and custom) get these features
    -  NON_MINIMAL_FEATURES="$NON_MINIMAL_FEATURES cmsgc g1gc parallelgc serialgc epsilongc jni-check jvmti management nmt services vm-structs zgc"
    +  NON_MINIMAL_FEATURES="$NON_MINIMAL_FEATURES cmsgc g1gc parallelgc serialgc epsilongc shenandoahgc jni-check jvmti management nmt services vm-structs zgc"
     
       # Disable CDS on AIX.
       if test "x$OPENJDK_TARGET_OS" = "xaix"; then
    diff --git a/make/conf/jib-profiles.js b/make/conf/jib-profiles.js
    index 2a0b94502df..8cf01a4e0eb 100644
    --- a/make/conf/jib-profiles.js
    +++ b/make/conf/jib-profiles.js
    @@ -248,6 +248,7 @@ var getJibProfilesCommon = function (input, data) {
             configure_args: concat(["--enable-jtreg-failure-handler"],
                 "--with-exclude-translations=de,es,fr,it,ko,pt_BR,sv,ca,tr,cs,sk,ja_JP_A,ja_JP_HA,ja_JP_HI,ja_JP_I,zh_TW,zh_HK",
                 "--disable-manpages",
    +            "--with-jvm-features=-shenandoahgc",
                 versionArgs(input, common))
         };
         // Extra settings for debug profiles
    @@ -425,7 +426,7 @@ var getJibProfilesProfiles = function (input, common, data) {
             "windows-x64": {
                 target_os: "windows",
                 target_cpu: "x64",
    -            dependencies: ["devkit", "graalunit_lib"],
    +            dependencies: ["devkit", "pandoc", "graalunit_lib"],
                 configure_args: concat(common.configure_args_64bit),
             },
     
    diff --git a/make/data/charsetmapping/charsets b/make/data/charsetmapping/charsets
    index bf1e23345b4..45b422fc6de 100644
    --- a/make/data/charsetmapping/charsets
    +++ b/make/data/charsetmapping/charsets
    @@ -1554,10 +1554,11 @@ charset x-IBM970 IBM970
     
     charset x-IBM964 IBM964
         package sun.nio.cs.ext
    -    type    source
    +    type    template
         alias   cp964               # JDK historical
         alias   ibm964
         alias   ibm-964
    +    alias   ibm-euctw
         alias   964
     
     charset x-IBM33722 IBM33722
    @@ -1861,6 +1862,11 @@ charset x-JIS0212_MS5022X JIS_X_0212_MS5022X
         minmax  0x21 0x7e 0x21 0x7e
         internal true               # "internal implementation
     
    +charset SimpleEUCEncoder SimpleEUCEncoder
    +    package sun.nio.cs.ext
    +    type    template
    +    internal true
    +
     ########################################################
     #
     # platform specific charsets, to be registered into spi
    diff --git a/make/data/charsetmapping/stdcs-aix b/make/data/charsetmapping/stdcs-aix
    index dab8523da14..2ed31864268 100644
    --- a/make/data/charsetmapping/stdcs-aix
    +++ b/make/data/charsetmapping/stdcs-aix
    @@ -16,6 +16,7 @@ IBM942C
     IBM943
     IBM943C
     IBM950
    +IBM964
     IBM970
     IBM1046
     IBM1124
    @@ -25,3 +26,4 @@ ISO_8859_6
     ISO_8859_8
     MS1252
     TIS_620
    +SimpleEUCEncoder
    diff --git a/make/devkit/createPandocBundle.sh b/make/devkit/createPandocBundle.sh
    index f4c6ca729e4..2b36c58a502 100644
    --- a/make/devkit/createPandocBundle.sh
    +++ b/make/devkit/createPandocBundle.sh
    @@ -41,6 +41,9 @@ if [[ $TARGET_PLATFORM == linux_x64 ]] ; then
     elif [[ $TARGET_PLATFORM == macosx_x64 ]] ; then
       PANDOC_PLATFORM=macOS
       PANDOC_SUFFIX=zip
    +elif [[ $TARGET_PLATFORM == windows_x64 ]] ; then
    +  PANDOC_PLATFORM=windows-x86_64
    +  PANDOC_SUFFIX=zip
     else
       echo "Unknown platform"
       exit 1
    @@ -59,7 +62,12 @@ fi
     cd ..
     
     mkdir pandoc
    -cp tmp/pandoc-$PANDOC_VERSION/bin/pandoc pandoc
    +if [[ $TARGET_PLATFORM == windows_x64 ]] ; then
    +  cp tmp/pandoc-$PANDOC_VERSION-$PANDOC_PLATFORM/pandoc.exe pandoc
    +  chmod +x pandoc/pandoc.exe
    +else
    +  cp tmp/pandoc-$PANDOC_VERSION/bin/pandoc pandoc
    +fi
     
     tar -cvzf ../$BUNDLE_NAME pandoc
     cp ../$BUNDLE_NAME "$ORIG_DIR"
    diff --git a/make/hotspot/gensrc/GensrcAdlc.gmk b/make/hotspot/gensrc/GensrcAdlc.gmk
    index 92b030b69da..8cd9af6ea12 100644
    --- a/make/hotspot/gensrc/GensrcAdlc.gmk
    +++ b/make/hotspot/gensrc/GensrcAdlc.gmk
    @@ -136,6 +136,12 @@ ifeq ($(call check-jvm-feature, compiler2), true)
           $d/os_cpu/$(HOTSPOT_TARGET_OS)_$(HOTSPOT_TARGET_CPU_ARCH)/$(HOTSPOT_TARGET_OS)_$(HOTSPOT_TARGET_CPU_ARCH).ad \
         )))
     
    +  ifeq ($(call check-jvm-feature, shenandoahgc), true)
    +    AD_SRC_FILES += $(call uniq, $(wildcard $(foreach d, $(AD_SRC_ROOTS), \
    +        $d/cpu/$(HOTSPOT_TARGET_CPU_ARCH)/gc/shenandoah/shenandoah_$(HOTSPOT_TARGET_CPU).ad \
    +      )))
    +  endif
    +
       SINGLE_AD_SRCFILE := $(ADLC_SUPPORT_DIR)/all-ad-src.ad
     
       INSERT_FILENAME_AWK_SCRIPT := \
    diff --git a/make/hotspot/lib/JvmDtraceObjects.gmk b/make/hotspot/lib/JvmDtraceObjects.gmk
    index 895cfdf4907..7e17f1e31a9 100644
    --- a/make/hotspot/lib/JvmDtraceObjects.gmk
    +++ b/make/hotspot/lib/JvmDtraceObjects.gmk
    @@ -60,6 +60,7 @@ ifeq ($(call check-jvm-feature, dtrace), true)
             ciEnv.o \
             classLoadingService.o \
             compileBroker.o \
    +        gcVMOperations.o \
             hashtable.o \
             instanceKlass.o \
             java.o \
    @@ -74,18 +75,17 @@ ifeq ($(call check-jvm-feature, dtrace), true)
             thread.o \
             unsafe.o \
             vmThread.o \
    -        vmGCOperations.o \
         )
     
         ifeq ($(call check-jvm-feature, cmsgc), true)
           DTRACE_INSTRUMENTED_OBJS += $(addprefix $(JVM_OUTPUTDIR)/objs/, \
    -          vmCMSOperations.o \
    +          cmsVMOperations.o \
           )
         endif
     
         ifeq ($(call check-jvm-feature, parallelgc), true)
           DTRACE_INSTRUMENTED_OBJS += $(addprefix $(JVM_OUTPUTDIR)/objs/, \
    -          vmPSOperations.o \
    +          psVMOperations.o \
           )
         endif
     
    diff --git a/make/hotspot/lib/JvmFeatures.gmk b/make/hotspot/lib/JvmFeatures.gmk
    index c42b1e930aa..ceee2ea72a4 100644
    --- a/make/hotspot/lib/JvmFeatures.gmk
    +++ b/make/hotspot/lib/JvmFeatures.gmk
    @@ -166,6 +166,13 @@ ifneq ($(call check-jvm-feature, zgc), true)
       JVM_EXCLUDE_PATTERNS += gc/z
     endif
     
    +ifneq ($(call check-jvm-feature, shenandoahgc), true)
    +  JVM_CFLAGS_FEATURES += -DINCLUDE_SHENANDOAHGC=0
    +  JVM_EXCLUDE_PATTERNS += gc/shenandoah
    +else
    +  JVM_CFLAGS_FEATURES += -DSUPPORT_BARRIER_ON_PRIMITIVES -DSUPPORT_NOT_TO_SPACE_INVARIANT
    +endif
    +
     ifneq ($(call check-jvm-feature, jfr), true)
       JVM_CFLAGS_FEATURES += -DINCLUDE_JFR=0
       JVM_EXCLUDE_PATTERNS += jfr
    diff --git a/make/hotspot/lib/JvmOverrideFiles.gmk b/make/hotspot/lib/JvmOverrideFiles.gmk
    index 3e32966fa18..7d45dd331af 100644
    --- a/make/hotspot/lib/JvmOverrideFiles.gmk
    +++ b/make/hotspot/lib/JvmOverrideFiles.gmk
    @@ -36,6 +36,11 @@ ifeq ($(TOOLCHAIN_TYPE), gcc)
       BUILD_LIBJVM_assembler_x86.cpp_CXXFLAGS := -Wno-maybe-uninitialized
       BUILD_LIBJVM_cardTableBarrierSetAssembler_x86.cpp_CXXFLAGS := -Wno-maybe-uninitialized
       BUILD_LIBJVM_interp_masm_x86.cpp_CXXFLAGS := -Wno-uninitialized
    +  ifeq ($(DEBUG_LEVEL), release)
    +    # Need extra inlining to collapse all marking code into the hot marking loop
    +    BUILD_LIBJVM_shenandoahConcurrentMark.cpp_CXXFLAGS := --param inline-unit-growth=1000
    +    BUILD_LIBJVM_shenandoahTraversalGC.cpp_CXXFLAGS := --param inline-unit-growth=1000
    +  endif
     endif
     
     LIBJVM_FDLIBM_COPY_OPT_FLAG := $(CXX_O_FLAG_NONE)
    diff --git a/make/jdk/src/classes/build/tools/cldrconverter/AbstractLDMLHandler.java b/make/jdk/src/classes/build/tools/cldrconverter/AbstractLDMLHandler.java
    index 88868eff70d..2197a279682 100644
    --- a/make/jdk/src/classes/build/tools/cldrconverter/AbstractLDMLHandler.java
    +++ b/make/jdk/src/classes/build/tools/cldrconverter/AbstractLDMLHandler.java
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -151,6 +151,19 @@ abstract class AbstractLDMLHandler extends DefaultHandler {
             }
         }
     
    +    void pushStringListEntry(String qName, Attributes attributes, String key) {
    +        if (!pushIfIgnored(qName, attributes)) {
    +            currentContainer = new StringListEntry(qName, currentContainer, key);
    +        }
    +    }
    +
    +    void pushStringListElement(String qName, Attributes attributes, int index) {
    +        if (!pushIfIgnored(qName, attributes)) {
    +            currentContainer = new StringListElement(qName, currentContainer, index);
    +        }
    +    }
    +
    +
         private boolean pushIfIgnored(String qName, Attributes attributes) {
             if (isIgnored(attributes) || currentContainer instanceof IgnoredContainer) {
                 pushIgnoredContainer(qName);
    diff --git a/make/jdk/src/classes/build/tools/cldrconverter/Bundle.java b/make/jdk/src/classes/build/tools/cldrconverter/Bundle.java
    index f608bc97882..71edade6daa 100644
    --- a/make/jdk/src/classes/build/tools/cldrconverter/Bundle.java
    +++ b/make/jdk/src/classes/build/tools/cldrconverter/Bundle.java
    @@ -53,6 +53,10 @@ class Bundle {
             "NumberPatterns/percent"
         };
     
    +    private final static String[] COMPACT_NUMBER_PATTERN_KEYS = {
    +            "short.CompactNumberPatterns",
    +            "long.CompactNumberPatterns"};
    +
         private final static String[] NUMBER_ELEMENT_KEYS = {
             "NumberElements/decimal",
             "NumberElements/group",
    @@ -228,6 +232,16 @@ class Bundle {
                 }
             }
     
    +        for (String k : COMPACT_NUMBER_PATTERN_KEYS) {
    +            List patterns = (List) myMap.remove(k);
    +            if (patterns != null) {
    +                // Replace any null entry with empty strings.
    +                String[] arrPatterns = patterns.stream()
    +                        .map(s -> s == null ? "" : s).toArray(String[]::new);
    +                myMap.put(k, arrPatterns);
    +            }
    +        }
    +
             // if myMap has any of NUMBER_ELEMENT_KEYS, create a complete NumberElements.
             String defaultScript = (String) myMap.get("DefaultNumberingSystem");
             @SuppressWarnings("unchecked")
    diff --git a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java
    index 0ecb7eb6f59..473bc73d183 100644
    --- a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java
    +++ b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java
    @@ -888,6 +888,8 @@ public class CLDRConverter {
                 copyIfPresent(map, "NumberElements", formatData);
             }
             copyIfPresent(map, "NumberPatterns", formatData);
    +        copyIfPresent(map, "short.CompactNumberPatterns", formatData);
    +        copyIfPresent(map, "long.CompactNumberPatterns", formatData);
     
             // put extra number elements for available scripts into formatData, if it is "root"
             if (id.equals("root")) {
    diff --git a/make/jdk/src/classes/build/tools/cldrconverter/LDMLParseHandler.java b/make/jdk/src/classes/build/tools/cldrconverter/LDMLParseHandler.java
    index f45b5a7df60..f8ddf34dc8e 100644
    --- a/make/jdk/src/classes/build/tools/cldrconverter/LDMLParseHandler.java
    +++ b/make/jdk/src/classes/build/tools/cldrconverter/LDMLParseHandler.java
    @@ -52,6 +52,8 @@ class LDMLParseHandler extends AbstractLDMLHandler {
         private final String id;
         private String currentContext = ""; // "format"/"stand-alone"
         private String currentWidth = ""; // "wide"/"narrow"/"abbreviated"
    +    private String currentStyle = ""; // short, long for decimalFormat
    +    private String compactCount = ""; // one or other for decimalFormat
     
         LDMLParseHandler(String id) {
             this.id = id;
    @@ -503,13 +505,85 @@ class LDMLParseHandler extends AbstractLDMLHandler {
             // Number format information
             //
             case "decimalFormatLength":
    -            if (attributes.getValue("type") == null) {
    -                // skipping type="short" data
    -                // for FormatData
    -                // copy string for later assembly into NumberPatterns
    +            String type = attributes.getValue("type");
    +            if (null == type) {
    +                // format data for decimal number format
                     pushStringEntry(qName, attributes, "NumberPatterns/decimal");
    +                currentStyle = type;
                 } else {
    -                pushIgnoredContainer(qName);
    +                switch (type) {
    +                    case "short":
    +                    case "long":
    +                        // considering "short" and long for
    +                        // compact number formatting patterns
    +                        pushKeyContainer(qName, attributes, type);
    +                        currentStyle = type;
    +                        break;
    +                    default:
    +                        pushIgnoredContainer(qName);
    +                        break;
    +                }
    +            }
    +            break;
    +        case "decimalFormat":
    +            if(currentStyle == null) {
    +                pushContainer(qName, attributes);
    +            } else {
    +                switch (currentStyle) {
    +                    case "short":
    +                        pushStringListEntry(qName, attributes,
    +                                currentStyle+".CompactNumberPatterns");
    +                        break;
    +                    case "long":
    +                        pushStringListEntry(qName, attributes,
    +                                currentStyle+".CompactNumberPatterns");
    +                        break;
    +                    default:
    +                        pushIgnoredContainer(qName);
    +                        break;
    +                }
    +            }
    +            break;
    +        case "pattern":
    +            String containerName = currentContainer.getqName();
    +            if (containerName.equals("decimalFormat")) {
    +                if (currentStyle == null) {
    +                    pushContainer(qName, attributes);
    +                } else {
    +                    // The compact number patterns parsing assumes that the order
    +                    // of patterns are always in the increasing order of their
    +                    // type attribute i.e. type = 1000...
    +                    // Between the inflectional forms for a type (e.g.
    +                    // count = "one" and count = "other" for type = 1000), it is
    +                    // assumed that the count = "one" always appears before
    +                    // count = "other"
    +                    switch (currentStyle) {
    +                        case "short":
    +                        case "long":
    +                            String count = attributes.getValue("count");
    +                            // first pattern of count = "one" or count = "other"
    +                            if ((count.equals("one") || count.equals("other"))
    +                                    && compactCount.equals("")) {
    +                                compactCount = count;
    +                                pushStringListElement(qName, attributes,
    +                                        (int) Math.log10(Double.parseDouble(attributes.getValue("type"))));
    +                            } else if ((count.equals("one") || count.equals("other"))
    +                                    && compactCount.equals(count)) {
    +                                // extract patterns with similar "count"
    +                                // attribute value
    +                                pushStringListElement(qName, attributes,
    +                                        (int) Math.log10(Double.parseDouble(attributes.getValue("type"))));
    +                            } else {
    +                                pushIgnoredContainer(qName);
    +                            }
    +                            break;
    +                        default:
    +                            pushIgnoredContainer(qName);
    +                            break;
    +                    }
    +                }
    +            } else {
    +                pushContainer(qName, attributes);
                 }
                 break;
             case "currencyFormatLength":
    @@ -676,10 +750,9 @@ class LDMLParseHandler extends AbstractLDMLHandler {
             // "alias" for root
             case "alias":
                 {
    -                if (id.equals("root") &&
    -                        !isIgnored(attributes) &&
    -                        currentCalendarType != null &&
    -                        !currentCalendarType.lname().startsWith("islamic-")) { // ignore Islamic variants
    +                if (id.equals("root") && !isIgnored(attributes)
    +                        && ((currentContainer.getqName().equals("decimalFormatLength"))
    +                        || (currentCalendarType != null && !currentCalendarType.lname().startsWith("islamic-")))) { // ignore islamic variants
                         pushAliasEntry(qName, attributes, attributes.getValue("path"));
                     } else {
                         pushIgnoredContainer(qName);
    @@ -831,6 +904,9 @@ class LDMLParseHandler extends AbstractLDMLHandler {
             case "dayPeriods":
             case "eras":
                 break;
    +        case "decimalFormatLength": // used for compact number formatting patterns
    +            keyName = type + ".CompactNumberPatterns";
    +            break;
             default:
                 keyName = "";
                 break;
    @@ -869,6 +945,14 @@ class LDMLParseHandler extends AbstractLDMLHandler {
                 width = path.substring(start+typeKey.length(), path.indexOf("']", start));
             }
     
    +        // used for compact number formatting patterns aliases
    +        typeKey = "decimalFormatLength[@type='";
    +        start = path.indexOf(typeKey);
    +        if (start != -1) {
    +            String style = path.substring(start + typeKey.length(), path.indexOf("']", start));
    +            return toJDKKey(qName, "", style);
    +        }
    +
             return calType + "." + toJDKKey(qName, context, width);
         }
     
    @@ -926,7 +1010,11 @@ class LDMLParseHandler extends AbstractLDMLHandler {
                 currentContext = "";
                 putIfEntry();
                 break;
    -
    +        case "decimalFormatLength":
    +            currentStyle = "";
    +            compactCount = "";
    +            putIfEntry();
    +            break;
             default:
                 putIfEntry();
             }
    @@ -937,22 +1025,28 @@ class LDMLParseHandler extends AbstractLDMLHandler {
             if (currentContainer instanceof AliasEntry) {
                 Entry entry = (Entry) currentContainer;
                 String containerqName = entry.getParent().getqName();
    -            Set keyNames = populateAliasKeys(containerqName, currentContext, currentWidth);
    -            if (!keyNames.isEmpty()) {
    -                for (String keyName : keyNames) {
    -                    String[] tmp = keyName.split(",", 3);
    -                    String calType = currentCalendarType.lname();
    -                    String src = calType+"."+tmp[0];
    -                    String target = getTarget(
    -                                entry.getKey(),
    -                                calType,
    -                                tmp[1].length()>0 ? tmp[1] : currentContext,
    -                                tmp[2].length()>0 ? tmp[2] : currentWidth);
    -                    if (target.substring(target.lastIndexOf('.')+1).equals(containerqName)) {
    -                        target = target.substring(0, target.indexOf('.'))+"."+tmp[0];
    +            if (containerqName.equals("decimalFormatLength")) {
    +                String srcKey = toJDKKey(containerqName, "", currentStyle);
    +                String targetKey = getTarget(entry.getKey(), "", "", "");
    +                CLDRConverter.aliases.put(srcKey, targetKey);
    +            } else {
    +                Set keyNames = populateAliasKeys(containerqName, currentContext, currentWidth);
    +                if (!keyNames.isEmpty()) {
    +                    for (String keyName : keyNames) {
    +                        String[] tmp = keyName.split(",", 3);
    +                        String calType = currentCalendarType.lname();
    +                        String src = calType+"."+tmp[0];
    +                        String target = getTarget(
    +                                    entry.getKey(),
    +                                    calType,
    +                                    tmp[1].length()>0 ? tmp[1] : currentContext,
    +                                    tmp[2].length()>0 ? tmp[2] : currentWidth);
    +                        if (target.substring(target.lastIndexOf('.')+1).equals(containerqName)) {
    +                            target = target.substring(0, target.indexOf('.'))+"."+tmp[0];
    +                        }
    +                        CLDRConverter.aliases.put(src.replaceFirst("^gregorian.", ""),
    +                                                  target.replaceFirst("^gregorian.", ""));
                         }
    -                    CLDRConverter.aliases.put(src.replaceFirst("^gregorian.", ""),
    -                                              target.replaceFirst("^gregorian.", ""));
                     }
                 }
             } else if (currentContainer instanceof Entry) {
    diff --git a/make/jdk/src/classes/build/tools/cldrconverter/StringListElement.java b/make/jdk/src/classes/build/tools/cldrconverter/StringListElement.java
    new file mode 100644
    index 00000000000..4529efb015f
    --- /dev/null
    +++ b/make/jdk/src/classes/build/tools/cldrconverter/StringListElement.java
    @@ -0,0 +1,47 @@
    +/*
    + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
    + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.  Oracle designates this
    + * particular file as subject to the "Classpath" exception as provided
    + * by Oracle in the LICENSE file that accompanied this code.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + */
    +
    +package build.tools.cldrconverter;
    +
    +class StringListElement extends Container {
    +
    +    StringListEntry list;
    +    int index;
    +
    +    StringListElement(String qName, Container parent, int index) {
    +        super(qName, parent);
    +        while (!(parent instanceof StringListEntry)) {
    +            parent = parent.getParent();
    +        }
    +        list = (StringListEntry) parent;
    +        this.index = index;
    +    }
    +
    +    @Override
    +    void addCharacters(char[] characters, int start, int length) {
    +        list.addCharacters(index, characters, start, length);
    +    }
    +
    +}
    diff --git a/make/jdk/src/classes/build/tools/cldrconverter/StringListEntry.java b/make/jdk/src/classes/build/tools/cldrconverter/StringListEntry.java
    new file mode 100644
    index 00000000000..a0e55007f66
    --- /dev/null
    +++ b/make/jdk/src/classes/build/tools/cldrconverter/StringListEntry.java
    @@ -0,0 +1,61 @@
    +/*
    + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
    + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.  Oracle designates this
    + * particular file as subject to the "Classpath" exception as provided
    + * by Oracle in the LICENSE file that accompanied this code.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + */
    +
    +package build.tools.cldrconverter;
    +
    +import java.util.ArrayList;
    +import java.util.List;
    +import java.util.stream.IntStream;
    +
    +class StringListEntry extends Entry> {
    +
    +    private List value;
    +
    +    StringListEntry(String qName, Container parent, String key) {
    +        super(qName, parent, key);
    +        value = new ArrayList<>();
    +    }
    +
    +    void addCharacters(int index, char[] characters, int start, int length) {
    +        // fill with empty strings when the patterns start from index > 0
    +        if (value.size() < index) {
    +            IntStream.range(0, index).forEach(i -> value.add(i, ""));
    +            value.add(index, new String(characters, start, length));
    +        } else {
    +            value.add(index, new String(characters, start, length));
    +        }
    +    }
    +
    +    @Override
    +    List getValue() {
    +        for (String element : value) {
    +            if (element != null) {
    +                return value;
    +            }
    +        }
    +        return null;
    +    }
    +
    +}
    diff --git a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/TEST.properties b/make/launcher/Launcher-jdk.jfr.gmk
    similarity index 72%
    rename from test/hotspot/jtreg/vmTestbase/nsk/stress/network/TEST.properties
    rename to make/launcher/Launcher-jdk.jfr.gmk
    index 8b51b2a9115..f2d504ac373 100644
    --- a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/TEST.properties
    +++ b/make/launcher/Launcher-jdk.jfr.gmk
    @@ -4,7 +4,9 @@
     #
     # This code is free software; you can redistribute it and/or modify it
     # under the terms of the GNU General Public License version 2 only, as
    -# published by the Free Software Foundation.
    +# published by the Free Software Foundation.  Oracle designates this
    +# particular file as subject to the "Classpath" exception as provided
    +# by Oracle in the LICENSE file that accompanied this code.
     #
     # This code is distributed in the hope that it will be useful, but WITHOUT
     # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    @@ -21,4 +23,9 @@
     # questions.
     #
     
    -exclusiveAccess.dirs=.
    +include LauncherCommon.gmk
    +
    +$(eval $(call SetupBuildLauncher, jfr, \
    +    MAIN_CLASS := jdk.jfr.internal.tool.Main, \
    +    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
    +))
    diff --git a/make/test/JtregGraalUnit.gmk b/make/test/JtregGraalUnit.gmk
    index 9b44c795d3e..824d4457a55 100644
    --- a/make/test/JtregGraalUnit.gmk
    +++ b/make/test/JtregGraalUnit.gmk
    @@ -80,15 +80,18 @@ ifeq ($(INCLUDE_GRAAL), true)
                 $(SRC_DIR)/org.graalvm.compiler.asm.amd64.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.asm.sparc.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.asm.test/src \
    +            $(SRC_DIR)/org.graalvm.compiler.core.aarch64.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.core.amd64.test/src \
    -            $(SRC_DIR)/org.graalvm.compiler.core.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.core.jdk9.test/src \
    +            $(SRC_DIR)/org.graalvm.compiler.core.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.debug.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.graph.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.hotspot.amd64.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.hotspot.lir.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.hotspot.sparc.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.hotspot.test/src \
    +            $(SRC_DIR)/org.graalvm.compiler.jtt/src \
    +            $(SRC_DIR)/org.graalvm.compiler.lir.jtt/src \
                 $(SRC_DIR)/org.graalvm.compiler.lir.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.loop.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.nodes.test/src \
    @@ -96,12 +99,9 @@ ifeq ($(INCLUDE_GRAAL), true)
                 $(SRC_DIR)/org.graalvm.compiler.phases.common.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.replacements.jdk12.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.replacements.jdk9.test/src \
    -            $(SRC_DIR)/org.graalvm.compiler.replacements.jdk9_11.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.replacements.test/src \
                 $(SRC_DIR)/org.graalvm.compiler.test/src \
                 $(SRC_DIR)/org.graalvm.util.test/src \
    -            $(SRC_DIR)/org.graalvm.compiler.jtt/src \
    -            $(SRC_DIR)/org.graalvm.compiler.lir.jtt/src \
                 , \
             EXCLUDE_FILES := org/graalvm/compiler/core/test/VerifyDebugUsageTest.java, \
             BIN := $(COMPILE_OUTPUTDIR)/jdk.vm.compiler.tests, \
    diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad
    index a86fe76f025..9ba919947b8 100644
    --- a/src/hotspot/cpu/aarch64/aarch64.ad
    +++ b/src/hotspot/cpu/aarch64/aarch64.ad
    @@ -1,6 +1,6 @@
     //
     // Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
    -// Copyright (c) 2014, Red Hat Inc. All rights reserved.
    +// Copyright (c) 2014, 2018, Red Hat, Inc. All rights reserved.
     // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     //
     // This code is free software; you can redistribute it and/or modify it
    @@ -1272,6 +1272,8 @@ source %{
         case Op_CompareAndSwapL:
         case Op_CompareAndSwapP:
         case Op_CompareAndSwapN:
    +    case Op_ShenandoahCompareAndSwapP:
    +    case Op_ShenandoahCompareAndSwapN:
         case Op_CompareAndSwapB:
         case Op_CompareAndSwapS:
         case Op_GetAndSetI:
    @@ -1293,6 +1295,10 @@ source %{
         case Op_WeakCompareAndSwapL:
         case Op_WeakCompareAndSwapP:
         case Op_WeakCompareAndSwapN:
    +    case Op_ShenandoahWeakCompareAndSwapP:
    +    case Op_ShenandoahWeakCompareAndSwapN:
    +    case Op_ShenandoahCompareAndExchangeP:
    +    case Op_ShenandoahCompareAndExchangeN:
           return maybe_volatile;
         default:
           return false;
    diff --git a/src/hotspot/cpu/aarch64/assembler_aarch64.hpp b/src/hotspot/cpu/aarch64/assembler_aarch64.hpp
    index 719e8edcbd8..09c7cd240f4 100644
    --- a/src/hotspot/cpu/aarch64/assembler_aarch64.hpp
    +++ b/src/hotspot/cpu/aarch64/assembler_aarch64.hpp
    @@ -1118,7 +1118,7 @@ public:
         Register Rn, enum operand_size sz, int op, bool ordered) {
         starti;
         f(sz, 31, 30), f(0b001000, 29, 24), f(op, 23, 21);
    -    rf(Rs, 16), f(ordered, 15), rf(Rt2, 10), rf(Rn, 5), rf(Rt1, 0);
    +    rf(Rs, 16), f(ordered, 15), rf(Rt2, 10), srf(Rn, 5), rf(Rt1, 0);
       }
     
       void load_exclusive(Register dst, Register addr,
    @@ -1247,7 +1247,7 @@ public:
                       enum operand_size sz, int op1, int op2, bool a, bool r) {
         starti;
         f(sz, 31, 30), f(0b111000, 29, 24), f(a, 23), f(r, 22), f(1, 21);
    -    rf(Rs, 16), f(op1, 15), f(op2, 14, 12), f(0, 11, 10), rf(Rn, 5), zrf(Rt, 0);
    +    rf(Rs, 16), f(op1, 15), f(op2, 14, 12), f(0, 11, 10), srf(Rn, 5), zrf(Rt, 0);
       }
     
     #define INSN(NAME, NAME_A, NAME_L, NAME_AL, op1, op2)                   \
    diff --git a/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp
    new file mode 100644
    index 00000000000..db13a870dda
    --- /dev/null
    +++ b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp
    @@ -0,0 +1,671 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahRuntime.hpp"
    +#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
    +#include "interpreter/interpreter.hpp"
    +#include "interpreter/interp_masm.hpp"
    +#include "runtime/sharedRuntime.hpp"
    +#include "runtime/thread.hpp"
    +#ifdef COMPILER1
    +#include "c1/c1_LIRAssembler.hpp"
    +#include "c1/c1_MacroAssembler.hpp"
    +#include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
    +#endif
    +
    +#define __ masm->
    +
    +address ShenandoahBarrierSetAssembler::_shenandoah_wb = NULL;
    +
    +void ShenandoahBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
    +                                                       Register addr, Register count, RegSet saved_regs) {
    +  if (is_oop) {
    +    bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0;
    +    if (!dest_uninitialized && !ShenandoahHeap::heap()->heuristics()->can_do_traversal_gc()) {
    +      __ push(saved_regs, sp);
    +      if (count == c_rarg0) {
    +        if (addr == c_rarg1) {
    +          // exactly backwards!!
    +          __ mov(rscratch1, c_rarg0);
    +          __ mov(c_rarg0, c_rarg1);
    +          __ mov(c_rarg1, rscratch1);
    +        } else {
    +          __ mov(c_rarg1, count);
    +          __ mov(c_rarg0, addr);
    +        }
    +      } else {
    +        __ mov(c_rarg0, addr);
    +        __ mov(c_rarg1, count);
    +      }
    +      if (UseCompressedOops) {
    +        __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_narrow_oop_entry), 2);
    +      } else {
    +        __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_oop_entry), 2);
    +      }
    +      __ pop(saved_regs, sp);
    +    }
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
    +                                                       Register start, Register end, Register scratch, RegSet saved_regs) {
    +  if (is_oop) {
    +    __ push(saved_regs, sp);
    +    // must compute element count unless barrier set interface is changed (other platforms supply count)
    +    assert_different_registers(start, end, scratch);
    +    __ lea(scratch, Address(end, BytesPerHeapOop));
    +    __ sub(scratch, scratch, start);               // subtract start to get #bytes
    +    __ lsr(scratch, scratch, LogBytesPerHeapOop);  // convert to element count
    +    __ mov(c_rarg0, start);
    +    __ mov(c_rarg1, scratch);
    +    __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_post_entry), 2);
    +    __ pop(saved_regs, sp);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::shenandoah_write_barrier_pre(MacroAssembler* masm,
    +                                                                 Register obj,
    +                                                                 Register pre_val,
    +                                                                 Register thread,
    +                                                                 Register tmp,
    +                                                                 bool tosca_live,
    +                                                                 bool expand_call) {
    +  if (ShenandoahSATBBarrier) {
    +    satb_write_barrier_pre(masm, obj, pre_val, thread, tmp, tosca_live, expand_call);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::satb_write_barrier_pre(MacroAssembler* masm,
    +                                                           Register obj,
    +                                                           Register pre_val,
    +                                                           Register thread,
    +                                                           Register tmp,
    +                                                           bool tosca_live,
    +                                                           bool expand_call) {
    +  // If expand_call is true then we expand the call_VM_leaf macro
    +  // directly to skip generating the check by
    +  // InterpreterMacroAssembler::call_VM_leaf_base that checks _last_sp.
    +
    +  assert(thread == rthread, "must be");
    +
    +  Label done;
    +  Label runtime;
    +
    +  assert_different_registers(obj, pre_val, tmp, rscratch1);
    +  assert(pre_val != noreg &&  tmp != noreg, "expecting a register");
    +
    +  Address in_progress(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_active_offset()));
    +  Address index(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset()));
    +  Address buffer(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset()));
    +
    +  // Is marking active?
    +  if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
    +    __ ldrw(tmp, in_progress);
    +  } else {
    +    assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption");
    +    __ ldrb(tmp, in_progress);
    +  }
    +  __ cbzw(tmp, done);
    +
    +  // Do we need to load the previous value?
    +  if (obj != noreg) {
    +    __ load_heap_oop(pre_val, Address(obj, 0), noreg, noreg, AS_RAW);
    +  }
    +
    +  // Is the previous value null?
    +  __ cbz(pre_val, done);
    +
    +  // Can we store original value in the thread's buffer?
    +  // Is index == 0?
    +  // (The index field is typed as size_t.)
    +
    +  __ ldr(tmp, index);                      // tmp := *index_adr
    +  __ cbz(tmp, runtime);                    // tmp == 0?
    +                                        // If yes, goto runtime
    +
    +  __ sub(tmp, tmp, wordSize);              // tmp := tmp - wordSize
    +  __ str(tmp, index);                      // *index_adr := tmp
    +  __ ldr(rscratch1, buffer);
    +  __ add(tmp, tmp, rscratch1);             // tmp := tmp + *buffer_adr
    +
    +  // Record the previous value
    +  __ str(pre_val, Address(tmp, 0));
    +  __ b(done);
    +
    +  __ bind(runtime);
    +  // save the live input values
    +  RegSet saved = RegSet::of(pre_val);
    +  if (tosca_live) saved += RegSet::of(r0);
    +  if (obj != noreg) saved += RegSet::of(obj);
    +
    +  __ push(saved, sp);
    +
    +  // Calling the runtime using the regular call_VM_leaf mechanism generates
    +  // code (generated by InterpreterMacroAssember::call_VM_leaf_base)
    +  // that checks that the *(rfp+frame::interpreter_frame_last_sp) == NULL.
    +  //
    +  // If we care generating the pre-barrier without a frame (e.g. in the
    +  // intrinsified Reference.get() routine) then ebp might be pointing to
    +  // the caller frame and so this check will most likely fail at runtime.
    +  //
    +  // Expanding the call directly bypasses the generation of the check.
    +  // So when we do not have have a full interpreter frame on the stack
    +  // expand_call should be passed true.
    +
    +  if (expand_call) {
    +    assert(pre_val != c_rarg1, "smashed arg");
    +    __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), pre_val, thread);
    +  } else {
    +    __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), pre_val, thread);
    +  }
    +
    +  __ pop(saved, sp);
    +
    +  __ bind(done);
    +}
    +
    +void ShenandoahBarrierSetAssembler::read_barrier(MacroAssembler* masm, Register dst) {
    +  if (ShenandoahReadBarrier) {
    +    read_barrier_impl(masm, dst);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::read_barrier_impl(MacroAssembler* masm, Register dst) {
    +  assert(UseShenandoahGC && (ShenandoahReadBarrier || ShenandoahStoreValReadBarrier || ShenandoahCASBarrier), "should be enabled");
    +  Label is_null;
    +  __ cbz(dst, is_null);
    +  read_barrier_not_null_impl(masm, dst);
    +  __ bind(is_null);
    +}
    +
    +void ShenandoahBarrierSetAssembler::read_barrier_not_null(MacroAssembler* masm, Register dst) {
    +  if (ShenandoahReadBarrier) {
    +    read_barrier_not_null_impl(masm, dst);
    +  }
    +}
    +
    +
    +void ShenandoahBarrierSetAssembler::read_barrier_not_null_impl(MacroAssembler* masm, Register dst) {
    +  assert(UseShenandoahGC && (ShenandoahReadBarrier || ShenandoahStoreValReadBarrier || ShenandoahCASBarrier), "should be enabled");
    +  __ ldr(dst, Address(dst, ShenandoahBrooksPointer::byte_offset()));
    +}
    +
    +void ShenandoahBarrierSetAssembler::write_barrier(MacroAssembler* masm, Register dst) {
    +  if (ShenandoahWriteBarrier) {
    +    write_barrier_impl(masm, dst);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::write_barrier_impl(MacroAssembler* masm, Register dst) {
    +  assert(UseShenandoahGC && (ShenandoahWriteBarrier || ShenandoahStoreValEnqueueBarrier), "Should be enabled");
    +  assert(dst != rscratch1, "need rscratch1");
    +  assert(dst != rscratch2, "need rscratch2");
    +
    +  Label done;
    +
    +  Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
    +  __ ldrb(rscratch1, gc_state);
    +
    +  // Check for heap stability
    +  __ mov(rscratch2, ShenandoahHeap::HAS_FORWARDED | ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL);
    +  __ tst(rscratch1, rscratch2);
    +  __ br(Assembler::EQ, done);
    +
    +  // Heap is unstable, need to perform the read-barrier even if WB is inactive
    +  __ ldr(dst, Address(dst, ShenandoahBrooksPointer::byte_offset()));
    +
    +  // Check for evacuation-in-progress and jump to WB slow-path if needed
    +  __ mov(rscratch2, ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL);
    +  __ tst(rscratch1, rscratch2);
    +  __ br(Assembler::EQ, done);
    +
    +  RegSet to_save = RegSet::of(r0);
    +  if (dst != r0) {
    +    __ push(to_save, sp);
    +    __ mov(r0, dst);
    +  }
    +
    +  __ far_call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_wb())));
    +
    +  if (dst != r0) {
    +    __ mov(dst, r0);
    +    __ pop(to_save, sp);
    +  }
    +
    +  __ bind(done);
    +}
    +
    +void ShenandoahBarrierSetAssembler::storeval_barrier(MacroAssembler* masm, Register dst, Register tmp) {
    +  if (ShenandoahStoreValEnqueueBarrier) {
    +    Label is_null;
    +    __ cbz(dst, is_null);
    +    write_barrier_impl(masm, dst);
    +    __ bind(is_null);
    +    // Save possibly live regs.
    +    RegSet live_regs = RegSet::range(r0, r4) - dst;
    +    __ push(live_regs, sp);
    +    __ strd(v0, __ pre(sp, 2 * -wordSize));
    +
    +    satb_write_barrier_pre(masm, noreg, dst, rthread, tmp, true, false);
    +
    +    // Restore possibly live regs.
    +    __ ldrd(v0, __ post(sp, 2 * wordSize));
    +    __ pop(live_regs, sp);
    +  }
    +  if (ShenandoahStoreValReadBarrier) {
    +    read_barrier_impl(masm, dst);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +                                            Register dst, Address src, Register tmp1, Register tmp_thread) {
    +  bool on_oop = type == T_OBJECT || type == T_ARRAY;
    +  bool in_heap = (decorators & IN_HEAP) != 0;
    +  bool on_weak = (decorators & ON_WEAK_OOP_REF) != 0;
    +  bool on_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0;
    +  bool on_reference = on_weak || on_phantom;
    +
    +  if (in_heap) {
    +    read_barrier_not_null(masm, src.base());
    +  }
    +
    +  BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
    +  if (ShenandoahKeepAliveBarrier && on_oop && on_reference) {
    +    __ enter();
    +    satb_write_barrier_pre(masm /* masm */,
    +                           noreg /* obj */,
    +                           dst /* pre_val */,
    +                           rthread /* thread */,
    +                           tmp1 /* tmp */,
    +                           true /* tosca_live */,
    +                           true /* expand_call */);
    +    __ leave();
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +                                             Address dst, Register val, Register tmp1, Register tmp2) {
    +  bool on_oop = type == T_OBJECT || type == T_ARRAY;
    +  bool in_heap = (decorators & IN_HEAP) != 0;
    +  if (in_heap) {
    +    write_barrier(masm, dst.base());
    +  }
    +  if (!on_oop) {
    +    BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2);
    +    return;
    +  }
    +
    +  // flatten object address if needed
    +  if (dst.index() == noreg && dst.offset() == 0) {
    +    if (dst.base() != r3) {
    +      __ mov(r3, dst.base());
    +    }
    +  } else {
    +    __ lea(r3, dst);
    +  }
    +
    +  shenandoah_write_barrier_pre(masm,
    +                               r3 /* obj */,
    +                               tmp2 /* pre_val */,
    +                               rthread /* thread */,
    +                               tmp1  /* tmp */,
    +                               val != noreg /* tosca_live */,
    +                               false /* expand_call */);
    +
    +  if (val == noreg) {
    +    BarrierSetAssembler::store_at(masm, decorators, type, Address(r3, 0), noreg, noreg, noreg);
    +  } else {
    +    storeval_barrier(masm, val, tmp1);
    +    // G1 barrier needs uncompressed oop for region cross check.
    +    Register new_val = val;
    +    if (UseCompressedOops) {
    +      new_val = rscratch2;
    +      __ mov(new_val, val);
    +    }
    +    BarrierSetAssembler::store_at(masm, decorators, type, Address(r3, 0), val, noreg, noreg);
    +  }
    +
    +}
    +
    +void ShenandoahBarrierSetAssembler::obj_equals(MacroAssembler* masm, Register op1, Register op2) {
    +  __ cmp(op1, op2);
    +  if (ShenandoahAcmpBarrier) {
    +    Label done;
    +    __ br(Assembler::EQ, done);
    +    // The object may have been evacuated, but we won't see it without a
    +    // membar here.
    +    __ membar(Assembler::LoadStore| Assembler::LoadLoad);
    +    read_barrier(masm, op1);
    +    read_barrier(masm, op2);
    +    __ cmp(op1, op2);
    +    __ bind(done);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::tlab_allocate(MacroAssembler* masm, Register obj,
    +                                                  Register var_size_in_bytes,
    +                                                  int con_size_in_bytes,
    +                                                  Register t1,
    +                                                  Register t2,
    +                                                  Label& slow_case) {
    +
    +  assert_different_registers(obj, t2);
    +  assert_different_registers(obj, var_size_in_bytes);
    +  Register end = t2;
    +
    +  __ ldr(obj, Address(rthread, JavaThread::tlab_top_offset()));
    +  if (var_size_in_bytes == noreg) {
    +    __ lea(end, Address(obj, (int) (con_size_in_bytes + ShenandoahBrooksPointer::byte_size())));
    +  } else {
    +    __ add(var_size_in_bytes, var_size_in_bytes, ShenandoahBrooksPointer::byte_size());
    +    __ lea(end, Address(obj, var_size_in_bytes));
    +  }
    +  __ ldr(rscratch1, Address(rthread, JavaThread::tlab_end_offset()));
    +  __ cmp(end, rscratch1);
    +  __ br(Assembler::HI, slow_case);
    +
    +  // update the tlab top pointer
    +  __ str(end, Address(rthread, JavaThread::tlab_top_offset()));
    +
    +  __ add(obj, obj, ShenandoahBrooksPointer::byte_size());
    +  __ str(obj, Address(obj, ShenandoahBrooksPointer::byte_offset()));
    +
    +  // recover var_size_in_bytes if necessary
    +  if (var_size_in_bytes == end) {
    +    __ sub(var_size_in_bytes, var_size_in_bytes, obj);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::resolve(MacroAssembler* masm, DecoratorSet decorators, Register obj) {
    +  bool oop_not_null = (decorators & IS_NOT_NULL) != 0;
    +  bool is_write = (decorators & ACCESS_WRITE) != 0;
    +  if (is_write) {
    +    if (oop_not_null) {
    +      write_barrier(masm, obj);
    +    } else {
    +      Label done;
    +      __ cbz(obj, done);
    +      write_barrier(masm, obj);
    +      __ bind(done);
    +    }
    +  } else {
    +    if (oop_not_null) {
    +      read_barrier_not_null(masm, obj);
    +    } else {
    +      read_barrier(masm, obj);
    +    }
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm, Register addr, Register expected, Register new_val,
    +                                                bool acquire, bool release, bool weak, bool encode,
    +                                                Register tmp1, Register tmp2, Register tmp3,
    +                                                Register result) {
    +
    +  if (!ShenandoahCASBarrier) {
    +    if (UseCompressedOops) {
    +      if (encode) {
    +        __ encode_heap_oop(tmp1, expected);
    +        expected = tmp1;
    +        __ encode_heap_oop(tmp3, new_val);
    +        new_val = tmp3;
    +      }
    +      __ cmpxchg(addr, expected, new_val, Assembler::word, /* acquire*/ true, /* release*/ true, /* weak*/ false, rscratch1);
    +      __ membar(__ AnyAny);
    +    } else {
    +      __ cmpxchg(addr, expected, new_val, Assembler::xword, /* acquire*/ true, /* release*/ true, /* weak*/ false, rscratch1);
    +      __ membar(__ AnyAny);
    +    }
    +    return;
    +  }
    +
    +  if (encode) {
    +    storeval_barrier(masm, new_val, tmp3);
    +  }
    +
    +  if (UseCompressedOops) {
    +    if (encode) {
    +      __ encode_heap_oop(tmp1, expected);
    +      expected = tmp1;
    +      __ encode_heap_oop(tmp2, new_val);
    +      new_val = tmp2;
    +    }
    +  }
    +  bool is_cae = (result != noreg);
    +  bool is_narrow = UseCompressedOops;
    +  Assembler::operand_size size = is_narrow ? Assembler::word : Assembler::xword;
    +  if (! is_cae) result = rscratch1;
    +
    +  assert_different_registers(addr, expected, new_val, result, tmp3);
    +
    +  Label retry, done, fail;
    +
    +  // CAS, using LL/SC pair.
    +  __ bind(retry);
    +  __ load_exclusive(result, addr, size, acquire);
    +  if (is_narrow) {
    +    __ cmpw(result, expected);
    +  } else {
    +    __ cmp(result, expected);
    +  }
    +  __ br(Assembler::NE, fail);
    +  __ store_exclusive(tmp3, new_val, addr, size, release);
    +  if (weak) {
    +    __ cmpw(tmp3, 0u); // If the store fails, return NE to our caller
    +  } else {
    +    __ cbnzw(tmp3, retry);
    +  }
    +  __ b(done);
    +
    + __  bind(fail);
    +  // Check if rb(expected)==rb(result)
    +  // Shuffle registers so that we have memory value ready for next expected.
    +  __ mov(tmp3, expected);
    +  __ mov(expected, result);
    +  if (is_narrow) {
    +    __ decode_heap_oop(result, result);
    +    __ decode_heap_oop(tmp3, tmp3);
    +  }
    +  read_barrier_impl(masm, result);
    +  read_barrier_impl(masm, tmp3);
    +  __ cmp(result, tmp3);
    +  // Retry with expected now being the value we just loaded from addr.
    +  __ br(Assembler::EQ, retry);
    +  if (is_narrow && is_cae) {
    +    // For cmp-and-exchange and narrow oops, we need to restore
    +    // the compressed old-value. We moved it to 'expected' a few lines up.
    +    __ mov(result, expected);
    +  }
    +  __ bind(done);
    +
    +}
    +
    +#ifdef COMPILER1
    +
    +#undef __
    +#define __ ce->masm()->
    +
    +void ShenandoahBarrierSetAssembler::gen_pre_barrier_stub(LIR_Assembler* ce, ShenandoahPreBarrierStub* stub) {
    +  ShenandoahBarrierSetC1* bs = (ShenandoahBarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1();
    +  // At this point we know that marking is in progress.
    +  // If do_load() is true then we have to emit the
    +  // load of the previous value; otherwise it has already
    +  // been loaded into _pre_val.
    +
    +  __ bind(*stub->entry());
    +
    +  assert(stub->pre_val()->is_register(), "Precondition.");
    +
    +  Register pre_val_reg = stub->pre_val()->as_register();
    +
    +  if (stub->do_load()) {
    +    ce->mem2reg(stub->addr(), stub->pre_val(), T_OBJECT, stub->patch_code(), stub->info(), false /*wide*/, false /*unaligned*/);
    +  }
    +  __ cbz(pre_val_reg, *stub->continuation());
    +  ce->store_parameter(stub->pre_val()->as_register(), 0);
    +  __ far_call(RuntimeAddress(bs->pre_barrier_c1_runtime_code_blob()->code_begin()));
    +  __ b(*stub->continuation());
    +}
    +
    +void ShenandoahBarrierSetAssembler::gen_write_barrier_stub(LIR_Assembler* ce, ShenandoahWriteBarrierStub* stub) {
    +
    +  Register obj = stub->obj()->as_register();
    +  Register res = stub->result()->as_register();
    +
    +  Label done;
    +
    +  __ bind(*stub->entry());
    +
    +  if (res != obj) {
    +    __ mov(res, obj);
    +  }
    +  // Check for null.
    +  if (stub->needs_null_check()) {
    +    __ cbz(res, done);
    +  }
    +
    +  write_barrier(ce->masm(), res);
    +
    +  __ bind(done);
    +  __ b(*stub->continuation());
    +}
    +
    +#undef __
    +
    +#define __ sasm->
    +
    +void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAssembler* sasm) {
    +  __ prologue("shenandoah_pre_barrier", false);
    +
    +  // arg0 : previous value of memory
    +
    +  BarrierSet* bs = BarrierSet::barrier_set();
    +
    +  const Register pre_val = r0;
    +  const Register thread = rthread;
    +  const Register tmp = rscratch1;
    +
    +  Address queue_index(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset()));
    +  Address buffer(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset()));
    +
    +  Label done;
    +  Label runtime;
    +
    +  // Is marking still active?
    +  Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
    +  __ ldrb(tmp, gc_state);
    +  __ mov(rscratch2, ShenandoahHeap::MARKING | ShenandoahHeap::TRAVERSAL);
    +  __ tst(tmp, rscratch2);
    +  __ br(Assembler::EQ, done);
    +
    +  // Can we store original value in the thread's buffer?
    +  __ ldr(tmp, queue_index);
    +  __ cbz(tmp, runtime);
    +
    +  __ sub(tmp, tmp, wordSize);
    +  __ str(tmp, queue_index);
    +  __ ldr(rscratch2, buffer);
    +  __ add(tmp, tmp, rscratch2);
    +  __ load_parameter(0, rscratch2);
    +  __ str(rscratch2, Address(tmp, 0));
    +  __ b(done);
    +
    +  __ bind(runtime);
    +  __ push_call_clobbered_registers();
    +  __ load_parameter(0, pre_val);
    +  __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), pre_val, thread);
    +  __ pop_call_clobbered_registers();
    +  __ bind(done);
    +
    +  __ epilogue();
    +}
    +
    +#undef __
    +
    +#endif // COMPILER1
    +
    +address ShenandoahBarrierSetAssembler::shenandoah_wb() {
    +  assert(_shenandoah_wb != NULL, "need write barrier stub");
    +  return _shenandoah_wb;
    +}
    +
    +#define __ cgen->assembler()->
    +
    +// Shenandoah write barrier.
    +//
    +// Input:
    +//   r0: OOP to evacuate.  Not null.
    +//
    +// Output:
    +//   r0: Pointer to evacuated OOP.
    +//
    +// Trash rscratch1, rscratch2.  Preserve everything else.
    +address ShenandoahBarrierSetAssembler::generate_shenandoah_wb(StubCodeGenerator* cgen) {
    +
    +  __ align(6);
    +  StubCodeMark mark(cgen, "StubRoutines", "shenandoah_wb");
    +  address start = __ pc();
    +
    +  Label work;
    +  __ mov(rscratch2, ShenandoahHeap::in_cset_fast_test_addr());
    +  __ lsr(rscratch1, r0, ShenandoahHeapRegion::region_size_bytes_shift_jint());
    +  __ ldrb(rscratch2, Address(rscratch2, rscratch1));
    +  __ tbnz(rscratch2, 0, work);
    +  __ ret(lr);
    +  __ bind(work);
    +
    +  Register obj = r0;
    +
    +  __ enter(); // required for proper stackwalking of RuntimeStub frame
    +
    +  __ push_call_clobbered_registers();
    +
    +  __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_JRT));
    +  __ blrt(lr, 1, 0, MacroAssembler::ret_type_integral);
    +  __ mov(rscratch1, obj);
    +  __ pop_call_clobbered_registers();
    +  __ mov(obj, rscratch1);
    +
    +  __ leave(); // required for proper stackwalking of RuntimeStub frame
    +  __ ret(lr);
    +
    +  return start;
    +}
    +
    +#undef __
    +
    +void ShenandoahBarrierSetAssembler::barrier_stubs_init() {
    +  if (ShenandoahWriteBarrier || ShenandoahStoreValEnqueueBarrier) {
    +    int stub_code_size = 2048;
    +    ResourceMark rm;
    +    BufferBlob* bb = BufferBlob::create("shenandoah_barrier_stubs", stub_code_size);
    +    CodeBuffer buf(bb);
    +    StubCodeGenerator cgen(&buf);
    +    _shenandoah_wb = generate_shenandoah_wb(&cgen);
    +  }
    +}
    diff --git a/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.hpp
    new file mode 100644
    index 00000000000..b3f89abf563
    --- /dev/null
    +++ b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.hpp
    @@ -0,0 +1,102 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef CPU_AARCH64_GC_SHENANDOAH_SHENANDOAHBARRIERSETASSEMBLER_AARCH64_HPP
    +#define CPU_AARCH64_GC_SHENANDOAH_SHENANDOAHBARRIERSETASSEMBLER_AARCH64_HPP
    +
    +#include "asm/macroAssembler.hpp"
    +#include "gc/shared/barrierSetAssembler.hpp"
    +#ifdef COMPILER1
    +class LIR_Assembler;
    +class ShenandoahPreBarrierStub;
    +class ShenandoahWriteBarrierStub;
    +class StubAssembler;
    +class StubCodeGenerator;
    +#endif
    +
    +class ShenandoahBarrierSetAssembler: public BarrierSetAssembler {
    +private:
    +
    +  static address _shenandoah_wb;
    +
    +  void satb_write_barrier_pre(MacroAssembler* masm,
    +                              Register obj,
    +                              Register pre_val,
    +                              Register thread,
    +                              Register tmp,
    +                              bool tosca_live,
    +                              bool expand_call);
    +  void shenandoah_write_barrier_pre(MacroAssembler* masm,
    +                                    Register obj,
    +                                    Register pre_val,
    +                                    Register thread,
    +                                    Register tmp,
    +                                    bool tosca_live,
    +                                    bool expand_call);
    +
    +  void read_barrier(MacroAssembler* masm, Register dst);
    +  void read_barrier_impl(MacroAssembler* masm, Register dst);
    +  void read_barrier_not_null(MacroAssembler* masm, Register dst);
    +  void read_barrier_not_null_impl(MacroAssembler* masm, Register dst);
    +  void write_barrier(MacroAssembler* masm, Register dst);
    +  void write_barrier_impl(MacroAssembler* masm, Register dst);
    +  void storeval_barrier(MacroAssembler* masm, Register dst, Register tmp);
    +  void asm_acmp_barrier(MacroAssembler* masm, Register op1, Register op2);
    +
    +  address generate_shenandoah_wb(StubCodeGenerator* cgen);
    +
    +public:
    +  static address shenandoah_wb();
    +
    +#ifdef COMPILER1
    +  void gen_pre_barrier_stub(LIR_Assembler* ce, ShenandoahPreBarrierStub* stub);
    +  void gen_write_barrier_stub(LIR_Assembler* ce, ShenandoahWriteBarrierStub* stub);
    +  void generate_c1_pre_barrier_runtime_stub(StubAssembler* sasm);
    +#endif
    +
    +  virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
    +                                  Register addr, Register count, RegSet saved_regs);
    +  virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
    +                                  Register start, Register end, Register tmp, RegSet saved_regs);
    +  virtual void load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +                       Register dst, Address src, Register tmp1, Register tmp_thread);
    +  virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +                        Address dst, Register val, Register tmp1, Register tmp2);
    +  virtual void obj_equals(MacroAssembler* masm, Register src1, Register src2);
    +  virtual void resolve(MacroAssembler* masm, DecoratorSet decorators, Register obj);
    +  virtual void tlab_allocate(MacroAssembler* masm, Register obj,
    +                             Register var_size_in_bytes,
    +                             int con_size_in_bytes,
    +                             Register t1,
    +                             Register t2,
    +                             Label& slow_case);
    +
    +  void cmpxchg_oop(MacroAssembler* masm, Register addr, Register expected, Register new_val,
    +                   bool acquire, bool release, bool weak, bool encode,
    +                   Register tmp1, Register tmp2, Register tmp3 = rscratch2,
    +                   Register result = noreg);
    +
    +  virtual void barrier_stubs_init();
    +};
    +
    +#endif // CPU_AARCH64_GC_SHENANDOAH_SHENANDOAHBARRIERSETASSEMBLER_AARCH64_HPP
    diff --git a/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetC1_aarch64.cpp b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetC1_aarch64.cpp
    new file mode 100644
    index 00000000000..13caaaffeac
    --- /dev/null
    +++ b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetC1_aarch64.cpp
    @@ -0,0 +1,98 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "c1/c1_LIRAssembler.hpp"
    +#include "c1/c1_MacroAssembler.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSet.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
    +#include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
    +
    +void LIR_OpShenandoahCompareAndSwap::emit_code(LIR_Assembler* masm) {
    +  Register addr = _addr->as_register_lo();
    +  Register newval = _new_value->as_register();
    +  Register cmpval = _cmp_value->as_register();
    +  Register tmp1 = _tmp1->as_register();
    +  Register tmp2 = _tmp2->as_register();
    +  ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm->masm(), addr, cmpval, newval, /*acquire*/ false, /*release*/ true, /*weak*/ false, true, tmp1, tmp2);
    +}
    +
    +#ifdef ASSERT
    +#define __ gen->lir(__FILE__, __LINE__)->
    +#else
    +#define __ gen->lir()->
    +#endif
    +
    +LIR_Opr ShenandoahBarrierSetC1::atomic_cmpxchg_at_resolved(LIRAccess& access, LIRItem& cmp_value, LIRItem& new_value) {
    +  BasicType bt = access.type();
    +  if (access.is_oop()) {
    +    LIRGenerator *gen = access.gen();
    +    if (ShenandoahSATBBarrier) {
    +      pre_barrier(gen, access.access_emit_info(), access.decorators(), access.resolved_addr(),
    +                  LIR_OprFact::illegalOpr /* pre_val */);
    +    }
    +    if (ShenandoahCASBarrier) {
    +      cmp_value.load_item();
    +      new_value.load_item();
    +
    +      LIR_Opr t1 = gen->new_register(T_OBJECT);
    +      LIR_Opr t2 = gen->new_register(T_OBJECT);
    +      LIR_Opr addr = access.resolved_addr()->as_address_ptr()->base();
    +
    +      __ append(new LIR_OpShenandoahCompareAndSwap(addr, cmp_value.result(), new_value.result(), t1, t2,
    +                                                   LIR_OprFact::illegalOpr));
    +
    +      LIR_Opr result = gen->new_register(T_INT);
    +      __ cmove(lir_cond_equal, LIR_OprFact::intConst(1), LIR_OprFact::intConst(0),
    +               result, T_INT);
    +      return result;
    +    }
    +  }
    +  return BarrierSetC1::atomic_cmpxchg_at_resolved(access, cmp_value, new_value);
    +}
    +
    +LIR_Opr ShenandoahBarrierSetC1::atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value) {
    +  LIRGenerator* gen = access.gen();
    +  BasicType type = access.type();
    +
    +  LIR_Opr result = gen->new_register(type);
    +  value.load_item();
    +  LIR_Opr value_opr = value.result();
    +
    +  if (access.is_oop()) {
    +    value_opr = storeval_barrier(access.gen(), value_opr, access.access_emit_info(), access.decorators());
    +  }
    +
    +  assert(type == T_INT || type == T_OBJECT || type == T_ARRAY LP64_ONLY( || type == T_LONG ), "unexpected type");
    +  LIR_Opr tmp = gen->new_register(T_INT);
    +  __ xchg(access.resolved_addr(), value_opr, result, tmp);
    +
    +  if (access.is_oop()) {
    +    if (ShenandoahSATBBarrier) {
    +      pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), LIR_OprFact::illegalOpr,
    +                  result /* pre_val */);
    +    }
    +  }
    +
    +  return result;
    +}
    diff --git a/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoah_aarch64.ad b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoah_aarch64.ad
    new file mode 100644
    index 00000000000..45deb26fefe
    --- /dev/null
    +++ b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoah_aarch64.ad
    @@ -0,0 +1,281 @@
    +//
    +// Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    +//
    +// This code is free software; you can redistribute it and/or modify it
    +// under the terms of the GNU General Public License version 2 only, as
    +// published by the Free Software Foundation.
    +//
    +// This code is distributed in the hope that it will be useful, but WITHOUT
    +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    +// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    +// version 2 for more details (a copy is included in the LICENSE file that
    +// accompanied this code).
    +//
    +// You should have received a copy of the GNU General Public License version
    +// 2 along with this work; if not, write to the Free Software Foundation,
    +// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    +//
    +// Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    +// or visit www.oracle.com if you need additional information or have any
    +// questions.
    +//
    +//
    +
    +source_hpp %{
    +#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
    +%}
    +
    +encode %{
    +  enc_class aarch64_enc_cmpxchg_oop_shenandoah(memory mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
    +    MacroAssembler _masm(&cbuf);
    +    guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
    +                                                   /*acquire*/ false, /*release*/ true, /*weak*/ false, /*encode*/ false, noreg, noreg);
    +  %}
    +
    +  enc_class aarch64_enc_cmpxchg_acq_oop_shenandoah(memory mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
    +    MacroAssembler _masm(&cbuf);
    +    guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
    +                                                   /*acquire*/ true, /*release*/ true, /*weak*/ false, /*encode*/ false, noreg, noreg);
    +  %}
    +%}
    +
    +instruct shenandoahRB(iRegPNoSp dst, iRegP src, rFlagsReg cr) %{
    +  match(Set dst (ShenandoahReadBarrier src));
    +  format %{ "shenandoah_rb $dst,$src" %}
    +  ins_encode %{
    +    Register s = $src$$Register;
    +    Register d = $dst$$Register;
    +    __ ldr(d, Address(s, ShenandoahBrooksPointer::byte_offset()));
    +  %}
    +  ins_pipe(pipe_class_memory);
    +%}
    +
    +
    +instruct compareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
    +
    +  match(Set res (ShenandoahCompareAndSwapP mem (Binary oldval newval)));
    +  ins_cost(2 * VOLATILE_REF_COST);
    +
    +  effect(TEMP tmp, KILL cr);
    +
    +  format %{
    +    "cmpxchg_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp"
    +    "cset $res, EQ\t# $res <-- (EQ ? 1 : 0)"
    +  %}
    +
    +  ins_encode(aarch64_enc_cmpxchg_oop_shenandoah(mem, oldval, newval, tmp),
    +             aarch64_enc_cset_eq(res));
    +
    +  ins_pipe(pipe_slow);
    +%}
    +
    +instruct compareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
    +
    +  match(Set res (ShenandoahCompareAndSwapN mem (Binary oldval newval)));
    +  ins_cost(2 * VOLATILE_REF_COST);
    +
    +  effect(TEMP tmp, KILL cr);
    +
    +  format %{
    +    "cmpxchgw_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp"
    +    "cset $res, EQ\t# $res <-- (EQ ? 1 : 0)"
    +  %}
    +
    +  ins_encode %{
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register, /*acquire*/ false, /*release*/ true, /*weak*/ false, /*encode*/ false, noreg, noreg);
    +    __ cset($res$$Register, Assembler::EQ);
    +  %}
    +
    +  ins_pipe(pipe_slow);
    +%}
    +
    +instruct compareAndSwapPAcq_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
    +
    +  predicate(needs_acquiring_load_exclusive(n));
    +  match(Set res (ShenandoahCompareAndSwapP mem (Binary oldval newval)));
    +  ins_cost(VOLATILE_REF_COST);
    +
    +  effect(TEMP tmp, KILL cr);
    +
    +  format %{
    +    "cmpxchg_acq_shenandoah_oop $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp"
    +    "cset $res, EQ\t# $res <-- (EQ ? 1 : 0)"
    +  %}
    +
    +  ins_encode(aarch64_enc_cmpxchg_acq_oop_shenandoah(mem, oldval, newval, tmp),
    +             aarch64_enc_cset_eq(res));
    +
    +  ins_pipe(pipe_slow);
    +%}
    +
    +instruct compareAndSwapNAcq_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
    +
    +  predicate(needs_acquiring_load_exclusive(n));
    +  match(Set res (ShenandoahCompareAndSwapN mem (Binary oldval newval)));
    +  ins_cost(VOLATILE_REF_COST);
    +
    +  effect(TEMP tmp, KILL cr);
    +
    + format %{
    +    "cmpxchgw_acq_shenandoah_narrow_oop $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp"
    +    "cset $res, EQ\t# $res <-- (EQ ? 1 : 0)"
    + %}
    +
    +  ins_encode %{
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register, /*acquire*/ true, /*release*/ true, /*weak*/ false, /*encode*/ false, noreg, noreg);
    +    __ cset($res$$Register, Assembler::EQ);
    +  %}
    +
    +  ins_pipe(pipe_slow);
    +%}
    +
    +instruct compareAndExchangeN_shenandoah(iRegNNoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
    +  match(Set res (ShenandoahCompareAndExchangeN mem (Binary oldval newval)));
    +  ins_cost(2 * VOLATILE_REF_COST);
    +  effect(TEMP_DEF res, TEMP tmp, KILL cr);
    +  format %{
    +    "cmpxchgw_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval"
    +  %}
    +  ins_encode %{
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
    +                                                   /*acquire*/ false, /*release*/ true, /*weak*/ false, /* encode*/ false, noreg, noreg, rscratch2, $res$$Register);
    +  %}
    +  ins_pipe(pipe_slow);
    +%}
    +
    +instruct compareAndExchangeP_shenandoah(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
    +  match(Set res (ShenandoahCompareAndExchangeP mem (Binary oldval newval)));
    +  ins_cost(2 * VOLATILE_REF_COST);
    +  effect(TEMP_DEF res, TEMP tmp, KILL cr);
    +  format %{
    +    "cmpxchg_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp"
    +  %}
    +  ins_encode %{
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
    +                                                   /*acquire*/ false, /*release*/ true, /*weak*/ false, /*encode*/ false, noreg, noreg, rscratch2, $res$$Register);
    +  %}
    +  ins_pipe(pipe_slow);
    +%}
    +
    +instruct compareAndExchangeNAcq_shenandoah(iRegNNoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
    +  predicate(needs_acquiring_load_exclusive(n));
    +  match(Set res (ShenandoahCompareAndExchangeN mem (Binary oldval newval)));
    +  ins_cost(VOLATILE_REF_COST);
    +  effect(TEMP_DEF res, TEMP tmp, KILL cr);
    +  format %{
    +    "cmpxchgw_acq_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval"
    +  %}
    +  ins_encode %{
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
    +                                                   /*acquire*/ true, /*release*/ true, /*weak*/ false, /* encode*/ false, noreg, noreg, rscratch2, $res$$Register);
    +  %}
    +  ins_pipe(pipe_slow);
    +%}
    +
    +instruct compareAndExchangePAcq_shenandoah(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
    +  predicate(needs_acquiring_load_exclusive(n));
    +  match(Set res (ShenandoahCompareAndExchangeP mem (Binary oldval newval)));
    +  ins_cost(VOLATILE_REF_COST);
    +  effect(TEMP_DEF res, TEMP tmp, KILL cr);
    +  format %{
    +    "cmpxchg_acq_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp"
    +  %}
    +  ins_encode %{
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
    +                                                   /*acquire*/ true, /*release*/ true, /*weak*/ false, /*encode*/ false, noreg, noreg, rscratch2, $res$$Register);
    +  %}
    +  ins_pipe(pipe_slow);
    +%}
    +
    +instruct weakCompareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
    +  match(Set res (ShenandoahWeakCompareAndSwapN mem (Binary oldval newval)));
    +  ins_cost(2 * VOLATILE_REF_COST);
    +  effect(TEMP tmp, KILL cr);
    +  format %{
    +    "cmpxchgw_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval"
    +    "csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
    +  %}
    +  ins_encode %{
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
    +                                                   /*acquire*/ false, /*release*/ true, /*weak*/ true, /*encode*/ false, noreg, noreg);
    +    __ csetw($res$$Register, Assembler::EQ);
    +  %}
    +  ins_pipe(pipe_slow);
    +%}
    +
    +instruct weakCompareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
    +  match(Set res (ShenandoahWeakCompareAndSwapP mem (Binary oldval newval)));
    +  ins_cost(2 * VOLATILE_REF_COST);
    +  effect(TEMP tmp, KILL cr);
    +  format %{
    +    "cmpxchg_shenandoah $res = $mem, $oldval, $newval\t# (ptr, weak) if $mem == $oldval then $mem <-- $newval"
    +    "csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
    +  %}
    +  ins_encode %{
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
    +                                                   /*acquire*/ false, /*release*/ true, /*weak*/ true, /*encode*/ false, noreg, noreg);
    +    __ csetw($res$$Register, Assembler::EQ);
    +  %}
    +  ins_pipe(pipe_slow);
    +%}
    +
    +instruct weakCompareAndSwapNAcq_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
    +  predicate(needs_acquiring_load_exclusive(n));
    +  match(Set res (ShenandoahWeakCompareAndSwapN mem (Binary oldval newval)));
    +  ins_cost(VOLATILE_REF_COST);
    +  effect(TEMP tmp, KILL cr);
    +  format %{
    +    "cmpxchgw_acq_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval"
    +    "csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
    +  %}
    +  ins_encode %{
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
    +                                                   /*acquire*/ true, /*release*/ true, /*weak*/ true, /*encode*/ false, noreg, noreg);
    +    __ csetw($res$$Register, Assembler::EQ);
    +  %}
    +  ins_pipe(pipe_slow);
    +%}
    +
    +instruct weakCompareAndSwapPAcq_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
    +  predicate(needs_acquiring_load_exclusive(n));
    +  match(Set res (ShenandoahWeakCompareAndSwapP mem (Binary oldval newval)));
    +  ins_cost(VOLATILE_REF_COST);
    +  effect(TEMP tmp, KILL cr);
    +  format %{
    +    "cmpxchg_acq_shenandoah $res = $mem, $oldval, $newval\t# (ptr, weak) if $mem == $oldval then $mem <-- $newval"
    +    "csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
    +  %}
    +  ins_encode %{
    +    Register tmp = $tmp$$Register;
    +    __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
    +                                                   /*acquire*/ true, /*release*/ true, /*weak*/ true, /*encode*/ false, noreg, noreg);
    +    __ csetw($res$$Register, Assembler::EQ);
    +  %}
    +  ins_pipe(pipe_slow);
    +%}
    +
    diff --git a/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp b/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp
    index 8c53caa8146..87e044e0aa2 100644
    --- a/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp
    +++ b/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp
    @@ -5740,9 +5740,10 @@ class StubGenerator: public StubCodeGenerator {
           StubRoutines::_updateBytesCRC32C = generate_updateBytesCRC32C();
         }
     
    -    if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dlog)) {
    -      StubRoutines::_dlog = generate_dlog();
    -    }
    +    // Disabled until JDK-8210858 is fixed
    +    // if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dlog)) {
    +    //   StubRoutines::_dlog = generate_dlog();
    +    // }
     
         if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dsin)) {
           StubRoutines::_dsin = generate_dsin_dcos(/* isCos = */ false);
    diff --git a/src/hotspot/cpu/arm/sharedRuntime_arm.cpp b/src/hotspot/cpu/arm/sharedRuntime_arm.cpp
    index e6a31cf54ed..afe80d17545 100644
    --- a/src/hotspot/cpu/arm/sharedRuntime_arm.cpp
    +++ b/src/hotspot/cpu/arm/sharedRuntime_arm.cpp
    @@ -1580,9 +1580,9 @@ void SharedRuntime::generate_deopt_blob() {
       __ mov(R0, Rthread);
       __ mov(R1, Rkind);
     
    -  pc_offset = __ set_last_Java_frame(SP, FP, false, Rtemp);
    +  pc_offset = __ set_last_Java_frame(SP, FP, true, Rtemp);
       assert(((__ pc()) - start) == __ offset(), "warning: start differs from code_begin");
    -  __ call(CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames));
    +  __ call_VM_leaf(CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames));
       if (pc_offset == -1) {
         pc_offset = __ offset();
       }
    @@ -1747,8 +1747,8 @@ void SharedRuntime::generate_uncommon_trap_blob() {
       // Call unpack_frames with proper arguments
       __ mov(R0, Rthread);
       __ mov(R1, Deoptimization::Unpack_uncommon_trap);
    -  __ set_last_Java_frame(SP, FP, false, Rtemp);
    -  __ call(CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames));
    +  __ set_last_Java_frame(SP, FP, true, Rtemp);
    +  __ call_VM_leaf(CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames));
       //  oop_maps->add_gc_map(__ pc() - start, new OopMap(frame_size_in_words, 0));
       __ reset_last_Java_frame(Rtemp);
     
    diff --git a/src/hotspot/cpu/sparc/vm_version_sparc.cpp b/src/hotspot/cpu/sparc/vm_version_sparc.cpp
    index 584b1b1609e..332d24ea3b3 100644
    --- a/src/hotspot/cpu/sparc/vm_version_sparc.cpp
    +++ b/src/hotspot/cpu/sparc/vm_version_sparc.cpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -521,15 +521,3 @@ void VM_Version::allow_all() {
     void VM_Version::revert() {
       _features = saved_features;
     }
    -
    -/* Determine a suitable number of threads on this particular machine.
    - *
    - * FIXME: Simply checking the processor family is insufficient.
    - */
    -unsigned int VM_Version::calc_parallel_worker_threads() {
    -  const int num = 5;
    -  const int den = is_post_niagara() ? 16 : 8;
    -  const int threshold = 8;
    -
    -  return nof_parallel_worker_threads(num, den, threshold);
    -}
    diff --git a/src/hotspot/cpu/sparc/vm_version_sparc.hpp b/src/hotspot/cpu/sparc/vm_version_sparc.hpp
    index 04ff200f439..e1115077543 100644
    --- a/src/hotspot/cpu/sparc/vm_version_sparc.hpp
    +++ b/src/hotspot/cpu/sparc/vm_version_sparc.hpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -365,8 +365,12 @@ public:
       //        this properly in order to enable complete page size support.
       static uint page_size_count() { return 2; }
     
    -  // Calculates the number of parallel threads
    -  static unsigned int calc_parallel_worker_threads();
    +  // Override default denominator for ParallelGCThreads.
    +  //
    +  // FIXME: Simply checking the processor family is insufficient.
    +  static uint parallel_worker_threads_denominator() {
    +    return is_post_niagara() ? 16 : 8;
    +  }
     };
     
     #endif // CPU_SPARC_VM_VM_VERSION_SPARC_HPP
    diff --git a/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp b/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp
    new file mode 100644
    index 00000000000..b30dfe2aa2a
    --- /dev/null
    +++ b/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp
    @@ -0,0 +1,1041 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahRuntime.hpp"
    +#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
    +#include "interpreter/interpreter.hpp"
    +#include "interpreter/interp_masm.hpp"
    +#include "runtime/sharedRuntime.hpp"
    +#include "runtime/thread.hpp"
    +#include "utilities/macros.hpp"
    +#ifdef COMPILER1
    +#include "c1/c1_LIRAssembler.hpp"
    +#include "c1/c1_MacroAssembler.hpp"
    +#include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
    +#endif
    +
    +#define __ masm->
    +
    +address ShenandoahBarrierSetAssembler::_shenandoah_wb = NULL;
    +
    +void ShenandoahBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +                                                       Register src, Register dst, Register count) {
    +
    +  bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0;
    +  bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0;
    +  bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops);
    +  bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0;
    +
    +  if (type == T_OBJECT || type == T_ARRAY) {
    +#ifdef _LP64
    +    if (!checkcast && !obj_int) {
    +      // Save count for barrier
    +      __ movptr(r11, count);
    +    } else if (disjoint && obj_int) {
    +      // Save dst in r11 in the disjoint case
    +      __ movq(r11, dst);
    +    }
    +#else
    +    if (disjoint) {
    +      __ mov(rdx, dst);          // save 'to'
    +    }
    +#endif
    +
    +    if (!dest_uninitialized && !ShenandoahHeap::heap()->heuristics()->can_do_traversal_gc()) {
    +      Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
    +#ifndef _LP64
    +      __ push(thread);
    +      __ get_thread(thread);
    +#endif
    +
    +      Label filtered;
    +      Address in_progress(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_active_offset()));
    +      // Is marking active?
    +      if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
    +        __ cmpl(in_progress, 0);
    +      } else {
    +        assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption");
    +        __ cmpb(in_progress, 0);
    +      }
    +
    +      NOT_LP64(__ pop(thread);)
    +
    +        __ jcc(Assembler::equal, filtered);
    +
    +      __ pusha();                      // push registers
    +#ifdef _LP64
    +      if (count == c_rarg0) {
    +        if (dst == c_rarg1) {
    +          // exactly backwards!!
    +          __ xchgptr(c_rarg1, c_rarg0);
    +        } else {
    +          __ movptr(c_rarg1, count);
    +          __ movptr(c_rarg0, dst);
    +        }
    +      } else {
    +        __ movptr(c_rarg0, dst);
    +        __ movptr(c_rarg1, count);
    +      }
    +      if (UseCompressedOops) {
    +        __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_narrow_oop_entry), 2);
    +      } else {
    +        __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_oop_entry), 2);
    +      }
    +#else
    +      __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_oop_entry),
    +                      dst, count);
    +#endif
    +      __ popa();
    +      __ bind(filtered);
    +    }
    +  }
    +
    +}
    +
    +void ShenandoahBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +                                                       Register src, Register dst, Register count) {
    +  bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0;
    +  bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0;
    +  bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops);
    +  Register tmp = rax;
    +
    +  if (type == T_OBJECT || type == T_ARRAY) {
    +#ifdef _LP64
    +    if (!checkcast && !obj_int) {
    +      // Save count for barrier
    +      count = r11;
    +    } else if (disjoint && obj_int) {
    +      // Use the saved dst in the disjoint case
    +      dst = r11;
    +    } else if (checkcast) {
    +      tmp = rscratch1;
    +    }
    +#else
    +    if (disjoint) {
    +      __ mov(dst, rdx); // restore 'to'
    +    }
    +#endif
    +
    +    __ pusha();             // push registers (overkill)
    +#ifdef _LP64
    +    if (c_rarg0 == count) { // On win64 c_rarg0 == rcx
    +      assert_different_registers(c_rarg1, dst);
    +      __ mov(c_rarg1, count);
    +      __ mov(c_rarg0, dst);
    +    } else {
    +      assert_different_registers(c_rarg0, count);
    +      __ mov(c_rarg0, dst);
    +      __ mov(c_rarg1, count);
    +    }
    +    __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_post_entry), 2);
    +#else
    +    __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_post_entry),
    +                    dst, count);
    +#endif
    +    __ popa();
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::shenandoah_write_barrier_pre(MacroAssembler* masm,
    +                                                                 Register obj,
    +                                                                 Register pre_val,
    +                                                                 Register thread,
    +                                                                 Register tmp,
    +                                                                 bool tosca_live,
    +                                                                 bool expand_call) {
    +
    +  if (ShenandoahSATBBarrier) {
    +    satb_write_barrier_pre(masm, obj, pre_val, thread, tmp, tosca_live, expand_call);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::satb_write_barrier_pre(MacroAssembler* masm,
    +                                                           Register obj,
    +                                                           Register pre_val,
    +                                                           Register thread,
    +                                                           Register tmp,
    +                                                           bool tosca_live,
    +                                                           bool expand_call) {
    +  // If expand_call is true then we expand the call_VM_leaf macro
    +  // directly to skip generating the check by
    +  // InterpreterMacroAssembler::call_VM_leaf_base that checks _last_sp.
    +
    +#ifdef _LP64
    +  assert(thread == r15_thread, "must be");
    +#endif // _LP64
    +
    +  Label done;
    +  Label runtime;
    +
    +  assert(pre_val != noreg, "check this code");
    +
    +  if (obj != noreg) {
    +    assert_different_registers(obj, pre_val, tmp);
    +    assert(pre_val != rax, "check this code");
    +  }
    +
    +  Address in_progress(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_active_offset()));
    +  Address index(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset()));
    +  Address buffer(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset()));
    +
    +  Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
    +  __ testb(gc_state, ShenandoahHeap::MARKING | ShenandoahHeap::TRAVERSAL);
    +  __ jcc(Assembler::zero, done);
    +
    +  // Do we need to load the previous value?
    +  if (obj != noreg) {
    +    __ load_heap_oop(pre_val, Address(obj, 0), noreg, noreg, AS_RAW);
    +  }
    +
    +  // Is the previous value null?
    +  __ cmpptr(pre_val, (int32_t) NULL_WORD);
    +  __ jcc(Assembler::equal, done);
    +
    +  // Can we store original value in the thread's buffer?
    +  // Is index == 0?
    +  // (The index field is typed as size_t.)
    +
    +  __ movptr(tmp, index);                   // tmp := *index_adr
    +  __ cmpptr(tmp, 0);                       // tmp == 0?
    +  __ jcc(Assembler::equal, runtime);       // If yes, goto runtime
    +
    +  __ subptr(tmp, wordSize);                // tmp := tmp - wordSize
    +  __ movptr(index, tmp);                   // *index_adr := tmp
    +  __ addptr(tmp, buffer);                  // tmp := tmp + *buffer_adr
    +
    +  // Record the previous value
    +  __ movptr(Address(tmp, 0), pre_val);
    +  __ jmp(done);
    +
    +  __ bind(runtime);
    +  // save the live input values
    +  if(tosca_live) __ push(rax);
    +
    +  if (obj != noreg && obj != rax)
    +    __ push(obj);
    +
    +  if (pre_val != rax)
    +    __ push(pre_val);
    +
    +  // Calling the runtime using the regular call_VM_leaf mechanism generates
    +  // code (generated by InterpreterMacroAssember::call_VM_leaf_base)
    +  // that checks that the *(ebp+frame::interpreter_frame_last_sp) == NULL.
    +  //
    +  // If we care generating the pre-barrier without a frame (e.g. in the
    +  // intrinsified Reference.get() routine) then ebp might be pointing to
    +  // the caller frame and so this check will most likely fail at runtime.
    +  //
    +  // Expanding the call directly bypasses the generation of the check.
    +  // So when we do not have have a full interpreter frame on the stack
    +  // expand_call should be passed true.
    +
    +  NOT_LP64( __ push(thread); )
    +
    +#ifdef _LP64
    +  // We move pre_val into c_rarg0 early, in order to avoid smashing it, should
    +  // pre_val be c_rarg1 (where the call prologue would copy thread argument).
    +  // Note: this should not accidentally smash thread, because thread is always r15.
    +  assert(thread != c_rarg0, "smashed arg");
    +  if (c_rarg0 != pre_val) {
    +    __ mov(c_rarg0, pre_val);
    +  }
    +#endif
    +
    +  if (expand_call) {
    +    LP64_ONLY( assert(pre_val != c_rarg1, "smashed arg"); )
    +#ifdef _LP64
    +    if (c_rarg1 != thread) {
    +      __ mov(c_rarg1, thread);
    +    }
    +    // Already moved pre_val into c_rarg0 above
    +#else
    +    __ push(thread);
    +    __ push(pre_val);
    +#endif
    +    __ MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), 2);
    +  } else {
    +    __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), LP64_ONLY(c_rarg0) NOT_LP64(pre_val), thread);
    +  }
    +
    +  NOT_LP64( __ pop(thread); )
    +
    +  // save the live input values
    +  if (pre_val != rax)
    +    __ pop(pre_val);
    +
    +  if (obj != noreg && obj != rax)
    +    __ pop(obj);
    +
    +  if(tosca_live) __ pop(rax);
    +
    +  __ bind(done);
    +}
    +
    +void ShenandoahBarrierSetAssembler::read_barrier(MacroAssembler* masm, Register dst) {
    +  if (ShenandoahReadBarrier) {
    +    read_barrier_impl(masm, dst);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::read_barrier_impl(MacroAssembler* masm, Register dst) {
    +  assert(UseShenandoahGC && (ShenandoahReadBarrier || ShenandoahStoreValReadBarrier || ShenandoahCASBarrier), "should be enabled");
    +  Label is_null;
    +  __ testptr(dst, dst);
    +  __ jcc(Assembler::zero, is_null);
    +  read_barrier_not_null_impl(masm, dst);
    +  __ bind(is_null);
    +}
    +
    +void ShenandoahBarrierSetAssembler::read_barrier_not_null(MacroAssembler* masm, Register dst) {
    +  if (ShenandoahReadBarrier) {
    +    read_barrier_not_null_impl(masm, dst);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::read_barrier_not_null_impl(MacroAssembler* masm, Register dst) {
    +  assert(UseShenandoahGC && (ShenandoahReadBarrier || ShenandoahStoreValReadBarrier || ShenandoahCASBarrier), "should be enabled");
    +  __ movptr(dst, Address(dst, ShenandoahBrooksPointer::byte_offset()));
    +}
    +
    +
    +void ShenandoahBarrierSetAssembler::write_barrier(MacroAssembler* masm, Register dst) {
    +  if (ShenandoahWriteBarrier) {
    +    write_barrier_impl(masm, dst);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::write_barrier_impl(MacroAssembler* masm, Register dst) {
    +  assert(UseShenandoahGC && (ShenandoahWriteBarrier || ShenandoahStoreValEnqueueBarrier), "Should be enabled");
    +#ifdef _LP64
    +  Label done;
    +
    +  Address gc_state(r15_thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
    +  __ testb(gc_state, ShenandoahHeap::HAS_FORWARDED | ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL);
    +  __ jccb(Assembler::zero, done);
    +
    +  // Heap is unstable, need to perform the read-barrier even if WB is inactive
    +  read_barrier_not_null(masm, dst);
    +
    +  __ testb(gc_state, ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL);
    +  __ jccb(Assembler::zero, done);
    +
    +   if (dst != rax) {
    +     __ xchgptr(dst, rax); // Move obj into rax and save rax into obj.
    +   }
    +
    +   __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_wb())));
    +
    +   if (dst != rax) {
    +     __ xchgptr(rax, dst); // Swap back obj with rax.
    +   }
    +
    +  __ bind(done);
    +#else
    +  Unimplemented();
    +#endif
    +}
    +
    +void ShenandoahBarrierSetAssembler::storeval_barrier(MacroAssembler* masm, Register dst, Register tmp) {
    +  if (ShenandoahStoreValReadBarrier || ShenandoahStoreValEnqueueBarrier) {
    +    storeval_barrier_impl(masm, dst, tmp);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::storeval_barrier_impl(MacroAssembler* masm, Register dst, Register tmp) {
    +  assert(UseShenandoahGC && (ShenandoahStoreValReadBarrier || ShenandoahStoreValEnqueueBarrier), "should be enabled");
    +
    +  if (dst == noreg) return;
    +
    +#ifdef _LP64
    +  if (ShenandoahStoreValEnqueueBarrier) {
    +    Label is_null;
    +    __ testptr(dst, dst);
    +    __ jcc(Assembler::zero, is_null);
    +    write_barrier_impl(masm, dst);
    +    __ bind(is_null);
    +
    +    // The set of registers to be saved+restored is the same as in the write-barrier above.
    +    // Those are the commonly used registers in the interpreter.
    +    __ pusha();
    +    // __ push_callee_saved_registers();
    +    __ subptr(rsp, 2 * Interpreter::stackElementSize);
    +    __ movdbl(Address(rsp, 0), xmm0);
    +
    +    satb_write_barrier_pre(masm, noreg, dst, r15_thread, tmp, true, false);
    +    __ movdbl(xmm0, Address(rsp, 0));
    +    __ addptr(rsp, 2 * Interpreter::stackElementSize);
    +    //__ pop_callee_saved_registers();
    +    __ popa();
    +  }
    +  if (ShenandoahStoreValReadBarrier) {
    +    read_barrier_impl(masm, dst);
    +  }
    +#else
    +  Unimplemented();
    +#endif
    +}
    +
    +void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +             Register dst, Address src, Register tmp1, Register tmp_thread) {
    +  bool on_oop = type == T_OBJECT || type == T_ARRAY;
    +  bool in_heap = (decorators & IN_HEAP) != 0;
    +  bool on_weak = (decorators & ON_WEAK_OOP_REF) != 0;
    +  bool on_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0;
    +  bool on_reference = on_weak || on_phantom;
    +  if (in_heap) {
    +    read_barrier_not_null(masm, src.base());
    +  }
    +  BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
    +  if (ShenandoahKeepAliveBarrier && on_oop && on_reference) {
    +    const Register thread = NOT_LP64(tmp_thread) LP64_ONLY(r15_thread);
    +    NOT_LP64(__ get_thread(thread));
    +
    +    // Generate the SATB pre-barrier code to log the value of
    +    // the referent field in an SATB buffer.
    +    shenandoah_write_barrier_pre(masm /* masm */,
    +                                 noreg /* obj */,
    +                                 dst /* pre_val */,
    +                                 thread /* thread */,
    +                                 tmp1 /* tmp */,
    +                                 true /* tosca_live */,
    +                                 true /* expand_call */);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +              Address dst, Register val, Register tmp1, Register tmp2) {
    +
    +  bool in_heap = (decorators & IN_HEAP) != 0;
    +  bool as_normal = (decorators & AS_NORMAL) != 0;
    +  if (in_heap) {
    +    write_barrier(masm, dst.base());
    +  }
    +  if (type == T_OBJECT || type == T_ARRAY) {
    +    bool needs_pre_barrier = as_normal;
    +
    +    Register tmp3 = LP64_ONLY(r8) NOT_LP64(rsi);
    +    Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx);
    +    // flatten object address if needed
    +    // We do it regardless of precise because we need the registers
    +    if (dst.index() == noreg && dst.disp() == 0) {
    +      if (dst.base() != tmp1) {
    +        __ movptr(tmp1, dst.base());
    +      }
    +    } else {
    +      __ lea(tmp1, dst);
    +    }
    +
    +#ifndef _LP64
    +    InterpreterMacroAssembler *imasm = static_cast(masm);
    +#endif
    +
    +    NOT_LP64(__ get_thread(rcx));
    +    NOT_LP64(imasm->save_bcp());
    +
    +    if (needs_pre_barrier) {
    +      shenandoah_write_barrier_pre(masm /*masm*/,
    +                                   tmp1 /* obj */,
    +                                   tmp2 /* pre_val */,
    +                                   rthread /* thread */,
    +                                   tmp3  /* tmp */,
    +                                   val != noreg /* tosca_live */,
    +                                   false /* expand_call */);
    +    }
    +    if (val == noreg) {
    +      BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp1, 0), val, noreg, noreg);
    +    } else {
    +      storeval_barrier(masm, val, tmp3);
    +      BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp1, 0), val, noreg, noreg);
    +    }
    +    NOT_LP64(imasm->restore_bcp());
    +  } else {
    +    BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2);
    +  }
    +}
    +
    +#ifndef _LP64
    +void ShenandoahBarrierSetAssembler::obj_equals(MacroAssembler* masm,
    +                                               Address obj1, jobject obj2) {
    +  Unimplemented();
    +}
    +
    +void ShenandoahBarrierSetAssembler::obj_equals(MacroAssembler* masm,
    +                                               Register obj1, jobject obj2) {
    +  Unimplemented();
    +}
    +#endif
    +
    +
    +void ShenandoahBarrierSetAssembler::obj_equals(MacroAssembler* masm, Register op1, Register op2) {
    +  __ cmpptr(op1, op2);
    +  if (ShenandoahAcmpBarrier) {
    +    Label done;
    +    __ jccb(Assembler::equal, done);
    +    read_barrier(masm, op1);
    +    read_barrier(masm, op2);
    +    __ cmpptr(op1, op2);
    +    __ bind(done);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::obj_equals(MacroAssembler* masm, Register src1, Address src2) {
    +  __ cmpptr(src1, src2);
    +  if (ShenandoahAcmpBarrier) {
    +    Label done;
    +    __ jccb(Assembler::equal, done);
    +    __ movptr(rscratch2, src2);
    +    read_barrier(masm, src1);
    +    read_barrier(masm, rscratch2);
    +    __ cmpptr(src1, rscratch2);
    +    __ bind(done);
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::tlab_allocate(MacroAssembler* masm,
    +                                                  Register thread, Register obj,
    +                                                  Register var_size_in_bytes,
    +                                                  int con_size_in_bytes,
    +                                                  Register t1, Register t2,
    +                                                  Label& slow_case) {
    +  assert_different_registers(obj, t1, t2);
    +  assert_different_registers(obj, var_size_in_bytes, t1);
    +  Register end = t2;
    +  if (!thread->is_valid()) {
    +#ifdef _LP64
    +    thread = r15_thread;
    +#else
    +    assert(t1->is_valid(), "need temp reg");
    +    thread = t1;
    +    __ get_thread(thread);
    +#endif
    +  }
    +
    +  __ verify_tlab();
    +
    +  __ movptr(obj, Address(thread, JavaThread::tlab_top_offset()));
    +  if (var_size_in_bytes == noreg) {
    +    __ lea(end, Address(obj, con_size_in_bytes + ShenandoahBrooksPointer::byte_size()));
    +  } else {
    +    __ addptr(var_size_in_bytes, ShenandoahBrooksPointer::byte_size());
    +    __ lea(end, Address(obj, var_size_in_bytes, Address::times_1));
    +  }
    +  __ cmpptr(end, Address(thread, JavaThread::tlab_end_offset()));
    +  __ jcc(Assembler::above, slow_case);
    +
    +  // update the tlab top pointer
    +  __ movptr(Address(thread, JavaThread::tlab_top_offset()), end);
    +
    +  // Initialize brooks pointer
    +#ifdef _LP64
    +  __ incrementq(obj, ShenandoahBrooksPointer::byte_size());
    +#else
    +  __ incrementl(obj, ShenandoahBrooksPointer::byte_size());
    +#endif
    +  __ movptr(Address(obj, ShenandoahBrooksPointer::byte_offset()), obj);
    +
    +  // recover var_size_in_bytes if necessary
    +  if (var_size_in_bytes == end) {
    +    __ subptr(var_size_in_bytes, obj);
    +  }
    +  __ verify_tlab();
    +}
    +
    +void ShenandoahBarrierSetAssembler::resolve(MacroAssembler* masm, DecoratorSet decorators, Register obj) {
    +  bool oop_not_null = (decorators & IS_NOT_NULL) != 0;
    +  bool is_write = (decorators & ACCESS_WRITE) != 0;
    +  if (is_write) {
    +    if (oop_not_null) {
    +      write_barrier(masm, obj);
    +    } else {
    +      Label done;
    +      __ testptr(obj, obj);
    +      __ jcc(Assembler::zero, done);
    +      write_barrier(masm, obj);
    +      __ bind(done);
    +    }
    +  } else {
    +    if (oop_not_null) {
    +      read_barrier_not_null(masm, obj);
    +    } else {
    +      read_barrier(masm, obj);
    +    }
    +  }
    +}
    +
    +// Special Shenandoah CAS implementation that handles false negatives
    +// due to concurrent evacuation.
    +#ifndef _LP64
    +void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
    +                                                Register res, Address addr, Register oldval, Register newval,
    +                                                bool exchange, bool encode, Register tmp1, Register tmp2) {
    +  // Shenandoah has no 32-bit version for this.
    +  Unimplemented();
    +}
    +#else
    +void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
    +                                                Register res, Address addr, Register oldval, Register newval,
    +                                                bool exchange, bool encode, Register tmp1, Register tmp2) {
    +  if (!ShenandoahCASBarrier) {
    +#ifdef _LP64
    +    if (UseCompressedOops) {
    +      if (encode) {
    +        __ encode_heap_oop(oldval);
    +        __ mov(rscratch1, newval);
    +        __ encode_heap_oop(rscratch1);
    +        newval = rscratch1;
    +      }
    +      if (os::is_MP()) {
    +        __ lock();
    +      }
    +      // oldval (rax) is implicitly used by this instruction
    +      __ cmpxchgl(newval, addr);
    +    } else
    +#endif
    +      {
    +        if (os::is_MP()) {
    +          __ lock();
    +        }
    +        __ cmpxchgptr(newval, addr);
    +      }
    +
    +    if (!exchange) {
    +      assert(res != NULL, "need result register");
    +      __ setb(Assembler::equal, res);
    +      __ movzbl(res, res);
    +    }
    +    return;
    +  }
    +
    +  assert(ShenandoahCASBarrier, "Should only be used when CAS barrier is enabled");
    +  assert(oldval == rax, "must be in rax for implicit use in cmpxchg");
    +
    +  Label retry, done;
    +
    +  // Apply storeval barrier to newval.
    +  if (encode) {
    +    storeval_barrier(masm, newval, tmp1);
    +  }
    +
    +  if (UseCompressedOops) {
    +    if (encode) {
    +      __ encode_heap_oop(oldval);
    +      __ mov(rscratch1, newval);
    +      __ encode_heap_oop(rscratch1);
    +      newval = rscratch1;
    +    }
    +  }
    +
    +  // Remember oldval for retry logic below
    +  if (UseCompressedOops) {
    +    __ movl(tmp1, oldval);
    +  } else {
    +    __ movptr(tmp1, oldval);
    +  }
    +
    +  // Step 1. Try to CAS with given arguments. If successful, then we are done,
    +  // and can safely return.
    +  if (os::is_MP()) __ lock();
    +  if (UseCompressedOops) {
    +    __ cmpxchgl(newval, addr);
    +  } else {
    +    __ cmpxchgptr(newval, addr);
    +  }
    +  __ jcc(Assembler::equal, done, true);
    +
    +  // Step 2. CAS had failed. This may be a false negative.
    +  //
    +  // The trouble comes when we compare the to-space pointer with the from-space
    +  // pointer to the same object. To resolve this, it will suffice to read both
    +  // oldval and the value from memory through the read barriers -- this will give
    +  // both to-space pointers. If they mismatch, then it was a legitimate failure.
    +  //
    +  if (UseCompressedOops) {
    +    __ decode_heap_oop(tmp1);
    +  }
    +  read_barrier_impl(masm, tmp1);
    +
    +  if (UseCompressedOops) {
    +    __ movl(tmp2, oldval);
    +    __ decode_heap_oop(tmp2);
    +  } else {
    +    __ movptr(tmp2, oldval);
    +  }
    +  read_barrier_impl(masm, tmp2);
    +
    +  __ cmpptr(tmp1, tmp2);
    +  __ jcc(Assembler::notEqual, done, true);
    +
    +  // Step 3. Try to CAS again with resolved to-space pointers.
    +  //
    +  // Corner case: it may happen that somebody stored the from-space pointer
    +  // to memory while we were preparing for retry. Therefore, we can fail again
    +  // on retry, and so need to do this in loop, always re-reading the failure
    +  // witness through the read barrier.
    +  __ bind(retry);
    +  if (os::is_MP()) __ lock();
    +  if (UseCompressedOops) {
    +    __ cmpxchgl(newval, addr);
    +  } else {
    +    __ cmpxchgptr(newval, addr);
    +  }
    +  __ jcc(Assembler::equal, done, true);
    +
    +  if (UseCompressedOops) {
    +    __ movl(tmp2, oldval);
    +    __ decode_heap_oop(tmp2);
    +  } else {
    +    __ movptr(tmp2, oldval);
    +  }
    +  read_barrier_impl(masm, tmp2);
    +
    +  __ cmpptr(tmp1, tmp2);
    +  __ jcc(Assembler::equal, retry, true);
    +
    +  // Step 4. If we need a boolean result out of CAS, check the flag again,
    +  // and promote the result. Note that we handle the flag from both the CAS
    +  // itself and from the retry loop.
    +  __ bind(done);
    +  if (!exchange) {
    +    assert(res != NULL, "need result register");
    +    __ setb(Assembler::equal, res);
    +    __ movzbl(res, res);
    +  }
    +}
    +#endif // LP64
    +
    +void ShenandoahBarrierSetAssembler::save_vector_registers(MacroAssembler* masm) {
    +  int num_xmm_regs = LP64_ONLY(16) NOT_LP64(8);
    +  if (UseAVX > 2) {
    +    num_xmm_regs = LP64_ONLY(32) NOT_LP64(8);
    +  }
    +
    +  if (UseSSE == 1)  {
    +    __ subptr(rsp, sizeof(jdouble)*8);
    +    for (int n = 0; n < 8; n++) {
    +      __ movflt(Address(rsp, n*sizeof(jdouble)), as_XMMRegister(n));
    +    }
    +  } else if (UseSSE >= 2)  {
    +    if (UseAVX > 2) {
    +      __ push(rbx);
    +      __ movl(rbx, 0xffff);
    +      __ kmovwl(k1, rbx);
    +      __ pop(rbx);
    +    }
    +#ifdef COMPILER2
    +    if (MaxVectorSize > 16) {
    +      if(UseAVX > 2) {
    +        // Save upper half of ZMM registers
    +        __ subptr(rsp, 32*num_xmm_regs);
    +        for (int n = 0; n < num_xmm_regs; n++) {
    +          __ vextractf64x4_high(Address(rsp, n*32), as_XMMRegister(n));
    +        }
    +      }
    +      assert(UseAVX > 0, "256 bit vectors are supported only with AVX");
    +      // Save upper half of YMM registers
    +      __ subptr(rsp, 16*num_xmm_regs);
    +      for (int n = 0; n < num_xmm_regs; n++) {
    +        __ vextractf128_high(Address(rsp, n*16), as_XMMRegister(n));
    +      }
    +    }
    +#endif
    +    // Save whole 128bit (16 bytes) XMM registers
    +    __ subptr(rsp, 16*num_xmm_regs);
    +#ifdef _LP64
    +    if (VM_Version::supports_evex()) {
    +      for (int n = 0; n < num_xmm_regs; n++) {
    +        __ vextractf32x4(Address(rsp, n*16), as_XMMRegister(n), 0);
    +      }
    +    } else {
    +      for (int n = 0; n < num_xmm_regs; n++) {
    +        __ movdqu(Address(rsp, n*16), as_XMMRegister(n));
    +      }
    +    }
    +#else
    +    for (int n = 0; n < num_xmm_regs; n++) {
    +      __ movdqu(Address(rsp, n*16), as_XMMRegister(n));
    +    }
    +#endif
    +  }
    +}
    +
    +void ShenandoahBarrierSetAssembler::restore_vector_registers(MacroAssembler* masm) {
    +  int num_xmm_regs = LP64_ONLY(16) NOT_LP64(8);
    +  if (UseAVX > 2) {
    +    num_xmm_regs = LP64_ONLY(32) NOT_LP64(8);
    +  }
    +  if (UseSSE == 1)  {
    +    for (int n = 0; n < 8; n++) {
    +      __ movflt(as_XMMRegister(n), Address(rsp, n*sizeof(jdouble)));
    +    }
    +    __ addptr(rsp, sizeof(jdouble)*8);
    +  } else if (UseSSE >= 2)  {
    +    // Restore whole 128bit (16 bytes) XMM registers
    +#ifdef _LP64
    +    if (VM_Version::supports_evex()) {
    +      for (int n = 0; n < num_xmm_regs; n++) {
    +        __ vinsertf32x4(as_XMMRegister(n), as_XMMRegister(n), Address(rsp, n*16), 0);
    +      }
    +    } else {
    +      for (int n = 0; n < num_xmm_regs; n++) {
    +        __ movdqu(as_XMMRegister(n), Address(rsp, n*16));
    +      }
    +    }
    +#else
    +    for (int n = 0; n < num_xmm_regs; n++) {
    +      __ movdqu(as_XMMRegister(n), Address(rsp, n*16));
    +    }
    +#endif
    +    __ addptr(rsp, 16*num_xmm_regs);
    +
    +#ifdef COMPILER2
    +    if (MaxVectorSize > 16) {
    +      // Restore upper half of YMM registers.
    +      for (int n = 0; n < num_xmm_regs; n++) {
    +        __ vinsertf128_high(as_XMMRegister(n), Address(rsp, n*16));
    +      }
    +      __ addptr(rsp, 16*num_xmm_regs);
    +      if (UseAVX > 2) {
    +        for (int n = 0; n < num_xmm_regs; n++) {
    +          __ vinsertf64x4_high(as_XMMRegister(n), Address(rsp, n*32));
    +        }
    +        __ addptr(rsp, 32*num_xmm_regs);
    +      }
    +    }
    +#endif
    +  }
    +}
    +
    +#ifdef COMPILER1
    +
    +#undef __
    +#define __ ce->masm()->
    +
    +void ShenandoahBarrierSetAssembler::gen_pre_barrier_stub(LIR_Assembler* ce, ShenandoahPreBarrierStub* stub) {
    +  ShenandoahBarrierSetC1* bs = (ShenandoahBarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1();
    +  // At this point we know that marking is in progress.
    +  // If do_load() is true then we have to emit the
    +  // load of the previous value; otherwise it has already
    +  // been loaded into _pre_val.
    +
    +  __ bind(*stub->entry());
    +  assert(stub->pre_val()->is_register(), "Precondition.");
    +
    +  Register pre_val_reg = stub->pre_val()->as_register();
    +
    +  if (stub->do_load()) {
    +    ce->mem2reg(stub->addr(), stub->pre_val(), T_OBJECT, stub->patch_code(), stub->info(), false /*wide*/, false /*unaligned*/);
    +  }
    +
    +  __ cmpptr(pre_val_reg, (int32_t)NULL_WORD);
    +  __ jcc(Assembler::equal, *stub->continuation());
    +  ce->store_parameter(stub->pre_val()->as_register(), 0);
    +  __ call(RuntimeAddress(bs->pre_barrier_c1_runtime_code_blob()->code_begin()));
    +  __ jmp(*stub->continuation());
    +
    +}
    +
    +void ShenandoahBarrierSetAssembler::gen_write_barrier_stub(LIR_Assembler* ce, ShenandoahWriteBarrierStub* stub) {
    +  __ bind(*stub->entry());
    +
    +  Label done;
    +  Register obj = stub->obj()->as_register();
    +  Register res = stub->result()->as_register();
    +
    +  if (res != obj) {
    +    __ mov(res, obj);
    +  }
    +
    +  // Check for null.
    +  if (stub->needs_null_check()) {
    +    __ testptr(res, res);
    +    __ jcc(Assembler::zero, done);
    +  }
    +
    +  write_barrier(ce->masm(), res);
    +
    +  __ bind(done);
    +  __ jmp(*stub->continuation());
    +}
    +
    +#undef __
    +
    +#define __ sasm->
    +
    +void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAssembler* sasm) {
    +  __ prologue("shenandoah_pre_barrier", false);
    +  // arg0 : previous value of memory
    +
    +  __ push(rax);
    +  __ push(rdx);
    +
    +  const Register pre_val = rax;
    +  const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
    +  const Register tmp = rdx;
    +
    +  NOT_LP64(__ get_thread(thread);)
    +
    +  Address queue_index(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset()));
    +  Address buffer(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset()));
    +
    +  Label done;
    +  Label runtime;
    +
    +  // Is SATB still active?
    +  Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
    +  __ testb(gc_state, ShenandoahHeap::MARKING | ShenandoahHeap::TRAVERSAL);
    +  __ jcc(Assembler::zero, done);
    +
    +  // Can we store original value in the thread's buffer?
    +
    +  __ movptr(tmp, queue_index);
    +  __ testptr(tmp, tmp);
    +  __ jcc(Assembler::zero, runtime);
    +  __ subptr(tmp, wordSize);
    +  __ movptr(queue_index, tmp);
    +  __ addptr(tmp, buffer);
    +
    +  // prev_val (rax)
    +  __ load_parameter(0, pre_val);
    +  __ movptr(Address(tmp, 0), pre_val);
    +  __ jmp(done);
    +
    +  __ bind(runtime);
    +
    +  __ save_live_registers_no_oop_map(true);
    +
    +  // load the pre-value
    +  __ load_parameter(0, rcx);
    +  __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), rcx, thread);
    +
    +  __ restore_live_registers(true);
    +
    +  __ bind(done);
    +
    +  __ pop(rdx);
    +  __ pop(rax);
    +
    +  __ epilogue();
    +}
    +
    +#undef __
    +
    +#endif // COMPILER1
    +
    +address ShenandoahBarrierSetAssembler::shenandoah_wb() {
    +  assert(_shenandoah_wb != NULL, "need write barrier stub");
    +  return _shenandoah_wb;
    +}
    +
    +#define __ cgen->assembler()->
    +
    +address ShenandoahBarrierSetAssembler::generate_shenandoah_wb(StubCodeGenerator* cgen) {
    +  __ align(CodeEntryAlignment);
    +  StubCodeMark mark(cgen, "StubRoutines", "shenandoah_wb");
    +  address start = __ pc();
    +
    +#ifdef _LP64
    +  Label not_done;
    +
    +  // We use RDI, which also serves as argument register for slow call.
    +  // RAX always holds the src object ptr, except after the slow call and
    +  // the cmpxchg, then it holds the result.
    +  // R8 and RCX are used as temporary registers.
    +  __ push(rdi);
    +  __ push(r8);
    +
    +  // Check for object beeing in the collection set.
    +  // TODO: Can we use only 1 register here?
    +  // The source object arrives here in rax.
    +  // live: rax
    +  // live: rdi
    +  __ mov(rdi, rax);
    +  __ shrptr(rdi, ShenandoahHeapRegion::region_size_bytes_shift_jint());
    +  // live: r8
    +  __ movptr(r8, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr());
    +  __ movbool(r8, Address(r8, rdi, Address::times_1));
    +  // unlive: rdi
    +  __ testbool(r8);
    +  // unlive: r8
    +  __ jccb(Assembler::notZero, not_done);
    +
    +  __ pop(r8);
    +  __ pop(rdi);
    +  __ ret(0);
    +
    +  __ bind(not_done);
    +
    +  __ push(rcx);
    +  __ push(rdx);
    +  __ push(rdi);
    +  __ push(rsi);
    +  __ push(r8);
    +  __ push(r9);
    +  __ push(r10);
    +  __ push(r11);
    +  __ push(r12);
    +  __ push(r13);
    +  __ push(r14);
    +  __ push(r15);
    +  save_vector_registers(cgen->assembler());
    +  __ movptr(rdi, rax);
    +  __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_JRT), rdi);
    +  restore_vector_registers(cgen->assembler());
    +  __ pop(r15);
    +  __ pop(r14);
    +  __ pop(r13);
    +  __ pop(r12);
    +  __ pop(r11);
    +  __ pop(r10);
    +  __ pop(r9);
    +  __ pop(r8);
    +  __ pop(rsi);
    +  __ pop(rdi);
    +  __ pop(rdx);
    +  __ pop(rcx);
    +
    +  __ pop(r8);
    +  __ pop(rdi);
    +  __ ret(0);
    +#else
    +  ShouldNotReachHere();
    +#endif
    +  return start;
    +}
    +
    +#undef __
    +
    +void ShenandoahBarrierSetAssembler::barrier_stubs_init() {
    +  if (ShenandoahWriteBarrier || ShenandoahStoreValEnqueueBarrier) {
    +    int stub_code_size = 4096;
    +    ResourceMark rm;
    +    BufferBlob* bb = BufferBlob::create("shenandoah_barrier_stubs", stub_code_size);
    +    CodeBuffer buf(bb);
    +    StubCodeGenerator cgen(&buf);
    +    _shenandoah_wb = generate_shenandoah_wb(&cgen);
    +  }
    +}
    diff --git a/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.hpp b/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.hpp
    new file mode 100644
    index 00000000000..c373409ec67
    --- /dev/null
    +++ b/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.hpp
    @@ -0,0 +1,119 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef CPU_X86_GC_SHENANDOAH_SHENANDOAHBARRIERSETASSEMBLER_X86_HPP
    +#define CPU_X86_GC_SHENANDOAH_SHENANDOAHBARRIERSETASSEMBLER_X86_HPP
    +
    +#include "asm/macroAssembler.hpp"
    +#include "gc/shared/barrierSetAssembler.hpp"
    +#ifdef COMPILER1
    +class LIR_Assembler;
    +class ShenandoahPreBarrierStub;
    +class ShenandoahWriteBarrierStub;
    +class StubAssembler;
    +class StubCodeGenerator;
    +#endif
    +
    +class ShenandoahBarrierSetAssembler: public BarrierSetAssembler {
    +private:
    +
    +  static address _shenandoah_wb;
    +
    +  void satb_write_barrier_pre(MacroAssembler* masm,
    +                              Register obj,
    +                              Register pre_val,
    +                              Register thread,
    +                              Register tmp,
    +                              bool tosca_live,
    +                              bool expand_call);
    +
    +  void shenandoah_write_barrier_pre(MacroAssembler* masm,
    +                                    Register obj,
    +                                    Register pre_val,
    +                                    Register thread,
    +                                    Register tmp,
    +                                    bool tosca_live,
    +                                    bool expand_call);
    +
    +  void read_barrier(MacroAssembler* masm, Register dst);
    +  void read_barrier_impl(MacroAssembler* masm, Register dst);
    +
    +  void read_barrier_not_null(MacroAssembler* masm, Register dst);
    +  void read_barrier_not_null_impl(MacroAssembler* masm, Register dst);
    +
    +  void write_barrier(MacroAssembler* masm, Register dst);
    +  void write_barrier_impl(MacroAssembler* masm, Register dst);
    +
    +  void storeval_barrier(MacroAssembler* masm, Register dst, Register tmp);
    +  void storeval_barrier_impl(MacroAssembler* masm, Register dst, Register tmp);
    +
    +  address generate_shenandoah_wb(StubCodeGenerator* cgen);
    +
    +  void save_vector_registers(MacroAssembler* masm);
    +  void restore_vector_registers(MacroAssembler* masm);
    +
    +public:
    +  static address shenandoah_wb();
    +
    +#ifdef COMPILER1
    +  void gen_pre_barrier_stub(LIR_Assembler* ce, ShenandoahPreBarrierStub* stub);
    +  void gen_write_barrier_stub(LIR_Assembler* ce, ShenandoahWriteBarrierStub* stub);
    +  void generate_c1_pre_barrier_runtime_stub(StubAssembler* sasm);
    +#endif
    +
    +  void cmpxchg_oop(MacroAssembler* masm,
    +                   Register res, Address addr, Register oldval, Register newval,
    +                   bool exchange, bool encode, Register tmp1, Register tmp2);
    +  virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +                                  Register src, Register dst, Register count);
    +  virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +                                  Register src, Register dst, Register count);
    +  virtual void load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +                       Register dst, Address src, Register tmp1, Register tmp_thread);
    +  virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
    +                        Address dst, Register val, Register tmp1, Register tmp2);
    +
    +#ifndef _LP64
    +  virtual void obj_equals(MacroAssembler* masm,
    +                          Address obj1, jobject obj2);
    +  virtual void obj_equals(MacroAssembler* masm,
    +                          Register obj1, jobject obj2);
    +#endif
    +
    +  virtual void obj_equals(MacroAssembler* masm, Register src1, Register src2);
    +  virtual void obj_equals(MacroAssembler* masm, Register src1, Address src2);
    +
    +  virtual void tlab_allocate(MacroAssembler* masm,
    +                             Register thread, Register obj,
    +                             Register var_size_in_bytes,
    +                             int con_size_in_bytes,
    +                             Register t1, Register t2,
    +                             Label& slow_case);
    +
    +  virtual void resolve(MacroAssembler* masm, DecoratorSet decorators, Register obj);
    +
    +  virtual void barrier_stubs_init();
    +
    +};
    +
    +#endif // CPU_X86_GC_SHENANDOAH_SHENANDOAHBARRIERSETASSEMBLER_X86_HPP
    diff --git a/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetC1_x86.cpp b/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetC1_x86.cpp
    new file mode 100644
    index 00000000000..2e1c5e87ba8
    --- /dev/null
    +++ b/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetC1_x86.cpp
    @@ -0,0 +1,104 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "c1/c1_LIRAssembler.hpp"
    +#include "c1/c1_MacroAssembler.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSet.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
    +#include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
    +
    +void LIR_OpShenandoahCompareAndSwap::emit_code(LIR_Assembler* masm) {
    +  Register addr = _addr->as_register_lo();
    +  Register newval = _new_value->as_register();
    +  Register cmpval = _cmp_value->as_register();
    +  Register tmp1 = _tmp1->as_register();
    +  Register tmp2 = _tmp2->as_register();
    +  assert(cmpval == rax, "wrong register");
    +  assert(newval != NULL, "new val must be register");
    +  assert(cmpval != newval, "cmp and new values must be in different registers");
    +  assert(cmpval != addr, "cmp and addr must be in different registers");
    +  assert(newval != addr, "new value and addr must be in different registers");
    +  ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm->masm(), NULL, Address(addr, 0), cmpval, newval, true, true, tmp1, tmp2);
    +}
    +
    +#ifdef ASSERT
    +#define __ gen->lir(__FILE__, __LINE__)->
    +#else
    +#define __ gen->lir()->
    +#endif
    +
    +LIR_Opr ShenandoahBarrierSetC1::atomic_cmpxchg_at_resolved(LIRAccess& access, LIRItem& cmp_value, LIRItem& new_value) {
    +
    +  if (access.is_oop()) {
    +    LIRGenerator* gen = access.gen();
    +    if (ShenandoahSATBBarrier) {
    +      pre_barrier(gen, access.access_emit_info(), access.decorators(), access.resolved_addr(),
    +                  LIR_OprFact::illegalOpr /* pre_val */);
    +    }
    +    if (ShenandoahCASBarrier) {
    +      cmp_value.load_item_force(FrameMap::rax_oop_opr);
    +      new_value.load_item();
    +
    +      LIR_Opr t1 = gen->new_register(T_OBJECT);
    +      LIR_Opr t2 = gen->new_register(T_OBJECT);
    +      LIR_Opr addr = access.resolved_addr()->as_address_ptr()->base();
    +
    +      __ append(new LIR_OpShenandoahCompareAndSwap(addr, cmp_value.result(), new_value.result(), t1, t2, LIR_OprFact::illegalOpr));
    +
    +      LIR_Opr result = gen->new_register(T_INT);
    +      __ cmove(lir_cond_equal, LIR_OprFact::intConst(1), LIR_OprFact::intConst(0),
    +               result, T_INT);
    +      return result;
    +    }
    +  }
    +  return BarrierSetC1::atomic_cmpxchg_at_resolved(access, cmp_value, new_value);
    +}
    +
    +LIR_Opr ShenandoahBarrierSetC1::atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value) {
    +  LIRGenerator* gen = access.gen();
    +  BasicType type = access.type();
    +
    +  LIR_Opr result = gen->new_register(type);
    +  value.load_item();
    +  LIR_Opr value_opr = value.result();
    +
    +  if (access.is_oop()) {
    +    value_opr = storeval_barrier(access.gen(), value_opr, access.access_emit_info(), access.decorators());
    +  }
    +
    +  // Because we want a 2-arg form of xchg and xadd
    +  __ move(value_opr, result);
    +
    +  assert(type == T_INT || type == T_OBJECT || type == T_ARRAY LP64_ONLY( || type == T_LONG ), "unexpected type");
    +  __ xchg(access.resolved_addr(), result, result, LIR_OprFact::illegalOpr);
    +
    +  if (access.is_oop()) {
    +    if (ShenandoahSATBBarrier) {
    +      pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), LIR_OprFact::illegalOpr,
    +                  result /* pre_val */);
    +    }
    +  }
    +
    +  return result;
    +}
    diff --git a/src/hotspot/cpu/x86/gc/shenandoah/shenandoah_x86_64.ad b/src/hotspot/cpu/x86/gc/shenandoah/shenandoah_x86_64.ad
    new file mode 100644
    index 00000000000..40cdde133df
    --- /dev/null
    +++ b/src/hotspot/cpu/x86/gc/shenandoah/shenandoah_x86_64.ad
    @@ -0,0 +1,152 @@
    +//
    +// Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    +//
    +// This code is free software; you can redistribute it and/or modify it
    +// under the terms of the GNU General Public License version 2 only, as
    +// published by the Free Software Foundation.
    +//
    +// This code is distributed in the hope that it will be useful, but WITHOUT
    +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    +// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    +// version 2 for more details (a copy is included in the LICENSE file that
    +// accompanied this code).
    +//
    +// You should have received a copy of the GNU General Public License version
    +// 2 along with this work; if not, write to the Free Software Foundation,
    +// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    +//
    +// Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    +// or visit www.oracle.com if you need additional information or have any
    +// questions.
    +//
    +//
    +
    +source_hpp %{
    +#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
    +%}
    +
    +instruct shenandoahRB(rRegP dst, rRegP src, rFlagsReg cr) %{
    +  match(Set dst (ShenandoahReadBarrier src));
    +  effect(DEF dst, USE src);
    +  ins_cost(125); // XXX
    +  format %{ "shenandoah_rb $dst, $src" %}
    +  ins_encode %{
    +    Register d = $dst$$Register;
    +    Register s = $src$$Register;
    +    __ movptr(d, Address(s, ShenandoahBrooksPointer::byte_offset()));
    +  %}
    +  ins_pipe(ialu_reg_mem);
    +%}
    +
    +instruct shenandoahRBNarrow(rRegP dst, rRegN src) %{
    +  predicate(UseCompressedOops && (Universe::narrow_oop_shift() == 0));
    +  match(Set dst (ShenandoahReadBarrier (DecodeN src)));
    +  effect(DEF dst, USE src);
    +  ins_cost(125); // XXX
    +  format %{ "shenandoah_rb $dst, $src" %}
    +  ins_encode %{
    +    Register d = $dst$$Register;
    +    Register s = $src$$Register;
    +    __ movptr(d, Address(r12, s, Address::times_1, ShenandoahBrooksPointer::byte_offset()));
    +  %}
    +  ins_pipe(ialu_reg_mem);
    +%}
    +
    +instruct shenandoahRBNarrowShift(rRegP dst, rRegN src) %{
    +  predicate(UseCompressedOops && (Universe::narrow_oop_shift() == Address::times_8));
    +  match(Set dst (ShenandoahReadBarrier (DecodeN src)));
    +  effect(DEF dst, USE src);
    +  ins_cost(125); // XXX
    +  format %{ "shenandoah_rb $dst, $src" %}
    +  ins_encode %{
    +    Register d = $dst$$Register;
    +    Register s = $src$$Register;
    +    __ movptr(d, Address(r12, s, Address::times_8, ShenandoahBrooksPointer::byte_offset()));
    +  %}
    +  ins_pipe(ialu_reg_mem);
    +%}
    +
    +instruct compareAndSwapP_shenandoah(rRegI res,
    +                                    memory mem_ptr,
    +                                    rRegP tmp1, rRegP tmp2,
    +                                    rax_RegP oldval, rRegP newval,
    +                                    rFlagsReg cr)
    +%{
    +  predicate(VM_Version::supports_cx8());
    +  match(Set res (ShenandoahCompareAndSwapP mem_ptr (Binary oldval newval)));
    +  match(Set res (ShenandoahWeakCompareAndSwapP mem_ptr (Binary oldval newval)));
    +  effect(TEMP tmp1, TEMP tmp2, KILL cr, KILL oldval);
    +
    +  format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
    +
    +  ins_encode %{
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
    +                                                   $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
    +                                                   false, // swap
    +                                                   false, $tmp1$$Register, $tmp2$$Register
    +                                                   );
    +  %}
    +  ins_pipe( pipe_cmpxchg );
    +%}
    +
    +instruct compareAndSwapN_shenandoah(rRegI res,
    +                                    memory mem_ptr,
    +                                    rRegP tmp1, rRegP tmp2,
    +                                    rax_RegN oldval, rRegN newval,
    +                                    rFlagsReg cr) %{
    +  match(Set res (ShenandoahCompareAndSwapN mem_ptr (Binary oldval newval)));
    +  match(Set res (ShenandoahWeakCompareAndSwapN mem_ptr (Binary oldval newval)));
    +  effect(TEMP tmp1, TEMP tmp2, KILL cr, KILL oldval);
    +
    +  format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
    +
    +  ins_encode %{
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
    +                                                   $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
    +                                                   false, // swap
    +                                                   false, $tmp1$$Register, $tmp2$$Register
    +                                                   );
    +  %}
    +  ins_pipe( pipe_cmpxchg );
    +%}
    +
    +instruct compareAndExchangeN_shenandoah(memory mem_ptr,
    +                                        rax_RegN oldval, rRegN newval,
    +                                        rRegP tmp1, rRegP tmp2,
    +                                        rFlagsReg cr) %{
    +  match(Set oldval (ShenandoahCompareAndExchangeN mem_ptr (Binary oldval newval)));
    +  effect(TEMP tmp1, TEMP tmp2, KILL cr);
    +
    +  format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
    +
    +  ins_encode %{
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
    +                                                   NULL, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
    +                                                   true, // exchange
    +                                                   false, $tmp1$$Register, $tmp2$$Register
    +                                                   );
    +  %}
    +  ins_pipe( pipe_cmpxchg );
    +%}
    +
    +instruct compareAndExchangeP_shenandoah(memory mem_ptr,
    +                                        rax_RegP oldval, rRegP newval,
    +                                        rRegP tmp1, rRegP tmp2,
    +                                        rFlagsReg cr)
    +%{
    +  predicate(VM_Version::supports_cx8());
    +  match(Set oldval (ShenandoahCompareAndExchangeP mem_ptr (Binary oldval newval)));
    +  effect(KILL cr, TEMP tmp1, TEMP tmp2);
    +  ins_cost(1000);
    +
    +  format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
    +
    +  ins_encode %{
    +    ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
    +                                                   NULL, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
    +                                                   true,  // exchange
    +                                                   false, $tmp1$$Register, $tmp2$$Register
    +                                                   );
    +  %}
    +  ins_pipe( pipe_cmpxchg );
    +%}
    diff --git a/src/hotspot/os/aix/os_aix.cpp b/src/hotspot/os/aix/os_aix.cpp
    index 9475aea6615..ecd9ec4c009 100644
    --- a/src/hotspot/os/aix/os_aix.cpp
    +++ b/src/hotspot/os/aix/os_aix.cpp
    @@ -4359,7 +4359,7 @@ bool os::start_debugging(char *buf, int buflen) {
     static inline time_t get_mtime(const char* filename) {
       struct stat st;
       int ret = os::stat(filename, &st);
    -  assert(ret == 0, "failed to stat() file '%s': %s", filename, strerror(errno));
    +  assert(ret == 0, "failed to stat() file '%s': %s", filename, os::strerror(errno));
       return st.st_mtime;
     }
     
    diff --git a/src/hotspot/os/bsd/os_bsd.cpp b/src/hotspot/os/bsd/os_bsd.cpp
    index 89c14a1e753..2ba1bae954b 100644
    --- a/src/hotspot/os/bsd/os_bsd.cpp
    +++ b/src/hotspot/os/bsd/os_bsd.cpp
    @@ -3388,7 +3388,7 @@ bool os::message_box(const char* title, const char* message) {
     static inline struct timespec get_mtime(const char* filename) {
       struct stat st;
       int ret = os::stat(filename, &st);
    -  assert(ret == 0, "failed to stat() file '%s': %s", filename, strerror(errno));
    +  assert(ret == 0, "failed to stat() file '%s': %s", filename, os::strerror(errno));
     #ifdef __APPLE__
       return st.st_mtimespec;
     #else
    diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp
    index fd6c3580242..7d7f6c49d46 100644
    --- a/src/hotspot/os/linux/os_linux.cpp
    +++ b/src/hotspot/os/linux/os_linux.cpp
    @@ -5946,7 +5946,7 @@ size_t os::current_stack_size() {
     static inline struct timespec get_mtime(const char* filename) {
       struct stat st;
       int ret = os::stat(filename, &st);
    -  assert(ret == 0, "failed to stat() file '%s': %s", filename, strerror(errno));
    +  assert(ret == 0, "failed to stat() file '%s': %s", filename, os::strerror(errno));
       return st.st_mtim;
     }
     
    diff --git a/src/hotspot/os/solaris/os_solaris.cpp b/src/hotspot/os/solaris/os_solaris.cpp
    index 2a6282d1564..c2fddc3d045 100644
    --- a/src/hotspot/os/solaris/os_solaris.cpp
    +++ b/src/hotspot/os/solaris/os_solaris.cpp
    @@ -1652,7 +1652,7 @@ void* os::get_default_process_handle() {
     static inline time_t get_mtime(const char* filename) {
       struct stat st;
       int ret = os::stat(filename, &st);
    -  assert(ret == 0, "failed to stat() file '%s': %s", filename, strerror(errno));
    +  assert(ret == 0, "failed to stat() file '%s': %s", filename, os::strerror(errno));
       return st.st_mtime;
     }
     
    diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp
    index 60abbcf40e6..17365abc40c 100644
    --- a/src/hotspot/os/windows/os_windows.cpp
    +++ b/src/hotspot/os/windows/os_windows.cpp
    @@ -1563,7 +1563,7 @@ int os::vsnprintf(char* buf, size_t len, const char* fmt, va_list args) {
     static inline time_t get_mtime(const char* filename) {
       struct stat st;
       int ret = os::stat(filename, &st);
    -  assert(ret == 0, "failed to stat() file '%s': %s", filename, strerror(errno));
    +  assert(ret == 0, "failed to stat() file '%s': %s", filename, os::strerror(errno));
       return st.st_mtime;
     }
     
    diff --git a/src/hotspot/os/windows/os_windows.hpp b/src/hotspot/os/windows/os_windows.hpp
    index 9d58e746ef9..644582df5e2 100644
    --- a/src/hotspot/os/windows/os_windows.hpp
    +++ b/src/hotspot/os/windows/os_windows.hpp
    @@ -26,6 +26,9 @@
     #define OS_WINDOWS_VM_OS_WINDOWS_HPP
     // Win32_OS defines the interface to windows operating systems
     
    +// strtok_s is the Windows thread-safe equivalent of POSIX strtok_r
    +#define strtok_r strtok_s
    +
     // Information about the protection of the page at address '0' on this os.
     static bool zero_page_read_protected() { return true; }
     
    diff --git a/src/hotspot/share/adlc/formssel.cpp b/src/hotspot/share/adlc/formssel.cpp
    index 9759e53ca3c..c5296d0c002 100644
    --- a/src/hotspot/share/adlc/formssel.cpp
    +++ b/src/hotspot/share/adlc/formssel.cpp
    @@ -775,7 +775,10 @@ bool InstructForm::captures_bottom_type(FormDict &globals) const {
            !strcmp(_matrule->_rChild->_opType,"GetAndSetP")   ||
            !strcmp(_matrule->_rChild->_opType,"GetAndSetN")   ||
            !strcmp(_matrule->_rChild->_opType,"CompareAndExchangeP") ||
    -       !strcmp(_matrule->_rChild->_opType,"CompareAndExchangeN")))  return true;
    +       !strcmp(_matrule->_rChild->_opType,"CompareAndExchangeN") ||
    +       !strcmp(_matrule->_rChild->_opType,"ShenandoahCompareAndExchangeP") ||
    +       !strcmp(_matrule->_rChild->_opType,"ShenandoahCompareAndExchangeN") ||
    +       !strcmp(_matrule->_rChild->_opType,"ShenandoahReadBarrier")))  return true;
       else if ( is_ideal_load() == Form::idealP )                return true;
       else if ( is_ideal_store() != Form::none  )                return true;
     
    @@ -3498,10 +3501,12 @@ int MatchNode::needs_ideal_memory_edge(FormDict &globals) const {
         "CompareAndSwapB", "CompareAndSwapS", "CompareAndSwapI", "CompareAndSwapL", "CompareAndSwapP", "CompareAndSwapN",
         "WeakCompareAndSwapB", "WeakCompareAndSwapS", "WeakCompareAndSwapI", "WeakCompareAndSwapL", "WeakCompareAndSwapP", "WeakCompareAndSwapN",
         "CompareAndExchangeB", "CompareAndExchangeS", "CompareAndExchangeI", "CompareAndExchangeL", "CompareAndExchangeP", "CompareAndExchangeN",
    +    "ShenandoahCompareAndSwapN", "ShenandoahCompareAndSwapP", "ShenandoahWeakCompareAndSwapP", "ShenandoahWeakCompareAndSwapN", "ShenandoahCompareAndExchangeP", "ShenandoahCompareAndExchangeN",
         "StoreCM",
         "ClearArray",
         "GetAndSetB", "GetAndSetS", "GetAndAddI", "GetAndSetI", "GetAndSetP",
         "GetAndAddB", "GetAndAddS", "GetAndAddL", "GetAndSetL", "GetAndSetN",
    +    "ShenandoahReadBarrier",
         "LoadBarrierSlowReg", "LoadBarrierWeakSlowReg"
       };
       int cnt = sizeof(needs_ideal_memory_list)/sizeof(char*);
    diff --git a/src/hotspot/share/aot/aotCodeHeap.cpp b/src/hotspot/share/aot/aotCodeHeap.cpp
    index 7f0540562fa..c84bca519c6 100644
    --- a/src/hotspot/share/aot/aotCodeHeap.cpp
    +++ b/src/hotspot/share/aot/aotCodeHeap.cpp
    @@ -40,7 +40,7 @@
     #include "runtime/os.hpp"
     #include "runtime/safepointVerifiers.hpp"
     #include "runtime/sharedRuntime.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     bool AOTLib::_narrow_oop_shift_initialized = false;
     int  AOTLib::_narrow_oop_shift = 0;
    diff --git a/src/hotspot/share/aot/aotCompiledMethod.cpp b/src/hotspot/share/aot/aotCompiledMethod.cpp
    index 46705a1e0e0..103e72677e3 100644
    --- a/src/hotspot/share/aot/aotCompiledMethod.cpp
    +++ b/src/hotspot/share/aot/aotCompiledMethod.cpp
    @@ -155,6 +155,10 @@ Metadata* AOTCompiledMethod::metadata_at(int index) const {
       ShouldNotReachHere(); return NULL;
     }
     
    +void AOTCompiledMethod::do_unloading(bool unloading_occurred) {
    +  unload_nmethod_caches(unloading_occurred);
    +}
    +
     bool AOTCompiledMethod::make_not_entrant_helper(int new_state) {
       // Make sure the method is not flushed in case of a safepoint in code below.
       methodHandle the_method(method());
    diff --git a/src/hotspot/share/aot/aotCompiledMethod.hpp b/src/hotspot/share/aot/aotCompiledMethod.hpp
    index 0cfa0a68b8f..79b79579591 100644
    --- a/src/hotspot/share/aot/aotCompiledMethod.hpp
    +++ b/src/hotspot/share/aot/aotCompiledMethod.hpp
    @@ -265,6 +265,7 @@ private:
     #endif
       }
     
    +  virtual void do_unloading(bool unloading_occurred);
     
     protected:
       // AOT compiled methods are not flushed
    diff --git a/src/hotspot/share/ci/ciInstanceKlass.cpp b/src/hotspot/share/ci/ciInstanceKlass.cpp
    index 6928049cc21..e8ad5e2567d 100644
    --- a/src/hotspot/share/ci/ciInstanceKlass.cpp
    +++ b/src/hotspot/share/ci/ciInstanceKlass.cpp
    @@ -72,7 +72,7 @@ ciInstanceKlass::ciInstanceKlass(Klass* k) :
       // by the GC but need to be strong roots if reachable from a current compilation.
       // InstanceKlass are created for both weak and strong metadata.  Ensuring this metadata
       // alive covers the cases where there are weak roots without performance cost.
    -  oop holder = ik->holder_phantom();
    +  oop holder = ik->klass_holder();
       if (ik->is_unsafe_anonymous()) {
         // Though ciInstanceKlass records class loader oop, it's not enough to keep
         // VM unsafe anonymous classes alive (loader == NULL). Klass holder should
    @@ -742,3 +742,27 @@ void ciInstanceKlass::dump_replay_data(outputStream* out) {
         ik->do_local_static_fields(&sffp);
       }
     }
    +
    +#ifdef ASSERT
    +bool ciInstanceKlass::debug_final_field_at(int offset) {
    +  GUARDED_VM_ENTRY(
    +    InstanceKlass* ik = get_instanceKlass();
    +    fieldDescriptor fd;
    +    if (ik->find_field_from_offset(offset, false, &fd)) {
    +      return fd.is_final();
    +    }
    +  );
    +  return false;
    +}
    +
    +bool ciInstanceKlass::debug_stable_field_at(int offset) {
    +  GUARDED_VM_ENTRY(
    +    InstanceKlass* ik = get_instanceKlass();
    +    fieldDescriptor fd;
    +    if (ik->find_field_from_offset(offset, false, &fd)) {
    +      return fd.is_stable();
    +    }
    +  );
    +  return false;
    +}
    +#endif
    diff --git a/src/hotspot/share/ci/ciInstanceKlass.hpp b/src/hotspot/share/ci/ciInstanceKlass.hpp
    index 914d6049755..e98f98b588c 100644
    --- a/src/hotspot/share/ci/ciInstanceKlass.hpp
    +++ b/src/hotspot/share/ci/ciInstanceKlass.hpp
    @@ -274,6 +274,11 @@ public:
     
       // Dump the current state of this klass for compilation replay.
       virtual void dump_replay_data(outputStream* out);
    +
    +#ifdef ASSERT
    +  bool debug_final_field_at(int offset);
    +  bool debug_stable_field_at(int offset);
    +#endif
     };
     
     #endif // SHARE_VM_CI_CIINSTANCEKLASS_HPP
    diff --git a/src/hotspot/share/ci/ciMethod.cpp b/src/hotspot/share/ci/ciMethod.cpp
    index 7ed07bba56e..a19d7219d8c 100644
    --- a/src/hotspot/share/ci/ciMethod.cpp
    +++ b/src/hotspot/share/ci/ciMethod.cpp
    @@ -403,7 +403,7 @@ MethodLivenessResult ciMethod::raw_liveness_at_bci(int bci) {
     // information.
     MethodLivenessResult ciMethod::liveness_at_bci(int bci) {
       MethodLivenessResult result = raw_liveness_at_bci(bci);
    -  if (CURRENT_ENV->should_retain_local_variables() || DeoptimizeALot || CompileTheWorld) {
    +  if (CURRENT_ENV->should_retain_local_variables() || DeoptimizeALot) {
         // Keep all locals live for the user's edification and amusement.
         result.at_put_range(0, result.size(), true);
       }
    @@ -1210,7 +1210,7 @@ bool ciMethod::is_klass_loaded(int refinfo_index, bool must_be_resolved) const {
     // ciMethod::check_call
     bool ciMethod::check_call(int refinfo_index, bool is_static) const {
       // This method is used only in C2 from InlineTree::ok_to_inline,
    -  // and is only used under -Xcomp or -XX:CompileTheWorld.
    +  // and is only used under -Xcomp.
       // It appears to fail when applied to an invokeinterface call site.
       // FIXME: Remove this method and resolve_method_statically; refactor to use the other LinkResolver entry points.
       VM_ENTRY_MARK;
    diff --git a/src/hotspot/share/classfile/classLoader.cpp b/src/hotspot/share/classfile/classLoader.cpp
    index b033639b7b9..0f624d8ce5c 100644
    --- a/src/hotspot/share/classfile/classLoader.cpp
    +++ b/src/hotspot/share/classfile/classLoader.cpp
    @@ -453,37 +453,6 @@ JImageLocationRef ClassLoader::jimage_find_resource(JImageFile* jf,
       return ((*JImageFindResource)(jf, module_name, get_jimage_version_string(), file_name, &size));
     }
     
    -#ifndef PRODUCT
    -bool ctw_visitor(JImageFile* jimage,
    -        const char* module_name, const char* version, const char* package,
    -        const char* name, const char* extension, void* arg) {
    -  if (strcmp(extension, "class") == 0) {
    -    Thread* THREAD = Thread::current();
    -    ResourceMark rm(THREAD);
    -    char* path = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, JIMAGE_MAX_PATH);
    -    jio_snprintf(path, JIMAGE_MAX_PATH - 1, "%s/%s.class", package, name);
    -    ClassLoader::compile_the_world_in(path, *(Handle*)arg, THREAD);
    -    return !HAS_PENDING_EXCEPTION;
    -  }
    -  return true;
    -}
    -
    -void ClassPathImageEntry::compile_the_world(Handle loader, TRAPS) {
    -  tty->print_cr("CompileTheWorld : Compiling all classes in %s", name());
    -  tty->cr();
    -  (*JImageResourceIterator)(_jimage, (JImageResourceVisitor_t)ctw_visitor, (void *)&loader);
    -  if (HAS_PENDING_EXCEPTION) {
    -    if (PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) {
    -      CLEAR_PENDING_EXCEPTION;
    -      tty->print_cr("\nCompileTheWorld : Ran out of memory\n");
    -      tty->print_cr("Increase class metadata storage if a limit was set");
    -    } else {
    -      tty->print_cr("\nCompileTheWorld : Unexpected exception occurred\n");
    -    }
    -  }
    -}
    -#endif
    -
     bool ClassPathImageEntry::is_modules_image() const {
       return ClassLoader::is_modules_image(name());
     }
    @@ -1224,13 +1193,14 @@ const char* ClassLoader::file_name_for_class_name(const char* class_name,
       assert((int)strlen(class_name) == class_name_len, "invariant");
     
       static const char class_suffix[] = ".class";
    +  size_t class_suffix_len = sizeof(class_suffix);
     
       char* const file_name = NEW_RESOURCE_ARRAY(char,
                                                  class_name_len +
    -                                             sizeof(class_suffix)); // includes term NULL
    +                                             class_suffix_len); // includes term NULL
     
       strncpy(file_name, class_name, class_name_len);
    -  strncpy(&file_name[class_name_len], class_suffix, sizeof(class_suffix));
    +  strncpy(&file_name[class_name_len], class_suffix, class_suffix_len);
     
       return file_name;
     }
    @@ -1750,247 +1720,6 @@ void ClassLoader::create_javabase() {
       }
     }
     
    -#ifndef PRODUCT
    -
    -// CompileTheWorld
    -//
    -// Iterates over all class path entries and forces compilation of all methods
    -// in all classes found. Currently, only zip/jar archives are searched.
    -//
    -// The classes are loaded by the Java level bootstrap class loader, and the
    -// initializer is called. If DelayCompilationDuringStartup is true (default),
    -// the interpreter will run the initialization code. Note that forcing
    -// initialization in this way could potentially lead to initialization order
    -// problems, in which case we could just force the initialization bit to be set.
    -
    -
    -// We need to iterate over the contents of a zip/jar file, so we replicate the
    -// jzcell and jzfile definitions from zip_util.h but rename jzfile to real_jzfile,
    -// since jzfile already has a void* definition.
    -//
    -// Note that this is only used in debug mode.
    -//
    -// HotSpot integration note:
    -// Matches zip_util.h 1.14 99/06/01 from jdk1.3 beta H build
    -
    -
    -// JDK 1.3 version
    -typedef struct real_jzentry {         /* Zip file entry */
    -    char *name;                 /* entry name */
    -    jint time;                  /* modification time */
    -    jint size;                  /* size of uncompressed data */
    -    jint csize;                 /* size of compressed data (zero if uncompressed) */
    -    jint crc;                   /* crc of uncompressed data */
    -    char *comment;              /* optional zip file comment */
    -    jbyte *extra;               /* optional extra data */
    -    jint pos;                   /* position of LOC header (if negative) or data */
    -} real_jzentry;
    -
    -typedef struct real_jzfile {  /* Zip file */
    -    char *name;                 /* zip file name */
    -    jint refs;                  /* number of active references */
    -    jint fd;                    /* open file descriptor */
    -    void *lock;                 /* read lock */
    -    char *comment;              /* zip file comment */
    -    char *msg;                  /* zip error message */
    -    void *entries;              /* array of hash cells */
    -    jint total;                 /* total number of entries */
    -    unsigned short *table;      /* Hash chain heads: indexes into entries */
    -    jint tablelen;              /* number of hash eads */
    -    real_jzfile *next;        /* next zip file in search list */
    -    jzentry *cache;             /* we cache the most recently freed jzentry */
    -    /* Information on metadata names in META-INF directory */
    -    char **metanames;           /* array of meta names (may have null names) */
    -    jint metacount;             /* number of slots in metanames array */
    -    /* If there are any per-entry comments, they are in the comments array */
    -    char **comments;
    -} real_jzfile;
    -
    -void ClassPathDirEntry::compile_the_world(Handle loader, TRAPS) {
    -  // For now we only compile all methods in all classes in zip/jar files
    -  tty->print_cr("CompileTheWorld : Skipped classes in %s", _dir);
    -  tty->cr();
    -}
    -
    -void ClassPathZipEntry::compile_the_world(Handle loader, TRAPS) {
    -  real_jzfile* zip = (real_jzfile*) _zip;
    -  tty->print_cr("CompileTheWorld : Compiling all classes in %s", zip->name);
    -  tty->cr();
    -  // Iterate over all entries in zip file
    -  for (int n = 0; ; n++) {
    -    real_jzentry * ze = (real_jzentry *)((*GetNextEntry)(_zip, n));
    -    if (ze == NULL) break;
    -    ClassLoader::compile_the_world_in(ze->name, loader, CHECK);
    -  }
    -  if (HAS_PENDING_EXCEPTION) {
    -    if (PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) {
    -      CLEAR_PENDING_EXCEPTION;
    -      tty->print_cr("\nCompileTheWorld : Ran out of memory\n");
    -      tty->print_cr("Increase class metadata storage if a limit was set");
    -    } else {
    -      tty->print_cr("\nCompileTheWorld : Unexpected exception occurred\n");
    -    }
    -  }
    -}
    -
    -void ClassLoader::compile_the_world() {
    -  EXCEPTION_MARK;
    -  HandleMark hm(THREAD);
    -  ResourceMark rm(THREAD);
    -
    -  assert(has_jrt_entry(), "Compile The World not supported with exploded module build");
    -
    -  // Find bootstrap loader
    -  Handle system_class_loader (THREAD, SystemDictionary::java_system_loader());
    -  jlong start = os::javaTimeMillis();
    -
    -  // Compile the world for the modular java runtime image
    -  _jrt_entry->compile_the_world(system_class_loader, CATCH);
    -
    -  // Iterate over all bootstrap class path appended entries
    -  ClassPathEntry* e = _first_append_entry;
    -  while (e != NULL) {
    -    assert(!e->is_modules_image(), "A modular java runtime image is present on the list of appended entries");
    -    e->compile_the_world(system_class_loader, CATCH);
    -    e = e->next();
    -  }
    -  jlong end = os::javaTimeMillis();
    -  tty->print_cr("CompileTheWorld : Done (%d classes, %d methods, " JLONG_FORMAT " ms)",
    -                _compile_the_world_class_counter, _compile_the_world_method_counter, (end - start));
    -  {
    -    // Print statistics as if before normal exit:
    -    extern void print_statistics();
    -    print_statistics();
    -  }
    -  vm_exit(0);
    -}
    -
    -int ClassLoader::_compile_the_world_class_counter = 0;
    -int ClassLoader::_compile_the_world_method_counter = 0;
    -static int _codecache_sweep_counter = 0;
    -
    -// Filter out all exceptions except OOMs
    -static void clear_pending_exception_if_not_oom(TRAPS) {
    -  if (HAS_PENDING_EXCEPTION &&
    -      !PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) {
    -    CLEAR_PENDING_EXCEPTION;
    -  }
    -  // The CHECK at the caller will propagate the exception out
    -}
    -
    -/**
    - * Returns if the given method should be compiled when doing compile-the-world.
    - *
    - * TODO:  This should be a private method in a CompileTheWorld class.
    - */
    -static bool can_be_compiled(const methodHandle& m, int comp_level) {
    -  assert(CompileTheWorld, "must be");
    -
    -  // It's not valid to compile a native wrapper for MethodHandle methods
    -  // that take a MemberName appendix since the bytecode signature is not
    -  // correct.
    -  vmIntrinsics::ID iid = m->intrinsic_id();
    -  if (MethodHandles::is_signature_polymorphic(iid) && MethodHandles::has_member_arg(iid)) {
    -    return false;
    -  }
    -
    -  return CompilationPolicy::can_be_compiled(m, comp_level);
    -}
    -
    -void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
    -  if (string_ends_with(name, ".class")) {
    -    // We have a .class file
    -    int len = (int)strlen(name);
    -    char buffer[2048];
    -    strncpy(buffer, name, len - 6);
    -    buffer[len-6] = 0;
    -    // If the file has a period after removing .class, it's not really a
    -    // valid class file.  The class loader will check everything else.
    -    if (strchr(buffer, '.') == NULL) {
    -      _compile_the_world_class_counter++;
    -      if (_compile_the_world_class_counter > CompileTheWorldStopAt) return;
    -
    -      // Construct name without extension
    -      TempNewSymbol sym = SymbolTable::new_symbol(buffer, CHECK);
    -      // Use loader to load and initialize class
    -      Klass* k = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD);
    -      if (k != NULL && !HAS_PENDING_EXCEPTION) {
    -        k->initialize(THREAD);
    -      }
    -      bool exception_occurred = HAS_PENDING_EXCEPTION;
    -      clear_pending_exception_if_not_oom(CHECK);
    -      if (CompileTheWorldPreloadClasses && k != NULL) {
    -        InstanceKlass* ik = InstanceKlass::cast(k);
    -        ConstantPool::preload_and_initialize_all_classes(ik->constants(), THREAD);
    -        if (HAS_PENDING_EXCEPTION) {
    -          // If something went wrong in preloading we just ignore it
    -          clear_pending_exception_if_not_oom(CHECK);
    -          tty->print_cr("Preloading failed for (%d) %s", _compile_the_world_class_counter, buffer);
    -        }
    -      }
    -
    -      if (_compile_the_world_class_counter >= CompileTheWorldStartAt) {
    -        if (k == NULL || exception_occurred) {
    -          // If something went wrong (e.g. ExceptionInInitializerError) we skip this class
    -          tty->print_cr("CompileTheWorld (%d) : Skipping %s", _compile_the_world_class_counter, buffer);
    -        } else {
    -          tty->print_cr("CompileTheWorld (%d) : %s", _compile_the_world_class_counter, buffer);
    -          // Preload all classes to get around uncommon traps
    -          // Iterate over all methods in class
    -          int comp_level = CompilationPolicy::policy()->initial_compile_level();
    -          InstanceKlass* ik = InstanceKlass::cast(k);
    -          for (int n = 0; n < ik->methods()->length(); n++) {
    -            methodHandle m (THREAD, ik->methods()->at(n));
    -            if (can_be_compiled(m, comp_level)) {
    -              if (++_codecache_sweep_counter == CompileTheWorldSafepointInterval) {
    -                // Give sweeper a chance to keep up with CTW
    -                VM_CTWThreshold op;
    -                VMThread::execute(&op);
    -                _codecache_sweep_counter = 0;
    -              }
    -              // Force compilation
    -              CompileBroker::compile_method(m, InvocationEntryBci, comp_level,
    -                                            methodHandle(), 0, CompileTask::Reason_CTW, THREAD);
    -              if (HAS_PENDING_EXCEPTION) {
    -                clear_pending_exception_if_not_oom(CHECK);
    -                tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string());
    -              } else {
    -                _compile_the_world_method_counter++;
    -              }
    -              if (TieredCompilation && TieredStopAtLevel >= CompLevel_full_optimization) {
    -                // Clobber the first compile and force second tier compilation
    -                CompiledMethod* nm = m->code();
    -                if (nm != NULL && !m->is_method_handle_intrinsic()) {
    -                  // Throw out the code so that the code cache doesn't fill up
    -                  nm->make_not_entrant();
    -                }
    -                CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_full_optimization,
    -                                              methodHandle(), 0, CompileTask::Reason_CTW, THREAD);
    -                if (HAS_PENDING_EXCEPTION) {
    -                  clear_pending_exception_if_not_oom(CHECK);
    -                  tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string());
    -                } else {
    -                  _compile_the_world_method_counter++;
    -                }
    -              }
    -            } else {
    -              tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string());
    -            }
    -
    -            CompiledMethod* nm = m->code();
    -            if (nm != NULL && !m->is_method_handle_intrinsic()) {
    -              // Throw out the code so that the code cache doesn't fill up
    -              nm->make_not_entrant();
    -            }
    -          }
    -        }
    -      }
    -    }
    -  }
    -}
    -
    -#endif //PRODUCT
    -
     // Please keep following two functions at end of this file. With them placed at top or in middle of the file,
     // they could get inlined by agressive compiler, an unknown trick, see bug 6966589.
     void PerfClassTraceTime::initialize() {
    diff --git a/src/hotspot/share/classfile/classLoader.hpp b/src/hotspot/share/classfile/classLoader.hpp
    index 4c765be5c92..e312f2df2c1 100644
    --- a/src/hotspot/share/classfile/classLoader.hpp
    +++ b/src/hotspot/share/classfile/classLoader.hpp
    @@ -60,8 +60,6 @@ public:
       // Attempt to locate file_name through this class path entry.
       // Returns a class file parsing stream if successfull.
       virtual ClassFileStream* open_stream(const char* name, TRAPS) = 0;
    -  // Debugging
    -  NOT_PRODUCT(virtual void compile_the_world(Handle loader, TRAPS) = 0;)
     };
     
     class ClassPathDirEntry: public ClassPathEntry {
    @@ -75,8 +73,6 @@ class ClassPathDirEntry: public ClassPathEntry {
       ClassPathDirEntry(const char* dir);
       virtual ~ClassPathDirEntry() {}
       ClassFileStream* open_stream(const char* name, TRAPS);
    -  // Debugging
    -  NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
     };
     
     
    @@ -107,8 +103,6 @@ class ClassPathZipEntry: public ClassPathEntry {
       u1* open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS);
       ClassFileStream* open_stream(const char* name, TRAPS);
       void contents_do(void f(const char* name, void* context), void* context);
    -  // Debugging
    -  NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
     };
     
     
    @@ -126,9 +120,6 @@ public:
       ClassPathImageEntry(JImageFile* jimage, const char* name);
       virtual ~ClassPathImageEntry();
       ClassFileStream* open_stream(const char* name, TRAPS);
    -
    -  // Debugging
    -  NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
     };
     
     // ModuleClassPathList contains a linked list of ClassPathEntry's
    @@ -447,17 +438,6 @@ class ClassLoader: AllStatic {
     
       // Debugging
       static void verify()              PRODUCT_RETURN;
    -
    -  // Force compilation of all methods in all classes in bootstrap class path (stress test)
    -#ifndef PRODUCT
    - protected:
    -  static int _compile_the_world_class_counter;
    -  static int _compile_the_world_method_counter;
    - public:
    -  static void compile_the_world();
    -  static void compile_the_world_in(char* name, Handle loader, TRAPS);
    -  static int  compile_the_world_counter() { return _compile_the_world_class_counter; }
    -#endif //PRODUCT
     };
     
     // PerfClassTraceTime is used to measure time for class loading related events.
    diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
    index f1f8324a057..c177c48b3ef 100644
    --- a/src/hotspot/share/classfile/classLoaderData.cpp
    +++ b/src/hotspot/share/classfile/classLoaderData.cpp
    @@ -192,7 +192,7 @@ oop* ClassLoaderData::ChunkedHandleList::add(oop o) {
         OrderAccess::release_store(&_head, next);
       }
       oop* handle = &_head->_data[_head->_size];
    -  *handle = o;
    +  NativeAccess::oop_store(handle, o);
       OrderAccess::release_store(&_head->_size, _head->_size + 1);
       return handle;
     }
    @@ -234,7 +234,7 @@ class VerifyContainsOopClosure : public OopClosure {
       VerifyContainsOopClosure(oop target) : _target(target), _found(false) {}
     
       void do_oop(oop* p) {
    -    if (p != NULL && oopDesc::equals(RawAccess<>::oop_load(p), _target)) {
    +    if (p != NULL && oopDesc::equals(NativeAccess::oop_load(p), _target)) {
           _found = true;
         }
       }
    diff --git a/src/hotspot/share/classfile/classLoaderData.hpp b/src/hotspot/share/classfile/classLoaderData.hpp
    index a36f2572837..71234280472 100644
    --- a/src/hotspot/share/classfile/classLoaderData.hpp
    +++ b/src/hotspot/share/classfile/classLoaderData.hpp
    @@ -176,12 +176,12 @@ class ClassLoaderData : public CHeapObj {
       void clear_accumulated_modified_oops() { _accumulated_modified_oops = false; }
       bool has_accumulated_modified_oops()   { return _accumulated_modified_oops; }
       oop holder_no_keepalive() const;
    +  oop holder_phantom() const;
     
      private:
       void unload();
       bool keep_alive() const       { return _keep_alive > 0; }
     
    -  oop holder_phantom() const;
       void classes_do(void f(Klass* const));
       void loaded_classes_do(KlassClosure* klass_closure);
       void classes_do(void f(InstanceKlass*));
    diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.cpp b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
    index 4e253255c28..249809ebe35 100644
    --- a/src/hotspot/share/classfile/classLoaderDataGraph.cpp
    +++ b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
    @@ -583,7 +583,6 @@ void ClassLoaderDataGraph::clean_module_and_package_info() {
     }
     
     void ClassLoaderDataGraph::purge() {
    -  assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
       ClassLoaderData* list = _unloading;
       _unloading = NULL;
       ClassLoaderData* next = list;
    diff --git a/src/hotspot/share/classfile/classLoaderStats.hpp b/src/hotspot/share/classfile/classLoaderStats.hpp
    index ea22878a728..c625ef2ef73 100644
    --- a/src/hotspot/share/classfile/classLoaderStats.hpp
    +++ b/src/hotspot/share/classfile/classLoaderStats.hpp
    @@ -30,7 +30,7 @@
     #include "oops/klass.hpp"
     #include "oops/oop.hpp"
     #include "oops/oopsHierarchy.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/diagnosticCommand.hpp"
     #include "utilities/resourceHash.hpp"
     
    diff --git a/src/hotspot/share/classfile/dictionary.cpp b/src/hotspot/share/classfile/dictionary.cpp
    index 12c4d7e787f..612591fa551 100644
    --- a/src/hotspot/share/classfile/dictionary.cpp
    +++ b/src/hotspot/share/classfile/dictionary.cpp
    @@ -235,7 +235,7 @@ void Dictionary::clean_cached_protection_domains(DictionaryEntry* probe) {
     
     
     void Dictionary::do_unloading() {
    -  assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
    +  assert_locked_or_safepoint(SystemDictionary_lock);
     
       // The NULL class loader doesn't initiate loading classes from other class loaders
       if (loader_data() == ClassLoaderData::the_null_class_loader_data()) {
    diff --git a/src/hotspot/share/classfile/dictionary.hpp b/src/hotspot/share/classfile/dictionary.hpp
    index 474803603de..4c0e91046c2 100644
    --- a/src/hotspot/share/classfile/dictionary.hpp
    +++ b/src/hotspot/share/classfile/dictionary.hpp
    @@ -173,7 +173,7 @@ class DictionaryEntry : public HashtableEntry {
         for (ProtectionDomainEntry* current = pd_set(); // accessed at a safepoint
                                     current != NULL;
                                     current = current->_next) {
    -      oopDesc::verify(current->_pd_cache->object_no_keepalive());
    +      guarantee(oopDesc::is_oop(current->_pd_cache->object_no_keepalive()), "Invalid oop");
         }
       }
     
    diff --git a/src/hotspot/share/classfile/stringTable.cpp b/src/hotspot/share/classfile/stringTable.cpp
    index 7b576fa9409..918f2611371 100644
    --- a/src/hotspot/share/classfile/stringTable.cpp
    +++ b/src/hotspot/share/classfile/stringTable.cpp
    @@ -54,13 +54,13 @@
     #include "utilities/macros.hpp"
     
     // We prefer short chains of avg 2
    -#define PREF_AVG_LIST_LEN   2
    +const double PREF_AVG_LIST_LEN = 2.0;
     // 2^24 is max size
    -#define END_SIZE           24
    +const size_t END_SIZE = 24;
     // If a chain gets to 32 something might be wrong
    -#define REHASH_LEN         32
    +const size_t REHASH_LEN = 32;
     // If we have as many dead items as 50% of the number of bucket
    -#define CLEAN_DEAD_HIGH_WATER_MARK 0.5
    +const double CLEAN_DEAD_HIGH_WATER_MARK = 0.5;
     
     #if INCLUDE_CDS_JAVA_HEAP
     inline oop read_string_from_compact_hashtable(address base_address, u4 offset) {
    @@ -216,7 +216,7 @@ size_t StringTable::item_added() {
       return Atomic::add((size_t)1, &(the_table()->_items_count));
     }
     
    -size_t StringTable::add_items_count_to_clean(size_t ndead) {
    +size_t StringTable::add_items_to_clean(size_t ndead) {
       size_t total = Atomic::add((size_t)ndead, &(the_table()->_uncleaned_items_count));
       log_trace(stringtable)(
          "Uncleaned items:" SIZE_FORMAT " added: " SIZE_FORMAT " total:" SIZE_FORMAT,
    @@ -228,11 +228,11 @@ void StringTable::item_removed() {
       Atomic::add((size_t)-1, &(the_table()->_items_count));
     }
     
    -double StringTable::get_load_factor() {
    +double StringTable::get_load_factor() const {
       return (double)_items_count/_current_size;
     }
     
    -double StringTable::get_dead_factor() {
    +double StringTable::get_dead_factor() const {
       return (double)_uncleaned_items_count/_current_size;
     }
     
    @@ -432,7 +432,7 @@ void StringTable::possibly_parallel_unlink(
       _par_state_string->weak_oops_do(&stiac, &dnc);
     
       // Accumulate the dead strings.
    -  the_table()->add_items_count_to_clean(stiac._count);
    +  the_table()->add_items_to_clean(stiac._count);
     
       *processed = stiac._count_total;
       *removed = stiac._count;
    diff --git a/src/hotspot/share/classfile/stringTable.hpp b/src/hotspot/share/classfile/stringTable.hpp
    index 408ef21050e..90f00ec047c 100644
    --- a/src/hotspot/share/classfile/stringTable.hpp
    +++ b/src/hotspot/share/classfile/stringTable.hpp
    @@ -72,15 +72,15 @@ private:
       volatile size_t _uncleaned_items_count;
       DEFINE_PAD_MINUS_SIZE(2, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile size_t));
     
    -  double get_load_factor();
    -  double get_dead_factor();
    +  double get_load_factor() const;
    +  double get_dead_factor() const;
     
       void check_concurrent_work();
       void trigger_concurrent_work();
     
       static size_t item_added();
       static void item_removed();
    -  size_t add_items_count_to_clean(size_t ndead);
    +  size_t add_items_to_clean(size_t ndead);
     
       StringTable();
     
    @@ -125,7 +125,7 @@ private:
       // If GC uses ParState directly it should add the number of cleared
       // strings to this method.
       static void inc_dead_counter(size_t ndead) {
    -    the_table()->add_items_count_to_clean(ndead);
    +    the_table()->add_items_to_clean(ndead);
       }
     
       //   Delete pointers to otherwise-unreachable objects.
    diff --git a/src/hotspot/share/classfile/symbolTable.cpp b/src/hotspot/share/classfile/symbolTable.cpp
    index 258a64704b4..60b46a166bc 100644
    --- a/src/hotspot/share/classfile/symbolTable.cpp
    +++ b/src/hotspot/share/classfile/symbolTable.cpp
    @@ -42,19 +42,19 @@
     // We used to not resize at all, so let's be conservative
     // and not set it too short before we decide to resize,
     // to match previous startup behavior
    -#define PREF_AVG_LIST_LEN           8
    +const double PREF_AVG_LIST_LEN = 8.0;
     // 2^17 (131,072) is max size, which is about 6.5 times as large
     // as the previous table size (used to be 20,011),
     // which never resized
    -#define END_SIZE                    17
    +const size_t END_SIZE = 17;
     // If a chain gets to 100 something might be wrong
    -#define REHASH_LEN                  100
    +const size_t REHASH_LEN = 100;
     // We only get a chance to check whether we need
     // to clean infrequently (on class unloading),
     // so if we have even one dead entry then mark table for cleaning
    -#define CLEAN_DEAD_HIGH_WATER_MARK  0.0
    +const double CLEAN_DEAD_HIGH_WATER_MARK = 0.0;
     
    -#define ON_STACK_BUFFER_LENGTH 128
    +const size_t ON_STACK_BUFFER_LENGTH = 128;
     
     // --------------------------------------------------------------------------
     
    @@ -171,8 +171,9 @@ void SymbolTable::set_item_clean_count(size_t ncl) {
       log_trace(symboltable)("Set uncleaned items:" SIZE_FORMAT, SymbolTable::the_table()->_uncleaned_items_count);
     }
     
    +// Mark one item as needing to be cleaned, but only if no other items are marked yet
     void SymbolTable::mark_item_clean_count() {
    -  if (Atomic::cmpxchg((size_t)1, &(SymbolTable::the_table()->_uncleaned_items_count), (size_t)0) == 0) { // only mark if unset
    +  if (Atomic::cmpxchg((size_t)1, &(SymbolTable::the_table()->_uncleaned_items_count), (size_t)0) == 0) {
         log_trace(symboltable)("Marked uncleaned items:" SIZE_FORMAT, SymbolTable::the_table()->_uncleaned_items_count);
       }
     }
    @@ -182,11 +183,11 @@ void SymbolTable::item_removed() {
       Atomic::dec(&(SymbolTable::the_table()->_items_count));
     }
     
    -double SymbolTable::get_load_factor() {
    +double SymbolTable::get_load_factor() const {
       return (double)_items_count/_current_size;
     }
     
    -double SymbolTable::get_dead_factor() {
    +double SymbolTable::get_dead_factor() const {
       return (double)_uncleaned_items_count/_current_size;
     }
     
    @@ -386,7 +387,7 @@ public:
         assert(*value != NULL, "value should point to a symbol");
         _return = *value;
       }
    -  Symbol* get_res_sym() {
    +  Symbol* get_res_sym() const {
         return _return;
       }
     };
    @@ -694,7 +695,7 @@ void SymbolTable::grow(JavaThread* jt) {
     }
     
     struct SymbolTableDoDelete : StackObj {
    -  int _deleted;
    +  size_t _deleted;
       SymbolTableDoDelete() : _deleted(0) {}
       void operator()(Symbol** value) {
         assert(value != NULL, "expected valid value");
    @@ -706,7 +707,7 @@ struct SymbolTableDoDelete : StackObj {
     };
     
     struct SymbolTableDeleteCheck : StackObj {
    -  int _processed;
    +  size_t _processed;
       SymbolTableDeleteCheck() : _processed(0) {}
       bool operator()(Symbol** value) {
         assert(value != NULL, "expected valid value");
    @@ -738,9 +739,9 @@ void SymbolTable::clean_dead_entries(JavaThread* jt) {
         bdt.done(jt);
       }
     
    -  Atomic::add((size_t)stdc._processed, &_symbols_counted);
    +  Atomic::add(stdc._processed, &_symbols_counted);
     
    -  log_debug(symboltable)("Cleaned " INT32_FORMAT " of " INT32_FORMAT,
    +  log_debug(symboltable)("Cleaned " SIZE_FORMAT " of " SIZE_FORMAT,
                              stdd._deleted, stdc._processed);
     }
     
    @@ -775,7 +776,7 @@ void SymbolTable::concurrent_work(JavaThread* jt) {
     }
     
     class CountDead : StackObj {
    -  int _count;
    +  size_t _count;
     public:
       CountDead() : _count(0) {}
       bool operator()(Symbol** value) {
    @@ -787,7 +788,7 @@ public:
         }
         return true;
       };
    -  int get_dead_count() {
    +  size_t get_dead_count() const {
         return _count;
       }
     };
    diff --git a/src/hotspot/share/classfile/symbolTable.hpp b/src/hotspot/share/classfile/symbolTable.hpp
    index 3d3b27e1fb9..f91fb3a60d0 100644
    --- a/src/hotspot/share/classfile/symbolTable.hpp
    +++ b/src/hotspot/share/classfile/symbolTable.hpp
    @@ -123,8 +123,8 @@ private:
       volatile size_t _items_count;
       volatile size_t _uncleaned_items_count;
     
    -  double get_load_factor();
    -  double get_dead_factor();
    +  double get_load_factor() const;
    +  double get_dead_factor() const;
     
       void check_concurrent_work();
       void trigger_concurrent_work();
    diff --git a/src/hotspot/share/classfile/verifier.hpp b/src/hotspot/share/classfile/verifier.hpp
    index 57d222abdf2..586f9a98b92 100644
    --- a/src/hotspot/share/classfile/verifier.hpp
    +++ b/src/hotspot/share/classfile/verifier.hpp
    @@ -36,7 +36,6 @@
     class Verifier : AllStatic {
      public:
       enum {
    -    STRICTER_ACCESS_CTRL_CHECK_VERSION  = 49,
         STACKMAP_ATTRIBUTE_MAJOR_VERSION    = 50,
         INVOKEDYNAMIC_MAJOR_VERSION         = 51,
         NO_RELAX_ACCESS_CTRL_CHECK_VERSION  = 52,
    diff --git a/src/hotspot/share/classfile/vmSymbols.cpp b/src/hotspot/share/classfile/vmSymbols.cpp
    index f4538855b6a..1def05a9c4d 100644
    --- a/src/hotspot/share/classfile/vmSymbols.cpp
    +++ b/src/hotspot/share/classfile/vmSymbols.cpp
    @@ -473,15 +473,16 @@ bool vmIntrinsics::is_intrinsic_disabled(vmIntrinsics::ID id) {
       // Note, DirectiveSet may not be created at this point yet since this code
       // is called from initial stub geenration code.
       char* local_list = (char*)DirectiveSet::canonicalize_disableintrinsic(DisableIntrinsic);
    -
    +  char* save_ptr;
       bool found = false;
    -  char* token = strtok(local_list, ",");
    +
    +  char* token = strtok_r(local_list, ",", &save_ptr);
       while (token != NULL) {
         if (strcmp(token, vmIntrinsics::name_at(id)) == 0) {
           found = true;
           break;
         } else {
    -      token = strtok(NULL, ",");
    +      token = strtok_r(NULL, ",", &save_ptr);
         }
       }
     
    diff --git a/src/hotspot/share/code/codeBehaviours.cpp b/src/hotspot/share/code/codeBehaviours.cpp
    index 91ac83630c2..c0605c61bf7 100644
    --- a/src/hotspot/share/code/codeBehaviours.cpp
    +++ b/src/hotspot/share/code/codeBehaviours.cpp
    @@ -30,10 +30,10 @@
     CompiledICProtectionBehaviour* CompiledICProtectionBehaviour::_current = NULL;
     
     bool DefaultICProtectionBehaviour::lock(CompiledMethod* method) {
    -  if (CompiledIC_lock->owned_by_self()) {
    +  if (is_safe(method)) {
         return false;
       }
    -  CompiledIC_lock->lock();
    +  CompiledIC_lock->lock_without_safepoint_check();
       return true;
     }
     
    diff --git a/src/hotspot/share/code/codeCache.cpp b/src/hotspot/share/code/codeCache.cpp
    index 76794004310..09117a12f54 100644
    --- a/src/hotspot/share/code/codeCache.cpp
    +++ b/src/hotspot/share/code/codeCache.cpp
    @@ -289,7 +289,7 @@ void CodeCache::initialize_heaps() {
     
       // If large page support is enabled, align code heaps according to large
       // page size to make sure that code cache is covered by large pages.
    -  const size_t alignment = MAX2(page_size(false), (size_t) os::vm_allocation_granularity());
    +  const size_t alignment = MAX2(page_size(false, 8), (size_t) os::vm_allocation_granularity());
       non_nmethod_size = align_up(non_nmethod_size, alignment);
       profiled_size    = align_down(profiled_size, alignment);
     
    @@ -314,10 +314,14 @@ void CodeCache::initialize_heaps() {
       add_heap(non_profiled_space, "CodeHeap 'non-profiled nmethods'", CodeBlobType::MethodNonProfiled);
     }
     
    -size_t CodeCache::page_size(bool aligned) {
    +size_t CodeCache::page_size(bool aligned, size_t min_pages) {
       if (os::can_execute_large_page_memory()) {
    -    return aligned ? os::page_size_for_region_aligned(ReservedCodeCacheSize, 8) :
    -                     os::page_size_for_region_unaligned(ReservedCodeCacheSize, 8);
    +    if (InitialCodeCacheSize < ReservedCodeCacheSize) {
    +      // Make sure that the page size allows for an incremental commit of the reserved space
    +      min_pages = MAX2(min_pages, (size_t)8);
    +    }
    +    return aligned ? os::page_size_for_region_aligned(ReservedCodeCacheSize, min_pages) :
    +                     os::page_size_for_region_unaligned(ReservedCodeCacheSize, min_pages);
       } else {
         return os::vm_page_size();
       }
    @@ -1196,7 +1200,6 @@ bool CodeCache::is_far_target(address target) {
     #endif
     }
     
    -#ifdef HOTSWAP
     int CodeCache::mark_for_evol_deoptimization(InstanceKlass* dependee) {
       MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
       int number_of_marked_CodeBlobs = 0;
    @@ -1230,8 +1233,6 @@ int CodeCache::mark_for_evol_deoptimization(InstanceKlass* dependee) {
     
       return number_of_marked_CodeBlobs;
     }
    -#endif // HOTSWAP
    -
     
     // Deoptimize all methods
     void CodeCache::mark_all_nmethods_for_deoptimization() {
    @@ -1293,8 +1294,8 @@ void CodeCache::flush_dependents_on(InstanceKlass* dependee) {
       }
     }
     
    -#ifdef HOTSWAP
    -// Flushes compiled methods dependent on dependee in the evolutionary sense
    +// Flushes compiled methods dependent on dependee when the dependee is redefined
    +// via RedefineClasses
     void CodeCache::flush_evol_dependents_on(InstanceKlass* ev_k) {
       // --- Compile_lock is not held. However we are at a safepoint.
       assert_locked_or_safepoint(Compile_lock);
    @@ -1322,8 +1323,6 @@ void CodeCache::flush_evol_dependents_on(InstanceKlass* ev_k) {
         make_marked_nmethods_not_entrant();
       }
     }
    -#endif // HOTSWAP
    -
     
     // Flushes compiled methods dependent on dependee
     void CodeCache::flush_dependents_on_method(const methodHandle& m_h) {
    diff --git a/src/hotspot/share/code/codeCache.hpp b/src/hotspot/share/code/codeCache.hpp
    index 09ac3e4b68e..a58c0adbdda 100644
    --- a/src/hotspot/share/code/codeCache.hpp
    +++ b/src/hotspot/share/code/codeCache.hpp
    @@ -75,6 +75,7 @@
     class ExceptionCache;
     class KlassDepChange;
     class OopClosure;
    +class ShenandoahParallelCodeHeapIterator;
     
     class CodeCache : AllStatic {
       friend class VMStructs;
    @@ -82,6 +83,7 @@ class CodeCache : AllStatic {
       template  friend class CodeBlobIterator;
       friend class WhiteBox;
       friend class CodeCacheLoader;
    +  friend class ShenandoahParallelCodeHeapIterator;
      private:
       // CodeHeaps of the cache
       static GrowableArray* _heaps;
    @@ -111,7 +113,6 @@ class CodeCache : AllStatic {
       static CodeHeap* get_code_heap(int code_blob_type);         // Returns the CodeHeap for the given CodeBlobType
       // Returns the name of the VM option to set the size of the corresponding CodeHeap
       static const char* get_code_heap_flag_name(int code_blob_type);
    -  static size_t page_size(bool aligned = true);               // Returns the page size used by the CodeCache
       static ReservedCodeSpace reserve_heap_memory(size_t size);  // Reserves one continuous chunk of memory for the CodeHeaps
     
       // Iteration
    @@ -133,6 +134,7 @@ class CodeCache : AllStatic {
      public:
       // Initialization
       static void initialize();
    +  static size_t page_size(bool aligned = true, size_t min_pages = 1); // Returns the page size used by the CodeCache
     
       static int code_heap_compare(CodeHeap* const &lhs, CodeHeap* const &rhs);
     
    @@ -286,9 +288,7 @@ class CodeCache : AllStatic {
       // Deoptimization
      private:
       static int  mark_for_deoptimization(KlassDepChange& changes);
    -#ifdef HOTSWAP
       static int  mark_for_evol_deoptimization(InstanceKlass* dependee);
    -#endif // HOTSWAP
     
      public:
       static void mark_all_nmethods_for_deoptimization();
    @@ -297,10 +297,8 @@ class CodeCache : AllStatic {
     
       // Flushing and deoptimization
       static void flush_dependents_on(InstanceKlass* dependee);
    -#ifdef HOTSWAP
       // Flushing and deoptimization in case of evolution
       static void flush_evol_dependents_on(InstanceKlass* dependee);
    -#endif // HOTSWAP
       // Support for fullspeed debugging
       static void flush_dependents_on_method(const methodHandle& dependee);
     
    diff --git a/src/hotspot/share/code/compiledIC.cpp b/src/hotspot/share/code/compiledIC.cpp
    index c5f15b39b82..d1c31f69acc 100644
    --- a/src/hotspot/share/code/compiledIC.cpp
    +++ b/src/hotspot/share/code/compiledIC.cpp
    @@ -126,7 +126,6 @@ void CompiledIC::internal_set_ic_destination(address entry_point, bool is_icstub
     
       {
         CodeBlob* cb = CodeCache::find_blob_unsafe(_call->instruction_address());
    -    MutexLockerEx pl(CompiledICLocker::is_safe(cb->as_compiled_method()) ? NULL : Patching_lock, Mutex::_no_safepoint_check_flag);
         assert(cb != NULL && cb->is_compiled(), "must be compiled");
         _call->set_destination_mt_safe(entry_point);
       }
    @@ -237,7 +236,13 @@ CompiledIC::CompiledIC(RelocIterator* iter)
       initialize_from_iter(iter);
     }
     
    -bool CompiledIC::set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode, TRAPS) {
    +// This function may fail for two reasons: either due to running out of vtable
    +// stubs, or due to running out of IC stubs in an attempted transition to a
    +// transitional state. The needs_ic_stub_refill value will be set if the failure
    +// was due to running out of IC stubs, in which case the caller will refill IC
    +// stubs and retry.
    +bool CompiledIC::set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode,
    +                                    bool& needs_ic_stub_refill, TRAPS) {
       assert(CompiledICLocker::is_safe(_method), "mt unsafe call");
       assert(!is_optimized(), "cannot set an optimized virtual call to megamorphic");
       assert(is_call_to_compiled() || is_call_to_interpreted(), "going directly to megamorphic?");
    @@ -259,7 +264,11 @@ bool CompiledIC::set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecod
         CompiledICHolder* holder = new CompiledICHolder(call_info->resolved_method()->method_holder(),
                                                         call_info->resolved_klass(), false);
         holder->claim();
    -    InlineCacheBuffer::create_transition_stub(this, holder, entry);
    +    if (!InlineCacheBuffer::create_transition_stub(this, holder, entry)) {
    +      delete holder;
    +      needs_ic_stub_refill = true;
    +      return false;
    +    }
       } else {
         assert(call_info->call_kind() == CallInfo::vtable_call, "either itable or vtable");
         // Can be different than selected_method->vtable_index(), due to package-private etc.
    @@ -269,7 +278,10 @@ bool CompiledIC::set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecod
         if (entry == NULL) {
           return false;
         }
    -    InlineCacheBuffer::create_transition_stub(this, NULL, entry);
    +    if (!InlineCacheBuffer::create_transition_stub(this, NULL, entry)) {
    +      needs_ic_stub_refill = true;
    +      return false;
    +    }
       }
     
       if (TraceICs) {
    @@ -350,7 +362,7 @@ bool CompiledIC::is_call_to_interpreted() const {
       return is_call_to_interpreted;
     }
     
    -void CompiledIC::set_to_clean(bool in_use) {
    +bool CompiledIC::set_to_clean(bool in_use) {
       assert(CompiledICLocker::is_safe(_method), "mt unsafe call");
       if (TraceInlineCacheClearing || TraceICs) {
         tty->print_cr("IC@" INTPTR_FORMAT ": set to clean", p2i(instruction_address()));
    @@ -361,7 +373,7 @@ void CompiledIC::set_to_clean(bool in_use) {
     
       // A zombie transition will always be safe, since the metadata has already been set to NULL, so
       // we only need to patch the destination
    -  bool safe_transition = _call->is_safe_for_patching() || !in_use || is_optimized() || CompiledICLocker::is_safe(_method);
    +  bool safe_transition = _call->is_safe_for_patching() || !in_use || is_optimized() || SafepointSynchronize::is_at_safepoint();
     
       if (safe_transition) {
         // Kill any leftover stub we might have too
    @@ -373,7 +385,9 @@ void CompiledIC::set_to_clean(bool in_use) {
         }
       } else {
         // Unsafe transition - create stub.
    -    InlineCacheBuffer::create_transition_stub(this, NULL, entry);
    +    if (!InlineCacheBuffer::create_transition_stub(this, NULL, entry)) {
    +      return false;
    +    }
       }
       // We can't check this anymore. With lazy deopt we could have already
       // cleaned this IC entry before we even return. This is possible if
    @@ -382,6 +396,7 @@ void CompiledIC::set_to_clean(bool in_use) {
       // race because the IC entry was complete when we safepointed so
       // cleaning it immediately is harmless.
       // assert(is_clean(), "sanity check");
    +  return true;
     }
     
     bool CompiledIC::is_clean() const {
    @@ -393,7 +408,7 @@ bool CompiledIC::is_clean() const {
       return is_clean;
     }
     
    -void CompiledIC::set_to_monomorphic(CompiledICInfo& info) {
    +bool CompiledIC::set_to_monomorphic(CompiledICInfo& info) {
       assert(CompiledICLocker::is_safe(_method), "mt unsafe call");
       // Updating a cache to the wrong entry can cause bugs that are very hard
       // to track down - if cache entry gets invalid - we just clean it. In
    @@ -411,8 +426,7 @@ void CompiledIC::set_to_monomorphic(CompiledICInfo& info) {
       if (info.to_interpreter() || info.to_aot()) {
         // Call to interpreter
         if (info.is_optimized() && is_optimized()) {
    -       assert(is_clean(), "unsafe IC path");
    -       MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag);
    +      assert(is_clean(), "unsafe IC path");
           // the call analysis (callee structure) specifies that the call is optimized
           // (either because of CHA or the static target is final)
           // At code generation time, this call has been emitted as static call
    @@ -430,7 +444,11 @@ void CompiledIC::set_to_monomorphic(CompiledICInfo& info) {
           }
         } else {
           // Call via method-klass-holder
    -      InlineCacheBuffer::create_transition_stub(this, info.claim_cached_icholder(), info.entry());
    +      CompiledICHolder* holder = info.claim_cached_icholder();
    +      if (!InlineCacheBuffer::create_transition_stub(this, holder, info.entry())) {
    +        delete holder;
    +        return false;
    +      }
           if (TraceICs) {
              ResourceMark rm(thread);
              tty->print_cr ("IC@" INTPTR_FORMAT ": monomorphic to interpreter via icholder ", p2i(instruction_address()));
    @@ -450,7 +468,9 @@ void CompiledIC::set_to_monomorphic(CompiledICInfo& info) {
                     (!is_in_transition_state() && (info.is_optimized() || static_bound || is_clean()));
     
         if (!safe) {
    -      InlineCacheBuffer::create_transition_stub(this, info.cached_metadata(), info.entry());
    +      if (!InlineCacheBuffer::create_transition_stub(this, info.cached_metadata(), info.entry())) {
    +        return false;
    +      }
         } else {
           if (is_optimized()) {
             set_ic_destination(info.entry());
    @@ -475,6 +495,7 @@ void CompiledIC::set_to_monomorphic(CompiledICInfo& info) {
       // race because the IC entry was complete when we safepointed so
       // cleaning it immediately is harmless.
       // assert(is_call_to_compiled() || is_call_to_interpreted(), "sanity check");
    +  return true;
     }
     
     
    @@ -575,16 +596,16 @@ void CompiledIC::cleanup_call_site(virtual_call_Relocation* call_site, const Com
     
     // ----------------------------------------------------------------------------
     
    -void CompiledStaticCall::set_to_clean(bool in_use) {
    +bool CompiledStaticCall::set_to_clean(bool in_use) {
       // in_use is unused but needed to match template function in CompiledMethod
       assert(CompiledICLocker::is_safe(instruction_address()), "mt unsafe call");
       // Reset call site
    -  MutexLockerEx pl(SafepointSynchronize::is_at_safepoint() ? NULL : Patching_lock, Mutex::_no_safepoint_check_flag);
       set_destination_mt_safe(resolve_call_stub());
     
       // Do not reset stub here:  It is too expensive to call find_stub.
       // Instead, rely on caller (nmethod::clear_inline_caches) to clear
       // both the call and its stub.
    +  return true;
     }
     
     bool CompiledStaticCall::is_clean() const {
    @@ -624,7 +645,6 @@ void CompiledStaticCall::set_to_compiled(address entry) {
     
     void CompiledStaticCall::set(const StaticCallInfo& info) {
       assert(CompiledICLocker::is_safe(instruction_address()), "mt unsafe call");
    -  MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag);
       // Updating a cache to the wrong entry can cause bugs that are very hard
       // to track down - if cache entry gets invalid - we just clean it. In
       // this way it is always the same code path that is responsible for
    diff --git a/src/hotspot/share/code/compiledIC.hpp b/src/hotspot/share/code/compiledIC.hpp
    index 3d5da1de751..803b6b12c10 100644
    --- a/src/hotspot/share/code/compiledIC.hpp
    +++ b/src/hotspot/share/code/compiledIC.hpp
    @@ -28,6 +28,7 @@
     #include "code/nativeInst.hpp"
     #include "interpreter/linkResolver.hpp"
     #include "oops/compiledICHolder.hpp"
    +#include "runtime/safepointVerifiers.hpp"
     
     //-----------------------------------------------------------------------------
     // The CompiledIC represents a compiled inline cache.
    @@ -67,6 +68,7 @@ class CompiledICLocker: public StackObj {
       CompiledMethod* _method;
       CompiledICProtectionBehaviour* _behaviour;
       bool _locked;
    +  NoSafepointVerifier _nsv;
     
     public:
       CompiledICLocker(CompiledMethod* method);
    @@ -272,13 +274,13 @@ class CompiledIC: public ResourceObj {
       //
       // They all takes a TRAP argument, since they can cause a GC if the inline-cache buffer is full.
       //
    -  void set_to_clean(bool in_use = true);
    -  void set_to_monomorphic(CompiledICInfo& info);
    +  bool set_to_clean(bool in_use = true);
    +  bool set_to_monomorphic(CompiledICInfo& info);
       void clear_ic_stub();
     
       // Returns true if successful and false otherwise. The call can fail if memory
    -  // allocation in the code cache fails.
    -  bool set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode, TRAPS);
    +  // allocation in the code cache fails, or ic stub refill is required.
    +  bool set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode, bool& needs_ic_stub_refill, TRAPS);
     
       static void compute_monomorphic_entry(const methodHandle& method, Klass* receiver_klass,
                                             bool is_optimized, bool static_bound, bool caller_is_nmethod,
    @@ -372,7 +374,7 @@ public:
       virtual address destination() const = 0;
     
       // Clean static call (will force resolving on next use)
    -  void set_to_clean(bool in_use = true);
    +  bool set_to_clean(bool in_use = true);
     
       // Set state. The entry must be the same, as computed by compute_entry.
       // Computation and setting is split up, since the actions are separate during
    diff --git a/src/hotspot/share/code/compiledMethod.cpp b/src/hotspot/share/code/compiledMethod.cpp
    index ff22aecbd33..dbcd7b8604f 100644
    --- a/src/hotspot/share/code/compiledMethod.cpp
    +++ b/src/hotspot/share/code/compiledMethod.cpp
    @@ -27,6 +27,7 @@
     #include "code/compiledMethod.inline.hpp"
     #include "code/scopeDesc.hpp"
     #include "code/codeCache.hpp"
    +#include "code/icBuffer.hpp"
     #include "gc/shared/barrierSet.hpp"
     #include "gc/shared/gcBehaviours.hpp"
     #include "interpreter/bytecode.inline.hpp"
    @@ -430,27 +431,30 @@ static void check_class(Metadata* md) {
     #endif // ASSERT
     
     
    -void CompiledMethod::clean_ic_if_metadata_is_dead(CompiledIC *ic) {
    +bool CompiledMethod::clean_ic_if_metadata_is_dead(CompiledIC *ic) {
    +  if (ic->is_clean()) {
    +    return true;
    +  }
       if (ic->is_icholder_call()) {
         // The only exception is compiledICHolder metdata which may
         // yet be marked below. (We check this further below).
         CompiledICHolder* cichk_metdata = ic->cached_icholder();
     
         if (cichk_metdata->is_loader_alive()) {
    -      return;
    +      return true;
         }
       } else {
         Metadata* ic_metdata = ic->cached_metadata();
         if (ic_metdata != NULL) {
           if (ic_metdata->is_klass()) {
             if (((Klass*)ic_metdata)->is_loader_alive()) {
    -          return;
    +          return true;
             }
           } else if (ic_metdata->is_method()) {
             Method* method = (Method*)ic_metdata;
             assert(!method->is_old(), "old method should have been cleaned");
             if (method->method_holder()->is_loader_alive()) {
    -          return;
    +          return true;
             }
           } else {
             ShouldNotReachHere();
    @@ -458,7 +462,7 @@ void CompiledMethod::clean_ic_if_metadata_is_dead(CompiledIC *ic) {
         }
       }
     
    -  ic->set_to_clean();
    +  return ic->set_to_clean();
     }
     
     // static_stub_Relocations may have dangling references to
    @@ -496,7 +500,7 @@ void CompiledMethod::clean_ic_stubs() {
     
     // Clean references to unloaded nmethods at addr from this one, which is not unloaded.
     template 
    -static void clean_if_nmethod_is_unloaded(CompiledICorStaticCall *ic, address addr, CompiledMethod* from,
    +static bool clean_if_nmethod_is_unloaded(CompiledICorStaticCall *ic, address addr, CompiledMethod* from,
                                              bool clean_all) {
       // Ok, to lookup references to zombies here
       CodeBlob *cb = CodeCache::find_blob_unsafe(addr);
    @@ -504,20 +508,23 @@ static void clean_if_nmethod_is_unloaded(CompiledICorStaticCall *ic, address add
       if (nm != NULL) {
         // Clean inline caches pointing to both zombie and not_entrant methods
         if (clean_all || !nm->is_in_use() || nm->is_unloading() || (nm->method()->code() != nm)) {
    -      ic->set_to_clean(from->is_alive());
    +      if (!ic->set_to_clean(from->is_alive())) {
    +        return false;
    +      }
           assert(ic->is_clean(), "nmethod " PTR_FORMAT "not clean %s", p2i(from), from->method()->name_and_sig_as_C_string());
         }
       }
    +  return true;
     }
     
    -static void clean_if_nmethod_is_unloaded(CompiledIC *ic, CompiledMethod* from,
    +static bool clean_if_nmethod_is_unloaded(CompiledIC *ic, CompiledMethod* from,
                                              bool clean_all) {
    -  clean_if_nmethod_is_unloaded(ic, ic->ic_destination(), from, clean_all);
    +  return clean_if_nmethod_is_unloaded(ic, ic->ic_destination(), from, clean_all);
     }
     
    -static void clean_if_nmethod_is_unloaded(CompiledStaticCall *csc, CompiledMethod* from,
    +static bool clean_if_nmethod_is_unloaded(CompiledStaticCall *csc, CompiledMethod* from,
                                              bool clean_all) {
    -  clean_if_nmethod_is_unloaded(csc, csc->destination(), from, clean_all);
    +  return clean_if_nmethod_is_unloaded(csc, csc->destination(), from, clean_all);
     }
     
     // Cleans caches in nmethods that point to either classes that are unloaded
    @@ -527,7 +534,7 @@ static void clean_if_nmethod_is_unloaded(CompiledStaticCall *csc, CompiledMethod
     // nmethods are unloaded.  Return postponed=true in the parallel case for
     // inline caches found that point to nmethods that are not yet visited during
     // the do_unloading walk.
    -void CompiledMethod::unload_nmethod_caches(bool unloading_occurred) {
    +bool CompiledMethod::unload_nmethod_caches(bool unloading_occurred) {
       ResourceMark rm;
     
       // Exception cache only needs to be called if unloading occurred
    @@ -535,18 +542,33 @@ void CompiledMethod::unload_nmethod_caches(bool unloading_occurred) {
         clean_exception_cache();
       }
     
    -  cleanup_inline_caches_impl(unloading_occurred, false);
    +  if (!cleanup_inline_caches_impl(unloading_occurred, false)) {
    +    return false;
    +  }
     
       // All static stubs need to be cleaned.
       clean_ic_stubs();
     
       // Check that the metadata embedded in the nmethod is alive
       DEBUG_ONLY(metadata_do(check_class));
    +  return true;
    +}
    +
    +void CompiledMethod::cleanup_inline_caches(bool clean_all) {
    +  for (;;) {
    +    ICRefillVerifier ic_refill_verifier;
    +    { CompiledICLocker ic_locker(this);
    +      if (cleanup_inline_caches_impl(false, clean_all)) {
    +        return;
    +      }
    +    }
    +    InlineCacheBuffer::refill_ic_stubs();
    +  }
     }
     
     // Called to clean up after class unloading for live nmethods and from the sweeper
     // for all methods.
    -void CompiledMethod::cleanup_inline_caches_impl(bool unloading_occurred, bool clean_all) {
    +bool CompiledMethod::cleanup_inline_caches_impl(bool unloading_occurred, bool clean_all) {
       assert(CompiledICLocker::is_safe(this), "mt unsafe call");
       ResourceMark rm;
     
    @@ -561,30 +583,34 @@ void CompiledMethod::cleanup_inline_caches_impl(bool unloading_occurred, bool cl
           if (unloading_occurred) {
             // If class unloading occurred we first clear ICs where the cached metadata
             // is referring to an unloaded klass or method.
    -        clean_ic_if_metadata_is_dead(CompiledIC_at(&iter));
    +        if (!clean_ic_if_metadata_is_dead(CompiledIC_at(&iter))) {
    +          return false;
    +        }
           }
     
    -      clean_if_nmethod_is_unloaded(CompiledIC_at(&iter), this, clean_all);
    +      if (!clean_if_nmethod_is_unloaded(CompiledIC_at(&iter), this, clean_all)) {
    +        return false;
    +      }
           break;
     
         case relocInfo::opt_virtual_call_type:
    -      clean_if_nmethod_is_unloaded(CompiledIC_at(&iter), this, clean_all);
    +      if (!clean_if_nmethod_is_unloaded(CompiledIC_at(&iter), this, clean_all)) {
    +        return false;
    +      }
           break;
     
         case relocInfo::static_call_type:
    -      clean_if_nmethod_is_unloaded(compiledStaticCall_at(iter.reloc()), this, clean_all);
    +      if (!clean_if_nmethod_is_unloaded(compiledStaticCall_at(iter.reloc()), this, clean_all)) {
    +        return false;
    +      }
           break;
     
    -    case relocInfo::oop_type:
    -      break;
    -
    -    case relocInfo::metadata_type:
    -      break; // nothing to do.
    -
         default:
           break;
         }
       }
    +
    +  return true;
     }
     
     // Iterating over all nmethods, e.g. with the help of CodeCache::nmethods_do(fun) was found
    diff --git a/src/hotspot/share/code/compiledMethod.hpp b/src/hotspot/share/code/compiledMethod.hpp
    index 4a8cfa5fb2c..2d0c0864899 100644
    --- a/src/hotspot/share/code/compiledMethod.hpp
    +++ b/src/hotspot/share/code/compiledMethod.hpp
    @@ -352,12 +352,11 @@ public:
     
       // Inline cache support for class unloading and nmethod unloading
      private:
    -  void cleanup_inline_caches_impl(bool unloading_occurred, bool clean_all);
    +  bool cleanup_inline_caches_impl(bool unloading_occurred, bool clean_all);
    +
      public:
    -  void cleanup_inline_caches(bool clean_all) {
    -    // Serial version used by sweeper and whitebox test
    -    cleanup_inline_caches_impl(false, clean_all);
    -  }
    +  // Serial version used by sweeper and whitebox test
    +  void cleanup_inline_caches(bool clean_all);
     
       virtual void clear_inline_caches();
       void clear_ic_stubs();
    @@ -390,7 +389,7 @@ public:
       address oops_reloc_begin() const;
     
      private:
    -  void static clean_ic_if_metadata_is_dead(CompiledIC *ic);
    +  bool static clean_ic_if_metadata_is_dead(CompiledIC *ic);
     
       void clean_ic_stubs();
     
    @@ -400,8 +399,8 @@ public:
     
       virtual bool is_unloading() = 0;
     
    -  void unload_nmethod_caches(bool class_unloading_occurred);
    -  virtual void do_unloading(bool unloading_occurred) { }
    +  bool unload_nmethod_caches(bool class_unloading_occurred);
    +  virtual void do_unloading(bool unloading_occurred) = 0;
     
     private:
       PcDesc* find_pc_desc(address pc, bool approximate) {
    diff --git a/src/hotspot/share/code/icBuffer.cpp b/src/hotspot/share/code/icBuffer.cpp
    index a26ec161017..b03554c2bac 100644
    --- a/src/hotspot/share/code/icBuffer.cpp
    +++ b/src/hotspot/share/code/icBuffer.cpp
    @@ -38,15 +38,49 @@
     #include "runtime/handles.inline.hpp"
     #include "runtime/mutexLocker.hpp"
     #include "runtime/stubRoutines.hpp"
    +#include "runtime/thread.hpp"
     
     DEF_STUB_INTERFACE(ICStub);
     
     StubQueue* InlineCacheBuffer::_buffer    = NULL;
    -ICStub*    InlineCacheBuffer::_next_stub = NULL;
     
     CompiledICHolder* InlineCacheBuffer::_pending_released = NULL;
     int InlineCacheBuffer::_pending_count = 0;
     
    +#ifdef ASSERT
    +ICRefillVerifier::ICRefillVerifier()
    +  : _refill_requested(false),
    +    _refill_remembered(false)
    +{
    +  Thread* thread = Thread::current();
    +  assert(thread->missed_ic_stub_refill_mark() == NULL, "nesting not supported");
    +  thread->set_missed_ic_stub_refill_mark(this);
    +}
    +
    +ICRefillVerifier::~ICRefillVerifier() {
    +  assert(!_refill_requested || _refill_remembered,
    +         "Forgot to refill IC stubs after failed IC transition");
    +  Thread::current()->set_missed_ic_stub_refill_mark(NULL);
    +}
    +
    +ICRefillVerifierMark::ICRefillVerifierMark(ICRefillVerifier* verifier) {
    +  Thread* thread = Thread::current();
    +  assert(thread->missed_ic_stub_refill_mark() == NULL, "nesting not supported");
    +  thread->set_missed_ic_stub_refill_mark(this);
    +}
    +
    +ICRefillVerifierMark::~ICRefillVerifierMark() {
    +  Thread::current()->set_missed_ic_stub_refill_mark(NULL);
    +}
    +
    +static ICRefillVerifier* current_ic_refill_verifier() {
    +  Thread* current = Thread::current();
    +  ICRefillVerifier* verifier = reinterpret_cast(current->missed_ic_stub_refill_mark());
    +  assert(verifier != NULL, "need a verifier for safety");
    +  return verifier;
    +}
    +#endif
    +
     void ICStub::finalize() {
       if (!is_empty()) {
         ResourceMark rm;
    @@ -103,52 +137,46 @@ void ICStub::print() {
     //-----------------------------------------------------------------------------------------------
     // Implementation of InlineCacheBuffer
     
    -void InlineCacheBuffer::init_next_stub() {
    -  ICStub* ic_stub = (ICStub*)buffer()->request_committed (ic_stub_code_size());
    -  assert (ic_stub != NULL, "no room for a single stub");
    -  set_next_stub(ic_stub);
    -}
     
     void InlineCacheBuffer::initialize() {
       if (_buffer != NULL) return; // already initialized
       _buffer = new StubQueue(new ICStubInterface, 10*K, InlineCacheBuffer_lock, "InlineCacheBuffer");
       assert (_buffer != NULL, "cannot allocate InlineCacheBuffer");
    -  init_next_stub();
     }
     
     
     ICStub* InlineCacheBuffer::new_ic_stub() {
    -  while (true) {
    -    ICStub* ic_stub = (ICStub*)buffer()->request_committed(ic_stub_code_size());
    -    if (ic_stub != NULL) {
    -      return ic_stub;
    -    }
    -    // we ran out of inline cache buffer space; must enter safepoint.
    -    // We do this by forcing a safepoint
    -    EXCEPTION_MARK;
    +  return (ICStub*)buffer()->request_committed(ic_stub_code_size());
    +}
     
    -    VM_ICBufferFull ibf;
    -    VMThread::execute(&ibf);
    -    // We could potential get an async. exception at this point.
    -    // In that case we will rethrow it to ourselvs.
    -    if (HAS_PENDING_EXCEPTION) {
    -      oop exception = PENDING_EXCEPTION;
    -      CLEAR_PENDING_EXCEPTION;
    -      Thread::send_async_exception(JavaThread::current()->threadObj(), exception);
    -    }
    +
    +void InlineCacheBuffer::refill_ic_stubs() {
    +#ifdef ASSERT
    +  ICRefillVerifier* verifier = current_ic_refill_verifier();
    +  verifier->request_remembered();
    +#endif
    +  // we ran out of inline cache buffer space; must enter safepoint.
    +  // We do this by forcing a safepoint
    +  EXCEPTION_MARK;
    +
    +  VM_ICBufferFull ibf;
    +  VMThread::execute(&ibf);
    +  // We could potential get an async. exception at this point.
    +  // In that case we will rethrow it to ourselvs.
    +  if (HAS_PENDING_EXCEPTION) {
    +    oop exception = PENDING_EXCEPTION;
    +    CLEAR_PENDING_EXCEPTION;
    +    Thread::send_async_exception(JavaThread::current()->threadObj(), exception);
       }
    -  ShouldNotReachHere();
    -  return NULL;
     }
     
     
     void InlineCacheBuffer::update_inline_caches() {
    -  if (buffer()->number_of_stubs() > 1) {
    +  if (buffer()->number_of_stubs() > 0) {
         if (TraceICBuffer) {
           tty->print_cr("[updating inline caches with %d stubs]", buffer()->number_of_stubs());
         }
         buffer()->remove_all();
    -    init_next_stub();
       }
       release_pending_icholders();
     }
    @@ -160,7 +188,7 @@ bool InlineCacheBuffer::contains(address instruction_address) {
     
     
     bool InlineCacheBuffer::is_empty() {
    -  return buffer()->number_of_stubs() == 1;    // always has sentinel
    +  return buffer()->number_of_stubs() == 0;
     }
     
     
    @@ -168,9 +196,7 @@ void InlineCacheBuffer_init() {
       InlineCacheBuffer::initialize();
     }
     
    -
    -void InlineCacheBuffer::create_transition_stub(CompiledIC *ic, void* cached_value, address entry) {
    -  MutexLockerEx ml(CompiledIC_lock->owned_by_self() ? NULL : CompiledIC_lock);
    +bool InlineCacheBuffer::create_transition_stub(CompiledIC *ic, void* cached_value, address entry) {
       assert(!SafepointSynchronize::is_at_safepoint(), "should not be called during a safepoint");
       assert(CompiledICLocker::is_safe(ic->instruction_address()), "mt unsafe call");
       if (TraceICBuffer) {
    @@ -178,20 +204,27 @@ void InlineCacheBuffer::create_transition_stub(CompiledIC *ic, void* cached_valu
                       p2i(ic->instruction_address()), p2i(entry), p2i(cached_value));
       }
     
    +  // allocate and initialize new "out-of-line" inline-cache
    +  ICStub* ic_stub = new_ic_stub();
    +  if (ic_stub == NULL) {
    +#ifdef ASSERT
    +    ICRefillVerifier* verifier = current_ic_refill_verifier();
    +    verifier->request_refill();
    +#endif
    +    return false;
    +  }
    +
       // If an transition stub is already associate with the inline cache, then we remove the association.
       if (ic->is_in_transition_state()) {
         ICStub* old_stub = ICStub_from_destination_address(ic->stub_address());
         old_stub->clear();
       }
     
    -  // allocate and initialize new "out-of-line" inline-cache
    -  ICStub* ic_stub = get_next_stub();
       ic_stub->set_stub(ic, cached_value, entry);
     
       // Update inline cache in nmethod to point to new "out-of-line" allocated inline cache
       ic->set_ic_destination(ic_stub);
    -
    -  set_next_stub(new_ic_stub()); // can cause safepoint synchronization
    +  return true;
     }
     
     
    @@ -225,9 +258,7 @@ void InlineCacheBuffer::release_pending_icholders() {
     // not safe to free them until them since they might be visible to
     // another thread.
     void InlineCacheBuffer::queue_for_release(CompiledICHolder* icholder) {
    -  MutexLockerEx mex1((CompiledIC_lock->owned_by_self() ||
    -                      SafepointSynchronize::is_at_safepoint()) ? NULL : CompiledIC_lock);
    -  MutexLockerEx mex2(InlineCacheBuffer_lock);
    +  MutexLockerEx mex(InlineCacheBuffer_lock, Mutex::_no_safepoint_check_flag);
       icholder->set_next(_pending_released);
       _pending_released = icholder;
       _pending_count++;
    diff --git a/src/hotspot/share/code/icBuffer.hpp b/src/hotspot/share/code/icBuffer.hpp
    index b60b6200478..24621cac6b4 100644
    --- a/src/hotspot/share/code/icBuffer.hpp
    +++ b/src/hotspot/share/code/icBuffer.hpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -29,7 +29,10 @@
     #include "code/stubs.hpp"
     #include "interpreter/bytecodes.hpp"
     #include "memory/allocation.hpp"
    +#include "runtime/safepointVerifiers.hpp"
     #include "utilities/align.hpp"
    +#include "utilities/debug.hpp"
    +#include "utilities/macros.hpp"
     
     //
     // For CompiledIC's:
    @@ -92,6 +95,43 @@ inline ICStub* ICStub_from_destination_address(address destination_address) {
       return stub;
     }
     
    +#ifdef ASSERT
    +// The ICRefillVerifier class is a stack allocated RAII object used to
    +// detect if a failed IC transition that required IC stub refilling has
    +// been accidentally missed. It is up to the caller to in that case
    +// refill IC stubs.
    +class ICRefillVerifier: StackObj {
    +  bool _refill_requested;
    +  bool _refill_remembered;
    +
    + public:
    +  ICRefillVerifier();
    +  ~ICRefillVerifier();
    +
    +  void request_refill() { _refill_requested = true; }
    +  void request_remembered() { _refill_remembered = true; }
    +};
    +
    +// The ICRefillVerifierMark is used to set the thread's current
    +// ICRefillVerifier to a provided one. This is useful in particular
    +// when transitioning IC stubs in parallel and refilling from the
    +// master thread invoking the IC stub transitioning code.
    +class ICRefillVerifierMark: StackObj {
    + public:
    +  ICRefillVerifierMark(ICRefillVerifier* verifier);
    +  ~ICRefillVerifierMark();
    +};
    +#else
    +class ICRefillVerifier: StackObj {
    + public:
    +  ICRefillVerifier() {}
    +};
    +class ICRefillVerifierMark: StackObj {
    + public:
    +  ICRefillVerifierMark(ICRefillVerifier* verifier) {}
    +};
    +#endif
    +
     class InlineCacheBuffer: public AllStatic {
      private:
       // friends
    @@ -100,20 +140,14 @@ class InlineCacheBuffer: public AllStatic {
       static int ic_stub_code_size();
     
       static StubQueue* _buffer;
    -  static ICStub*    _next_stub;
     
       static CompiledICHolder* _pending_released;
       static int _pending_count;
     
       static StubQueue* buffer()                         { return _buffer;         }
    -  static void       set_next_stub(ICStub* next_stub) { _next_stub = next_stub; }
    -  static ICStub*    get_next_stub()                  { return _next_stub;      }
    -
    -  static void       init_next_stub();
     
       static ICStub* new_ic_stub();
     
    -
       // Machine-dependent implementation of ICBuffer
       static void    assemble_ic_buffer_code(address code_begin, void* cached_value, address entry_point);
       static address ic_buffer_entry_point  (address code_begin);
    @@ -129,6 +163,7 @@ class InlineCacheBuffer: public AllStatic {
     
         // removes the ICStubs after backpatching
       static void update_inline_caches();
    +  static void refill_ic_stubs();
     
       // for debugging
       static bool is_empty();
    @@ -138,7 +173,7 @@ class InlineCacheBuffer: public AllStatic {
       static int pending_icholder_count() { return _pending_count; }
     
       // New interface
    -  static void    create_transition_stub(CompiledIC *ic, void* cached_value, address entry);
    +  static bool    create_transition_stub(CompiledIC *ic, void* cached_value, address entry);
       static address ic_destination_for(CompiledIC *ic);
       static void*   cached_value_for(CompiledIC *ic);
     };
    diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp
    index 2c49d4a33ec..bbd416bf828 100644
    --- a/src/hotspot/share/code/nmethod.cpp
    +++ b/src/hotspot/share/code/nmethod.cpp
    @@ -1575,14 +1575,44 @@ bool nmethod::is_unloading() {
       if (state_is_unloading) {
         return true;
       }
    -  if (state_unloading_cycle == CodeCache::unloading_cycle()) {
    +  uint8_t current_cycle = CodeCache::unloading_cycle();
    +  if (state_unloading_cycle == current_cycle) {
         return false;
       }
     
       // The IsUnloadingBehaviour is responsible for checking if there are any dead
       // oops in the CompiledMethod, by calling oops_do on it.
    -  state_unloading_cycle = CodeCache::unloading_cycle();
    -  state_is_unloading = IsUnloadingBehaviour::current()->is_unloading(this);
    +  state_unloading_cycle = current_cycle;
    +
    +  if (is_zombie()) {
    +    // Zombies without calculated unloading epoch are never unloading due to GC.
    +
    +    // There are no races where a previously observed is_unloading() nmethod
    +    // suddenly becomes not is_unloading() due to here being observed as zombie.
    +
    +    // With STW unloading, all is_alive() && is_unloading() nmethods are unlinked
    +    // and unloaded in the safepoint. That makes races where an nmethod is first
    +    // observed as is_alive() && is_unloading() and subsequently observed as
    +    // is_zombie() impossible.
    +
    +    // With concurrent unloading, all references to is_unloading() nmethods are
    +    // first unlinked (e.g. IC caches and dependency contexts). Then a global
    +    // handshake operation is performed with all JavaThreads before finally
    +    // unloading the nmethods. The sweeper never converts is_alive() && is_unloading()
    +    // nmethods to zombies; it waits for them to become is_unloaded(). So before
    +    // the global handshake, it is impossible for is_unloading() nmethods to
    +    // racingly become is_zombie(). And is_unloading() is calculated for all is_alive()
    +    // nmethods before taking that global handshake, meaning that it will never
    +    // be recalculated after the handshake.
    +
    +    // After that global handshake, is_unloading() nmethods are only observable
    +    // to the iterators, and they will never trigger recomputation of the cached
    +    // is_unloading_state, and hence may not suffer from such races.
    +
    +    state_is_unloading = false;
    +  } else {
    +    state_is_unloading = IsUnloadingBehaviour::current()->is_unloading(this);
    +  }
     
       state = IsUnloadingState::create(state_is_unloading, state_unloading_cycle);
     
    @@ -1620,7 +1650,8 @@ void nmethod::do_unloading(bool unloading_occurred) {
         }
     #endif
     
    -    unload_nmethod_caches(unloading_occurred);
    +    guarantee(unload_nmethod_caches(unloading_occurred),
    +              "Should not need transition stubs");
       }
     }
     
    diff --git a/src/hotspot/share/code/relocInfo.cpp b/src/hotspot/share/code/relocInfo.cpp
    index 0654df90b2f..875ef907185 100644
    --- a/src/hotspot/share/code/relocInfo.cpp
    +++ b/src/hotspot/share/code/relocInfo.cpp
    @@ -644,12 +644,12 @@ Method* virtual_call_Relocation::method_value() {
       return (Method*)m;
     }
     
    -void virtual_call_Relocation::clear_inline_cache() {
    +bool virtual_call_Relocation::clear_inline_cache() {
       // No stubs for ICs
       // Clean IC
       ResourceMark rm;
       CompiledIC* icache = CompiledIC_at(this);
    -  icache->set_to_clean();
    +  return icache->set_to_clean();
     }
     
     
    @@ -672,15 +672,20 @@ Method* opt_virtual_call_Relocation::method_value() {
       return (Method*)m;
     }
     
    -void opt_virtual_call_Relocation::clear_inline_cache() {
    +template
    +static bool set_to_clean_no_ic_refill(CompiledICorStaticCall* ic) {
    +  guarantee(ic->set_to_clean(), "Should not need transition stubs");
    +  return true;
    +}
    +
    +bool opt_virtual_call_Relocation::clear_inline_cache() {
       // No stubs for ICs
       // Clean IC
       ResourceMark rm;
       CompiledIC* icache = CompiledIC_at(this);
    -  icache->set_to_clean();
    +  return set_to_clean_no_ic_refill(icache);
     }
     
    -
     address opt_virtual_call_Relocation::static_stub(bool is_aot) {
       // search for the static stub who points back to this static call
       address static_call_addr = addr();
    @@ -715,10 +720,10 @@ void static_call_Relocation::unpack_data() {
       _method_index = unpack_1_int();
     }
     
    -void static_call_Relocation::clear_inline_cache() {
    +bool static_call_Relocation::clear_inline_cache() {
       // Safe call site info
       CompiledStaticCall* handler = this->code()->compiledStaticCall_at(this);
    -  handler->set_to_clean();
    +  return set_to_clean_no_ic_refill(handler);
     }
     
     
    @@ -757,10 +762,11 @@ address trampoline_stub_Relocation::get_trampoline_for(address call, nmethod* co
       return NULL;
     }
     
    -void static_stub_Relocation::clear_inline_cache() {
    +bool static_stub_Relocation::clear_inline_cache() {
       // Call stub is only used when calling the interpreted code.
       // It does not really need to be cleared, except that we want to clean out the methodoop.
       CompiledDirectStaticCall::set_stub_to_clean(this);
    +  return true;
     }
     
     
    diff --git a/src/hotspot/share/code/relocInfo.hpp b/src/hotspot/share/code/relocInfo.hpp
    index 57931a1a6a7..69afef49499 100644
    --- a/src/hotspot/share/code/relocInfo.hpp
    +++ b/src/hotspot/share/code/relocInfo.hpp
    @@ -814,7 +814,7 @@ class Relocation {
       // all relocations are able to reassert their values
       virtual void set_value(address x);
     
    -  virtual void clear_inline_cache()              { }
    +  virtual bool clear_inline_cache()              { return true; }
     
       // This method assumes that all virtual/static (inline) caches are cleared (since for static_call_type and
       // ic_call_type is not always posisition dependent (depending on the state of the cache)). However, this is
    @@ -1052,7 +1052,7 @@ class virtual_call_Relocation : public CallRelocation {
       void pack_data_to(CodeSection* dest);
       void unpack_data();
     
    -  void clear_inline_cache();
    +  bool clear_inline_cache();
     };
     
     
    @@ -1083,7 +1083,7 @@ class opt_virtual_call_Relocation : public CallRelocation {
       void pack_data_to(CodeSection* dest);
       void unpack_data();
     
    -  void clear_inline_cache();
    +  bool clear_inline_cache();
     
       // find the matching static_stub
       address static_stub(bool is_aot);
    @@ -1117,7 +1117,7 @@ class static_call_Relocation : public CallRelocation {
       void pack_data_to(CodeSection* dest);
       void unpack_data();
     
    -  void clear_inline_cache();
    +  bool clear_inline_cache();
     
       // find the matching static_stub
       address static_stub(bool is_aot);
    @@ -1146,7 +1146,7 @@ class static_stub_Relocation : public Relocation {
       static_stub_Relocation() { }
     
      public:
    -  void clear_inline_cache();
    +  bool clear_inline_cache();
     
       address static_call() { return _static_call; }
       bool is_aot() { return _is_aot; }
    diff --git a/src/hotspot/share/code/stubs.cpp b/src/hotspot/share/code/stubs.cpp
    index 81717b919ba..d751f3dc246 100644
    --- a/src/hotspot/share/code/stubs.cpp
    +++ b/src/hotspot/share/code/stubs.cpp
    @@ -117,7 +117,7 @@ Stub* StubQueue::request_committed(int code_size) {
     
     Stub* StubQueue::request(int requested_code_size) {
       assert(requested_code_size > 0, "requested_code_size must be > 0");
    -  if (_mutex != NULL) _mutex->lock();
    +  if (_mutex != NULL) _mutex->lock_without_safepoint_check();
       Stub* s = current_stub();
       int requested_size = align_up(stub_code_size_to_size(requested_code_size), CodeEntryAlignment);
       if (requested_size <= available_space()) {
    @@ -207,7 +207,7 @@ void StubQueue::remove_all(){
     void StubQueue::verify() {
       // verify only if initialized
       if (_stub_buffer == NULL) return;
    -  MutexLockerEx lock(_mutex);
    +  MutexLockerEx lock(_mutex, Mutex::_no_safepoint_check_flag);
       // verify index boundaries
       guarantee(0 <= _buffer_size, "buffer size must be positive");
       guarantee(0 <= _buffer_limit && _buffer_limit <= _buffer_size , "_buffer_limit out of bounds");
    @@ -234,9 +234,8 @@ void StubQueue::verify() {
     
     
     void StubQueue::print() {
    -  MutexLockerEx lock(_mutex);
    +  MutexLockerEx lock(_mutex, Mutex::_no_safepoint_check_flag);
       for (Stub* s = first(); s != NULL; s = next(s)) {
         stub_print(s);
       }
     }
    -
    diff --git a/src/hotspot/share/code/vtableStubs.cpp b/src/hotspot/share/code/vtableStubs.cpp
    index 09a0e05dfd6..ae0787e28ce 100644
    --- a/src/hotspot/share/code/vtableStubs.cpp
    +++ b/src/hotspot/share/code/vtableStubs.cpp
    @@ -124,7 +124,7 @@ int VtableStubs::_itab_stub_size = 0;
     void VtableStubs::initialize() {
       VtableStub::_receiver_location = SharedRuntime::name_for_receiver();
       {
    -    MutexLocker ml(VtableStubs_lock);
    +    MutexLockerEx ml(VtableStubs_lock, Mutex::_no_safepoint_check_flag);
         assert(_number_of_vtable_stubs == 0, "potential performance bug: VtableStubs initialized more than once");
         assert(is_power_of_2(N), "N must be a power of 2");
         for (int i = 0; i < N; i++) {
    @@ -247,7 +247,7 @@ inline uint VtableStubs::hash(bool is_vtable_stub, int vtable_index){
     
     
     VtableStub* VtableStubs::lookup(bool is_vtable_stub, int vtable_index) {
    -  MutexLocker ml(VtableStubs_lock);
    +  MutexLockerEx ml(VtableStubs_lock, Mutex::_no_safepoint_check_flag);
       unsigned hash = VtableStubs::hash(is_vtable_stub, vtable_index);
       VtableStub* s = _table[hash];
       while( s && !s->matches(is_vtable_stub, vtable_index)) s = s->next();
    @@ -256,7 +256,7 @@ VtableStub* VtableStubs::lookup(bool is_vtable_stub, int vtable_index) {
     
     
     void VtableStubs::enter(bool is_vtable_stub, int vtable_index, VtableStub* s) {
    -  MutexLocker ml(VtableStubs_lock);
    +  MutexLockerEx ml(VtableStubs_lock, Mutex::_no_safepoint_check_flag);
       assert(s->matches(is_vtable_stub, vtable_index), "bad vtable stub");
       unsigned int h = VtableStubs::hash(is_vtable_stub, vtable_index);
       // enter s at the beginning of the corresponding list
    @@ -266,7 +266,7 @@ void VtableStubs::enter(bool is_vtable_stub, int vtable_index, VtableStub* s) {
     }
     
     VtableStub* VtableStubs::entry_point(address pc) {
    -  MutexLocker ml(VtableStubs_lock);
    +  MutexLockerEx ml(VtableStubs_lock, Mutex::_no_safepoint_check_flag);
       VtableStub* stub = (VtableStub*)(pc - VtableStub::entry_offset());
       uint hash = VtableStubs::hash(stub->is_vtable_stub(), stub->index());
       VtableStub* s;
    diff --git a/src/hotspot/share/compiler/compileBroker.cpp b/src/hotspot/share/compiler/compileBroker.cpp
    index 4c48f693efe..c8204120eb8 100644
    --- a/src/hotspot/share/compiler/compileBroker.cpp
    +++ b/src/hotspot/share/compiler/compileBroker.cpp
    @@ -1306,7 +1306,7 @@ nmethod* CompileBroker::compile_method(const methodHandle& method, int osr_bci,
           CompilationPolicy::policy()->delay_compilation(method());
           return NULL;
         }
    -    bool is_blocking = !directive->BackgroundCompilationOption || CompileTheWorld || ReplayCompiles;
    +    bool is_blocking = !directive->BackgroundCompilationOption || ReplayCompiles;
         compile_method_base(method, osr_bci, comp_level, hot_method, hot_count, compile_reason, is_blocking, THREAD);
       }
     
    @@ -2247,11 +2247,11 @@ void CompileBroker::handle_full_code_cache(int code_blob_type) {
         }
     
     #ifndef PRODUCT
    -    if (CompileTheWorld || ExitOnFullCodeCache) {
    +    if (ExitOnFullCodeCache) {
           codecache_print(/* detailed= */ true);
           before_exit(JavaThread::current());
           exit_globals(); // will delete tty
    -      vm_direct_exit(CompileTheWorld ? 0 : 1);
    +      vm_direct_exit(1);
         }
     #endif
         if (UseCodeCacheFlushing) {
    diff --git a/src/hotspot/share/compiler/compilerDefinitions.cpp b/src/hotspot/share/compiler/compilerDefinitions.cpp
    index 1b6b67ae740..fb22003eadf 100644
    --- a/src/hotspot/share/compiler/compilerDefinitions.cpp
    +++ b/src/hotspot/share/compiler/compilerDefinitions.cpp
    @@ -23,6 +23,7 @@
      */
     
     #include "precompiled.hpp"
    +#include "code/codeCache.hpp"
     #include "runtime/globals.hpp"
     #include "runtime/globals_extension.hpp"
     #include "compiler/compilerDefinitions.hpp"
    @@ -200,8 +201,10 @@ void CompilerConfig::set_tiered_flags() {
         FLAG_SET_ERGO(uintx, ReservedCodeCacheSize,
                       MIN2(CODE_CACHE_DEFAULT_LIMIT, (size_t)ReservedCodeCacheSize * 5));
       }
    -  // Enable SegmentedCodeCache if TieredCompilation is enabled and ReservedCodeCacheSize >= 240M
    -  if (FLAG_IS_DEFAULT(SegmentedCodeCache) && ReservedCodeCacheSize >= 240*M) {
    +  // Enable SegmentedCodeCache if TieredCompilation is enabled, ReservedCodeCacheSize >= 240M
    +  // and the code cache contains at least 8 pages (segmentation disables advantage of huge pages).
    +  if (FLAG_IS_DEFAULT(SegmentedCodeCache) && ReservedCodeCacheSize >= 240*M &&
    +      8 * CodeCache::page_size() <= ReservedCodeCacheSize) {
         FLAG_SET_ERGO(bool, SegmentedCodeCache, true);
       }
       if (!UseInterpreter) { // -Xcomp
    @@ -311,9 +314,9 @@ bool CompilerConfig::check_args_consistency(bool status) {
       }
     #endif
     
    -  if (BackgroundCompilation && (CompileTheWorld || ReplayCompiles)) {
    +  if (BackgroundCompilation && ReplayCompiles) {
         if (!FLAG_IS_DEFAULT(BackgroundCompilation)) {
    -      warning("BackgroundCompilation disabled due to CompileTheWorld or ReplayCompiles options.");
    +      warning("BackgroundCompilation disabled due to ReplayCompiles option.");
         }
         FLAG_SET_CMDLINE(bool, BackgroundCompilation, false);
       }
    diff --git a/src/hotspot/share/compiler/compilerDirectives.cpp b/src/hotspot/share/compiler/compilerDirectives.cpp
    index 6488463608d..5040a3ae171 100644
    --- a/src/hotspot/share/compiler/compilerDirectives.cpp
    +++ b/src/hotspot/share/compiler/compilerDirectives.cpp
    @@ -398,13 +398,14 @@ bool DirectiveSet::is_intrinsic_disabled(const methodHandle& method) {
       size_t length = strlen(DisableIntrinsicOption);
       char* local_list = NEW_RESOURCE_ARRAY(char, length + 1);
       strncpy(local_list, DisableIntrinsicOption, length + 1);
    +  char* save_ptr;
     
    -  char* token = strtok(local_list, ",");
    +  char* token = strtok_r(local_list, ",", &save_ptr);
       while (token != NULL) {
         if (strcmp(token, vmIntrinsics::name_at(id)) == 0) {
           return true;
         } else {
    -      token = strtok(NULL, ",");
    +      token = strtok_r(NULL, ",", &save_ptr);
         }
       }
     
    diff --git a/src/hotspot/share/gc/cms/cmsArguments.cpp b/src/hotspot/share/gc/cms/cmsArguments.cpp
    index af731582bc6..248355ec76c 100644
    --- a/src/hotspot/share/gc/cms/cmsArguments.cpp
    +++ b/src/hotspot/share/gc/cms/cmsArguments.cpp
    @@ -30,10 +30,10 @@
     #include "gc/cms/compactibleFreeListSpace.hpp"
     #include "gc/shared/gcArguments.inline.hpp"
     #include "gc/shared/genCollectedHeap.hpp"
    +#include "gc/shared/workerPolicy.hpp"
     #include "runtime/arguments.hpp"
     #include "runtime/globals.hpp"
     #include "runtime/globals_extension.hpp"
    -#include "runtime/vm_version.hpp"
     #include "utilities/defaultStream.hpp"
     
     size_t CMSArguments::conservative_max_heap_alignment() {
    @@ -46,7 +46,7 @@ void CMSArguments::set_parnew_gc_flags() {
       assert(UseConcMarkSweepGC, "CMS is expected to be on here");
     
       if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
    -    FLAG_SET_DEFAULT(ParallelGCThreads, VM_Version::parallel_worker_threads());
    +    FLAG_SET_DEFAULT(ParallelGCThreads, WorkerPolicy::parallel_worker_threads());
         assert(ParallelGCThreads > 0, "We should always have at least one thread by default");
       } else if (ParallelGCThreads == 0) {
         jio_fprintf(defaultStream::error_stream(),
    diff --git a/src/hotspot/share/gc/cms/cmsCollectorPolicy.cpp b/src/hotspot/share/gc/cms/cmsCollectorPolicy.cpp
    index 09acf055d0b..34bb868edee 100644
    --- a/src/hotspot/share/gc/cms/cmsCollectorPolicy.cpp
    +++ b/src/hotspot/share/gc/cms/cmsCollectorPolicy.cpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -30,9 +30,9 @@
     #include "gc/shared/collectorPolicy.hpp"
     #include "gc/shared/gcLocker.hpp"
     #include "gc/shared/gcPolicyCounters.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "gc/shared/generationSpec.hpp"
     #include "gc/shared/space.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
     #include "memory/universe.hpp"
     #include "oops/oop.inline.hpp"
     #include "runtime/arguments.hpp"
    diff --git a/src/hotspot/share/gc/cms/cmsHeap.cpp b/src/hotspot/share/gc/cms/cmsHeap.cpp
    index f41bbdd86f8..dd7741236bd 100644
    --- a/src/hotspot/share/gc/cms/cmsHeap.cpp
    +++ b/src/hotspot/share/gc/cms/cmsHeap.cpp
    @@ -24,12 +24,12 @@
     
     #include "precompiled.hpp"
     #include "gc/cms/cmsCardTable.hpp"
    +#include "gc/cms/cmsVMOperations.hpp"
     #include "gc/cms/compactibleFreeListSpace.hpp"
     #include "gc/cms/concurrentMarkSweepGeneration.hpp"
     #include "gc/cms/concurrentMarkSweepThread.hpp"
     #include "gc/cms/cmsHeap.hpp"
     #include "gc/cms/parNewGeneration.hpp"
    -#include "gc/cms/vmCMSOperations.hpp"
     #include "gc/shared/genCollectedHeap.hpp"
     #include "gc/shared/genMemoryPools.hpp"
     #include "gc/shared/genOopClosures.inline.hpp"
    diff --git a/src/hotspot/share/gc/cms/vmCMSOperations.cpp b/src/hotspot/share/gc/cms/cmsVMOperations.cpp
    similarity index 98%
    rename from src/hotspot/share/gc/cms/vmCMSOperations.cpp
    rename to src/hotspot/share/gc/cms/cmsVMOperations.cpp
    index 5301498aadf..ff036efc52f 100644
    --- a/src/hotspot/share/gc/cms/vmCMSOperations.cpp
    +++ b/src/hotspot/share/gc/cms/cmsVMOperations.cpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -24,9 +24,9 @@
     
     #include "precompiled.hpp"
     #include "gc/cms/cmsHeap.hpp"
    +#include "gc/cms/cmsVMOperations.hpp"
     #include "gc/cms/concurrentMarkSweepGeneration.inline.hpp"
     #include "gc/cms/concurrentMarkSweepThread.hpp"
    -#include "gc/cms/vmCMSOperations.hpp"
     #include "gc/shared/gcLocker.hpp"
     #include "gc/shared/gcTimer.hpp"
     #include "gc/shared/gcTraceTime.inline.hpp"
    diff --git a/src/hotspot/share/gc/cms/vmCMSOperations.hpp b/src/hotspot/share/gc/cms/cmsVMOperations.hpp
    similarity index 94%
    rename from src/hotspot/share/gc/cms/vmCMSOperations.hpp
    rename to src/hotspot/share/gc/cms/cmsVMOperations.hpp
    index fd39fe479d9..e0811703ec7 100644
    --- a/src/hotspot/share/gc/cms/vmCMSOperations.hpp
    +++ b/src/hotspot/share/gc/cms/cmsVMOperations.hpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -22,14 +22,14 @@
      *
      */
     
    -#ifndef SHARE_VM_GC_CMS_VMCMSOPERATIONS_HPP
    -#define SHARE_VM_GC_CMS_VMCMSOPERATIONS_HPP
    +#ifndef SHARE_VM_GC_CMS_CMSVMOPERATIONS_HPP
    +#define SHARE_VM_GC_CMS_CMSVMOPERATIONS_HPP
     
     #include "gc/cms/concurrentMarkSweepGeneration.hpp"
     #include "gc/shared/gcCause.hpp"
     #include "gc/shared/gcId.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     // The VM_CMS_Operation is slightly different from
     // a VM_GC_Operation -- and would not have subclassed easily
    @@ -143,4 +143,4 @@ class VM_GenCollectFullConcurrent: public VM_GC_Operation {
       virtual bool evaluate_at_safepoint() const;
     };
     
    -#endif // SHARE_VM_GC_CMS_VMCMSOPERATIONS_HPP
    +#endif // SHARE_VM_GC_CMS_CMSVMOPERATIONS_HPP
    diff --git a/src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp b/src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp
    index 0996e8ce37d..69cc0dbd3b2 100644
    --- a/src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp
    +++ b/src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp
    @@ -32,12 +32,12 @@
     #include "gc/cms/cmsGCStats.hpp"
     #include "gc/cms/cmsHeap.hpp"
     #include "gc/cms/cmsOopClosures.inline.hpp"
    +#include "gc/cms/cmsVMOperations.hpp"
     #include "gc/cms/compactibleFreeListSpace.hpp"
     #include "gc/cms/concurrentMarkSweepGeneration.inline.hpp"
     #include "gc/cms/concurrentMarkSweepThread.hpp"
     #include "gc/cms/parNewGeneration.hpp"
     #include "gc/cms/promotionInfo.inline.hpp"
    -#include "gc/cms/vmCMSOperations.hpp"
     #include "gc/serial/genMarkSweep.hpp"
     #include "gc/serial/tenuredGeneration.hpp"
     #include "gc/shared/adaptiveSizePolicy.hpp"
    @@ -55,12 +55,14 @@
     #include "gc/shared/genOopClosures.inline.hpp"
     #include "gc/shared/isGCActiveMark.hpp"
     #include "gc/shared/oopStorageParState.hpp"
    +#include "gc/shared/owstTaskTerminator.hpp"
     #include "gc/shared/referencePolicy.hpp"
     #include "gc/shared/referenceProcessorPhaseTimes.hpp"
     #include "gc/shared/space.inline.hpp"
     #include "gc/shared/strongRootsScope.hpp"
     #include "gc/shared/taskqueue.inline.hpp"
     #include "gc/shared/weakProcessor.hpp"
    +#include "gc/shared/workerPolicy.hpp"
     #include "logging/log.hpp"
     #include "logging/logStream.hpp"
     #include "memory/allocation.hpp"
    @@ -2981,7 +2983,7 @@ bool CMSCollector::markFromRootsWork() {
     // Forward decl
     class CMSConcMarkingTask;
     
    -class CMSConcMarkingTerminator: public ParallelTaskTerminator {
    +class CMSConcMarkingParallelTerminator: public ParallelTaskTerminator {
       CMSCollector*       _collector;
       CMSConcMarkingTask* _task;
      public:
    @@ -2991,7 +2993,7 @@ class CMSConcMarkingTerminator: public ParallelTaskTerminator {
       // "queue_set" is a set of work queues of other threads.
       // "collector" is the CMS collector associated with this task terminator.
       // "yield" indicates whether we need the gang as a whole to yield.
    -  CMSConcMarkingTerminator(int n_threads, TaskQueueSetSuper* queue_set, CMSCollector* collector) :
    +  CMSConcMarkingParallelTerminator(int n_threads, TaskQueueSetSuper* queue_set, CMSCollector* collector) :
         ParallelTaskTerminator(n_threads, queue_set),
         _collector(collector) { }
     
    @@ -3000,6 +3002,45 @@ class CMSConcMarkingTerminator: public ParallelTaskTerminator {
       }
     };
     
    +class CMSConcMarkingOWSTTerminator: public OWSTTaskTerminator {
    +  CMSCollector*       _collector;
    +  CMSConcMarkingTask* _task;
    + public:
    +  virtual void yield();
    +
    +  // "n_threads" is the number of threads to be terminated.
    +  // "queue_set" is a set of work queues of other threads.
    +  // "collector" is the CMS collector associated with this task terminator.
    +  // "yield" indicates whether we need the gang as a whole to yield.
    +  CMSConcMarkingOWSTTerminator(int n_threads, TaskQueueSetSuper* queue_set, CMSCollector* collector) :
    +    OWSTTaskTerminator(n_threads, queue_set),
    +    _collector(collector) { }
    +
    +  void set_task(CMSConcMarkingTask* task) {
    +    _task = task;
    +  }
    +};
    +
    +class CMSConcMarkingTaskTerminator {
    + private:
    +  ParallelTaskTerminator* _term;
    + public:
    +  CMSConcMarkingTaskTerminator(int n_threads, TaskQueueSetSuper* queue_set, CMSCollector* collector) {
    +    if (UseOWSTTaskTerminator) {
    +      _term = new CMSConcMarkingOWSTTerminator(n_threads, queue_set, collector);
    +    } else {
    +      _term = new CMSConcMarkingParallelTerminator(n_threads, queue_set, collector);
    +    }
    +  }
    +  ~CMSConcMarkingTaskTerminator() {
    +    assert(_term != NULL, "Must not be NULL");
    +    delete _term;
    +  }
    +
    +  void set_task(CMSConcMarkingTask* task);
    +  ParallelTaskTerminator* terminator() const { return _term; }
    +};
    +
     class CMSConcMarkingTerminatorTerminator: public TerminatorTerminator {
       CMSConcMarkingTask* _task;
      public:
    @@ -3027,7 +3068,7 @@ class CMSConcMarkingTask: public YieldingFlexibleGangTask {
       OopTaskQueueSet*  _task_queues;
     
       // Termination (and yielding) support
    -  CMSConcMarkingTerminator _term;
    +  CMSConcMarkingTaskTerminator       _term;
       CMSConcMarkingTerminatorTerminator _term_term;
     
      public:
    @@ -3057,7 +3098,7 @@ class CMSConcMarkingTask: public YieldingFlexibleGangTask {
     
       HeapWord* volatile* global_finger_addr() { return &_global_finger; }
     
    -  CMSConcMarkingTerminator* terminator() { return &_term; }
    +  ParallelTaskTerminator* terminator() { return _term.terminator(); }
     
       virtual void set_for_termination(uint active_workers) {
         terminator()->reset_for_reuse(active_workers);
    @@ -3075,7 +3116,7 @@ class CMSConcMarkingTask: public YieldingFlexibleGangTask {
       void reset(HeapWord* ra) {
         assert(_global_finger >= _cms_space->end(),  "Postcondition of ::work(i)");
         _restart_addr = _global_finger = ra;
    -    _term.reset_for_reuse();
    +    _term.terminator()->reset_for_reuse();
       }
     
       static bool get_work_from_overflow_stack(CMSMarkStack* ovflw_stk,
    @@ -3096,7 +3137,7 @@ bool CMSConcMarkingTerminatorTerminator::should_exit_termination() {
       // thread has yielded.
     }
     
    -void CMSConcMarkingTerminator::yield() {
    +void CMSConcMarkingParallelTerminator::yield() {
       if (_task->should_yield()) {
         _task->yield();
       } else {
    @@ -3104,6 +3145,22 @@ void CMSConcMarkingTerminator::yield() {
       }
     }
     
    +void CMSConcMarkingOWSTTerminator::yield() {
    +  if (_task->should_yield()) {
    +    _task->yield();
    +  } else {
    +    OWSTTaskTerminator::yield();
    +  }
    +}
    +
    +void CMSConcMarkingTaskTerminator::set_task(CMSConcMarkingTask* task) {
    +  if (UseOWSTTaskTerminator) {
    +    ((CMSConcMarkingOWSTTerminator*)_term)->set_task(task);
    +  } else {
    +    ((CMSConcMarkingParallelTerminator*)_term)->set_task(task);
    +  }
    +}
    +
     ////////////////////////////////////////////////////////////////
     // Concurrent Marking Algorithm Sketch
     ////////////////////////////////////////////////////////////////
    @@ -3488,9 +3545,9 @@ void CMSConcMarkingTask::coordinator_yield() {
     
     bool CMSCollector::do_marking_mt() {
       assert(ConcGCThreads > 0 && conc_workers() != NULL, "precondition");
    -  uint num_workers = AdaptiveSizePolicy::calc_active_conc_workers(conc_workers()->total_workers(),
    -                                                                  conc_workers()->active_workers(),
    -                                                                  Threads::number_of_non_daemon_threads());
    +  uint num_workers = WorkerPolicy::calc_active_conc_workers(conc_workers()->total_workers(),
    +                                                            conc_workers()->active_workers(),
    +                                                            Threads::number_of_non_daemon_threads());
       num_workers = conc_workers()->update_active_workers(num_workers);
       log_info(gc,task)("Using %u workers of %u for marking", num_workers, conc_workers()->total_workers());
     
    @@ -4292,7 +4349,7 @@ class CMSParRemarkTask: public CMSParMarkTask {
     
       // The per-thread work queues, available here for stealing.
       OopTaskQueueSet*       _task_queues;
    -  ParallelTaskTerminator _term;
    +  TaskTerminator         _term;
       StrongRootsScope*      _strong_roots_scope;
     
      public:
    @@ -4314,7 +4371,7 @@ class CMSParRemarkTask: public CMSParMarkTask {
     
       OopTaskQueue* work_queue(int i) { return task_queues()->queue(i); }
     
    -  ParallelTaskTerminator* terminator() { return &_term; }
    +  ParallelTaskTerminator* terminator() { return _term.terminator(); }
       uint n_workers() { return _n_workers; }
     
       void work(uint worker_id);
    @@ -5002,11 +5059,11 @@ void CMSCollector::do_remark_non_parallel() {
     ////////////////////////////////////////////////////////
     class AbstractGangTaskWOopQueues : public AbstractGangTask {
       OopTaskQueueSet*       _queues;
    -  ParallelTaskTerminator _terminator;
    +  TaskTerminator         _terminator;
      public:
       AbstractGangTaskWOopQueues(const char* name, OopTaskQueueSet* queues, uint n_threads) :
         AbstractGangTask(name), _queues(queues), _terminator(n_threads, _queues) {}
    -  ParallelTaskTerminator* terminator() { return &_terminator; }
    +  ParallelTaskTerminator* terminator() { return _terminator.terminator(); }
       OopTaskQueueSet* queues() { return _queues; }
     };
     
    diff --git a/src/hotspot/share/gc/cms/parNewGeneration.cpp b/src/hotspot/share/gc/cms/parNewGeneration.cpp
    index ad4b65d8ef7..a465e9cd65b 100644
    --- a/src/hotspot/share/gc/cms/parNewGeneration.cpp
    +++ b/src/hotspot/share/gc/cms/parNewGeneration.cpp
    @@ -49,6 +49,7 @@
     #include "gc/shared/taskqueue.inline.hpp"
     #include "gc/shared/weakProcessor.hpp"
     #include "gc/shared/workgroup.hpp"
    +#include "gc/shared/workerPolicy.hpp"
     #include "logging/log.hpp"
     #include "logging/logStream.hpp"
     #include "memory/iterator.inline.hpp"
    @@ -74,7 +75,7 @@ ParScanThreadState::ParScanThreadState(Space* to_space_,
                                            Stack* overflow_stacks_,
                                            PreservedMarks* preserved_marks_,
                                            size_t desired_plab_sz_,
    -                                       ParallelTaskTerminator& term_) :
    +                                       TaskTerminator& term_) :
       _work_queue(work_queue_set_->queue(thread_num_)),
       _overflow_stack(overflow_stacks_ ? overflow_stacks_ + thread_num_ : NULL),
       _preserved_marks(preserved_marks_),
    @@ -86,7 +87,7 @@ ParScanThreadState::ParScanThreadState(Space* to_space_,
       _old_gen_root_closure(young_gen_, this),
       _evacuate_followers(this, &_to_space_closure, &_old_gen_closure,
                           &_to_space_root_closure, young_gen_, &_old_gen_root_closure,
    -                      work_queue_set_, &term_),
    +                      work_queue_set_, term_.terminator()),
       _is_alive_closure(young_gen_),
       _scan_weak_ref_closure(young_gen_, this),
       _keep_alive_closure(&_scan_weak_ref_closure),
    @@ -305,7 +306,7 @@ public:
                             Stack*       overflow_stacks_,
                             PreservedMarksSet&      preserved_marks_set,
                             size_t                  desired_plab_sz,
    -                        ParallelTaskTerminator& term);
    +                        TaskTerminator& term);
     
       ~ParScanThreadStateSet() { TASKQUEUE_STATS_ONLY(reset_stats()); }
     
    @@ -326,14 +327,14 @@ public:
       #endif // TASKQUEUE_STATS
     
     private:
    -  ParallelTaskTerminator& _term;
    +  TaskTerminator&         _term;
       ParNewGeneration&       _young_gen;
       Generation&             _old_gen;
       ParScanThreadState*     _per_thread_states;
       const int               _num_threads;
      public:
       bool is_valid(int id) const { return id < _num_threads; }
    -  ParallelTaskTerminator* terminator() { return &_term; }
    +  ParallelTaskTerminator* terminator() { return _term.terminator(); }
     };
     
     ParScanThreadStateSet::ParScanThreadStateSet(int num_threads,
    @@ -344,7 +345,7 @@ ParScanThreadStateSet::ParScanThreadStateSet(int num_threads,
                                                  Stack* overflow_stacks,
                                                  PreservedMarksSet& preserved_marks_set,
                                                  size_t desired_plab_sz,
    -                                             ParallelTaskTerminator& term)
    +                                             TaskTerminator& term)
       : _term(term),
         _young_gen(young_gen),
         _old_gen(old_gen),
    @@ -378,7 +379,7 @@ void ParScanThreadStateSet::trace_promotion_failed(const YoungGCTracer* gc_trace
     }
     
     void ParScanThreadStateSet::reset(uint active_threads, bool promotion_failed) {
    -  _term.reset_for_reuse(active_threads);
    +  _term.terminator()->reset_for_reuse(active_threads);
       if (promotion_failed) {
         for (int i = 0; i < _num_threads; ++i) {
           thread_state(i).print_promotion_failure_size();
    @@ -866,9 +867,9 @@ void ParNewGeneration::collect(bool   full,
       WorkGang* workers = gch->workers();
       assert(workers != NULL, "Need workgang for parallel work");
       uint active_workers =
    -       AdaptiveSizePolicy::calc_active_workers(workers->total_workers(),
    -                                               workers->active_workers(),
    -                                               Threads::number_of_non_daemon_threads());
    +      WorkerPolicy::calc_active_workers(workers->total_workers(),
    +                                        workers->active_workers(),
    +                                        Threads::number_of_non_daemon_threads());
       active_workers = workers->update_active_workers(active_workers);
       log_info(gc,task)("Using %u workers of %u for evacuation", active_workers, workers->total_workers());
     
    @@ -903,7 +904,7 @@ void ParNewGeneration::collect(bool   full,
     
       // Always set the terminator for the active number of workers
       // because only those workers go through the termination protocol.
    -  ParallelTaskTerminator _term(active_workers, task_queues());
    +  TaskTerminator _term(active_workers, task_queues());
       ParScanThreadStateSet thread_state_set(active_workers,
                                              *to(), *this, *_old_gen, *task_queues(),
                                              _overflow_stacks, _preserved_marks_set,
    diff --git a/src/hotspot/share/gc/cms/parNewGeneration.hpp b/src/hotspot/share/gc/cms/parNewGeneration.hpp
    index d5832b4cfd6..5e4d7a5e7a0 100644
    --- a/src/hotspot/share/gc/cms/parNewGeneration.hpp
    +++ b/src/hotspot/share/gc/cms/parNewGeneration.hpp
    @@ -133,7 +133,7 @@ class ParScanThreadState {
                          Stack* overflow_stacks_,
                          PreservedMarks* preserved_marks_,
                          size_t desired_plab_sz_,
    -                     ParallelTaskTerminator& term_);
    +                     TaskTerminator& term_);
     
      public:
       AgeTable* age_table() {return &_ageTable;}
    diff --git a/src/hotspot/share/gc/g1/g1Allocator.cpp b/src/hotspot/share/gc/g1/g1Allocator.cpp
    index a838abf3b91..d4969c66ac9 100644
    --- a/src/hotspot/share/gc/g1/g1Allocator.cpp
    +++ b/src/hotspot/share/gc/g1/g1Allocator.cpp
    @@ -84,8 +84,6 @@ void G1Allocator::reuse_retained_old_region(EvacuationInfo& evacuation_info,
         // we allocate to in the region sets. We'll re-add it later, when
         // it's retired again.
         _g1h->old_set_remove(retained_region);
    -    bool during_im = _g1h->collector_state()->in_initial_mark_gc();
    -    retained_region->note_start_of_copying(during_im);
         old->set(retained_region);
         _g1h->hr_printer()->reuse(retained_region);
         evacuation_info.set_alloc_regions_used_before(retained_region->used());
    diff --git a/src/hotspot/share/gc/g1/g1Arguments.cpp b/src/hotspot/share/gc/g1/g1Arguments.cpp
    index af3d0b88574..1f5d3beb7c1 100644
    --- a/src/hotspot/share/gc/g1/g1Arguments.cpp
    +++ b/src/hotspot/share/gc/g1/g1Arguments.cpp
    @@ -30,9 +30,9 @@
     #include "gc/g1/g1HeapVerifier.hpp"
     #include "gc/g1/heapRegion.hpp"
     #include "gc/shared/gcArguments.inline.hpp"
    +#include "gc/shared/workerPolicy.hpp"
     #include "runtime/globals.hpp"
     #include "runtime/globals_extension.hpp"
    -#include "runtime/vm_version.hpp"
     
     size_t G1Arguments::conservative_max_heap_alignment() {
       return HeapRegion::max_region_size();
    @@ -44,10 +44,12 @@ void G1Arguments::initialize_verification_types() {
         size_t length = strlen(VerifyGCType);
         char* type_list = NEW_C_HEAP_ARRAY(char, length + 1, mtInternal);
         strncpy(type_list, VerifyGCType, length + 1);
    -    char* token = strtok(type_list, delimiter);
    +    char* save_ptr;
    +
    +    char* token = strtok_r(type_list, delimiter, &save_ptr);
         while (token != NULL) {
           parse_verification_type(token);
    -      token = strtok(NULL, delimiter);
    +      token = strtok_r(NULL, delimiter, &save_ptr);
         }
         FREE_C_HEAP_ARRAY(char, type_list);
       }
    @@ -75,7 +77,7 @@ void G1Arguments::parse_verification_type(const char* type) {
     void G1Arguments::initialize() {
       GCArguments::initialize();
       assert(UseG1GC, "Error");
    -  FLAG_SET_DEFAULT(ParallelGCThreads, VM_Version::parallel_worker_threads());
    +  FLAG_SET_DEFAULT(ParallelGCThreads, WorkerPolicy::parallel_worker_threads());
       if (ParallelGCThreads == 0) {
         assert(!FLAG_IS_DEFAULT(ParallelGCThreads), "The default value for ParallelGCThreads should not be 0.");
         vm_exit_during_initialization("The flag -XX:+UseG1GC can not be combined with -XX:ParallelGCThreads=0", NULL);
    diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
    index a4893b9e9fe..a1c77341743 100644
    --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
    +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
    @@ -57,11 +57,10 @@
     #include "gc/g1/g1ThreadLocalData.hpp"
     #include "gc/g1/g1YCTypes.hpp"
     #include "gc/g1/g1YoungRemSetSamplingThread.hpp"
    +#include "gc/g1/g1VMOperations.hpp"
     #include "gc/g1/heapRegion.inline.hpp"
     #include "gc/g1/heapRegionRemSet.hpp"
     #include "gc/g1/heapRegionSet.inline.hpp"
    -#include "gc/g1/vm_operations_g1.hpp"
    -#include "gc/shared/adaptiveSizePolicy.hpp"
     #include "gc/shared/gcBehaviours.hpp"
     #include "gc/shared/gcHeapSummary.hpp"
     #include "gc/shared/gcId.hpp"
    @@ -78,6 +77,7 @@
     #include "gc/shared/referenceProcessor.inline.hpp"
     #include "gc/shared/taskqueue.inline.hpp"
     #include "gc/shared/weakProcessor.inline.hpp"
    +#include "gc/shared/workerPolicy.hpp"
     #include "logging/log.hpp"
     #include "memory/allocation.hpp"
     #include "memory/iterator.hpp"
    @@ -1150,6 +1150,8 @@ void G1CollectedHeap::do_full_collection(bool clear_all_soft_refs) {
     }
     
     void G1CollectedHeap::resize_heap_if_necessary() {
    +  assert_at_safepoint_on_vm_thread();
    +
       // Capacity, free and used after the GC counted as full regions to
       // include the waste in the following calculations.
       const size_t capacity_after_gc = capacity();
    @@ -1991,6 +1993,7 @@ bool G1CollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
       switch (cause) {
         case GCCause::_gc_locker:               return GCLockerInvokesConcurrent;
         case GCCause::_g1_humongous_allocation: return true;
    +    case GCCause::_g1_periodic_collection:  return G1PeriodicGCInvokesConcurrent;
         default:                                return is_user_requested_concurrent_full_gc(cause);
       }
     }
    @@ -2912,9 +2915,9 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
         }
         GCTraceTime(Info, gc) tm(gc_string, NULL, gc_cause(), true);
     
    -    uint active_workers = AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
    -                                                                  workers()->active_workers(),
    -                                                                  Threads::number_of_non_daemon_threads());
    +    uint active_workers = WorkerPolicy::calc_active_workers(workers()->total_workers(),
    +                                                            workers()->active_workers(),
    +                                                            Threads::number_of_non_daemon_threads());
         active_workers = workers()->update_active_workers(active_workers);
         log_info(gc,task)("Using %u workers of %u for evacuation", active_workers, workers()->total_workers());
     
    @@ -3002,11 +3005,15 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
             // Initialize the GC alloc regions.
             _allocator->init_gc_alloc_regions(evacuation_info);
     
    -        G1ParScanThreadStateSet per_thread_states(this, workers()->active_workers(), collection_set()->young_region_length());
    +        G1ParScanThreadStateSet per_thread_states(this,
    +                                                  workers()->active_workers(),
    +                                                  collection_set()->young_region_length(),
    +                                                  collection_set()->optional_region_length());
             pre_evacuate_collection_set();
     
             // Actually do the work...
             evacuate_collection_set(&per_thread_states);
    +        evacuate_optional_collection_set(&per_thread_states);
     
             post_evacuate_collection_set(evacuation_info, &per_thread_states);
     
    @@ -3197,11 +3204,11 @@ void G1ParEvacuateFollowersClosure::do_void() {
       EventGCPhaseParallel event;
       G1ParScanThreadState* const pss = par_scan_state();
       pss->trim_queue();
    -  event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(G1GCPhaseTimes::ObjCopy));
    +  event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(_phase));
       do {
         EventGCPhaseParallel event;
         pss->steal_and_trim_queue(queues());
    -    event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(G1GCPhaseTimes::ObjCopy));
    +    event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(_phase));
       } while (!offer_termination());
     }
     
    @@ -3211,7 +3218,7 @@ protected:
       G1ParScanThreadStateSet* _pss;
       RefToScanQueueSet*       _queues;
       G1RootProcessor*         _root_processor;
    -  ParallelTaskTerminator   _terminator;
    +  TaskTerminator           _terminator;
       uint                     _n_workers;
     
     public:
    @@ -3256,7 +3263,7 @@ public:
           size_t evac_term_attempts = 0;
           {
             double start = os::elapsedTime();
    -        G1ParEvacuateFollowersClosure evac(_g1h, pss, _queues, &_terminator);
    +        G1ParEvacuateFollowersClosure evac(_g1h, pss, _queues, _terminator.terminator(), G1GCPhaseTimes::ObjCopy);
             evac.do_void();
     
             evac_term_attempts = evac.term_attempts();
    @@ -3547,7 +3554,7 @@ public:
         G1CopyingKeepAliveClosure keep_alive(_g1h, pss);
     
         // Complete GC closure
    -    G1ParEvacuateFollowersClosure drain_queue(_g1h, pss, _task_queues, _terminator);
    +    G1ParEvacuateFollowersClosure drain_queue(_g1h, pss, _task_queues, _terminator, G1GCPhaseTimes::ObjCopy);
     
         // Call the reference processing task's work routine.
         _proc_task.work(worker_id, is_alive, keep_alive, drain_queue);
    @@ -3568,8 +3575,8 @@ void G1STWRefProcTaskExecutor::execute(ProcessTask& proc_task, uint ergo_workers
       assert(_workers->active_workers() >= ergo_workers,
              "Ergonomically chosen workers (%u) should be less than or equal to active workers (%u)",
              ergo_workers, _workers->active_workers());
    -  ParallelTaskTerminator terminator(ergo_workers, _queues);
    -  G1STWRefProcTaskProxy proc_task_proxy(proc_task, _g1h, _pss, _queues, &terminator);
    +  TaskTerminator terminator(ergo_workers, _queues);
    +  G1STWRefProcTaskProxy proc_task_proxy(proc_task, _g1h, _pss, _queues, terminator.terminator());
     
       _workers->run_task(&proc_task_proxy, ergo_workers);
     }
    @@ -3719,6 +3726,145 @@ void G1CollectedHeap::evacuate_collection_set(G1ParScanThreadStateSet* per_threa
       phase_times->record_code_root_fixup_time(code_root_fixup_time_ms);
     }
     
    +class G1EvacuateOptionalRegionTask : public AbstractGangTask {
    +  G1CollectedHeap* _g1h;
    +  G1ParScanThreadStateSet* _per_thread_states;
    +  G1OptionalCSet* _optional;
    +  RefToScanQueueSet* _queues;
    +  ParallelTaskTerminator _terminator;
    +
    +  Tickspan trim_ticks(G1ParScanThreadState* pss) {
    +    Tickspan copy_time = pss->trim_ticks();
    +    pss->reset_trim_ticks();
    +    return copy_time;
    +  }
    +
    +  void scan_roots(G1ParScanThreadState* pss, uint worker_id) {
    +    G1EvacuationRootClosures* root_cls = pss->closures();
    +    G1ScanObjsDuringScanRSClosure obj_cl(_g1h, pss);
    +
    +    size_t scanned = 0;
    +    size_t claimed = 0;
    +    size_t skipped = 0;
    +    size_t used_memory = 0;
    +
    +    Ticks    start = Ticks::now();
    +    Tickspan copy_time;
    +
    +    for (uint i = _optional->current_index(); i < _optional->current_limit(); i++) {
    +      HeapRegion* hr = _optional->region_at(i);
    +      G1ScanRSForOptionalClosure scan_opt_cl(&obj_cl);
    +      pss->oops_into_optional_region(hr)->oops_do(&scan_opt_cl, root_cls->raw_strong_oops());
    +      copy_time += trim_ticks(pss);
    +
    +      G1ScanRSForRegionClosure scan_rs_cl(_g1h->g1_rem_set()->scan_state(), &obj_cl, pss, G1GCPhaseTimes::OptScanRS, worker_id);
    +      scan_rs_cl.do_heap_region(hr);
    +      copy_time += trim_ticks(pss);
    +      scanned += scan_rs_cl.cards_scanned();
    +      claimed += scan_rs_cl.cards_claimed();
    +      skipped += scan_rs_cl.cards_skipped();
    +
    +      // Chunk lists for this region is no longer needed.
    +      used_memory += pss->oops_into_optional_region(hr)->used_memory();
    +    }
    +
    +    Tickspan scan_time = (Ticks::now() - start) - copy_time;
    +    G1GCPhaseTimes* p = _g1h->g1_policy()->phase_times();
    +    p->record_or_add_time_secs(G1GCPhaseTimes::OptScanRS, worker_id, scan_time.seconds());
    +    p->record_or_add_time_secs(G1GCPhaseTimes::OptObjCopy, worker_id, copy_time.seconds());
    +
    +    p->record_or_add_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_id, scanned, G1GCPhaseTimes::OptCSetScannedCards);
    +    p->record_or_add_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_id, claimed, G1GCPhaseTimes::OptCSetClaimedCards);
    +    p->record_or_add_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_id, skipped, G1GCPhaseTimes::OptCSetSkippedCards);
    +    p->record_or_add_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_id, used_memory, G1GCPhaseTimes::OptCSetUsedMemory);
    +  }
    +
    +  void evacuate_live_objects(G1ParScanThreadState* pss, uint worker_id) {
    +    Ticks start = Ticks::now();
    +    G1ParEvacuateFollowersClosure cl(_g1h, pss, _queues, &_terminator, G1GCPhaseTimes::OptObjCopy);
    +    cl.do_void();
    +
    +    Tickspan evac_time = (Ticks::now() - start);
    +    G1GCPhaseTimes* p = _g1h->g1_policy()->phase_times();
    +    p->record_or_add_time_secs(G1GCPhaseTimes::OptObjCopy, worker_id, evac_time.seconds());
    +    assert(pss->trim_ticks().seconds() == 0.0, "Unexpected partial trimming done during optional evacuation");
    +  }
    +
    + public:
    +  G1EvacuateOptionalRegionTask(G1CollectedHeap* g1h,
    +                               G1ParScanThreadStateSet* per_thread_states,
    +                               G1OptionalCSet* cset,
    +                               RefToScanQueueSet* queues,
    +                               uint n_workers) :
    +    AbstractGangTask("G1 Evacuation Optional Region Task"),
    +    _g1h(g1h),
    +    _per_thread_states(per_thread_states),
    +    _optional(cset),
    +    _queues(queues),
    +    _terminator(n_workers, _queues) {
    +  }
    +
    +  void work(uint worker_id) {
    +    ResourceMark rm;
    +    HandleMark  hm;
    +
    +    G1ParScanThreadState* pss = _per_thread_states->state_for_worker(worker_id);
    +    pss->set_ref_discoverer(_g1h->ref_processor_stw());
    +
    +    scan_roots(pss, worker_id);
    +    evacuate_live_objects(pss, worker_id);
    +  }
    +};
    +
    +void G1CollectedHeap::evacuate_optional_regions(G1ParScanThreadStateSet* per_thread_states, G1OptionalCSet* ocset) {
    +  class G1MarkScope : public MarkScope {};
    +  G1MarkScope code_mark_scope;
    +
    +  G1EvacuateOptionalRegionTask task(this, per_thread_states, ocset, _task_queues, workers()->active_workers());
    +  workers()->run_task(&task);
    +}
    +
    +void G1CollectedHeap::evacuate_optional_collection_set(G1ParScanThreadStateSet* per_thread_states) {
    +  G1OptionalCSet optional_cset(&_collection_set, per_thread_states);
    +  if (optional_cset.is_empty()) {
    +    return;
    +  }
    +
    +  if (evacuation_failed()) {
    +    return;
    +  }
    +
    +  G1GCPhaseTimes* phase_times = g1_policy()->phase_times();
    +  const double gc_start_time_ms = phase_times->cur_collection_start_sec() * 1000.0;
    +
    +  double start_time_sec = os::elapsedTime();
    +
    +  do {
    +    double time_used_ms = os::elapsedTime() * 1000.0 - gc_start_time_ms;
    +    double time_left_ms = MaxGCPauseMillis - time_used_ms;
    +
    +    if (time_left_ms < 0) {
    +      log_trace(gc, ergo, cset)("Skipping %u optional regions, pause time exceeded %.3fms", optional_cset.size(), time_used_ms);
    +      break;
    +    }
    +
    +    optional_cset.prepare_evacuation(time_left_ms * _g1_policy->optional_evacuation_fraction());
    +    if (optional_cset.prepare_failed()) {
    +      log_trace(gc, ergo, cset)("Skipping %u optional regions, no regions can be evacuated in %.3fms", optional_cset.size(), time_left_ms);
    +      break;
    +    }
    +
    +    evacuate_optional_regions(per_thread_states, &optional_cset);
    +
    +    optional_cset.complete_evacuation();
    +    if (optional_cset.evacuation_failed()) {
    +      break;
    +    }
    +  } while (!optional_cset.is_empty());
    +
    +  phase_times->record_optional_evacuation((os::elapsedTime() - start_time_sec) * 1000.0);
    +}
    +
     void G1CollectedHeap::post_evacuate_collection_set(EvacuationInfo& evacuation_info, G1ParScanThreadStateSet* per_thread_states) {
       // Also cleans the card table from temporary duplicate detection information used
       // during UpdateRS/ScanRS.
    @@ -4533,8 +4679,6 @@ HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size, InCSetState d
         }
         _g1_policy->remset_tracker()->update_at_allocate(new_alloc_region);
         _hr_printer.alloc(new_alloc_region);
    -    bool during_im = collector_state()->in_initial_mark_gc();
    -    new_alloc_region->note_start_of_copying(during_im);
         return new_alloc_region;
       }
       return NULL;
    @@ -4543,12 +4687,15 @@ HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size, InCSetState d
     void G1CollectedHeap::retire_gc_alloc_region(HeapRegion* alloc_region,
                                                  size_t allocated_bytes,
                                                  InCSetState dest) {
    -  bool during_im = collector_state()->in_initial_mark_gc();
    -  alloc_region->note_end_of_copying(during_im);
       g1_policy()->record_bytes_copied_during_gc(allocated_bytes);
       if (dest.is_old()) {
         old_set_add(alloc_region);
       }
    +
    +  bool const during_im = collector_state()->in_initial_mark_gc();
    +  if (during_im && allocated_bytes > 0) {
    +    _cm->root_regions()->add(alloc_region);
    +  }
       _hr_printer.retire(alloc_region);
     }
     
    diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp
    index 4b36f994c80..c9a79f4054a 100644
    --- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp
    +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp
    @@ -35,6 +35,7 @@
     #include "gc/g1/g1EdenRegions.hpp"
     #include "gc/g1/g1EvacFailure.hpp"
     #include "gc/g1/g1EvacStats.hpp"
    +#include "gc/g1/g1GCPhaseTimes.hpp"
     #include "gc/g1/g1HeapTransition.hpp"
     #include "gc/g1/g1HeapVerifier.hpp"
     #include "gc/g1/g1HRPrinter.hpp"
    @@ -567,6 +568,9 @@ public:
       void register_old_region_with_cset(HeapRegion* r) {
         _in_cset_fast_test.set_in_old(r->hrm_index());
       }
    +  void register_optional_region_with_cset(HeapRegion* r) {
    +    _in_cset_fast_test.set_optional(r->hrm_index());
    +  }
       void clear_in_cset(const HeapRegion* hr) {
         _in_cset_fast_test.clear(hr);
       }
    @@ -723,6 +727,8 @@ private:
     
       // Actually do the work of evacuating the collection set.
       void evacuate_collection_set(G1ParScanThreadStateSet* per_thread_states);
    +  void evacuate_optional_collection_set(G1ParScanThreadStateSet* per_thread_states);
    +  void evacuate_optional_regions(G1ParScanThreadStateSet* per_thread_states, G1OptionalCSet* ocset);
     
       void pre_evacuate_collection_set();
       void post_evacuate_collection_set(EvacuationInfo& evacuation_info, G1ParScanThreadStateSet* pss);
    @@ -1405,6 +1411,7 @@ protected:
       G1ParScanThreadState*         _par_scan_state;
       RefToScanQueueSet*            _queues;
       ParallelTaskTerminator*       _terminator;
    +  G1GCPhaseTimes::GCParPhases   _phase;
     
       G1ParScanThreadState*   par_scan_state() { return _par_scan_state; }
       RefToScanQueueSet*      queues()         { return _queues; }
    @@ -1414,10 +1421,11 @@ public:
       G1ParEvacuateFollowersClosure(G1CollectedHeap* g1h,
                                     G1ParScanThreadState* par_scan_state,
                                     RefToScanQueueSet* queues,
    -                                ParallelTaskTerminator* terminator)
    +                                ParallelTaskTerminator* terminator,
    +                                G1GCPhaseTimes::GCParPhases phase)
         : _start_term(0.0), _term_time(0.0), _term_attempts(0),
           _g1h(g1h), _par_scan_state(par_scan_state),
    -      _queues(queues), _terminator(terminator) {}
    +      _queues(queues), _terminator(terminator), _phase(phase) {}
     
       void do_void();
     
    diff --git a/src/hotspot/share/gc/g1/g1CollectionSet.cpp b/src/hotspot/share/gc/g1/g1CollectionSet.cpp
    index f5e40e21ad2..2a2d1af52b4 100644
    --- a/src/hotspot/share/gc/g1/g1CollectionSet.cpp
    +++ b/src/hotspot/share/gc/g1/g1CollectionSet.cpp
    @@ -23,15 +23,17 @@
      */
     
     #include "precompiled.hpp"
    -#include "gc/g1/g1CollectedHeap.hpp"
    +#include "gc/g1/g1CollectedHeap.inline.hpp"
     #include "gc/g1/g1CollectionSet.hpp"
     #include "gc/g1/g1CollectorState.hpp"
    +#include "gc/g1/g1ParScanThreadState.hpp"
     #include "gc/g1/g1Policy.hpp"
     #include "gc/g1/heapRegion.inline.hpp"
     #include "gc/g1/heapRegionRemSet.hpp"
     #include "gc/g1/heapRegionSet.hpp"
     #include "logging/logStream.hpp"
     #include "utilities/debug.hpp"
    +#include "utilities/globalDefinitions.hpp"
     #include "utilities/quickSort.hpp"
     
     G1CollectorState* G1CollectionSet::collector_state() {
    @@ -60,6 +62,9 @@ G1CollectionSet::G1CollectionSet(G1CollectedHeap* g1h, G1Policy* policy) :
       _collection_set_regions(NULL),
       _collection_set_cur_length(0),
       _collection_set_max_length(0),
    +  _optional_regions(NULL),
    +  _optional_region_length(0),
    +  _optional_region_max_length(0),
       _bytes_used_before(0),
       _recorded_rs_lengths(0),
       _inc_build_state(Inactive),
    @@ -74,6 +79,7 @@ G1CollectionSet::~G1CollectionSet() {
       if (_collection_set_regions != NULL) {
         FREE_C_HEAP_ARRAY(uint, _collection_set_regions);
       }
    +  free_optional_regions();
       delete _cset_chooser;
     }
     
    @@ -88,6 +94,7 @@ void G1CollectionSet::init_region_lengths(uint eden_cset_region_length,
              "Young region length %u should match collection set length " SIZE_FORMAT, young_region_length(), _collection_set_cur_length);
     
       _old_region_length      = 0;
    +  _optional_region_length = 0;
     }
     
     void G1CollectionSet::initialize(uint max_region_length) {
    @@ -96,6 +103,23 @@ void G1CollectionSet::initialize(uint max_region_length) {
       _collection_set_regions = NEW_C_HEAP_ARRAY(uint, max_region_length, mtGC);
     }
     
    +void G1CollectionSet::initialize_optional(uint max_length) {
    +  assert(_optional_regions == NULL, "Already initialized");
    +  assert(_optional_region_length == 0, "Already initialized");
    +  assert(_optional_region_max_length == 0, "Already initialized");
    +  _optional_region_max_length = max_length;
    +  _optional_regions = NEW_C_HEAP_ARRAY(HeapRegion*, _optional_region_max_length, mtGC);
    +}
    +
    +void G1CollectionSet::free_optional_regions() {
    +  _optional_region_length = 0;
    +  _optional_region_max_length = 0;
    +  if (_optional_regions != NULL) {
    +    FREE_C_HEAP_ARRAY(HeapRegion*, _optional_regions);
    +    _optional_regions = NULL;
    +  }
    +}
    +
     void G1CollectionSet::set_recorded_rs_lengths(size_t rs_lengths) {
       _recorded_rs_lengths = rs_lengths;
     }
    @@ -104,7 +128,8 @@ void G1CollectionSet::set_recorded_rs_lengths(size_t rs_lengths) {
     void G1CollectionSet::add_old_region(HeapRegion* hr) {
       assert_at_safepoint_on_vm_thread();
     
    -  assert(_inc_build_state == Active, "Precondition");
    +  assert(_inc_build_state == Active || hr->index_in_opt_cset() != G1OptionalCSet::InvalidCSetIndex,
    +         "Precondition, actively building cset or adding optional later on");
       assert(hr->is_old(), "the region should be old");
     
       assert(!hr->in_collection_set(), "should not already be in the CSet");
    @@ -117,6 +142,22 @@ void G1CollectionSet::add_old_region(HeapRegion* hr) {
       size_t rs_length = hr->rem_set()->occupied();
       _recorded_rs_lengths += rs_length;
       _old_region_length += 1;
    +
    +  log_trace(gc, cset)("Added old region %d to collection set", hr->hrm_index());
    +}
    +
    +void G1CollectionSet::add_optional_region(HeapRegion* hr) {
    +  assert(!optional_is_full(), "Precondition, must have room left for this region");
    +  assert(hr->is_old(), "the region should be old");
    +  assert(!hr->in_collection_set(), "should not already be in the CSet");
    +
    +  _g1h->register_optional_region_with_cset(hr);
    +
    +  _optional_regions[_optional_region_length] = hr;
    +  uint index = _optional_region_length++;
    +  hr->set_index_in_opt_cset(index);
    +
    +  log_trace(gc, cset)("Added region %d to optional collection set (%u)", hr->hrm_index(), _optional_region_length);
     }
     
     // Initialize the per-collection-set information
    @@ -168,6 +209,7 @@ void G1CollectionSet::finalize_incremental_building() {
     void G1CollectionSet::clear() {
       assert_at_safepoint_on_vm_thread();
       _collection_set_cur_length = 0;
    +  _optional_region_length = 0;
     }
     
     void G1CollectionSet::iterate(HeapRegionClosure* cl) const {
    @@ -396,6 +438,30 @@ double G1CollectionSet::finalize_young_part(double target_pause_time_ms, G1Survi
       return time_remaining_ms;
     }
     
    +void G1CollectionSet::add_as_old(HeapRegion* hr) {
    +  cset_chooser()->pop(); // already have region via peek()
    +  _g1h->old_set_remove(hr);
    +  add_old_region(hr);
    +}
    +
    +void G1CollectionSet::add_as_optional(HeapRegion* hr) {
    +  assert(_optional_regions != NULL, "Must not be called before array is allocated");
    +  cset_chooser()->pop(); // already have region via peek()
    +  _g1h->old_set_remove(hr);
    +  add_optional_region(hr);
    +}
    +
    +bool G1CollectionSet::optional_is_full() {
    +  assert(_optional_region_length <= _optional_region_max_length, "Invariant");
    +  return _optional_region_length == _optional_region_max_length;
    +}
    +
    +void G1CollectionSet::clear_optional_region(const HeapRegion* hr) {
    +  assert(_optional_regions != NULL, "Must not be called before array is allocated");
    +  uint index = hr->index_in_opt_cset();
    +  _optional_regions[index] = NULL;
    +}
    +
     static int compare_region_idx(const uint a, const uint b) {
       if (a > b) {
         return 1;
    @@ -409,21 +475,28 @@ static int compare_region_idx(const uint a, const uint b) {
     void G1CollectionSet::finalize_old_part(double time_remaining_ms) {
       double non_young_start_time_sec = os::elapsedTime();
       double predicted_old_time_ms = 0.0;
    +  double predicted_optional_time_ms = 0.0;
    +  double optional_threshold_ms = time_remaining_ms * _policy->optional_prediction_fraction();
    +  uint expensive_region_num = 0;
     
       if (collector_state()->in_mixed_phase()) {
         cset_chooser()->verify();
         const uint min_old_cset_length = _policy->calc_min_old_cset_length();
    -    const uint max_old_cset_length = _policy->calc_max_old_cset_length();
    -
    -    uint expensive_region_num = 0;
    +    const uint max_old_cset_length = MAX2(min_old_cset_length, _policy->calc_max_old_cset_length());
         bool check_time_remaining = _policy->adaptive_young_list_length();
     
    +    initialize_optional(max_old_cset_length - min_old_cset_length);
    +    log_debug(gc, ergo, cset)("Start adding old regions for mixed gc. min %u regions, max %u regions, "
    +                              "time remaining %1.2fms, optional threshold %1.2fms",
    +                              min_old_cset_length, max_old_cset_length, time_remaining_ms, optional_threshold_ms);
    +
         HeapRegion* hr = cset_chooser()->peek();
         while (hr != NULL) {
    -      if (old_region_length() >= max_old_cset_length) {
    +      if (old_region_length() + optional_region_length() >= max_old_cset_length) {
             // Added maximum number of old regions to the CSet.
    -        log_debug(gc, ergo, cset)("Finish adding old regions to CSet (old CSet region num reached max). old %u regions, max %u regions",
    -                                  old_region_length(), max_old_cset_length);
    +        log_debug(gc, ergo, cset)("Finish adding old regions to CSet (old CSet region num reached max). "
    +                                  "old %u regions, optional %u regions",
    +                                  old_region_length(), optional_region_length());
             break;
           }
     
    @@ -437,69 +510,66 @@ void G1CollectionSet::finalize_old_part(double time_remaining_ms) {
             // reclaimable space is at or below the waste threshold. Stop
             // adding old regions to the CSet.
             log_debug(gc, ergo, cset)("Finish adding old regions to CSet (reclaimable percentage not over threshold). "
    -                                  "old %u regions, max %u regions, reclaimable: " SIZE_FORMAT "B (%1.2f%%) threshold: " UINTX_FORMAT "%%",
    -                                  old_region_length(), max_old_cset_length, reclaimable_bytes, reclaimable_percent, G1HeapWastePercent);
    +                                  "reclaimable: " SIZE_FORMAT "%s (%1.2f%%) threshold: " UINTX_FORMAT "%%",
    +                                  byte_size_in_proper_unit(reclaimable_bytes), proper_unit_for_byte_size(reclaimable_bytes),
    +                                  reclaimable_percent, G1HeapWastePercent);
             break;
           }
     
           double predicted_time_ms = predict_region_elapsed_time_ms(hr);
    -      if (check_time_remaining) {
    -        if (predicted_time_ms > time_remaining_ms) {
    -          // Too expensive for the current CSet.
    -
    -          if (old_region_length() >= min_old_cset_length) {
    -            // We have added the minimum number of old regions to the CSet,
    -            // we are done with this CSet.
    -            log_debug(gc, ergo, cset)("Finish adding old regions to CSet (predicted time is too high). "
    -                                      "predicted time: %1.2fms, remaining time: %1.2fms old %u regions, min %u regions",
    -                                      predicted_time_ms, time_remaining_ms, old_region_length(), min_old_cset_length);
    -            break;
    -          }
    -
    -          // We'll add it anyway given that we haven't reached the
    -          // minimum number of old regions.
    -          expensive_region_num += 1;
    +      time_remaining_ms = MAX2(time_remaining_ms - predicted_time_ms, 0.0);
    +      // Add regions to old set until we reach minimum amount
    +      if (old_region_length() < min_old_cset_length) {
    +        predicted_old_time_ms += predicted_time_ms;
    +        add_as_old(hr);
    +        // Record the number of regions added when no time remaining
    +        if (time_remaining_ms == 0.0) {
    +          expensive_region_num++;
             }
           } else {
    -        if (old_region_length() >= min_old_cset_length) {
    -          // In the non-auto-tuning case, we'll finish adding regions
    -          // to the CSet if we reach the minimum.
    -
    -          log_debug(gc, ergo, cset)("Finish adding old regions to CSet (old CSet region num reached min). old %u regions, min %u regions",
    -                                    old_region_length(), min_old_cset_length);
    +        // In the non-auto-tuning case, we'll finish adding regions
    +        // to the CSet if we reach the minimum.
    +        if (!check_time_remaining) {
    +          log_debug(gc, ergo, cset)("Finish adding old regions to CSet (old CSet region num reached min).");
    +          break;
    +        }
    +        // Keep adding regions to old set until we reach optional threshold
    +        if (time_remaining_ms > optional_threshold_ms) {
    +          predicted_old_time_ms += predicted_time_ms;
    +          add_as_old(hr);
    +        } else if (time_remaining_ms > 0) {
    +          // Keep adding optional regions until time is up
    +          if (!optional_is_full()) {
    +            predicted_optional_time_ms += predicted_time_ms;
    +            add_as_optional(hr);
    +          } else {
    +            log_debug(gc, ergo, cset)("Finish adding old regions to CSet (optional set full).");
    +            break;
    +          }
    +        } else {
    +          log_debug(gc, ergo, cset)("Finish adding old regions to CSet (predicted time is too high).");
               break;
             }
           }
    -
    -      // We will add this region to the CSet.
    -      time_remaining_ms = MAX2(time_remaining_ms - predicted_time_ms, 0.0);
    -      predicted_old_time_ms += predicted_time_ms;
    -      cset_chooser()->pop(); // already have region via peek()
    -      _g1h->old_set_remove(hr);
    -      add_old_region(hr);
    -
           hr = cset_chooser()->peek();
         }
         if (hr == NULL) {
           log_debug(gc, ergo, cset)("Finish adding old regions to CSet (candidate old regions not available)");
         }
     
    -    if (expensive_region_num > 0) {
    -      // We print the information once here at the end, predicated on
    -      // whether we added any apparently expensive regions or not, to
    -      // avoid generating output per region.
    -      log_debug(gc, ergo, cset)("Added expensive regions to CSet (old CSet region num not reached min)."
    -                                "old: %u regions, expensive: %u regions, min: %u regions, remaining time: %1.2fms",
    -                                old_region_length(), expensive_region_num, min_old_cset_length, time_remaining_ms);
    -    }
    -
         cset_chooser()->verify();
       }
     
       stop_incremental_building();
     
    -  log_debug(gc, ergo, cset)("Finish choosing CSet. old: %u regions, predicted old region time: %1.2fms, time remaining: %1.2f",
    -                            old_region_length(), predicted_old_time_ms, time_remaining_ms);
    +  log_debug(gc, ergo, cset)("Finish choosing CSet regions old: %u, optional: %u, "
    +                            "predicted old time: %1.2fms, predicted optional time: %1.2fms, time remaining: %1.2f",
    +                            old_region_length(), optional_region_length(),
    +                            predicted_old_time_ms, predicted_optional_time_ms, time_remaining_ms);
    +  if (expensive_region_num > 0) {
    +    log_debug(gc, ergo, cset)("CSet contains %u old regions that were added although the predicted time was too high.",
    +                              expensive_region_num);
    +  }
     
       double non_young_end_time_sec = os::elapsedTime();
       phase_times()->record_non_young_cset_choice_time_ms((non_young_end_time_sec - non_young_start_time_sec) * 1000.0);
    @@ -507,6 +577,86 @@ void G1CollectionSet::finalize_old_part(double time_remaining_ms) {
       QuickSort::sort(_collection_set_regions, _collection_set_cur_length, compare_region_idx, true);
     }
     
    +HeapRegion* G1OptionalCSet::region_at(uint index) {
    +  return _cset->optional_region_at(index);
    +}
    +
    +void G1OptionalCSet::prepare_evacuation(double time_limit) {
    +  assert(_current_index == _current_limit, "Before prepare no regions should be ready for evac");
    +
    +  uint prepared_regions = 0;
    +  double prediction_ms = 0;
    +
    +  _prepare_failed = true;
    +  for (uint i = _current_index; i < _cset->optional_region_length(); i++) {
    +    HeapRegion* hr = region_at(i);
    +    prediction_ms += _cset->predict_region_elapsed_time_ms(hr);
    +    if (prediction_ms > time_limit) {
    +      log_debug(gc, cset)("Prepared %u regions for optional evacuation. Predicted time: %.3fms", prepared_regions, prediction_ms);
    +      return;
    +    }
    +
    +    // This region will be included in the next optional evacuation.
    +    prepare_to_evacuate_optional_region(hr);
    +    prepared_regions++;
    +    _current_limit++;
    +    _prepare_failed = false;
    +  }
    +
    +  log_debug(gc, cset)("Prepared all %u regions for optional evacuation. Predicted time: %.3fms",
    +                      prepared_regions, prediction_ms);
    +}
    +
    +bool G1OptionalCSet::prepare_failed() {
    +  return _prepare_failed;
    +}
    +
    +void G1OptionalCSet::complete_evacuation() {
    +  _evacuation_failed = false;
    +  for (uint i = _current_index; i < _current_limit; i++) {
    +    HeapRegion* hr = region_at(i);
    +    _cset->clear_optional_region(hr);
    +    if (hr->evacuation_failed()){
    +      _evacuation_failed = true;
    +    }
    +  }
    +  _current_index = _current_limit;
    +}
    +
    +bool G1OptionalCSet::evacuation_failed() {
    +  return _evacuation_failed;
    +}
    +
    +G1OptionalCSet::~G1OptionalCSet() {
    +  G1CollectedHeap* g1h = G1CollectedHeap::heap();
    +  while (!is_empty()) {
    +    // We want to return regions not evacuated to the
    +    // chooser in reverse order to maintain the old order.
    +    HeapRegion* hr = _cset->remove_last_optional_region();
    +    assert(hr != NULL, "Should be valid region left");
    +    _pset->record_unused_optional_region(hr);
    +    g1h->old_set_add(hr);
    +    g1h->clear_in_cset(hr);
    +    hr->set_index_in_opt_cset(InvalidCSetIndex);
    +    _cset->cset_chooser()->push(hr);
    +  }
    +  _cset->free_optional_regions();
    +}
    +
    +uint G1OptionalCSet::size() {
    +  return _cset->optional_region_length() - _current_index;
    +}
    +
    +bool G1OptionalCSet::is_empty() {
    +  return size() == 0;
    +}
    +
    +void G1OptionalCSet::prepare_to_evacuate_optional_region(HeapRegion* hr) {
    +  log_trace(gc, cset)("Adding region %u for optional evacuation", hr->hrm_index());
    +  G1CollectedHeap::heap()->clear_in_cset(hr);
    +  _cset->add_old_region(hr);
    +}
    +
     #ifdef ASSERT
     class G1VerifyYoungCSetIndicesClosure : public HeapRegionClosure {
     private:
    diff --git a/src/hotspot/share/gc/g1/g1CollectionSet.hpp b/src/hotspot/share/gc/g1/g1CollectionSet.hpp
    index 0ddd0c1fbff..63bc5833e71 100644
    --- a/src/hotspot/share/gc/g1/g1CollectionSet.hpp
    +++ b/src/hotspot/share/gc/g1/g1CollectionSet.hpp
    @@ -32,6 +32,7 @@
     class G1CollectedHeap;
     class G1CollectorState;
     class G1GCPhaseTimes;
    +class G1ParScanThreadStateSet;
     class G1Policy;
     class G1SurvivorRegions;
     class HeapRegion;
    @@ -56,6 +57,13 @@ class G1CollectionSet {
       volatile size_t _collection_set_cur_length;
       size_t _collection_set_max_length;
     
    +  // When doing mixed collections we can add old regions to the collection, which
    +  // can be collected if there is enough time. We call these optional regions and
    +  // the pointer to these regions are stored in the array below.
    +  HeapRegion** _optional_regions;
    +  uint _optional_region_length;
    +  uint _optional_region_max_length;
    +
       // The number of bytes in the collection set before the pause. Set from
       // the incrementally built collection set at the start of an evacuation
       // pause, and incremented in finalize_old_part() when adding old regions
    @@ -106,15 +114,19 @@ class G1CollectionSet {
       G1CollectorState* collector_state();
       G1GCPhaseTimes* phase_times();
     
    -  double predict_region_elapsed_time_ms(HeapRegion* hr);
    -
       void verify_young_cset_indices() const NOT_DEBUG_RETURN;
    +  void add_as_optional(HeapRegion* hr);
    +  void add_as_old(HeapRegion* hr);
    +  bool optional_is_full();
    +
     public:
       G1CollectionSet(G1CollectedHeap* g1h, G1Policy* policy);
       ~G1CollectionSet();
     
       // Initializes the collection set giving the maximum possible length of the collection set.
       void initialize(uint max_region_length);
    +  void initialize_optional(uint max_length);
    +  void free_optional_regions();
     
       CollectionSetChooser* cset_chooser();
     
    @@ -131,6 +143,7 @@ public:
       uint eden_region_length() const     { return _eden_region_length;     }
       uint survivor_region_length() const { return _survivor_region_length; }
       uint old_region_length() const      { return _old_region_length;      }
    +  uint optional_region_length() const { return _optional_region_length; }
     
       // Incremental collection set support
     
    @@ -175,6 +188,9 @@ public:
       // Add old region "hr" to the collection set.
       void add_old_region(HeapRegion* hr);
     
    +  // Add old region "hr" to optional collection set.
    +  void add_optional_region(HeapRegion* hr);
    +
       // Update information about hr in the aggregated information for
       // the incrementally built collection set.
       void update_young_region_prediction(HeapRegion* hr, size_t new_rs_length);
    @@ -191,10 +207,73 @@ public:
       void print(outputStream* st);
     #endif // !PRODUCT
     
    +  double predict_region_elapsed_time_ms(HeapRegion* hr);
    +
    +  void clear_optional_region(const HeapRegion* hr);
    +
    +  HeapRegion* optional_region_at(uint i) const {
    +    assert(_optional_regions != NULL, "Not yet initialized");
    +    assert(i < _optional_region_length, "index %u out of bounds (%u)", i, _optional_region_length);
    +    return _optional_regions[i];
    +  }
    +
    +  HeapRegion* remove_last_optional_region() {
    +    assert(_optional_regions != NULL, "Not yet initialized");
    +    assert(_optional_region_length != 0, "No region to remove");
    +    _optional_region_length--;
    +    HeapRegion* removed = _optional_regions[_optional_region_length];
    +    _optional_regions[_optional_region_length] = NULL;
    +    return removed;
    +  }
    +
     private:
       // Update the incremental collection set information when adding a region.
       void add_young_region_common(HeapRegion* hr);
     };
     
    +// Helper class to manage the optional regions in a Mixed collection.
    +class G1OptionalCSet : public StackObj {
    +private:
    +  G1CollectionSet* _cset;
    +  G1ParScanThreadStateSet* _pset;
    +  uint _current_index;
    +  uint _current_limit;
    +  bool _prepare_failed;
    +  bool _evacuation_failed;
    +
    +  void prepare_to_evacuate_optional_region(HeapRegion* hr);
    +
    +public:
    +  static const uint InvalidCSetIndex = UINT_MAX;
    +
    +  G1OptionalCSet(G1CollectionSet* cset, G1ParScanThreadStateSet* pset) :
    +    _cset(cset),
    +    _pset(pset),
    +    _current_index(0),
    +    _current_limit(0),
    +    _prepare_failed(false),
    +    _evacuation_failed(false) { }
    +  // The destructor returns regions to the cset-chooser and
    +  // frees the optional structure in the cset.
    +  ~G1OptionalCSet();
    +
    +  uint current_index() { return _current_index; }
    +  uint current_limit() { return _current_limit; }
    +
    +  uint size();
    +  bool is_empty();
    +
    +  HeapRegion* region_at(uint index);
    +
    +  // Prepare a set of regions for optional evacuation.
    +  void prepare_evacuation(double time_left_ms);
    +  bool prepare_failed();
    +
    +  // Complete the evacuation of the previously prepared
    +  // regions by updating their state and check for failures.
    +  void complete_evacuation();
    +  bool evacuation_failed();
    +};
    +
     #endif // SHARE_VM_GC_G1_G1COLLECTIONSET_HPP
     
    diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp
    index 0046b7d8675..17a711ade47 100644
    --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp
    +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp
    @@ -39,18 +39,18 @@
     #include "gc/g1/heapRegion.inline.hpp"
     #include "gc/g1/heapRegionRemSet.hpp"
     #include "gc/g1/heapRegionSet.inline.hpp"
    -#include "gc/shared/adaptiveSizePolicy.hpp"
     #include "gc/shared/gcId.hpp"
     #include "gc/shared/gcTimer.hpp"
     #include "gc/shared/gcTrace.hpp"
     #include "gc/shared/gcTraceTime.inline.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "gc/shared/genOopClosures.inline.hpp"
     #include "gc/shared/referencePolicy.hpp"
     #include "gc/shared/strongRootsScope.hpp"
     #include "gc/shared/suspendibleThreadSet.hpp"
     #include "gc/shared/taskqueue.inline.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
     #include "gc/shared/weakProcessor.inline.hpp"
    +#include "gc/shared/workerPolicy.hpp"
     #include "include/jvm.h"
     #include "logging/log.hpp"
     #include "memory/allocation.hpp"
    @@ -255,21 +255,35 @@ void G1CMMarkStack::set_empty() {
       _free_list = NULL;
     }
     
    -G1CMRootRegions::G1CMRootRegions() :
    -  _survivors(NULL), _cm(NULL), _scan_in_progress(false),
    -  _should_abort(false), _claimed_survivor_index(0) { }
    +G1CMRootRegions::G1CMRootRegions(uint const max_regions) :
    +  _root_regions(NEW_C_HEAP_ARRAY(HeapRegion*, max_regions, mtGC)),
    +  _max_regions(max_regions),
    +  _num_root_regions(0),
    +  _claimed_root_regions(0),
    +  _scan_in_progress(false),
    +  _should_abort(false) { }
     
    -void G1CMRootRegions::init(const G1SurvivorRegions* survivors, G1ConcurrentMark* cm) {
    -  _survivors = survivors;
    -  _cm = cm;
    +G1CMRootRegions::~G1CMRootRegions() {
    +  FREE_C_HEAP_ARRAY(HeapRegion*, _max_regions);
    +}
    +
    +void G1CMRootRegions::reset() {
    +  _num_root_regions = 0;
    +}
    +
    +void G1CMRootRegions::add(HeapRegion* hr) {
    +  assert_at_safepoint();
    +  size_t idx = Atomic::add((size_t)1, &_num_root_regions) - 1;
    +  assert(idx < _max_regions, "Trying to add more root regions than there is space " SIZE_FORMAT, _max_regions);
    +  _root_regions[idx] = hr;
     }
     
     void G1CMRootRegions::prepare_for_scan() {
       assert(!scan_in_progress(), "pre-condition");
     
    -  // Currently, only survivors can be root regions.
    -  _claimed_survivor_index = 0;
    -  _scan_in_progress = _survivors->regions()->is_nonempty();
    +  _scan_in_progress = _num_root_regions > 0;
    +
    +  _claimed_root_regions = 0;
       _should_abort = false;
     }
     
    @@ -280,18 +294,19 @@ HeapRegion* G1CMRootRegions::claim_next() {
         return NULL;
       }
     
    -  // Currently, only survivors can be root regions.
    -  const GrowableArray* survivor_regions = _survivors->regions();
    +  if (_claimed_root_regions >= _num_root_regions) {
    +    return NULL;
    +  }
     
    -  int claimed_index = Atomic::add(1, &_claimed_survivor_index) - 1;
    -  if (claimed_index < survivor_regions->length()) {
    -    return survivor_regions->at(claimed_index);
    +  size_t claimed_index = Atomic::add((size_t)1, &_claimed_root_regions) - 1;
    +  if (claimed_index < _num_root_regions) {
    +    return _root_regions[claimed_index];
       }
       return NULL;
     }
     
     uint G1CMRootRegions::num_root_regions() const {
    -  return (uint)_survivors->regions()->length();
    +  return (uint)_num_root_regions;
     }
     
     void G1CMRootRegions::notify_scan_done() {
    @@ -307,12 +322,10 @@ void G1CMRootRegions::cancel_scan() {
     void G1CMRootRegions::scan_finished() {
       assert(scan_in_progress(), "pre-condition");
     
    -  // Currently, only survivors can be root regions.
       if (!_should_abort) {
    -    assert(_claimed_survivor_index >= 0, "otherwise comparison is invalid: %d", _claimed_survivor_index);
    -    assert((uint)_claimed_survivor_index >= _survivors->length(),
    -           "we should have claimed all survivors, claimed index = %u, length = %u",
    -           (uint)_claimed_survivor_index, _survivors->length());
    +    assert(_claimed_root_regions >= num_root_regions(),
    +           "we should have claimed all root regions, claimed " SIZE_FORMAT ", length = %u",
    +           _claimed_root_regions, num_root_regions());
       }
     
       notify_scan_done();
    @@ -353,7 +366,7 @@ G1ConcurrentMark::G1ConcurrentMark(G1CollectedHeap* g1h,
     
       _heap(_g1h->reserved_region()),
     
    -  _root_regions(),
    +  _root_regions(_g1h->max_regions()),
     
       _global_mark_stack(),
     
    @@ -365,7 +378,7 @@ G1ConcurrentMark::G1ConcurrentMark(G1CollectedHeap* g1h,
       // _tasks set inside the constructor
     
       _task_queues(new G1CMTaskQueueSet((int) _max_num_tasks)),
    -  _terminator(ParallelTaskTerminator((int) _max_num_tasks, _task_queues)),
    +  _terminator((int) _max_num_tasks, _task_queues),
     
       _first_overflow_barrier_sync(),
       _second_overflow_barrier_sync(),
    @@ -406,8 +419,6 @@ G1ConcurrentMark::G1ConcurrentMark(G1CollectedHeap* g1h,
     
       assert(CGC_lock != NULL, "CGC_lock must be initialized");
     
    -  _root_regions.init(_g1h->survivor(), this);
    -
       if (FLAG_IS_DEFAULT(ConcGCThreads) || ConcGCThreads == 0) {
         // Calculate the number of concurrent worker threads by scaling
         // the number of parallel GC threads.
    @@ -577,7 +588,7 @@ void G1ConcurrentMark::set_concurrency(uint active_tasks) {
       _num_active_tasks = active_tasks;
       // Need to update the three data structures below according to the
       // number of active threads for this phase.
    -  _terminator = ParallelTaskTerminator((int) active_tasks, _task_queues);
    +  _terminator = TaskTerminator((int) active_tasks, _task_queues);
       _first_overflow_barrier_sync.set_n_workers((int) active_tasks);
       _second_overflow_barrier_sync.set_n_workers((int) active_tasks);
     }
    @@ -728,6 +739,8 @@ void G1ConcurrentMark::pre_initial_mark() {
       // For each region note start of marking.
       NoteStartOfMarkHRClosure startcl;
       _g1h->heap_region_iterate(&startcl);
    +
    +  _root_regions.reset();
     }
     
     
    @@ -845,10 +858,10 @@ uint G1ConcurrentMark::calc_active_marking_workers() {
         result = _max_concurrent_workers;
       } else {
         result =
    -      AdaptiveSizePolicy::calc_default_active_workers(_max_concurrent_workers,
    -                                                      1, /* Minimum workers */
    -                                                      _num_concurrent_workers,
    -                                                      Threads::number_of_non_daemon_threads());
    +      WorkerPolicy::calc_default_active_workers(_max_concurrent_workers,
    +                                                1, /* Minimum workers */
    +                                                _num_concurrent_workers,
    +                                                Threads::number_of_non_daemon_threads());
         // Don't scale the result down by scale_concurrent_workers() because
         // that scaling has already gone into "_max_concurrent_workers".
       }
    @@ -859,12 +872,12 @@ uint G1ConcurrentMark::calc_active_marking_workers() {
     }
     
     void G1ConcurrentMark::scan_root_region(HeapRegion* hr, uint worker_id) {
    -  // Currently, only survivors can be root regions.
    -  assert(hr->next_top_at_mark_start() == hr->bottom(), "invariant");
    +  assert(hr->is_old() || (hr->is_survivor() && hr->next_top_at_mark_start() == hr->bottom()),
    +         "Root regions must be old or survivor but region %u is %s", hr->hrm_index(), hr->get_type_str());
       G1RootRegionScanClosure cl(_g1h, this, worker_id);
     
       const uintx interval = PrefetchScanIntervalInBytes;
    -  HeapWord* curr = hr->bottom();
    +  HeapWord* curr = hr->next_top_at_mark_start();
       const HeapWord* end = hr->top();
       while (curr < end) {
         Prefetch::read(curr, interval);
    diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp
    index 1cba7828297..a12d8d72bb3 100644
    --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp
    +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp
    @@ -224,34 +224,37 @@ private:
       template void iterate(Fn fn) const PRODUCT_RETURN;
     };
     
    -// Root Regions are regions that are not empty at the beginning of a
    -// marking cycle and which we might collect during an evacuation pause
    -// while the cycle is active. Given that, during evacuation pauses, we
    -// do not copy objects that are explicitly marked, what we have to do
    -// for the root regions is to scan them and mark all objects reachable
    -// from them. According to the SATB assumptions, we only need to visit
    -// each object once during marking. So, as long as we finish this scan
    -// before the next evacuation pause, we can copy the objects from the
    -// root regions without having to mark them or do anything else to them.
    -//
    -// Currently, we only support root region scanning once (at the start
    -// of the marking cycle) and the root regions are all the survivor
    -// regions populated during the initial-mark pause.
    +// Root Regions are regions that contain objects from nTAMS to top. These are roots
    +// for marking, i.e. their referenced objects must be kept alive to maintain the
    +// SATB invariant.
    +// We could scan and mark them through during the initial-mark pause, but for
    +// pause time reasons we move this work to the concurrent phase.
    +// We need to complete this procedure before the next GC because it might determine
    +// that some of these "root objects" are dead, potentially dropping some required
    +// references.
    +// Root regions comprise of the complete contents of survivor regions, and any
    +// objects copied into old gen during GC.
     class G1CMRootRegions {
    -private:
    -  const G1SurvivorRegions* _survivors;
    -  G1ConcurrentMark*        _cm;
    +  HeapRegion** _root_regions;
    +  size_t const _max_regions;
     
    -  volatile bool            _scan_in_progress;
    -  volatile bool            _should_abort;
    -  volatile int             _claimed_survivor_index;
    +  volatile size_t _num_root_regions; // Actual number of root regions.
    +
    +  volatile size_t _claimed_root_regions; // Number of root regions currently claimed.
    +
    +  volatile bool _scan_in_progress;
    +  volatile bool _should_abort;
     
       void notify_scan_done();
     
     public:
    -  G1CMRootRegions();
    -  // We actually do most of the initialization in this method.
    -  void init(const G1SurvivorRegions* survivors, G1ConcurrentMark* cm);
    +  G1CMRootRegions(uint const max_regions);
    +  ~G1CMRootRegions();
    +
    +  // Reset the data structure to allow addition of new root regions.
    +  void reset();
    +
    +  void add(HeapRegion* hr);
     
       // Reset the claiming / scanning of the root regions.
       void prepare_for_scan();
    @@ -322,8 +325,8 @@ class G1ConcurrentMark : public CHeapObj {
       uint                    _num_active_tasks; // Number of tasks currently active
       G1CMTask**              _tasks;            // Task queue array (max_worker_id length)
     
    -  G1CMTaskQueueSet*       _task_queues;      // Task queue set
    -  ParallelTaskTerminator  _terminator;       // For termination
    +  G1CMTaskQueueSet*       _task_queues; // Task queue set
    +  TaskTerminator          _terminator;  // For termination
     
       // Two sync barriers that are used to synchronize tasks when an
       // overflow occurs. The algorithm is the following. All tasks enter
    @@ -409,10 +412,10 @@ class G1ConcurrentMark : public CHeapObj {
       // Prints all gathered CM-related statistics
       void print_stats();
     
    -  HeapWord*               finger()          { return _finger;   }
    -  bool                    concurrent()      { return _concurrent; }
    -  uint                    active_tasks()    { return _num_active_tasks; }
    -  ParallelTaskTerminator* terminator()      { return &_terminator; }
    +  HeapWord*               finger()           { return _finger;   }
    +  bool                    concurrent()       { return _concurrent; }
    +  uint                    active_tasks()     { return _num_active_tasks; }
    +  ParallelTaskTerminator* terminator() const { return _terminator.terminator(); }
     
       // Claims the next available region to be scanned by a marking
       // task/thread. It might return NULL if the next region is empty or
    @@ -553,7 +556,7 @@ public:
       // them.
       void scan_root_regions();
     
    -  // Scan a single root region and mark everything reachable from it.
    +  // Scan a single root region from nTAMS to top and mark everything reachable from it.
       void scan_root_region(HeapRegion* hr, uint worker_id);
     
       // Do concurrent phase of marking, to a tentative transitive closure.
    @@ -593,10 +596,8 @@ public:
       void print_on_error(outputStream* st) const;
     
       // Mark the given object on the next bitmap if it is below nTAMS.
    -  // If the passed obj_size is zero, it is recalculated from the given object if
    -  // needed. This is to be as lazy as possible with accessing the object's size.
    -  inline bool mark_in_next_bitmap(uint worker_id, HeapRegion* const hr, oop const obj, size_t const obj_size = 0);
    -  inline bool mark_in_next_bitmap(uint worker_id, oop const obj, size_t const obj_size = 0);
    +  inline bool mark_in_next_bitmap(uint worker_id, HeapRegion* const hr, oop const obj);
    +  inline bool mark_in_next_bitmap(uint worker_id, oop const obj);
     
       inline bool is_marked_in_next_bitmap(oop p) const;
     
    diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp
    index 46d28bd4707..226b650f403 100644
    --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp
    +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp
    @@ -55,12 +55,12 @@ inline bool G1CMSubjectToDiscoveryClosure::do_object_b(oop obj) {
       return _g1h->heap_region_containing(obj)->is_old_or_humongous_or_archive();
     }
     
    -inline bool G1ConcurrentMark::mark_in_next_bitmap(uint const worker_id, oop const obj, size_t const obj_size) {
    +inline bool G1ConcurrentMark::mark_in_next_bitmap(uint const worker_id, oop const obj) {
       HeapRegion* const hr = _g1h->heap_region_containing(obj);
    -  return mark_in_next_bitmap(worker_id, hr, obj, obj_size);
    +  return mark_in_next_bitmap(worker_id, hr, obj);
     }
     
    -inline bool G1ConcurrentMark::mark_in_next_bitmap(uint const worker_id, HeapRegion* const hr, oop const obj, size_t const obj_size) {
    +inline bool G1ConcurrentMark::mark_in_next_bitmap(uint const worker_id, HeapRegion* const hr, oop const obj) {
       assert(hr != NULL, "just checking");
       assert(hr->is_in_reserved(obj), "Attempting to mark object at " PTR_FORMAT " that is not contained in the given region %u", p2i(obj), hr->hrm_index());
     
    @@ -76,7 +76,7 @@ inline bool G1ConcurrentMark::mark_in_next_bitmap(uint const worker_id, HeapRegi
     
       bool success = _next_mark_bitmap->par_mark(obj_addr);
       if (success) {
    -    add_to_liveness(worker_id, obj, obj_size == 0 ? obj->size() : obj_size);
    +    add_to_liveness(worker_id, obj, obj->size());
       }
       return success;
     }
    diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMarkThread.cpp b/src/hotspot/share/gc/g1/g1ConcurrentMarkThread.cpp
    index 97f45566995..47df5fce0e3 100644
    --- a/src/hotspot/share/gc/g1/g1ConcurrentMarkThread.cpp
    +++ b/src/hotspot/share/gc/g1/g1ConcurrentMarkThread.cpp
    @@ -31,7 +31,7 @@
     #include "gc/g1/g1MMUTracker.hpp"
     #include "gc/g1/g1Policy.hpp"
     #include "gc/g1/g1RemSet.hpp"
    -#include "gc/g1/vm_operations_g1.hpp"
    +#include "gc/g1/g1VMOperations.hpp"
     #include "gc/shared/concurrentGCPhaseManager.hpp"
     #include "gc/shared/gcId.hpp"
     #include "gc/shared/gcTrace.hpp"
    @@ -339,7 +339,7 @@ void G1ConcurrentMarkThread::run_service() {
                                     TimeHelper::counter_to_millis(mark_end - mark_start));
               mark_manager.set_phase(G1ConcurrentPhase::REMARK, false);
               CMRemark cl(_cm);
    -          VM_CGC_Operation op(&cl, "Pause Remark");
    +          VM_G1Concurrent op(&cl, "Pause Remark");
               VMThread::execute(&op);
               if (_cm->has_aborted()) {
                 break;
    @@ -370,7 +370,7 @@ void G1ConcurrentMarkThread::run_service() {
     
           if (!_cm->has_aborted()) {
             CMCleanup cl_cl(_cm);
    -        VM_CGC_Operation op(&cl_cl, "Pause Cleanup");
    +        VM_G1Concurrent op(&cl_cl, "Pause Cleanup");
             VMThread::execute(&op);
           }
     
    diff --git a/src/hotspot/share/gc/g1/g1EvacFailure.cpp b/src/hotspot/share/gc/g1/g1EvacFailure.cpp
    index db54bc6ea47..c7875d30433 100644
    --- a/src/hotspot/share/gc/g1/g1EvacFailure.cpp
    +++ b/src/hotspot/share/gc/g1/g1EvacFailure.cpp
    @@ -126,7 +126,7 @@ public:
             // explicitly and all objects in the CSet are considered
             // (implicitly) live. So, we won't mark them explicitly and
             // we'll leave them over NTAMS.
    -        _cm->mark_in_next_bitmap(_worker_id, obj);
    +        _cm->mark_in_next_bitmap(_worker_id, _hr, obj);
           }
           size_t obj_size = obj->size();
     
    diff --git a/src/hotspot/share/gc/g1/g1FullCollector.cpp b/src/hotspot/share/gc/g1/g1FullCollector.cpp
    index 6369f6045c8..029a3ae5001 100644
    --- a/src/hotspot/share/gc/g1/g1FullCollector.cpp
    +++ b/src/hotspot/share/gc/g1/g1FullCollector.cpp
    @@ -37,11 +37,11 @@
     #include "gc/g1/g1OopClosures.hpp"
     #include "gc/g1/g1Policy.hpp"
     #include "gc/g1/g1StringDedup.hpp"
    -#include "gc/shared/adaptiveSizePolicy.hpp"
     #include "gc/shared/gcTraceTime.inline.hpp"
     #include "gc/shared/preservedMarks.hpp"
     #include "gc/shared/referenceProcessor.hpp"
     #include "gc/shared/weakProcessor.inline.hpp"
    +#include "gc/shared/workerPolicy.hpp"
     #include "logging/log.hpp"
     #include "runtime/biasedLocking.hpp"
     #include "runtime/handles.inline.hpp"
    @@ -88,15 +88,15 @@ uint G1FullCollector::calc_active_workers() {
       uint waste_worker_count = MAX2((max_wasted_regions_allowed * 2) , 1u);
       uint heap_waste_worker_limit = MIN2(waste_worker_count, max_worker_count);
     
    -  // Also consider HeapSizePerGCThread by calling AdaptiveSizePolicy to calculate
    +  // Also consider HeapSizePerGCThread by calling WorkerPolicy to calculate
       // the number of workers.
       uint current_active_workers = heap->workers()->active_workers();
    -  uint adaptive_worker_limit = AdaptiveSizePolicy::calc_active_workers(max_worker_count, current_active_workers, 0);
    +  uint active_worker_limit = WorkerPolicy::calc_active_workers(max_worker_count, current_active_workers, 0);
     
       // Update active workers to the lower of the limits.
    -  uint worker_count = MIN2(heap_waste_worker_limit, adaptive_worker_limit);
    +  uint worker_count = MIN2(heap_waste_worker_limit, active_worker_limit);
       log_debug(gc, task)("Requesting %u active workers for full compaction (waste limited workers: %u, adaptive workers: %u)",
    -                      worker_count, heap_waste_worker_limit, adaptive_worker_limit);
    +                      worker_count, heap_waste_worker_limit, active_worker_limit);
       worker_count = heap->workers()->update_active_workers(worker_count);
       log_info(gc, task)("Using %u workers of %u for full compaction", worker_count, max_worker_count);
     
    diff --git a/src/hotspot/share/gc/g1/g1FullGCMarkTask.cpp b/src/hotspot/share/gc/g1/g1FullGCMarkTask.cpp
    index 4700a530109..22e5178c579 100644
    --- a/src/hotspot/share/gc/g1/g1FullGCMarkTask.cpp
    +++ b/src/hotspot/share/gc/g1/g1FullGCMarkTask.cpp
    @@ -61,7 +61,7 @@ void G1FullGCMarkTask::work(uint worker_id) {
       }
     
       // Mark stack is populated, now process and drain it.
    -  marker->complete_marking(collector()->oop_queue_set(), collector()->array_queue_set(), &_terminator);
    +  marker->complete_marking(collector()->oop_queue_set(), collector()->array_queue_set(), _terminator.terminator());
     
       // This is the point where the entire marking should have completed.
       assert(marker->oop_stack()->is_empty(), "Marking should have completed");
    diff --git a/src/hotspot/share/gc/g1/g1FullGCMarkTask.hpp b/src/hotspot/share/gc/g1/g1FullGCMarkTask.hpp
    index 8dfff055565..7223cee50d3 100644
    --- a/src/hotspot/share/gc/g1/g1FullGCMarkTask.hpp
    +++ b/src/hotspot/share/gc/g1/g1FullGCMarkTask.hpp
    @@ -36,7 +36,7 @@
     
     class G1FullGCMarkTask : public G1FullGCTask {
       G1RootProcessor          _root_processor;
    -  ParallelTaskTerminator   _terminator;
    +  TaskTerminator           _terminator;
     
     public:
       G1FullGCMarkTask(G1FullCollector* collector);
    diff --git a/src/hotspot/share/gc/g1/g1FullGCMarker.inline.hpp b/src/hotspot/share/gc/g1/g1FullGCMarker.inline.hpp
    index d3c671b44e5..fdb35312cae 100644
    --- a/src/hotspot/share/gc/g1/g1FullGCMarker.inline.hpp
    +++ b/src/hotspot/share/gc/g1/g1FullGCMarker.inline.hpp
    @@ -165,7 +165,7 @@ void G1FullGCMarker::drain_stack() {
     }
     
     inline void G1FullGCMarker::follow_klass(Klass* k) {
    -  oop op = k->klass_holder();
    +  oop op = k->class_loader_data()->holder_no_keepalive();
       mark_and_push(&op);
     }
     
    diff --git a/src/hotspot/share/gc/g1/g1FullGCReferenceProcessorExecutor.hpp b/src/hotspot/share/gc/g1/g1FullGCReferenceProcessorExecutor.hpp
    index 492c783b625..d4f06f56e0c 100644
    --- a/src/hotspot/share/gc/g1/g1FullGCReferenceProcessorExecutor.hpp
    +++ b/src/hotspot/share/gc/g1/g1FullGCReferenceProcessorExecutor.hpp
    @@ -32,6 +32,7 @@
     #include "gc/g1/g1StringDedup.hpp"
     #include "gc/g1/heapRegionManager.hpp"
     #include "gc/shared/referenceProcessor.hpp"
    +#include "gc/shared/taskqueue.hpp"
     #include "utilities/ticks.hpp"
     
     class G1FullGCTracer;
    @@ -58,9 +59,9 @@ private:
     
       class G1RefProcTaskProxy : public AbstractGangTask {
         typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
    -    ProcessTask&             _proc_task;
    -    G1FullCollector*         _collector;
    -    ParallelTaskTerminator   _terminator;
    +    ProcessTask&                  _proc_task;
    +    G1FullCollector*              _collector;
    +    TaskTerminator                _terminator;
     
       public:
         G1RefProcTaskProxy(ProcessTask& proc_task,
    diff --git a/src/hotspot/share/gc/g1/g1FullGCScope.hpp b/src/hotspot/share/gc/g1/g1FullGCScope.hpp
    index 4842a836ce9..e17e1471b61 100644
    --- a/src/hotspot/share/gc/g1/g1FullGCScope.hpp
    +++ b/src/hotspot/share/gc/g1/g1FullGCScope.hpp
    @@ -31,8 +31,8 @@
     #include "gc/shared/gcTrace.hpp"
     #include "gc/shared/gcTraceTime.hpp"
     #include "gc/shared/gcTimer.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "gc/shared/isGCActiveMark.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
     #include "memory/allocation.hpp"
     #include "services/memoryService.hpp"
     
    diff --git a/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp b/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp
    index 1ebc8df86c4..6a6c8eb1aff 100644
    --- a/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp
    +++ b/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp
    @@ -73,11 +73,13 @@ G1GCPhaseTimes::G1GCPhaseTimes(STWGCTimer* gc_timer, uint max_gc_threads) :
         _gc_par_phases[ScanHCC] = NULL;
       }
       _gc_par_phases[ScanRS] = new WorkerDataArray(max_gc_threads, "Scan RS (ms):");
    +  _gc_par_phases[OptScanRS] = new WorkerDataArray(max_gc_threads, "Optional Scan RS (ms):");
       _gc_par_phases[CodeRoots] = new WorkerDataArray(max_gc_threads, "Code Root Scanning (ms):");
     #if INCLUDE_AOT
       _gc_par_phases[AOTCodeRoots] = new WorkerDataArray(max_gc_threads, "AOT Root Scanning (ms):");
     #endif
       _gc_par_phases[ObjCopy] = new WorkerDataArray(max_gc_threads, "Object Copy (ms):");
    +  _gc_par_phases[OptObjCopy] = new WorkerDataArray(max_gc_threads, "Optional Object Copy (ms):");
       _gc_par_phases[Termination] = new WorkerDataArray(max_gc_threads, "Termination (ms):");
       _gc_par_phases[GCWorkerTotal] = new WorkerDataArray(max_gc_threads, "GC Worker Total (ms):");
       _gc_par_phases[GCWorkerEnd] = new WorkerDataArray(max_gc_threads, "GC Worker End (ms):");
    @@ -90,6 +92,15 @@ G1GCPhaseTimes::G1GCPhaseTimes(STWGCTimer* gc_timer, uint max_gc_threads) :
       _scan_rs_skipped_cards = new WorkerDataArray(max_gc_threads, "Skipped Cards:");
       _gc_par_phases[ScanRS]->link_thread_work_items(_scan_rs_skipped_cards, ScanRSSkippedCards);
     
    +  _opt_cset_scanned_cards = new WorkerDataArray(max_gc_threads, "Scanned Cards:");
    +  _gc_par_phases[OptScanRS]->link_thread_work_items(_opt_cset_scanned_cards, OptCSetScannedCards);
    +  _opt_cset_claimed_cards = new WorkerDataArray(max_gc_threads, "Claimed Cards:");
    +  _gc_par_phases[OptScanRS]->link_thread_work_items(_opt_cset_claimed_cards, OptCSetClaimedCards);
    +  _opt_cset_skipped_cards = new WorkerDataArray(max_gc_threads, "Skipped Cards:");
    +  _gc_par_phases[OptScanRS]->link_thread_work_items(_opt_cset_skipped_cards, OptCSetSkippedCards);
    +  _opt_cset_used_memory = new WorkerDataArray(max_gc_threads, "Used Memory:");
    +  _gc_par_phases[OptScanRS]->link_thread_work_items(_opt_cset_used_memory, OptCSetUsedMemory);
    +
       _update_rs_processed_buffers = new WorkerDataArray(max_gc_threads, "Processed Buffers:");
       _gc_par_phases[UpdateRS]->link_thread_work_items(_update_rs_processed_buffers, UpdateRSProcessedBuffers);
       _update_rs_scanned_cards = new WorkerDataArray(max_gc_threads, "Scanned Cards:");
    @@ -120,6 +131,7 @@ G1GCPhaseTimes::G1GCPhaseTimes(STWGCTimer* gc_timer, uint max_gc_threads) :
     
     void G1GCPhaseTimes::reset() {
       _cur_collection_par_time_ms = 0.0;
    +  _cur_optional_evac_ms = 0.0;
       _cur_collection_code_root_fixup_time_ms = 0.0;
       _cur_strong_code_root_purge_time_ms = 0.0;
       _cur_evac_fail_recalc_used = 0.0;
    @@ -227,11 +239,11 @@ void G1GCPhaseTimes::add_time_secs(GCParPhases phase, uint worker_i, double secs
       _gc_par_phases[phase]->add(worker_i, secs);
     }
     
    -void G1GCPhaseTimes::record_or_add_objcopy_time_secs(uint worker_i, double secs) {
    -  if (_gc_par_phases[ObjCopy]->get(worker_i) == _gc_par_phases[ObjCopy]->uninitialized()) {
    -    record_time_secs(ObjCopy, worker_i, secs);
    +void G1GCPhaseTimes::record_or_add_time_secs(GCParPhases phase, uint worker_i, double secs) {
    +  if (_gc_par_phases[phase]->get(worker_i) == _gc_par_phases[phase]->uninitialized()) {
    +    record_time_secs(phase, worker_i, secs);
       } else {
    -    add_time_secs(ObjCopy, worker_i, secs);
    +    add_time_secs(phase, worker_i, secs);
       }
     }
     
    @@ -239,6 +251,10 @@ void G1GCPhaseTimes::record_thread_work_item(GCParPhases phase, uint worker_i, s
       _gc_par_phases[phase]->set_thread_work_item(worker_i, count, index);
     }
     
    +void G1GCPhaseTimes::record_or_add_thread_work_item(GCParPhases phase, uint worker_i, size_t count, uint index) {
    +  _gc_par_phases[phase]->set_or_add_thread_work_item(worker_i, count, index);
    +}
    +
     // return the average time for a phase in milliseconds
     double G1GCPhaseTimes::average_time_ms(GCParPhases phase) {
       return _gc_par_phases[phase]->average() * 1000.0;
    @@ -348,6 +364,16 @@ double G1GCPhaseTimes::print_pre_evacuate_collection_set() const {
       return sum_ms;
     }
     
    +double G1GCPhaseTimes::print_evacuate_optional_collection_set() const {
    +  const double sum_ms = _cur_optional_evac_ms;
    +  if (sum_ms > 0) {
    +    info_time("Evacuate Optional Collection Set", sum_ms);
    +    debug_phase(_gc_par_phases[OptScanRS]);
    +    debug_phase(_gc_par_phases[OptObjCopy]);
    +  }
    +  return sum_ms;
    +}
    +
     double G1GCPhaseTimes::print_evacuate_collection_set() const {
       const double sum_ms = _cur_collection_par_time_ms;
     
    @@ -457,6 +483,7 @@ void G1GCPhaseTimes::print() {
       double accounted_ms = 0.0;
       accounted_ms += print_pre_evacuate_collection_set();
       accounted_ms += print_evacuate_collection_set();
    +  accounted_ms += print_evacuate_optional_collection_set();
       accounted_ms += print_post_evacuate_collection_set();
       print_other(accounted_ms);
     
    @@ -485,11 +512,13 @@ const char* G1GCPhaseTimes::phase_name(GCParPhases phase) {
           "UpdateRS",
           "ScanHCC",
           "ScanRS",
    +      "OptScanRS",
           "CodeRoots",
     #if INCLUDE_AOT
           "AOTCodeRoots",
     #endif
           "ObjCopy",
    +      "OptObjCopy",
           "Termination",
           "Other",
           "GCWorkerTotal",
    @@ -561,7 +590,7 @@ G1EvacPhaseTimesTracker::~G1EvacPhaseTimesTracker() {
         _trim_tracker.stop();
         // Exclude trim time by increasing the start time.
         _start_time += _trim_time;
    -    _phase_times->record_or_add_objcopy_time_secs(_worker_id, _trim_time.seconds());
    +    _phase_times->record_or_add_time_secs(G1GCPhaseTimes::ObjCopy, _worker_id, _trim_time.seconds());
       }
     }
     
    diff --git a/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp b/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp
    index 84d9df08b76..daf5ef8fa58 100644
    --- a/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp
    +++ b/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp
    @@ -63,11 +63,13 @@ class G1GCPhaseTimes : public CHeapObj {
         UpdateRS,
         ScanHCC,
         ScanRS,
    +    OptScanRS,
         CodeRoots,
     #if INCLUDE_AOT
         AOTCodeRoots,
     #endif
         ObjCopy,
    +    OptObjCopy,
         Termination,
         Other,
         GCWorkerTotal,
    @@ -92,6 +94,13 @@ class G1GCPhaseTimes : public CHeapObj {
         UpdateRSSkippedCards
       };
     
    +  enum GCOptCSetWorkItems {
    +      OptCSetScannedCards,
    +      OptCSetClaimedCards,
    +      OptCSetSkippedCards,
    +      OptCSetUsedMemory
    +  };
    +
      private:
       // Markers for grouping the phases in the GCPhases enum above
       static const int GCMainParPhasesLast = GCWorkerEnd;
    @@ -108,11 +117,17 @@ class G1GCPhaseTimes : public CHeapObj {
       WorkerDataArray* _scan_rs_claimed_cards;
       WorkerDataArray* _scan_rs_skipped_cards;
     
    +  WorkerDataArray* _opt_cset_scanned_cards;
    +  WorkerDataArray* _opt_cset_claimed_cards;
    +  WorkerDataArray* _opt_cset_skipped_cards;
    +  WorkerDataArray* _opt_cset_used_memory;
    +
       WorkerDataArray* _termination_attempts;
     
       WorkerDataArray* _redirtied_cards;
     
       double _cur_collection_par_time_ms;
    +  double _cur_optional_evac_ms;
       double _cur_collection_code_root_fixup_time_ms;
       double _cur_strong_code_root_purge_time_ms;
     
    @@ -184,6 +199,7 @@ class G1GCPhaseTimes : public CHeapObj {
     
       double print_pre_evacuate_collection_set() const;
       double print_evacuate_collection_set() const;
    +  double print_evacuate_optional_collection_set() const;
       double print_post_evacuate_collection_set() const;
       void print_other(double accounted_ms) const;
     
    @@ -199,10 +215,12 @@ class G1GCPhaseTimes : public CHeapObj {
       // add a number of seconds to a phase
       void add_time_secs(GCParPhases phase, uint worker_i, double secs);
     
    -  void record_or_add_objcopy_time_secs(uint worker_i, double secs);
    +  void record_or_add_time_secs(GCParPhases phase, uint worker_i, double secs);
     
       void record_thread_work_item(GCParPhases phase, uint worker_i, size_t count, uint index = 0);
     
    +  void record_or_add_thread_work_item(GCParPhases phase, uint worker_i, size_t count, uint index = 0);
    +
       // return the average time for a phase in milliseconds
       double average_time_ms(GCParPhases phase);
     
    @@ -234,6 +252,10 @@ class G1GCPhaseTimes : public CHeapObj {
         _cur_collection_par_time_ms = ms;
       }
     
    +  void record_optional_evacuation(double ms) {
    +    _cur_optional_evac_ms = ms;
    +  }
    +
       void record_code_root_fixup_time(double ms) {
         _cur_collection_code_root_fixup_time_ms = ms;
       }
    diff --git a/src/hotspot/share/gc/g1/g1InCSetState.hpp b/src/hotspot/share/gc/g1/g1InCSetState.hpp
    index cdba396b1ee..1dea5a37fa1 100644
    --- a/src/hotspot/share/gc/g1/g1InCSetState.hpp
    +++ b/src/hotspot/share/gc/g1/g1InCSetState.hpp
    @@ -56,7 +56,8 @@ struct InCSetState {
         // makes getting the next generation fast by a simple increment. They are also
         // used to index into arrays.
         // The negative values are used for objects requiring various special cases,
    -    // for example eager reclamation of humongous objects.
    +    // for example eager reclamation of humongous objects or optional regions.
    +    Optional     = -2,    // The region is optional
         Humongous    = -1,    // The region is humongous
         NotInCSet    =  0,    // The region is not in the collection set.
         Young        =  1,    // The region is in the collection set and a young region.
    @@ -78,10 +79,11 @@ struct InCSetState {
       bool is_humongous() const            { return _value == Humongous; }
       bool is_young() const                { return _value == Young; }
       bool is_old() const                  { return _value == Old; }
    +  bool is_optional() const             { return _value == Optional; }
     
     #ifdef ASSERT
       bool is_default() const              { return _value == NotInCSet; }
    -  bool is_valid() const                { return (_value >= Humongous) && (_value < Num); }
    +  bool is_valid() const                { return (_value >= Optional) && (_value < Num); }
       bool is_valid_gen() const            { return (_value >= Young && _value <= Old); }
     #endif
     };
    @@ -101,6 +103,12 @@ class G1InCSetStateFastTestBiasedMappedArray : public G1BiasedMappedArray void do_oop_work(T* p);
    +  virtual void do_oop(oop* p)          { do_oop_work(p); }
    +  virtual void do_oop(narrowOop* p)    { do_oop_work(p); }
    +};
     
     // This closure is applied to the fields of the objects that have just been copied during evacuation.
     class G1ScanEvacuatedObjClosure : public G1ScanClosureBase {
    @@ -141,11 +151,6 @@ protected:
       // during the GC (i.e., non-CSet objects). It is MT-safe.
       inline void mark_object(oop obj);
     
    -  // Mark the object if it's not already marked. This is used to mark
    -  // objects pointed to by roots that have been forwarded during a
    -  // GC. It is MT-safe.
    -  inline void mark_forwarded_object(oop from_obj, oop to_obj);
    -
       G1ParCopyHelper(G1CollectedHeap* g1h,  G1ParScanThreadState* par_scan_state);
       ~G1ParCopyHelper() { }
     
    diff --git a/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp b/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp
    index 074a6bf7486..8944810f70e 100644
    --- a/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp
    +++ b/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp
    @@ -64,6 +64,8 @@ template 
     inline void G1ScanClosureBase::handle_non_cset_obj_common(InCSetState const state, T* p, oop const obj) {
       if (state.is_humongous()) {
         _g1h->set_humongous_is_live(obj);
    +  } else if (state.is_optional()) {
    +    _par_scan_state->remember_reference_into_optional_region(p);
       }
     }
     
    @@ -195,6 +197,12 @@ inline void G1ScanObjsDuringScanRSClosure::do_oop_work(T* p) {
       }
     }
     
    +template 
    +inline void G1ScanRSForOptionalClosure::do_oop_work(T* p) {
    +  _scan_cl->do_oop_work(p);
    +  _scan_cl->trim_queue_partially();
    +}
    +
     void G1ParCopyHelper::do_cld_barrier(oop new_obj) {
       if (_g1h->heap_region_containing(new_obj)->is_young()) {
         _scanned_cld->record_modified_oops();
    @@ -208,21 +216,6 @@ void G1ParCopyHelper::mark_object(oop obj) {
       _cm->mark_in_next_bitmap(_worker_id, obj);
     }
     
    -void G1ParCopyHelper::mark_forwarded_object(oop from_obj, oop to_obj) {
    -  assert(from_obj->is_forwarded(), "from obj should be forwarded");
    -  assert(from_obj->forwardee() == to_obj, "to obj should be the forwardee");
    -  assert(from_obj != to_obj, "should not be self-forwarded");
    -
    -  assert(_g1h->heap_region_containing(from_obj)->in_collection_set(), "from obj should be in the CSet");
    -  assert(!_g1h->heap_region_containing(to_obj)->in_collection_set(), "should not mark objects in the CSet");
    -
    -  // The object might be in the process of being copied by another
    -  // worker so we cannot trust that its to-space image is
    -  // well-formed. So we have to read its size from its from-space
    -  // image which we know should not be changing.
    -  _cm->mark_in_next_bitmap(_worker_id, to_obj, from_obj->size());
    -}
    -
     void G1ParCopyHelper::trim_queue_partially() {
       _par_scan_state->trim_queue_partially();
     }
    @@ -251,11 +244,6 @@ void G1ParCopyClosure::do_oop_work(T* p) {
         }
         assert(forwardee != NULL, "forwardee should not be NULL");
         RawAccess::oop_store(p, forwardee);
    -    if (do_mark_object != G1MarkNone && forwardee != obj) {
    -      // If the object is self-forwarded we don't need to explicitly
    -      // mark it, the evacuation failure protocol will do so.
    -      mark_forwarded_object(obj, forwardee);
    -    }
     
         if (barrier == G1BarrierCLD) {
           do_cld_barrier(forwardee);
    @@ -263,6 +251,8 @@ void G1ParCopyClosure::do_oop_work(T* p) {
       } else {
         if (state.is_humongous()) {
           _g1h->set_humongous_is_live(obj);
    +    } else if (state.is_optional()) {
    +      _par_scan_state->remember_root_into_optional_region(p);
         }
     
         // The object is not in collection set. If we're a root scanning
    diff --git a/src/hotspot/share/gc/g1/g1OopStarChunkedList.cpp b/src/hotspot/share/gc/g1/g1OopStarChunkedList.cpp
    new file mode 100644
    index 00000000000..7c9f4c5aa5c
    --- /dev/null
    +++ b/src/hotspot/share/gc/g1/g1OopStarChunkedList.cpp
    @@ -0,0 +1,40 @@
    +/*
    + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
    + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/g1/g1OopStarChunkedList.inline.hpp"
    +
    +G1OopStarChunkedList::~G1OopStarChunkedList() {
    +  delete_list(_roots);
    +  delete_list(_croots);
    +  delete_list(_oops);
    +  delete_list(_coops);
    +}
    +
    +void G1OopStarChunkedList::oops_do(OopClosure* obj_cl, OopClosure* root_cl) {
    +  chunks_do(_roots, root_cl);
    +  chunks_do(_croots, root_cl);
    +  chunks_do(_oops, obj_cl);
    +  chunks_do(_coops, obj_cl);
    +}
    diff --git a/src/hotspot/share/gc/g1/g1OopStarChunkedList.hpp b/src/hotspot/share/gc/g1/g1OopStarChunkedList.hpp
    new file mode 100644
    index 00000000000..467838f273a
    --- /dev/null
    +++ b/src/hotspot/share/gc/g1/g1OopStarChunkedList.hpp
    @@ -0,0 +1,64 @@
    +/*
    + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
    + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_GC_G1_G1OOPSTARCHUNKEDLIST_HPP
    +#define SHARE_GC_G1_G1OOPSTARCHUNKEDLIST_HPP
    +
    +#include "oops/oopsHierarchy.hpp"
    +#include "utilities/chunkedList.hpp"
    +
    +class OopClosure;
    +
    +class G1OopStarChunkedList : public CHeapObj {
    +  size_t _used_memory;
    +
    +  ChunkedList* _roots;
    +  ChunkedList* _croots;
    +  ChunkedList* _oops;
    +  ChunkedList* _coops;
    +
    +  template  void delete_list(ChunkedList* c);
    +
    +  template 
    +  void chunks_do(ChunkedList* head,
    +                 OopClosure* cl);
    +
    +  template 
    +  inline void push(ChunkedList** field, T* p);
    +
    + public:
    +  G1OopStarChunkedList() : _used_memory(0), _roots(NULL), _croots(NULL), _oops(NULL), _coops(NULL) {}
    +  ~G1OopStarChunkedList();
    +
    +  size_t used_memory() { return _used_memory; }
    +
    +  void oops_do(OopClosure* obj_cl, OopClosure* root_cl);
    +
    +  inline void push_oop(oop* p);
    +  inline void push_oop(narrowOop* p);
    +  inline void push_root(oop* p);
    +  inline void push_root(narrowOop* p);
    +};
    +
    +#endif // SHARE_GC_G1_G1OOPSTARCHUNKEDLIST_HPP
    diff --git a/src/hotspot/share/gc/g1/g1OopStarChunkedList.inline.hpp b/src/hotspot/share/gc/g1/g1OopStarChunkedList.inline.hpp
    new file mode 100644
    index 00000000000..f49274df716
    --- /dev/null
    +++ b/src/hotspot/share/gc/g1/g1OopStarChunkedList.inline.hpp
    @@ -0,0 +1,84 @@
    +/*
    + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
    + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_GC_G1_G1OOPSTARCHUNKEDLIST_INLINE_HPP
    +#define SHARE_GC_G1_G1OOPSTARCHUNKEDLIST_INLINE_HPP
    +
    +#include "gc/g1/g1OopStarChunkedList.hpp"
    +#include "gc/g1/g1CollectedHeap.inline.hpp"
    +#include "memory/allocation.inline.hpp"
    +#include "memory/iterator.hpp"
    +
    +template 
    +inline void G1OopStarChunkedList::push(ChunkedList** field, T* p) {
    +  ChunkedList* list = *field;
    +  if (list == NULL) {
    +    *field = new ChunkedList();
    +    _used_memory += sizeof(ChunkedList);
    +  } else if (list->is_full()) {
    +    ChunkedList* next = new ChunkedList();
    +    next->set_next_used(list);
    +    *field = next;
    +    _used_memory += sizeof(ChunkedList);
    +  }
    +
    +  (*field)->push(p);
    +}
    +
    +inline void G1OopStarChunkedList::push_root(narrowOop* p) {
    +  push(&_croots, p);
    +}
    +
    +inline void G1OopStarChunkedList::push_root(oop* p) {
    +  push(&_roots, p);
    +}
    +
    +inline void G1OopStarChunkedList::push_oop(narrowOop* p) {
    +  push(&_coops, p);
    +}
    +
    +inline void G1OopStarChunkedList::push_oop(oop* p) {
    +  push(&_oops, p);
    +}
    +
    +template 
    +void G1OopStarChunkedList::delete_list(ChunkedList* c) {
    +  while (c != NULL) {
    +    ChunkedList* next = c->next_used();
    +    delete c;
    +    c = next;
    +  }
    +}
    +
    +template 
    +void G1OopStarChunkedList::chunks_do(ChunkedList* head, OopClosure* cl) {
    +  for (ChunkedList* c = head; c != NULL; c = c->next_used()) {
    +    for (size_t i = 0; i < c->size(); i++) {
    +      T* p = c->at(i);
    +      cl->do_oop(p);
    +    }
    +  }
    +}
    +
    +#endif // SHARE_GC_G1_G1OOPSTARCHUNKEDLIST_INLINE_HPP
    diff --git a/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp b/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp
    index e3fe0aae1ef..88b21177f10 100644
    --- a/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp
    +++ b/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp
    @@ -37,7 +37,10 @@
     #include "oops/oop.inline.hpp"
     #include "runtime/prefetch.inline.hpp"
     
    -G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, uint worker_id, size_t young_cset_length)
    +G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h,
    +                                           uint worker_id,
    +                                           size_t young_cset_length,
    +                                           size_t optional_cset_length)
       : _g1h(g1h),
         _refs(g1h->task_queue(worker_id)),
         _dcq(&g1h->dirty_card_queue_set()),
    @@ -51,7 +54,8 @@ G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, uint worker_id,
         _stack_trim_upper_threshold(GCDrainStackTargetSize * 2 + 1),
         _stack_trim_lower_threshold(GCDrainStackTargetSize),
         _trim_ticks(),
    -    _old_gen_is_full(false)
    +    _old_gen_is_full(false),
    +    _num_optional_regions(optional_cset_length)
     {
       // we allocate G1YoungSurvRateNumRegions plus one entries, since
       // we "sacrifice" entry 0 to keep track of surviving bytes for
    @@ -78,6 +82,8 @@ G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, uint worker_id,
       _dest[InCSetState::Old]          = InCSetState::Old;
     
       _closures = G1EvacuationRootClosures::create_root_closures(this, _g1h);
    +
    +  _oops_into_optional_regions = new G1OopStarChunkedList[_num_optional_regions];
     }
     
     // Pass locally gathered statistics to global state.
    @@ -97,6 +103,7 @@ G1ParScanThreadState::~G1ParScanThreadState() {
       delete _plab_allocator;
       delete _closures;
       FREE_C_HEAP_ARRAY(size_t, _surviving_young_words_base);
    +  delete[] _oops_into_optional_regions;
     }
     
     void G1ParScanThreadState::waste(size_t& wasted, size_t& undo_wasted) {
    @@ -324,7 +331,8 @@ oop G1ParScanThreadState::copy_to_survivor_space(InCSetState const state,
     G1ParScanThreadState* G1ParScanThreadStateSet::state_for_worker(uint worker_id) {
       assert(worker_id < _n_workers, "out of bounds access");
       if (_states[worker_id] == NULL) {
    -    _states[worker_id] = new G1ParScanThreadState(_g1h, worker_id, _young_cset_length);
    +    _states[worker_id] =
    +      new G1ParScanThreadState(_g1h, worker_id, _young_cset_length, _optional_cset_length);
       }
       return _states[worker_id];
     }
    @@ -351,6 +359,19 @@ void G1ParScanThreadStateSet::flush() {
       _flushed = true;
     }
     
    +void G1ParScanThreadStateSet::record_unused_optional_region(HeapRegion* hr) {
    +  for (uint worker_index = 0; worker_index < _n_workers; ++worker_index) {
    +    G1ParScanThreadState* pss = _states[worker_index];
    +
    +    if (pss == NULL) {
    +      continue;
    +    }
    +
    +    size_t used_memory = pss->oops_into_optional_region(hr)->used_memory();
    +    _g1h->g1_policy()->phase_times()->record_or_add_thread_work_item(G1GCPhaseTimes::OptScanRS, worker_index, used_memory, G1GCPhaseTimes::OptCSetUsedMemory);
    +  }
    +}
    +
     oop G1ParScanThreadState::handle_evacuation_failure_par(oop old, markOop m) {
       assert(_g1h->is_in_cset(old), "Object " PTR_FORMAT " should be in the CSet", p2i(old));
     
    @@ -381,11 +402,15 @@ oop G1ParScanThreadState::handle_evacuation_failure_par(oop old, markOop m) {
         return forward_ptr;
       }
     }
    -G1ParScanThreadStateSet::G1ParScanThreadStateSet(G1CollectedHeap* g1h, uint n_workers, size_t young_cset_length) :
    +G1ParScanThreadStateSet::G1ParScanThreadStateSet(G1CollectedHeap* g1h,
    +                                                 uint n_workers,
    +                                                 size_t young_cset_length,
    +                                                 size_t optional_cset_length) :
         _g1h(g1h),
         _states(NEW_C_HEAP_ARRAY(G1ParScanThreadState*, n_workers, mtGC)),
         _surviving_young_words_total(NEW_C_HEAP_ARRAY(size_t, young_cset_length, mtGC)),
         _young_cset_length(young_cset_length),
    +    _optional_cset_length(optional_cset_length),
         _n_workers(n_workers),
         _flushed(false) {
       for (uint i = 0; i < n_workers; ++i) {
    diff --git a/src/hotspot/share/gc/g1/g1ParScanThreadState.hpp b/src/hotspot/share/gc/g1/g1ParScanThreadState.hpp
    index 367cdbdfb6a..c689a6b1d28 100644
    --- a/src/hotspot/share/gc/g1/g1ParScanThreadState.hpp
    +++ b/src/hotspot/share/gc/g1/g1ParScanThreadState.hpp
    @@ -37,6 +37,7 @@
     #include "oops/oop.hpp"
     #include "utilities/ticks.hpp"
     
    +class G1OopStarChunkedList;
     class G1PLABAllocator;
     class G1EvacuationRootClosures;
     class HeapRegion;
    @@ -87,8 +88,14 @@ class G1ParScanThreadState : public CHeapObj {
         return _dest[original.value()];
       }
     
    +  size_t _num_optional_regions;
    +  G1OopStarChunkedList* _oops_into_optional_regions;
    +
     public:
    -  G1ParScanThreadState(G1CollectedHeap* g1h, uint worker_id, size_t young_cset_length);
    +  G1ParScanThreadState(G1CollectedHeap* g1h,
    +                       uint worker_id,
    +                       size_t young_cset_length,
    +                       size_t optional_cset_length);
       virtual ~G1ParScanThreadState();
     
       void set_ref_discoverer(ReferenceDiscoverer* rd) { _scanner.set_ref_discoverer(rd); }
    @@ -206,6 +213,13 @@ public:
     
       // An attempt to evacuate "obj" has failed; take necessary steps.
       oop handle_evacuation_failure_par(oop obj, markOop m);
    +
    +  template 
    +  inline void remember_root_into_optional_region(T* p);
    +  template 
    +  inline void remember_reference_into_optional_region(T* p);
    +
    +  inline G1OopStarChunkedList* oops_into_optional_region(const HeapRegion* hr);
     };
     
     class G1ParScanThreadStateSet : public StackObj {
    @@ -213,14 +227,19 @@ class G1ParScanThreadStateSet : public StackObj {
       G1ParScanThreadState** _states;
       size_t* _surviving_young_words_total;
       size_t _young_cset_length;
    +  size_t _optional_cset_length;
       uint _n_workers;
       bool _flushed;
     
      public:
    -  G1ParScanThreadStateSet(G1CollectedHeap* g1h, uint n_workers, size_t young_cset_length);
    +  G1ParScanThreadStateSet(G1CollectedHeap* g1h,
    +                          uint n_workers,
    +                          size_t young_cset_length,
    +                          size_t optional_cset_length);
       ~G1ParScanThreadStateSet();
     
       void flush();
    +  void record_unused_optional_region(HeapRegion* hr);
     
       G1ParScanThreadState* state_for_worker(uint worker_id);
     
    diff --git a/src/hotspot/share/gc/g1/g1ParScanThreadState.inline.hpp b/src/hotspot/share/gc/g1/g1ParScanThreadState.inline.hpp
    index 02d3dd70b9c..533819b9b25 100644
    --- a/src/hotspot/share/gc/g1/g1ParScanThreadState.inline.hpp
    +++ b/src/hotspot/share/gc/g1/g1ParScanThreadState.inline.hpp
    @@ -26,6 +26,7 @@
     #define SHARE_VM_GC_G1_G1PARSCANTHREADSTATE_INLINE_HPP
     
     #include "gc/g1/g1CollectedHeap.inline.hpp"
    +#include "gc/g1/g1OopStarChunkedList.inline.hpp"
     #include "gc/g1/g1ParScanThreadState.hpp"
     #include "gc/g1/g1RemSet.hpp"
     #include "oops/access.inline.hpp"
    @@ -203,4 +204,23 @@ inline void G1ParScanThreadState::reset_trim_ticks() {
       _trim_ticks = Tickspan();
     }
     
    +template 
    +inline void G1ParScanThreadState::remember_root_into_optional_region(T* p) {
    +  oop o = RawAccess::oop_load(p);
    +  uint index = _g1h->heap_region_containing(o)->index_in_opt_cset();
    +  _oops_into_optional_regions[index].push_root(p);
    +}
    +
    +template 
    +inline void G1ParScanThreadState::remember_reference_into_optional_region(T* p) {
    +  oop o = RawAccess::oop_load(p);
    +  uint index = _g1h->heap_region_containing(o)->index_in_opt_cset();
    +  _oops_into_optional_regions[index].push_oop(p);
    +  DEBUG_ONLY(verify_ref(p);)
    +}
    +
    +G1OopStarChunkedList* G1ParScanThreadState::oops_into_optional_region(const HeapRegion* hr) {
    +  return &_oops_into_optional_regions[hr->index_in_opt_cset()];
    +}
    +
     #endif // SHARE_VM_GC_G1_G1PARSCANTHREADSTATE_INLINE_HPP
    diff --git a/src/hotspot/share/gc/g1/g1Policy.cpp b/src/hotspot/share/gc/g1/g1Policy.cpp
    index abcbf5399bd..49ce5c82cc9 100644
    --- a/src/hotspot/share/gc/g1/g1Policy.cpp
    +++ b/src/hotspot/share/gc/g1/g1Policy.cpp
    @@ -714,20 +714,34 @@ void G1Policy::record_collection_pause_end(double pause_time_ms, size_t cards_sc
       }
     
       _free_regions_at_end_of_collection = _g1h->num_free_regions();
    -  // IHOP control wants to know the expected young gen length if it were not
    -  // restrained by the heap reserve. Using the actual length would make the
    -  // prediction too small and the limit the young gen every time we get to the
    -  // predicted target occupancy.
    -  size_t last_unrestrained_young_length = update_young_list_max_and_target_length();
    +
       update_rs_lengths_prediction();
     
    -  update_ihop_prediction(app_time_ms / 1000.0,
    -                         _bytes_allocated_in_old_since_last_gc,
    -                         last_unrestrained_young_length * HeapRegion::GrainBytes,
    -                         this_pause_was_young_only);
    -  _bytes_allocated_in_old_since_last_gc = 0;
    +  // Do not update dynamic IHOP due to G1 periodic collection as it is highly likely
    +  // that in this case we are not running in a "normal" operating mode.
    +  if (_g1h->gc_cause() != GCCause::_g1_periodic_collection) {
    +    // IHOP control wants to know the expected young gen length if it were not
    +    // restrained by the heap reserve. Using the actual length would make the
    +    // prediction too small and the limit the young gen every time we get to the
    +    // predicted target occupancy.
    +    size_t last_unrestrained_young_length = update_young_list_max_and_target_length();
     
    -  _ihop_control->send_trace_event(_g1h->gc_tracer_stw());
    +    update_ihop_prediction(app_time_ms / 1000.0,
    +                           _bytes_allocated_in_old_since_last_gc,
    +                           last_unrestrained_young_length * HeapRegion::GrainBytes,
    +                           this_pause_was_young_only);
    +    _bytes_allocated_in_old_since_last_gc = 0;
    +
    +    _ihop_control->send_trace_event(_g1h->gc_tracer_stw());
    +  } else {
    +    // Any garbage collection triggered as periodic collection resets the time-to-mixed
    +    // measurement. Periodic collection typically means that the application is "inactive", i.e.
    +    // the marking threads may have received an uncharacterisic amount of cpu time
    +    // for completing the marking, i.e. are faster than expected.
    +    // This skews the predicted marking length towards smaller values which might cause
    +    // the mark start being too late.
    +    _initial_mark_to_mixed.reset();
    +  }
     
       // Note that _mmu_tracker->max_gc_time() returns the time in seconds.
       double update_rs_time_goal_ms = _mmu_tracker->max_gc_time() * MILLIUNITS * G1RSetUpdatingPauseTimePercent / 100.0;
    @@ -1078,7 +1092,9 @@ void G1Policy::record_pause(PauseKind kind, double start, double end) {
           _initial_mark_to_mixed.add_pause(end - start);
           break;
         case InitialMarkGC:
    -      _initial_mark_to_mixed.record_initial_mark_end(end);
    +      if (_g1h->gc_cause() != GCCause::_g1_periodic_collection) {
    +        _initial_mark_to_mixed.record_initial_mark_end(end);
    +      }
           break;
         case MixedGC:
           _initial_mark_to_mixed.record_mixed_gc_start(start);
    diff --git a/src/hotspot/share/gc/g1/g1Policy.hpp b/src/hotspot/share/gc/g1/g1Policy.hpp
    index bb547f3317a..d4dceb7a5b1 100644
    --- a/src/hotspot/share/gc/g1/g1Policy.hpp
    +++ b/src/hotspot/share/gc/g1/g1Policy.hpp
    @@ -401,6 +401,14 @@ private:
     
       size_t desired_survivor_size() const;
     public:
    +  // Fraction used when predicting how many optional regions to include in
    +  // the CSet. This fraction of the available time is used for optional regions,
    +  // the rest is used to add old regions to the normal CSet.
    +  double optional_prediction_fraction() { return 0.2; }
    +  // Fraction used when evacuating the optional regions. This fraction of the
    +  // remaining time is used to choose what regions to include in the evacuation.
    +  double optional_evacuation_fraction() { return 0.75; }
    +
       uint tenuring_threshold() const { return _tenuring_threshold; }
     
       uint max_survivor_regions() {
    diff --git a/src/hotspot/share/gc/g1/g1RemSet.cpp b/src/hotspot/share/gc/g1/g1RemSet.cpp
    index 3cdc3486f56..98587f88bf4 100644
    --- a/src/hotspot/share/gc/g1/g1RemSet.cpp
    +++ b/src/hotspot/share/gc/g1/g1RemSet.cpp
    @@ -311,12 +311,14 @@ void G1RemSet::initialize(size_t capacity, uint max_regions) {
     G1ScanRSForRegionClosure::G1ScanRSForRegionClosure(G1RemSetScanState* scan_state,
                                                        G1ScanObjsDuringScanRSClosure* scan_obj_on_card,
                                                        G1ParScanThreadState* pss,
    +                                                   G1GCPhaseTimes::GCParPhases phase,
                                                        uint worker_i) :
       _g1h(G1CollectedHeap::heap()),
       _ct(_g1h->card_table()),
       _pss(pss),
       _scan_objs_on_card_cl(scan_obj_on_card),
       _scan_state(scan_state),
    +  _phase(phase),
       _worker_i(worker_i),
       _cards_scanned(0),
       _cards_claimed(0),
    @@ -402,7 +404,7 @@ void G1ScanRSForRegionClosure::scan_rem_set_roots(HeapRegion* r) {
     
         scan_card(mr, region_idx_for_card);
       }
    -  event.commit(GCId::current(), _worker_i, G1GCPhaseTimes::phase_name(G1GCPhaseTimes::ScanRS));
    +  event.commit(GCId::current(), _worker_i, G1GCPhaseTimes::phase_name(_phase));
     }
     
     void G1ScanRSForRegionClosure::scan_strong_code_roots(HeapRegion* r) {
    @@ -437,7 +439,7 @@ bool G1ScanRSForRegionClosure::do_heap_region(HeapRegion* r) {
     
     void G1RemSet::scan_rem_set(G1ParScanThreadState* pss, uint worker_i) {
       G1ScanObjsDuringScanRSClosure scan_cl(_g1h, pss);
    -  G1ScanRSForRegionClosure cl(_scan_state, &scan_cl, pss, worker_i);
    +  G1ScanRSForRegionClosure cl(_scan_state, &scan_cl, pss, G1GCPhaseTimes::ScanRS, worker_i);
       _g1h->collection_set_iterate_from(&cl, worker_i);
     
       G1GCPhaseTimes* p = _g1p->phase_times();
    diff --git a/src/hotspot/share/gc/g1/g1RemSet.hpp b/src/hotspot/share/gc/g1/g1RemSet.hpp
    index 4910d984daa..1e1cca1ee60 100644
    --- a/src/hotspot/share/gc/g1/g1RemSet.hpp
    +++ b/src/hotspot/share/gc/g1/g1RemSet.hpp
    @@ -28,6 +28,7 @@
     #include "gc/g1/dirtyCardQueue.hpp"
     #include "gc/g1/g1CardTable.hpp"
     #include "gc/g1/g1OopClosures.hpp"
    +#include "gc/g1/g1GCPhaseTimes.hpp"
     #include "gc/g1/g1RemSetSummary.hpp"
     #include "gc/g1/heapRegion.hpp"
     #include "memory/allocation.hpp"
    @@ -138,6 +139,8 @@ class G1ScanRSForRegionClosure : public HeapRegionClosure {
     
       G1RemSetScanState* _scan_state;
     
    +  G1GCPhaseTimes::GCParPhases _phase;
    +
       uint   _worker_i;
     
       size_t _cards_scanned;
    @@ -159,6 +162,7 @@ public:
       G1ScanRSForRegionClosure(G1RemSetScanState* scan_state,
                                G1ScanObjsDuringScanRSClosure* scan_obj_on_card,
                                G1ParScanThreadState* pss,
    +                           G1GCPhaseTimes::GCParPhases phase,
                                uint worker_i);
     
       bool do_heap_region(HeapRegion* r);
    diff --git a/src/hotspot/share/gc/g1/vm_operations_g1.cpp b/src/hotspot/share/gc/g1/g1VMOperations.cpp
    similarity index 94%
    rename from src/hotspot/share/gc/g1/vm_operations_g1.cpp
    rename to src/hotspot/share/gc/g1/g1VMOperations.cpp
    index ed6782679ca..6b521181c31 100644
    --- a/src/hotspot/share/gc/g1/vm_operations_g1.cpp
    +++ b/src/hotspot/share/gc/g1/g1VMOperations.cpp
    @@ -26,8 +26,8 @@
     #include "gc/g1/g1CollectedHeap.inline.hpp"
     #include "gc/g1/g1ConcurrentMarkThread.inline.hpp"
     #include "gc/g1/g1Policy.hpp"
    +#include "gc/g1/g1VMOperations.hpp"
     #include "gc/shared/gcId.hpp"
    -#include "gc/g1/vm_operations_g1.hpp"
     #include "gc/shared/gcTimer.hpp"
     #include "gc/shared/gcTraceTime.inline.hpp"
     #include "gc/shared/isGCActiveMark.hpp"
    @@ -43,13 +43,14 @@ VM_G1CollectForAllocation::VM_G1CollectForAllocation(size_t         word_size,
                                                          uint           gc_count_before,
                                                          GCCause::Cause gc_cause,
                                                          bool           should_initiate_conc_mark,
    -                                                     double         target_pause_time_ms)
    -  : VM_CollectForAllocation(word_size, gc_count_before, gc_cause),
    -    _pause_succeeded(false),
    -    _should_initiate_conc_mark(should_initiate_conc_mark),
    -    _should_retry_gc(false),
    -    _target_pause_time_ms(target_pause_time_ms),
    -    _old_marking_cycles_completed_before(0) {
    +                                                     double         target_pause_time_ms) :
    +  VM_CollectForAllocation(word_size, gc_count_before, gc_cause),
    +  _pause_succeeded(false),
    +  _should_initiate_conc_mark(should_initiate_conc_mark),
    +  _should_retry_gc(false),
    +  _target_pause_time_ms(target_pause_time_ms),
    +  _old_marking_cycles_completed_before(0) {
    +
       guarantee(target_pause_time_ms > 0.0,
                 "target_pause_time_ms = %1.6lf should be positive",
                 target_pause_time_ms);
    @@ -199,23 +200,23 @@ void VM_G1CollectForAllocation::doit_epilogue() {
       }
     }
     
    -void VM_CGC_Operation::doit() {
    +void VM_G1Concurrent::doit() {
       GCIdMark gc_id_mark(_gc_id);
       GCTraceCPUTime tcpu;
       G1CollectedHeap* g1h = G1CollectedHeap::heap();
    -  GCTraceTime(Info, gc) t(_printGCMessage, g1h->concurrent_mark()->gc_timer_cm(), GCCause::_no_gc, true);
    +  GCTraceTime(Info, gc) t(_message, g1h->concurrent_mark()->gc_timer_cm(), GCCause::_no_gc, true);
       TraceCollectorStats tcs(g1h->g1mm()->conc_collection_counters());
       SvcGCMarker sgcm(SvcGCMarker::CONCURRENT);
       IsGCActiveMark x;
       _cl->do_void();
     }
     
    -bool VM_CGC_Operation::doit_prologue() {
    +bool VM_G1Concurrent::doit_prologue() {
       Heap_lock->lock();
       return true;
     }
     
    -void VM_CGC_Operation::doit_epilogue() {
    +void VM_G1Concurrent::doit_epilogue() {
       if (Universe::has_reference_pending_list()) {
         Heap_lock->notify_all();
       }
    diff --git a/src/hotspot/share/gc/g1/vm_operations_g1.hpp b/src/hotspot/share/gc/g1/g1VMOperations.hpp
    similarity index 68%
    rename from src/hotspot/share/gc/g1/vm_operations_g1.hpp
    rename to src/hotspot/share/gc/g1/g1VMOperations.hpp
    index efc85b82a04..fd31140eddf 100644
    --- a/src/hotspot/share/gc/g1/vm_operations_g1.hpp
    +++ b/src/hotspot/share/gc/g1/g1VMOperations.hpp
    @@ -22,39 +22,36 @@
      *
      */
     
    -#ifndef SHARE_VM_GC_G1_VM_OPERATIONS_G1_HPP
    -#define SHARE_VM_GC_G1_VM_OPERATIONS_G1_HPP
    +#ifndef SHARE_VM_GC_G1_G1VMOPERATIONS_HPP
    +#define SHARE_VM_GC_G1_G1VMOPERATIONS_HPP
     
     #include "gc/shared/gcId.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     
     // VM_operations for the G1 collector.
     // VM_GC_Operation:
    -//   - VM_CGC_Operation
    +//   - VM_G1Concurrent
     //   - VM_G1CollectForAllocation
     //   - VM_G1CollectFull
     
    -class VM_G1CollectFull: public VM_GC_Operation {
    +class VM_G1CollectFull : public VM_GC_Operation {
     public:
       VM_G1CollectFull(uint gc_count_before,
                        uint full_gc_count_before,
    -                   GCCause::Cause cause)
    -    : VM_GC_Operation(gc_count_before, cause, full_gc_count_before, true) { }
    +                   GCCause::Cause cause) :
    +    VM_GC_Operation(gc_count_before, cause, full_gc_count_before, true) { }
       virtual VMOp_Type type() const { return VMOp_G1CollectFull; }
       virtual void doit();
    -  virtual const char* name() const {
    -    return "G1 Full collection";
    -  }
     };
     
    -class VM_G1CollectForAllocation: public VM_CollectForAllocation {
    -private:
    +class VM_G1CollectForAllocation : public VM_CollectForAllocation {
       bool         _pause_succeeded;
     
       bool         _should_initiate_conc_mark;
       bool         _should_retry_gc;
       double       _target_pause_time_ms;
       uint         _old_marking_cycles_completed_before;
    +
     public:
       VM_G1CollectForAllocation(size_t         word_size,
                                 uint           gc_count_before,
    @@ -65,30 +62,23 @@ public:
       virtual bool doit_prologue();
       virtual void doit();
       virtual void doit_epilogue();
    -  virtual const char* name() const {
    -    return "G1 collect for allocation";
    -  }
       bool should_retry_gc() const { return _should_retry_gc; }
       bool pause_succeeded() { return _pause_succeeded; }
     };
     
    -// Concurrent GC stop-the-world operations such as remark and cleanup;
    -// consider sharing these with CMS's counterparts.
    -class VM_CGC_Operation: public VM_Operation {
    +// Concurrent G1 stop-the-world operations such as remark and cleanup.
    +class VM_G1Concurrent : public VM_Operation {
       VoidClosure* _cl;
    -  const char*  _printGCMessage;
    +  const char*  _message;
       uint         _gc_id;
     
     public:
    -  VM_CGC_Operation(VoidClosure* cl, const char *printGCMsg)
    -    : _cl(cl), _printGCMessage(printGCMsg), _gc_id(GCId::current()) {}
    -  virtual VMOp_Type type() const { return VMOp_CGC_Operation; }
    +  VM_G1Concurrent(VoidClosure* cl, const char* message) :
    +    _cl(cl), _message(message), _gc_id(GCId::current()) { }
    +  virtual VMOp_Type type() const { return VMOp_G1Concurrent; }
       virtual void doit();
       virtual bool doit_prologue();
       virtual void doit_epilogue();
    -  virtual const char* name() const {
    -    return "concurrent gc";
    -  }
     };
     
    -#endif // SHARE_VM_GC_G1_VM_OPERATIONS_G1_HPP
    +#endif // SHARE_VM_GC_G1_G1VMOPERATIONS_HPP
    diff --git a/src/hotspot/share/gc/g1/g1YoungRemSetSamplingThread.cpp b/src/hotspot/share/gc/g1/g1YoungRemSetSamplingThread.cpp
    index 7b1133a4841..f993ca3ac43 100644
    --- a/src/hotspot/share/gc/g1/g1YoungRemSetSamplingThread.cpp
    +++ b/src/hotspot/share/gc/g1/g1YoungRemSetSamplingThread.cpp
    @@ -25,6 +25,8 @@
     #include "precompiled.hpp"
     #include "gc/g1/g1CollectedHeap.inline.hpp"
     #include "gc/g1/g1CollectionSet.hpp"
    +#include "gc/g1/g1ConcurrentMark.inline.hpp"
    +#include "gc/g1/g1ConcurrentMarkThread.inline.hpp"
     #include "gc/g1/g1Policy.hpp"
     #include "gc/g1/g1YoungRemSetSamplingThread.hpp"
     #include "gc/g1/heapRegion.inline.hpp"
    @@ -37,7 +39,8 @@ G1YoungRemSetSamplingThread::G1YoungRemSetSamplingThread() :
         _monitor(Mutex::nonleaf,
                  "G1YoungRemSetSamplingThread monitor",
                  true,
    -             Monitor::_safepoint_check_never) {
    +             Monitor::_safepoint_check_never),
    +    _last_periodic_gc_attempt_s(os::elapsedTime()) {
       set_name("G1 Young RemSet Sampling");
       create_and_start();
     }
    @@ -45,11 +48,49 @@ G1YoungRemSetSamplingThread::G1YoungRemSetSamplingThread() :
     void G1YoungRemSetSamplingThread::sleep_before_next_cycle() {
       MutexLockerEx x(&_monitor, Mutex::_no_safepoint_check_flag);
       if (!should_terminate()) {
    -    uintx waitms = G1ConcRefinementServiceIntervalMillis; // 300, really should be?
    +    uintx waitms = G1ConcRefinementServiceIntervalMillis;
         _monitor.wait(Mutex::_no_safepoint_check_flag, waitms);
       }
     }
     
    +bool G1YoungRemSetSamplingThread::should_start_periodic_gc() {
    +  // If we are currently in a concurrent mark we are going to uncommit memory soon.
    +  if (G1CollectedHeap::heap()->concurrent_mark()->cm_thread()->during_cycle()) {
    +    log_debug(gc, periodic)("Concurrent cycle in progress. Skipping.");
    +    return false;
    +  }
    +
    +  // Check if enough time has passed since the last GC.
    +  uintx time_since_last_gc;
    +  if ((G1PeriodicGCInterval == 0) ||
    +      ((time_since_last_gc = (uintx)Universe::heap()->millis_since_last_gc()) < G1PeriodicGCInterval)) {
    +    log_debug(gc, periodic)("Last GC occurred " UINTX_FORMAT "ms before which is below threshold " UINTX_FORMAT "ms. Skipping.",
    +                            time_since_last_gc, G1PeriodicGCInterval);
    +    return false;
    +  }
    +
    +  // Check if load is lower than max.
    +  double recent_load;
    +  if ((G1PeriodicGCSystemLoadThreshold > 0) &&
    +      (os::loadavg(&recent_load, 1) == -1 || recent_load > G1PeriodicGCSystemLoadThreshold)) {
    +    log_debug(gc, periodic)("Load %1.2f is higher than threshold " UINTX_FORMAT ". Skipping.",
    +                            recent_load, G1PeriodicGCSystemLoadThreshold);
    +    return false;
    +  }
    +
    +  return true;
    +}
    +
    +void G1YoungRemSetSamplingThread::check_for_periodic_gc(){
    +  if ((os::elapsedTime() - _last_periodic_gc_attempt_s) > (G1PeriodicGCInterval / 1000.0)) {
    +    log_debug(gc, periodic)("Checking for periodic GC.");
    +    if (should_start_periodic_gc()) {
    +      Universe::heap()->collect(GCCause::_g1_periodic_collection);
    +    }
    +    _last_periodic_gc_attempt_s = os::elapsedTime();
    +  }
    +}
    +
     void G1YoungRemSetSamplingThread::run_service() {
       double vtime_start = os::elapsedVTime();
     
    @@ -62,6 +103,8 @@ void G1YoungRemSetSamplingThread::run_service() {
           _vtime_accum = 0.0;
         }
     
    +    check_for_periodic_gc();
    +
         sleep_before_next_cycle();
       }
     }
    diff --git a/src/hotspot/share/gc/g1/g1YoungRemSetSamplingThread.hpp b/src/hotspot/share/gc/g1/g1YoungRemSetSamplingThread.hpp
    index b5215efbd19..f0068a24db8 100644
    --- a/src/hotspot/share/gc/g1/g1YoungRemSetSamplingThread.hpp
    +++ b/src/hotspot/share/gc/g1/g1YoungRemSetSamplingThread.hpp
    @@ -43,14 +43,20 @@ class G1YoungRemSetSamplingThread: public ConcurrentGCThread {
     private:
       Monitor _monitor;
     
    +  double _last_periodic_gc_attempt_s;
    +
    +  double _vtime_accum;  // Accumulated virtual time.
    +
       void sample_young_list_rs_lengths();
     
       void run_service();
    +  void check_for_periodic_gc();
    +
       void stop_service();
     
       void sleep_before_next_cycle();
     
    -  double _vtime_accum;  // Accumulated virtual time.
    +  bool should_start_periodic_gc();
     
     public:
       G1YoungRemSetSamplingThread();
    diff --git a/src/hotspot/share/gc/g1/g1_globals.hpp b/src/hotspot/share/gc/g1/g1_globals.hpp
    index 621d8455fe9..83f259da7cc 100644
    --- a/src/hotspot/share/gc/g1/g1_globals.hpp
    +++ b/src/hotspot/share/gc/g1/g1_globals.hpp
    @@ -299,6 +299,22 @@
               "Verify the code root lists attached to each heap region.")       \
                                                                                 \
       develop(bool, G1VerifyBitmaps, false,                                     \
    -          "Verifies the consistency of the marking bitmaps")
    +          "Verifies the consistency of the marking bitmaps")                \
    +                                                                            \
    +  manageable(uintx, G1PeriodicGCInterval, 0,                                \
    +          "Number of milliseconds after a previous GC to wait before "      \
    +          "triggering a periodic gc. A value of zero disables periodically "\
    +          "enforced gc cycles.")                                            \
    +                                                                            \
    +  product(bool, G1PeriodicGCInvokesConcurrent, true,                        \
    +          "Determines the kind of periodic GC. Set to true to have G1 "     \
    +          "perform a concurrent GC as periodic GC, otherwise use a STW "    \
    +          "Full GC.")                                                       \
    +                                                                            \
    +  manageable(uintx, G1PeriodicGCSystemLoadThreshold, 0,                     \
    +          "Maximum recent system wide system load as returned by the 1m "   \
    +          "value of getloadavg() at which G1 triggers a periodic GC. A "    \
    +          "load above this value cancels a given periodic GC. A value of "  \
    +          "zero disables this check.")                                      \
     
     #endif // SHARE_VM_GC_G1_G1_GLOBALS_HPP
    diff --git a/src/hotspot/share/gc/g1/heapRegion.cpp b/src/hotspot/share/gc/g1/heapRegion.cpp
    index 226d94a9a41..bca744ff027 100644
    --- a/src/hotspot/share/gc/g1/heapRegion.cpp
    +++ b/src/hotspot/share/gc/g1/heapRegion.cpp
    @@ -26,6 +26,7 @@
     #include "code/nmethod.hpp"
     #include "gc/g1/g1BlockOffsetTable.inline.hpp"
     #include "gc/g1/g1CollectedHeap.inline.hpp"
    +#include "gc/g1/g1CollectionSet.hpp"
     #include "gc/g1/g1HeapRegionTraceType.hpp"
     #include "gc/g1/g1OopClosures.inline.hpp"
     #include "gc/g1/heapRegion.inline.hpp"
    @@ -240,7 +241,8 @@ HeapRegion::HeapRegion(uint hrm_index,
         _containing_set(NULL),
     #endif
         _prev_marked_bytes(0), _next_marked_bytes(0), _gc_efficiency(0.0),
    -    _young_index_in_cset(-1), _surv_rate_group(NULL), _age_index(-1),
    +    _index_in_opt_cset(G1OptionalCSet::InvalidCSetIndex), _young_index_in_cset(-1),
    +    _surv_rate_group(NULL), _age_index(-1),
         _prev_top_at_mark_start(NULL), _next_top_at_mark_start(NULL),
         _recorded_rs_length(0), _predicted_elapsed_time_ms(0)
     {
    diff --git a/src/hotspot/share/gc/g1/heapRegion.hpp b/src/hotspot/share/gc/g1/heapRegion.hpp
    index 5973e4c70e3..4b3a99f4112 100644
    --- a/src/hotspot/share/gc/g1/heapRegion.hpp
    +++ b/src/hotspot/share/gc/g1/heapRegion.hpp
    @@ -250,6 +250,9 @@ class HeapRegion: public G1ContiguousSpace {
       // The calculated GC efficiency of the region.
       double _gc_efficiency;
     
    +  // The index in the optional regions array, if this region
    +  // is considered optional during a mixed collections.
    +  uint _index_in_opt_cset;
       int  _young_index_in_cset;
       SurvRateGroup* _surv_rate_group;
       int  _age_index;
    @@ -526,14 +529,6 @@ class HeapRegion: public G1ContiguousSpace {
       // info fields.
       inline void note_end_of_marking();
     
    -  // Notify the region that it will be used as to-space during a GC
    -  // and we are about to start copying objects into it.
    -  inline void note_start_of_copying(bool during_initial_mark);
    -
    -  // Notify the region that it ceases being to-space during a GC and
    -  // we will not copy objects into it any more.
    -  inline void note_end_of_copying(bool during_initial_mark);
    -
       // Notify the region that we are about to start processing
       // self-forwarded objects during evac failure handling.
       void note_self_forwarding_removal_start(bool during_initial_mark,
    @@ -554,6 +549,9 @@ class HeapRegion: public G1ContiguousSpace {
       void calc_gc_efficiency(void);
       double gc_efficiency() { return _gc_efficiency;}
     
    +  uint index_in_opt_cset() const { return _index_in_opt_cset; }
    +  void set_index_in_opt_cset(uint index) { _index_in_opt_cset = index; }
    +
       int  young_index_in_cset() const { return _young_index_in_cset; }
       void set_young_index_in_cset(int index) {
         assert( (index == -1) || is_young(), "pre-condition" );
    diff --git a/src/hotspot/share/gc/g1/heapRegion.inline.hpp b/src/hotspot/share/gc/g1/heapRegion.inline.hpp
    index a37ae507cfa..4cd800059b0 100644
    --- a/src/hotspot/share/gc/g1/heapRegion.inline.hpp
    +++ b/src/hotspot/share/gc/g1/heapRegion.inline.hpp
    @@ -252,49 +252,6 @@ inline void HeapRegion::note_end_of_marking() {
       _next_marked_bytes = 0;
     }
     
    -inline void HeapRegion::note_start_of_copying(bool during_initial_mark) {
    -  if (is_survivor()) {
    -    // This is how we always allocate survivors.
    -    assert(_next_top_at_mark_start == bottom(), "invariant");
    -  } else {
    -    if (during_initial_mark) {
    -      // During initial-mark we'll explicitly mark any objects on old
    -      // regions that are pointed to by roots. Given that explicit
    -      // marks only make sense under NTAMS it'd be nice if we could
    -      // check that condition if we wanted to. Given that we don't
    -      // know where the top of this region will end up, we simply set
    -      // NTAMS to the end of the region so all marks will be below
    -      // NTAMS. We'll set it to the actual top when we retire this region.
    -      _next_top_at_mark_start = end();
    -    } else {
    -      // We could have re-used this old region as to-space over a
    -      // couple of GCs since the start of the concurrent marking
    -      // cycle. This means that [bottom,NTAMS) will contain objects
    -      // copied up to and including initial-mark and [NTAMS, top)
    -      // will contain objects copied during the concurrent marking cycle.
    -      assert(top() >= _next_top_at_mark_start, "invariant");
    -    }
    -  }
    -}
    -
    -inline void HeapRegion::note_end_of_copying(bool during_initial_mark) {
    -  if (is_survivor()) {
    -    // This is how we always allocate survivors.
    -    assert(_next_top_at_mark_start == bottom(), "invariant");
    -  } else {
    -    if (during_initial_mark) {
    -      // See the comment for note_start_of_copying() for the details
    -      // on this.
    -      assert(_next_top_at_mark_start == end(), "pre-condition");
    -      _next_top_at_mark_start = top();
    -    } else {
    -      // See the comment for note_start_of_copying() for the details
    -      // on this.
    -      assert(top() >= _next_top_at_mark_start, "invariant");
    -    }
    -  }
    -}
    -
     inline bool HeapRegion::in_collection_set() const {
       return G1CollectedHeap::heap()->is_in_cset(this);
     }
    diff --git a/src/hotspot/share/gc/parallel/gcTaskManager.cpp b/src/hotspot/share/gc/parallel/gcTaskManager.cpp
    index dac0660437d..f7a29928e8a 100644
    --- a/src/hotspot/share/gc/parallel/gcTaskManager.cpp
    +++ b/src/hotspot/share/gc/parallel/gcTaskManager.cpp
    @@ -27,6 +27,7 @@
     #include "gc/parallel/gcTaskThread.hpp"
     #include "gc/shared/gcId.hpp"
     #include "gc/shared/workerManager.hpp"
    +#include "gc/shared/workerPolicy.hpp"
     #include "logging/log.hpp"
     #include "logging/logStream.hpp"
     #include "memory/allocation.hpp"
    @@ -494,9 +495,9 @@ GCTaskManager::~GCTaskManager() {
     
     void GCTaskManager::set_active_gang() {
       _active_workers =
    -    AdaptiveSizePolicy::calc_active_workers(workers(),
    -                                 active_workers(),
    -                                 Threads::number_of_non_daemon_threads());
    +    WorkerPolicy::calc_active_workers(workers(),
    +                                      active_workers(),
    +                                      Threads::number_of_non_daemon_threads());
     
       assert(!all_workers_active() || active_workers() == ParallelGCThreads,
              "all_workers_active() is  incorrect: "
    diff --git a/src/hotspot/share/gc/parallel/parallelArguments.cpp b/src/hotspot/share/gc/parallel/parallelArguments.cpp
    index 73201eecfe9..6caacb68bb1 100644
    --- a/src/hotspot/share/gc/parallel/parallelArguments.cpp
    +++ b/src/hotspot/share/gc/parallel/parallelArguments.cpp
    @@ -29,10 +29,10 @@
     #include "gc/shared/adaptiveSizePolicy.hpp"
     #include "gc/shared/collectorPolicy.hpp"
     #include "gc/shared/gcArguments.inline.hpp"
    +#include "gc/shared/workerPolicy.hpp"
     #include "runtime/globals.hpp"
     #include "runtime/globals_extension.hpp"
     #include "runtime/java.hpp"
    -#include "runtime/vm_version.hpp"
     #include "utilities/defaultStream.hpp"
     
     size_t ParallelArguments::conservative_max_heap_alignment() {
    @@ -51,7 +51,7 @@ void ParallelArguments::initialize() {
       // If no heap maximum was requested explicitly, use some reasonable fraction
       // of the physical memory, up to a maximum of 1GB.
       FLAG_SET_DEFAULT(ParallelGCThreads,
    -                   VM_Version::parallel_worker_threads());
    +                   WorkerPolicy::parallel_worker_threads());
       if (ParallelGCThreads == 0) {
         jio_fprintf(defaultStream::error_stream(),
             "The Parallel GC can not be combined with -XX:ParallelGCThreads=0\n");
    diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
    index 63c5cbc76ea..7957d304099 100644
    --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
    +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
    @@ -36,7 +36,7 @@
     #include "gc/parallel/psParallelCompact.inline.hpp"
     #include "gc/parallel/psPromotionManager.hpp"
     #include "gc/parallel/psScavenge.hpp"
    -#include "gc/parallel/vmPSOperations.hpp"
    +#include "gc/parallel/psVMOperations.hpp"
     #include "gc/shared/gcHeapSummary.hpp"
     #include "gc/shared/gcLocker.hpp"
     #include "gc/shared/gcWhen.hpp"
    diff --git a/src/hotspot/share/gc/parallel/pcTasks.cpp b/src/hotspot/share/gc/parallel/pcTasks.cpp
    index 656e4d7decc..28f516301f0 100644
    --- a/src/hotspot/share/gc/parallel/pcTasks.cpp
    +++ b/src/hotspot/share/gc/parallel/pcTasks.cpp
    @@ -158,14 +158,15 @@ void RefProcTaskExecutor::execute(ProcessTask& task, uint ergo_workers)
              "Ergonomically chosen workers (%u) must be equal to active workers (%u)",
              ergo_workers, active_gc_threads);
       OopTaskQueueSet* qset = ParCompactionManager::stack_array();
    -  ParallelTaskTerminator terminator(active_gc_threads, qset);
    +  TaskTerminator terminator(active_gc_threads, qset);
    +
       GCTaskQueue* q = GCTaskQueue::create();
       for(uint i=0; ienqueue(new RefProcTaskProxy(task, i));
       }
       if (task.marks_oops_alive() && (active_gc_threads>1)) {
         for (uint j=0; jenqueue(new StealMarkingTask(&terminator));
    +      q->enqueue(new StealMarkingTask(terminator.terminator()));
         }
       }
       PSParallelCompact::gc_task_manager()->execute_and_wait(q);
    diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp b/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp
    index 8160b31be22..b34e2275be2 100644
    --- a/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp
    +++ b/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp
    @@ -117,7 +117,7 @@ inline void ParCompactionManager::mark_and_push(T* p) {
     }
     
     inline void ParCompactionManager::follow_klass(Klass* klass) {
    -  oop holder = klass->klass_holder();
    +  oop holder = klass->class_loader_data()->holder_no_keepalive();
       mark_and_push(&holder);
     }
     
    diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
    index a1c3ae19937..e3817797557 100644
    --- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp
    +++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
    @@ -2100,7 +2100,7 @@ void PSParallelCompact::marking_phase(ParCompactionManager* cm,
       uint parallel_gc_threads = heap->gc_task_manager()->workers();
       uint active_gc_threads = heap->gc_task_manager()->active_workers();
       TaskQueueSetSuper* qset = ParCompactionManager::stack_array();
    -  ParallelTaskTerminator terminator(active_gc_threads, qset);
    +  TaskTerminator terminator(active_gc_threads, qset);
     
       PCMarkAndPushClosure mark_and_push_closure(cm);
       ParCompactionManager::FollowStackClosure follow_stack_closure(cm);
    @@ -2129,7 +2129,7 @@ void PSParallelCompact::marking_phase(ParCompactionManager* cm,
     
         if (active_gc_threads > 1) {
           for (uint j = 0; j < active_gc_threads; j++) {
    -        q->enqueue(new StealMarkingTask(&terminator));
    +        q->enqueue(new StealMarkingTask(terminator.terminator()));
           }
         }
     
    @@ -2459,12 +2459,12 @@ void PSParallelCompact::compact() {
       uint parallel_gc_threads = heap->gc_task_manager()->workers();
       uint active_gc_threads = heap->gc_task_manager()->active_workers();
       TaskQueueSetSuper* qset = ParCompactionManager::region_array();
    -  ParallelTaskTerminator terminator(active_gc_threads, qset);
    +  TaskTerminator terminator(active_gc_threads, qset);
     
       GCTaskQueue* q = GCTaskQueue::create();
       prepare_region_draining_tasks(q, active_gc_threads);
       enqueue_dense_prefix_tasks(q, active_gc_threads);
    -  enqueue_region_stealing_tasks(q, &terminator, active_gc_threads);
    +  enqueue_region_stealing_tasks(q, terminator.terminator(), active_gc_threads);
     
       {
         GCTraceTime(Trace, gc, phases) tm("Par Compact", &_gc_timer);
    diff --git a/src/hotspot/share/gc/parallel/psScavenge.cpp b/src/hotspot/share/gc/parallel/psScavenge.cpp
    index 3d982bc4c59..d5541b4f6cf 100644
    --- a/src/hotspot/share/gc/parallel/psScavenge.cpp
    +++ b/src/hotspot/share/gc/parallel/psScavenge.cpp
    @@ -57,7 +57,7 @@
     #include "runtime/handles.inline.hpp"
     #include "runtime/threadCritical.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/memoryService.hpp"
     #include "utilities/stack.inline.hpp"
     
    @@ -168,11 +168,11 @@ void PSRefProcTaskExecutor::execute(ProcessTask& task, uint ergo_workers)
       for(uint i=0; i < active_workers; i++) {
         q->enqueue(new PSRefProcTaskProxy(task, i));
       }
    -  ParallelTaskTerminator terminator(active_workers,
    -                                    (TaskQueueSetSuper*) PSPromotionManager::stack_array_depth());
    +  TaskTerminator terminator(active_workers,
    +                            (TaskQueueSetSuper*) PSPromotionManager::stack_array_depth());
       if (task.marks_oops_alive() && active_workers > 1) {
         for (uint j = 0; j < active_workers; j++) {
    -      q->enqueue(new StealTask(&terminator));
    +      q->enqueue(new StealTask(terminator.terminator()));
         }
       }
       manager->execute_and_wait(q);
    @@ -380,16 +380,15 @@ bool PSScavenge::invoke_no_policy() {
           q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti));
           q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::code_cache));
     
    -      ParallelTaskTerminator terminator(
    -        active_workers,
    -                  (TaskQueueSetSuper*) promotion_manager->stack_array_depth());
    +      TaskTerminator terminator(active_workers,
    +                                (TaskQueueSetSuper*) promotion_manager->stack_array_depth());
             // If active_workers can exceed 1, add a StrealTask.
             // PSPromotionManager::drain_stacks_depth() does not fully drain its
             // stacks and expects a StealTask to complete the draining if
             // ParallelGCThreads is > 1.
             if (gc_task_manager()->workers() > 1) {
               for (uint j = 0; j < active_workers; j++) {
    -            q->enqueue(new StealTask(&terminator));
    +            q->enqueue(new StealTask(terminator.terminator()));
               }
             }
     
    diff --git a/src/hotspot/share/gc/parallel/vmPSOperations.cpp b/src/hotspot/share/gc/parallel/psVMOperations.cpp
    similarity index 96%
    rename from src/hotspot/share/gc/parallel/vmPSOperations.cpp
    rename to src/hotspot/share/gc/parallel/psVMOperations.cpp
    index 67d094d1027..bc8d6336fe7 100644
    --- a/src/hotspot/share/gc/parallel/vmPSOperations.cpp
    +++ b/src/hotspot/share/gc/parallel/psVMOperations.cpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -25,7 +25,7 @@
     #include "precompiled.hpp"
     #include "gc/parallel/parallelScavengeHeap.inline.hpp"
     #include "gc/parallel/psScavenge.hpp"
    -#include "gc/parallel/vmPSOperations.hpp"
    +#include "gc/parallel/psVMOperations.hpp"
     #include "gc/shared/gcLocker.hpp"
     #include "utilities/dtrace.hpp"
     
    diff --git a/src/hotspot/share/gc/parallel/vmPSOperations.hpp b/src/hotspot/share/gc/parallel/psVMOperations.hpp
    similarity index 86%
    rename from src/hotspot/share/gc/parallel/vmPSOperations.hpp
    rename to src/hotspot/share/gc/parallel/psVMOperations.hpp
    index af7be6e93f0..5a5decfce62 100644
    --- a/src/hotspot/share/gc/parallel/vmPSOperations.hpp
    +++ b/src/hotspot/share/gc/parallel/psVMOperations.hpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -22,12 +22,12 @@
      *
      */
     
    -#ifndef SHARE_VM_GC_PARALLEL_VMPSOPERATIONS_HPP
    -#define SHARE_VM_GC_PARALLEL_VMPSOPERATIONS_HPP
    +#ifndef SHARE_VM_GC_PARALLEL_PSVMOPERATIONS_HPP
    +#define SHARE_VM_GC_PARALLEL_PSVMOPERATIONS_HPP
     
     #include "gc/parallel/parallelScavengeHeap.hpp"
     #include "gc/shared/gcCause.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     
     class VM_ParallelGCFailedAllocation : public VM_CollectForAllocation {
      public:
    @@ -46,4 +46,4 @@ class VM_ParallelGCSystemGC: public VM_GC_Operation {
       virtual void doit();
     };
     
    -#endif // SHARE_VM_GC_PARALLEL_VMPSOPERATIONS_HPP
    +#endif // SHARE_VM_GC_PARALLEL_PSVMOPERATIONS_HPP
    diff --git a/src/hotspot/share/gc/serial/markSweep.inline.hpp b/src/hotspot/share/gc/serial/markSweep.inline.hpp
    index a43588f0a4c..73f6b991e16 100644
    --- a/src/hotspot/share/gc/serial/markSweep.inline.hpp
    +++ b/src/hotspot/share/gc/serial/markSweep.inline.hpp
    @@ -57,7 +57,7 @@ template  inline void MarkSweep::mark_and_push(T* p) {
     }
     
     inline void MarkSweep::follow_klass(Klass* klass) {
    -  oop op = klass->klass_holder();
    +  oop op = klass->class_loader_data()->holder_no_keepalive();
       MarkSweep::mark_and_push(&op);
     }
     
    diff --git a/src/hotspot/share/gc/shared/adaptiveSizePolicy.cpp b/src/hotspot/share/gc/shared/adaptiveSizePolicy.cpp
    index 74c2e81714c..f2b42ba0246 100644
    --- a/src/hotspot/share/gc/shared/adaptiveSizePolicy.cpp
    +++ b/src/hotspot/share/gc/shared/adaptiveSizePolicy.cpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -24,18 +24,14 @@
     
     #include "precompiled.hpp"
     #include "gc/shared/adaptiveSizePolicy.hpp"
    -#include "gc/shared/collectorPolicy.hpp"
     #include "gc/shared/gcCause.hpp"
     #include "gc/shared/gcUtil.inline.hpp"
     #include "gc/shared/softRefPolicy.hpp"
    -#include "gc/shared/workgroup.hpp"
     #include "logging/log.hpp"
     #include "runtime/timer.hpp"
    -#include "utilities/ostream.hpp"
     
     elapsedTimer AdaptiveSizePolicy::_minor_timer;
     elapsedTimer AdaptiveSizePolicy::_major_timer;
    -bool AdaptiveSizePolicy::_debug_perturbation = false;
     
     // The throughput goal is implemented as
     //      _throughput_goal = 1 - ( 1 / (1 + gc_cost_ratio))
    @@ -94,129 +90,6 @@ AdaptiveSizePolicy::AdaptiveSizePolicy(size_t init_eden_size,
       _young_gen_policy_is_ready = false;
     }
     
    -//  If the number of GC threads was set on the command line,
    -// use it.
    -//  Else
    -//    Calculate the number of GC threads based on the number of Java threads.
    -//    Calculate the number of GC threads based on the size of the heap.
    -//    Use the larger.
    -
    -uint AdaptiveSizePolicy::calc_default_active_workers(uintx total_workers,
    -                                                     const uintx min_workers,
    -                                                     uintx active_workers,
    -                                                     uintx application_workers) {
    -  // If the user has specifically set the number of
    -  // GC threads, use them.
    -
    -  // If the user has turned off using a dynamic number of GC threads
    -  // or the users has requested a specific number, set the active
    -  // number of workers to all the workers.
    -
    -  uintx new_active_workers = total_workers;
    -  uintx prev_active_workers = active_workers;
    -  uintx active_workers_by_JT = 0;
    -  uintx active_workers_by_heap_size = 0;
    -
    -  // Always use at least min_workers but use up to
    -  // GCThreadsPerJavaThreads * application threads.
    -  active_workers_by_JT =
    -    MAX2((uintx) GCWorkersPerJavaThread * application_workers,
    -         min_workers);
    -
    -  // Choose a number of GC threads based on the current size
    -  // of the heap.  This may be complicated because the size of
    -  // the heap depends on factors such as the throughput goal.
    -  // Still a large heap should be collected by more GC threads.
    -  active_workers_by_heap_size =
    -      MAX2((size_t) 2U, Universe::heap()->capacity() / HeapSizePerGCThread);
    -
    -  uintx max_active_workers =
    -    MAX2(active_workers_by_JT, active_workers_by_heap_size);
    -
    -  new_active_workers = MIN2(max_active_workers, (uintx) total_workers);
    -
    -  // Increase GC workers instantly but decrease them more
    -  // slowly.
    -  if (new_active_workers < prev_active_workers) {
    -    new_active_workers =
    -      MAX2(min_workers, (prev_active_workers + new_active_workers) / 2);
    -  }
    -
    -  // Check once more that the number of workers is within the limits.
    -  assert(min_workers <= total_workers, "Minimum workers not consistent with total workers");
    -  assert(new_active_workers >= min_workers, "Minimum workers not observed");
    -  assert(new_active_workers <= total_workers, "Total workers not observed");
    -
    -  if (ForceDynamicNumberOfGCThreads) {
    -    // Assume this is debugging and jiggle the number of GC threads.
    -    if (new_active_workers == prev_active_workers) {
    -      if (new_active_workers < total_workers) {
    -        new_active_workers++;
    -      } else if (new_active_workers > min_workers) {
    -        new_active_workers--;
    -      }
    -    }
    -    if (new_active_workers == total_workers) {
    -      if (_debug_perturbation) {
    -        new_active_workers =  min_workers;
    -      }
    -      _debug_perturbation = !_debug_perturbation;
    -    }
    -    assert((new_active_workers <= ParallelGCThreads) &&
    -           (new_active_workers >= min_workers),
    -      "Jiggled active workers too much");
    -  }
    -
    -  log_trace(gc, task)("GCTaskManager::calc_default_active_workers() : "
    -     "active_workers(): " UINTX_FORMAT "  new_active_workers: " UINTX_FORMAT "  "
    -     "prev_active_workers: " UINTX_FORMAT "\n"
    -     " active_workers_by_JT: " UINTX_FORMAT "  active_workers_by_heap_size: " UINTX_FORMAT,
    -     active_workers, new_active_workers, prev_active_workers,
    -     active_workers_by_JT, active_workers_by_heap_size);
    -  assert(new_active_workers > 0, "Always need at least 1");
    -  return new_active_workers;
    -}
    -
    -uint AdaptiveSizePolicy::calc_active_workers(uintx total_workers,
    -                                             uintx active_workers,
    -                                             uintx application_workers) {
    -  // If the user has specifically set the number of
    -  // GC threads, use them.
    -
    -  // If the user has turned off using a dynamic number of GC threads
    -  // or the users has requested a specific number, set the active
    -  // number of workers to all the workers.
    -
    -  uint new_active_workers;
    -  if (!UseDynamicNumberOfGCThreads ||
    -     (!FLAG_IS_DEFAULT(ParallelGCThreads) && !ForceDynamicNumberOfGCThreads)) {
    -    new_active_workers = total_workers;
    -  } else {
    -    uintx min_workers = (total_workers == 1) ? 1 : 2;
    -    new_active_workers = calc_default_active_workers(total_workers,
    -                                                     min_workers,
    -                                                     active_workers,
    -                                                     application_workers);
    -  }
    -  assert(new_active_workers > 0, "Always need at least 1");
    -  return new_active_workers;
    -}
    -
    -uint AdaptiveSizePolicy::calc_active_conc_workers(uintx total_workers,
    -                                                  uintx active_workers,
    -                                                  uintx application_workers) {
    -  if (!UseDynamicNumberOfGCThreads ||
    -     (!FLAG_IS_DEFAULT(ConcGCThreads) && !ForceDynamicNumberOfGCThreads)) {
    -    return ConcGCThreads;
    -  } else {
    -    uint no_of_gc_threads = calc_default_active_workers(total_workers,
    -                                                        1, /* Minimum number of workers */
    -                                                        active_workers,
    -                                                        application_workers);
    -    return no_of_gc_threads;
    -  }
    -}
    -
     bool AdaptiveSizePolicy::tenuring_threshold_change() const {
       return decrement_tenuring_threshold_for_gc_cost() ||
              increment_tenuring_threshold_for_gc_cost() ||
    diff --git a/src/hotspot/share/gc/shared/adaptiveSizePolicy.hpp b/src/hotspot/share/gc/shared/adaptiveSizePolicy.hpp
    index 071b7a36784..ef1bc807ec3 100644
    --- a/src/hotspot/share/gc/shared/adaptiveSizePolicy.hpp
    +++ b/src/hotspot/share/gc/shared/adaptiveSizePolicy.hpp
    @@ -25,12 +25,9 @@
     #ifndef SHARE_VM_GC_SHARED_ADAPTIVESIZEPOLICY_HPP
     #define SHARE_VM_GC_SHARED_ADAPTIVESIZEPOLICY_HPP
     
    -#include "gc/shared/collectedHeap.hpp"
     #include "gc/shared/gcCause.hpp"
     #include "gc/shared/gcUtil.hpp"
    -#include "logging/log.hpp"
     #include "memory/allocation.hpp"
    -#include "memory/universe.hpp"
     
     // This class keeps statistical information and computes the
     // size of the heap.
    @@ -188,8 +185,6 @@ class AdaptiveSizePolicy : public CHeapObj {
       julong _young_gen_change_for_minor_throughput;
       julong _old_gen_change_for_major_throughput;
     
    -  static const uint GCWorkersPerJavaThread  = 2;
    -
       // Accessors
     
       double gc_pause_goal_sec() const { return _gc_pause_goal_sec; }
    @@ -334,8 +329,6 @@ class AdaptiveSizePolicy : public CHeapObj {
       // Return true if the policy suggested a change.
       bool tenuring_threshold_change() const;
     
    -  static bool _debug_perturbation;
    -
      public:
       AdaptiveSizePolicy(size_t init_eden_size,
                          size_t init_promo_size,
    @@ -343,32 +336,6 @@ class AdaptiveSizePolicy : public CHeapObj {
                          double gc_pause_goal_sec,
                          uint gc_cost_ratio);
     
    -  // Return number default  GC threads to use in the next GC.
    -  static uint calc_default_active_workers(uintx total_workers,
    -                                          const uintx min_workers,
    -                                          uintx active_workers,
    -                                          uintx application_workers);
    -
    -  // Return number of GC threads to use in the next GC.
    -  // This is called sparingly so as not to change the
    -  // number of GC workers gratuitously.
    -  //   For ParNew collections
    -  //   For PS scavenge and ParOld collections
    -  //   For G1 evacuation pauses (subject to update)
    -  //   For G1 Full GCs (subject to update)
    -  // Other collection phases inherit the number of
    -  // GC workers from the calls above.  For example,
    -  // a CMS parallel remark uses the same number of GC
    -  // workers as the most recent ParNew collection.
    -  static uint calc_active_workers(uintx total_workers,
    -                                  uintx active_workers,
    -                                  uintx application_workers);
    -
    -  // Return number of GC threads to use in the next concurrent GC phase.
    -  static uint calc_active_conc_workers(uintx total_workers,
    -                                       uintx active_workers,
    -                                       uintx application_workers);
    -
       bool is_gc_cms_adaptive_size_policy() {
         return kind() == _gc_cms_adaptive_size_policy;
       }
    diff --git a/src/hotspot/share/gc/shared/barrierSetConfig.hpp b/src/hotspot/share/gc/shared/barrierSetConfig.hpp
    index afef9759687..d61adb75b10 100644
    --- a/src/hotspot/share/gc/shared/barrierSetConfig.hpp
    +++ b/src/hotspot/share/gc/shared/barrierSetConfig.hpp
    @@ -32,6 +32,7 @@
       f(CardTableBarrierSet)                             \
       EPSILONGC_ONLY(f(EpsilonBarrierSet))               \
       G1GC_ONLY(f(G1BarrierSet))                         \
    +  SHENANDOAHGC_ONLY(f(ShenandoahBarrierSet))         \
       ZGC_ONLY(f(ZBarrierSet))
     
     #define FOR_EACH_ABSTRACT_BARRIER_SET_DO(f)          \
    diff --git a/src/hotspot/share/gc/shared/barrierSetConfig.inline.hpp b/src/hotspot/share/gc/shared/barrierSetConfig.inline.hpp
    index 5030975100a..30d4f26e3f4 100644
    --- a/src/hotspot/share/gc/shared/barrierSetConfig.inline.hpp
    +++ b/src/hotspot/share/gc/shared/barrierSetConfig.inline.hpp
    @@ -36,6 +36,9 @@
     #if INCLUDE_G1GC
     #include "gc/g1/g1BarrierSet.inline.hpp"
     #endif
    +#if INCLUDE_SHENANDOAHGC
    +#include "gc/shenandoah/shenandoahBarrierSet.inline.hpp"
    +#endif
     #if INCLUDE_ZGC
     #include "gc/z/zBarrierSet.inline.hpp"
     #endif
    diff --git a/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp b/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp
    index 98a407031cc..ec440504432 100644
    --- a/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp
    +++ b/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp
    @@ -314,6 +314,8 @@ public:
       virtual void ccp_analyze(PhaseCCP* ccp, Unique_Node_List& worklist, Node* use) const {}
     
       virtual Node* split_if_pre(PhaseIdealLoop* phase, Node* n) const { return NULL; }
    +  virtual bool build_loop_late_post(PhaseIdealLoop* phase, Node* n) const { return false; }
    +  virtual bool sink_node(PhaseIdealLoop* phase, Node* n, Node* x, Node* x_ctrl, Node* n_ctrl) const { return false; }
     };
     
     #endif // SHARE_GC_SHARED_C2_BARRIERSETC2_HPP
    diff --git a/src/hotspot/share/gc/shared/collectedHeap.cpp b/src/hotspot/share/gc/shared/collectedHeap.cpp
    index 2bef8f9c0db..cb77b7ff555 100644
    --- a/src/hotspot/share/gc/shared/collectedHeap.cpp
    +++ b/src/hotspot/share/gc/shared/collectedHeap.cpp
    @@ -32,9 +32,9 @@
     #include "gc/shared/gcHeapSummary.hpp"
     #include "gc/shared/gcTrace.hpp"
     #include "gc/shared/gcTraceTime.inline.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "gc/shared/gcWhen.hpp"
     #include "gc/shared/memAllocator.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
     #include "logging/log.hpp"
     #include "memory/metaspace.hpp"
     #include "memory/resourceArea.hpp"
    diff --git a/src/hotspot/share/gc/shared/collectedHeap.hpp b/src/hotspot/share/gc/shared/collectedHeap.hpp
    index 4919cd0acad..7e39499eef1 100644
    --- a/src/hotspot/share/gc/shared/collectedHeap.hpp
    +++ b/src/hotspot/share/gc/shared/collectedHeap.hpp
    @@ -90,6 +90,7 @@ class GCHeapLog : public EventLogBase {
     //     CMSHeap
     //   G1CollectedHeap
     //   ParallelScavengeHeap
    +//   ShenandoahHeap
     //   ZCollectedHeap
     //
     class CollectedHeap : public CHeapObj {
    @@ -176,7 +177,8 @@ class CollectedHeap : public CHeapObj {
         CMS,
         G1,
         Epsilon,
    -    Z
    +    Z,
    +    Shenandoah
       };
     
       static inline size_t filler_array_max_size() {
    diff --git a/src/hotspot/share/gc/shared/collectorPolicy.cpp b/src/hotspot/share/gc/shared/collectorPolicy.cpp
    index c1e29b058df..6c5be4d465b 100644
    --- a/src/hotspot/share/gc/shared/collectorPolicy.cpp
    +++ b/src/hotspot/share/gc/shared/collectorPolicy.cpp
    @@ -28,9 +28,9 @@
     #include "gc/shared/collectorPolicy.hpp"
     #include "gc/shared/gcLocker.hpp"
     #include "gc/shared/gcPolicyCounters.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "gc/shared/generationSpec.hpp"
     #include "gc/shared/space.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
     #include "logging/log.hpp"
     #include "memory/universe.hpp"
     #include "runtime/arguments.hpp"
    diff --git a/src/hotspot/share/gc/shared/gcCause.cpp b/src/hotspot/share/gc/shared/gcCause.cpp
    index 43a3dc368f0..21724bca276 100644
    --- a/src/hotspot/share/gc/shared/gcCause.cpp
    +++ b/src/hotspot/share/gc/shared/gcCause.cpp
    @@ -105,9 +105,27 @@ const char* GCCause::to_string(GCCause::Cause cause) {
         case _g1_humongous_allocation:
           return "G1 Humongous Allocation";
     
    +    case _g1_periodic_collection:
    +      return "G1 Periodic Collection";
    +
         case _dcmd_gc_run:
           return "Diagnostic Command";
     
    +    case _shenandoah_allocation_failure_evac:
    +      return "Allocation Failure During Evacuation";
    +
    +    case _shenandoah_stop_vm:
    +      return "Stopping VM";
    +
    +    case _shenandoah_concurrent_gc:
    +      return "Concurrent GC";
    +
    +    case _shenandoah_traversal_gc:
    +      return "Traversal GC";
    +
    +    case _shenandoah_upgrade_to_full_gc:
    +      return "Upgrade To Full GC";
    +
         case _z_timer:
           return "Timer";
     
    diff --git a/src/hotspot/share/gc/shared/gcCause.hpp b/src/hotspot/share/gc/shared/gcCause.hpp
    index 3d078cac5dd..e3da356f82f 100644
    --- a/src/hotspot/share/gc/shared/gcCause.hpp
    +++ b/src/hotspot/share/gc/shared/gcCause.hpp
    @@ -76,9 +76,16 @@ class GCCause : public AllStatic {
     
         _g1_inc_collection_pause,
         _g1_humongous_allocation,
    +    _g1_periodic_collection,
     
         _dcmd_gc_run,
     
    +    _shenandoah_stop_vm,
    +    _shenandoah_allocation_failure_evac,
    +    _shenandoah_concurrent_gc,
    +    _shenandoah_traversal_gc,
    +    _shenandoah_upgrade_to_full_gc,
    +
         _z_timer,
         _z_warmup,
         _z_allocation_rate,
    @@ -122,7 +129,8 @@ class GCCause : public AllStatic {
         // _allocation_failure is the generic cause a collection for allocation failure
         // _adaptive_size_policy is for a collecton done before a full GC
         return (cause == GCCause::_allocation_failure ||
    -            cause == GCCause::_adaptive_size_policy);
    +            cause == GCCause::_adaptive_size_policy ||
    +            cause == GCCause::_shenandoah_allocation_failure_evac);
       }
     
       // Return a string describing the GCCause.
    diff --git a/src/hotspot/share/gc/shared/gcConfig.cpp b/src/hotspot/share/gc/shared/gcConfig.cpp
    index ddc84c1d2a4..9e32b73aa3b 100644
    --- a/src/hotspot/share/gc/shared/gcConfig.cpp
    +++ b/src/hotspot/share/gc/shared/gcConfig.cpp
    @@ -43,6 +43,9 @@
     #if INCLUDE_SERIALGC
     #include "gc/serial/serialArguments.hpp"
     #endif
    +#if INCLUDE_SHENANDOAHGC
    +#include "gc/shenandoah/shenandoahArguments.hpp"
    +#endif
     #if INCLUDE_ZGC
     #include "gc/z/zArguments.hpp"
     #endif
    @@ -57,23 +60,25 @@ struct SupportedGC {
           _flag(flag), _name(name), _arguments(arguments), _hs_err_name(hs_err_name) {}
     };
     
    -     CMSGC_ONLY(static CMSArguments      cmsArguments;)
    - EPSILONGC_ONLY(static EpsilonArguments  epsilonArguments;)
    -      G1GC_ONLY(static G1Arguments       g1Arguments;)
    -PARALLELGC_ONLY(static ParallelArguments parallelArguments;)
    -  SERIALGC_ONLY(static SerialArguments   serialArguments;)
    -       ZGC_ONLY(static ZArguments        zArguments;)
    +       CMSGC_ONLY(static CMSArguments      cmsArguments;)
    +   EPSILONGC_ONLY(static EpsilonArguments  epsilonArguments;)
    +        G1GC_ONLY(static G1Arguments       g1Arguments;)
    +  PARALLELGC_ONLY(static ParallelArguments parallelArguments;)
    +    SERIALGC_ONLY(static SerialArguments   serialArguments;)
    +SHENANDOAHGC_ONLY(static ShenandoahArguments shenandoahArguments;)
    +         ZGC_ONLY(static ZArguments        zArguments;)
     
     // Table of supported GCs, for translating between command
     // line flag, CollectedHeap::Name and GCArguments instance.
     static const SupportedGC SupportedGCs[] = {
    -       CMSGC_ONLY_ARG(SupportedGC(UseConcMarkSweepGC, CollectedHeap::CMS,      cmsArguments,      "concurrent mark sweep gc"))
    -   EPSILONGC_ONLY_ARG(SupportedGC(UseEpsilonGC,       CollectedHeap::Epsilon,  epsilonArguments,  "epsilon gc"))
    -        G1GC_ONLY_ARG(SupportedGC(UseG1GC,            CollectedHeap::G1,       g1Arguments,       "g1 gc"))
    -  PARALLELGC_ONLY_ARG(SupportedGC(UseParallelGC,      CollectedHeap::Parallel, parallelArguments, "parallel gc"))
    -  PARALLELGC_ONLY_ARG(SupportedGC(UseParallelOldGC,   CollectedHeap::Parallel, parallelArguments, "parallel gc"))
    -    SERIALGC_ONLY_ARG(SupportedGC(UseSerialGC,        CollectedHeap::Serial,   serialArguments,   "serial gc"))
    -         ZGC_ONLY_ARG(SupportedGC(UseZGC,             CollectedHeap::Z,        zArguments,        "z gc"))
    +       CMSGC_ONLY_ARG(SupportedGC(UseConcMarkSweepGC, CollectedHeap::CMS,        cmsArguments,        "concurrent mark sweep gc"))
    +   EPSILONGC_ONLY_ARG(SupportedGC(UseEpsilonGC,       CollectedHeap::Epsilon,    epsilonArguments,    "epsilon gc"))
    +        G1GC_ONLY_ARG(SupportedGC(UseG1GC,            CollectedHeap::G1,         g1Arguments,         "g1 gc"))
    +  PARALLELGC_ONLY_ARG(SupportedGC(UseParallelGC,      CollectedHeap::Parallel,   parallelArguments,   "parallel gc"))
    +  PARALLELGC_ONLY_ARG(SupportedGC(UseParallelOldGC,   CollectedHeap::Parallel,   parallelArguments,   "parallel gc"))
    +    SERIALGC_ONLY_ARG(SupportedGC(UseSerialGC,        CollectedHeap::Serial,     serialArguments,     "serial gc"))
    +SHENANDOAHGC_ONLY_ARG(SupportedGC(UseShenandoahGC,    CollectedHeap::Shenandoah, shenandoahArguments, "shenandoah gc"))
    +         ZGC_ONLY_ARG(SupportedGC(UseZGC,             CollectedHeap::Z,          zArguments,          "z gc"))
     };
     
     #define FOR_EACH_SUPPORTED_GC(var)                                          \
    @@ -90,14 +95,15 @@ GCArguments* GCConfig::_arguments = NULL;
     bool GCConfig::_gc_selected_ergonomically = false;
     
     void GCConfig::fail_if_unsupported_gc_is_selected() {
    -  NOT_CMSGC(     FAIL_IF_SELECTED(UseConcMarkSweepGC, true));
    -  NOT_EPSILONGC( FAIL_IF_SELECTED(UseEpsilonGC,       true));
    -  NOT_G1GC(      FAIL_IF_SELECTED(UseG1GC,            true));
    -  NOT_PARALLELGC(FAIL_IF_SELECTED(UseParallelGC,      true));
    -  NOT_PARALLELGC(FAIL_IF_SELECTED(UseParallelOldGC,   true));
    -  NOT_SERIALGC(  FAIL_IF_SELECTED(UseSerialGC,        true));
    -  NOT_SERIALGC(  FAIL_IF_SELECTED(UseParallelOldGC,   false));
    -  NOT_ZGC(       FAIL_IF_SELECTED(UseZGC,             true));
    +  NOT_CMSGC(       FAIL_IF_SELECTED(UseConcMarkSweepGC, true));
    +  NOT_EPSILONGC(   FAIL_IF_SELECTED(UseEpsilonGC,       true));
    +  NOT_G1GC(        FAIL_IF_SELECTED(UseG1GC,            true));
    +  NOT_PARALLELGC(  FAIL_IF_SELECTED(UseParallelGC,      true));
    +  NOT_PARALLELGC(  FAIL_IF_SELECTED(UseParallelOldGC,   true));
    +  NOT_SERIALGC(    FAIL_IF_SELECTED(UseSerialGC,        true));
    +  NOT_SERIALGC(    FAIL_IF_SELECTED(UseParallelOldGC,   false));
    +  NOT_SHENANDOAHGC(FAIL_IF_SELECTED(UseShenandoahGC,    true));
    +  NOT_ZGC(         FAIL_IF_SELECTED(UseZGC,             true));
     }
     
     void GCConfig::select_gc_ergonomically() {
    diff --git a/src/hotspot/share/gc/shared/gcConfiguration.cpp b/src/hotspot/share/gc/shared/gcConfiguration.cpp
    index f37387dd73c..47c22129a57 100644
    --- a/src/hotspot/share/gc/shared/gcConfiguration.cpp
    +++ b/src/hotspot/share/gc/shared/gcConfiguration.cpp
    @@ -43,7 +43,7 @@ GCName GCConfiguration::young_collector() const {
         return ParNew;
       }
     
    -  if (UseZGC) {
    +  if (UseZGC || UseShenandoahGC) {
         return NA;
       }
     
    @@ -67,6 +67,10 @@ GCName GCConfiguration::old_collector() const {
         return Z;
       }
     
    +  if (UseShenandoahGC) {
    +    return Shenandoah;
    +  }
    +
       return SerialOld;
     }
     
    diff --git a/src/hotspot/share/gc/shared/gcName.hpp b/src/hotspot/share/gc/shared/gcName.hpp
    index bc21fa6ccaa..0fe1b5ce604 100644
    --- a/src/hotspot/share/gc/shared/gcName.hpp
    +++ b/src/hotspot/share/gc/shared/gcName.hpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -39,6 +39,7 @@ enum GCName {
       G1Old,
       G1Full,
       Z,
    +  Shenandoah,
       NA,
       GCNameEndSentinel
     };
    @@ -58,6 +59,7 @@ class GCNameHelper {
           case G1Old: return "G1Old";
           case G1Full: return "G1Full";
           case Z: return "Z";
    +      case Shenandoah: return "Shenandoah";
           case NA: return "N/A";
           default: ShouldNotReachHere(); return NULL;
         }
    diff --git a/src/hotspot/share/gc/shared/vmGCOperations.cpp b/src/hotspot/share/gc/shared/gcVMOperations.cpp
    similarity index 97%
    rename from src/hotspot/share/gc/shared/vmGCOperations.cpp
    rename to src/hotspot/share/gc/shared/gcVMOperations.cpp
    index 220e1e9a910..fb658921785 100644
    --- a/src/hotspot/share/gc/shared/vmGCOperations.cpp
    +++ b/src/hotspot/share/gc/shared/gcVMOperations.cpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -28,8 +28,8 @@
     #include "gc/shared/allocTracer.hpp"
     #include "gc/shared/gcId.hpp"
     #include "gc/shared/gcLocker.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "gc/shared/genCollectedHeap.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
     #include "interpreter/oopMapCache.hpp"
     #include "logging/log.hpp"
     #include "memory/oopFactory.hpp"
    @@ -81,7 +81,6 @@ bool VM_GC_Operation::skip_operation() const {
     }
     
     bool VM_GC_Operation::doit_prologue() {
    -  assert(Thread::current()->is_Java_thread(), "just checking");
       assert(((_gc_cause != GCCause::_no_gc) &&
               (_gc_cause != GCCause::_no_cause_specified)), "Illegal GCCause");
     
    @@ -110,7 +109,6 @@ bool VM_GC_Operation::doit_prologue() {
     
     
     void VM_GC_Operation::doit_epilogue() {
    -  assert(Thread::current()->is_Java_thread(), "just checking");
       // Clean up old interpreter OopMap entries that were replaced
       // during the GC thread root traversal.
       OopMapCache::cleanup_old_entries();
    diff --git a/src/hotspot/share/gc/shared/vmGCOperations.hpp b/src/hotspot/share/gc/shared/gcVMOperations.hpp
    similarity index 97%
    rename from src/hotspot/share/gc/shared/vmGCOperations.hpp
    rename to src/hotspot/share/gc/shared/gcVMOperations.hpp
    index 7c5461da9c8..070c238ae05 100644
    --- a/src/hotspot/share/gc/shared/vmGCOperations.hpp
    +++ b/src/hotspot/share/gc/shared/gcVMOperations.hpp
    @@ -22,8 +22,8 @@
      *
      */
     
    -#ifndef SHARE_VM_GC_SHARED_VMGCOPERATIONS_HPP
    -#define SHARE_VM_GC_SHARED_VMGCOPERATIONS_HPP
    +#ifndef SHARE_VM_GC_SHARED_GCVMOPERATIONS_HPP
    +#define SHARE_VM_GC_SHARED_GCVMOPERATIONS_HPP
     
     #include "gc/shared/collectedHeap.hpp"
     #include "gc/shared/genCollectedHeap.hpp"
    @@ -32,7 +32,7 @@
     #include "runtime/handles.hpp"
     #include "runtime/jniHandles.hpp"
     #include "runtime/synchronizer.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     // The following class hierarchy represents
     // a set of operations (VM_Operation) related to GC.
    @@ -238,4 +238,4 @@ class SvcGCMarker : public StackObj {
       }
     };
     
    -#endif // SHARE_VM_GC_SHARED_VMGCOPERATIONS_HPP
    +#endif // SHARE_VM_GC_SHARED_GCVMOPERATIONS_HPP
    diff --git a/src/hotspot/share/gc/shared/gc_globals.hpp b/src/hotspot/share/gc/shared/gc_globals.hpp
    index 03be725eb6c..2ffdf4147d4 100644
    --- a/src/hotspot/share/gc/shared/gc_globals.hpp
    +++ b/src/hotspot/share/gc/shared/gc_globals.hpp
    @@ -41,6 +41,9 @@
     #if INCLUDE_SERIALGC
     #include "gc/serial/serial_globals.hpp"
     #endif
    +#if INCLUDE_SHENANDOAHGC
    +#include "gc/shenandoah/shenandoah_globals.hpp"
    +#endif
     #if INCLUDE_ZGC
     #include "gc/z/z_globals.hpp"
     #endif
    @@ -140,6 +143,22 @@
         constraint,                                                             \
         writeable))                                                             \
                                                                                 \
    +  SHENANDOAHGC_ONLY(GC_SHENANDOAH_FLAGS(                                    \
    +    develop,                                                                \
    +    develop_pd,                                                             \
    +    product,                                                                \
    +    product_pd,                                                             \
    +    diagnostic,                                                             \
    +    diagnostic_pd,                                                          \
    +    experimental,                                                           \
    +    notproduct,                                                             \
    +    manageable,                                                             \
    +    product_rw,                                                             \
    +    lp64_product,                                                           \
    +    range,                                                                  \
    +    constraint,                                                             \
    +    writeable))                                                             \
    +                                                                            \
       ZGC_ONLY(GC_Z_FLAGS(                                                      \
         develop,                                                                \
         develop_pd,                                                             \
    @@ -179,6 +198,9 @@
       experimental(bool, UseZGC, false,                                         \
               "Use the Z garbage collector")                                    \
                                                                                 \
    +  experimental(bool, UseShenandoahGC, false,                                \
    +          "Use the Shenandoah garbage collector")                           \
    +                                                                            \
       product(uint, ParallelGCThreads, 0,                                       \
               "Number of parallel threads parallel gc will use")                \
               constraint(ParallelGCThreadsConstraintFunc,AfterErgo)             \
    @@ -348,6 +370,10 @@
       develop(uintx, PromotionFailureALotInterval, 5,                           \
               "Total collections between promotion failures a lot")             \
                                                                                 \
    +  diagnostic(bool, UseOWSTTaskTerminator, true,                             \
    +          "Use Optimized Work Stealing Threads task termination "           \
    +          "protocol")                                                       \
    +                                                                            \
       experimental(uintx, WorkStealingSleepMillis, 1,                           \
               "Sleep time when sleep is used for yields")                       \
                                                                                 \
    diff --git a/src/hotspot/share/gc/shared/genCollectedHeap.cpp b/src/hotspot/share/gc/shared/genCollectedHeap.cpp
    index 609c3b48eb0..54df73fdcff 100644
    --- a/src/hotspot/share/gc/shared/genCollectedHeap.cpp
    +++ b/src/hotspot/share/gc/shared/genCollectedHeap.cpp
    @@ -42,13 +42,13 @@
     #include "gc/shared/gcPolicyCounters.hpp"
     #include "gc/shared/gcTrace.hpp"
     #include "gc/shared/gcTraceTime.inline.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "gc/shared/genCollectedHeap.hpp"
     #include "gc/shared/genOopClosures.inline.hpp"
     #include "gc/shared/generationSpec.hpp"
     #include "gc/shared/oopStorageParState.inline.hpp"
     #include "gc/shared/space.hpp"
     #include "gc/shared/strongRootsScope.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
     #include "gc/shared/weakProcessor.hpp"
     #include "gc/shared/workgroup.hpp"
     #include "memory/filemap.hpp"
    diff --git a/src/hotspot/share/gc/shared/owstTaskTerminator.cpp b/src/hotspot/share/gc/shared/owstTaskTerminator.cpp
    new file mode 100644
    index 00000000000..3c32ab627a9
    --- /dev/null
    +++ b/src/hotspot/share/gc/shared/owstTaskTerminator.cpp
    @@ -0,0 +1,171 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shared/owstTaskTerminator.hpp"
    +#include "logging/log.hpp"
    +
    +bool OWSTTaskTerminator::exit_termination(size_t tasks, TerminatorTerminator* terminator) {
    +  return tasks > 0 || (terminator != NULL && terminator->should_exit_termination());
    +}
    +
    +bool OWSTTaskTerminator::offer_termination(TerminatorTerminator* terminator) {
    +  assert(_n_threads > 0, "Initialization is incorrect");
    +  assert(_offered_termination < _n_threads, "Invariant");
    +  assert(_blocker != NULL, "Invariant");
    +
    +  // Single worker, done
    +  if (_n_threads == 1) {
    +    _offered_termination = 1;
    +    return true;
    +  }
    +
    +  _blocker->lock_without_safepoint_check();
    +  // All arrived, done
    +  _offered_termination++;
    +  if (_offered_termination == _n_threads) {
    +    _blocker->notify_all();
    +    _blocker->unlock();
    +    return true;
    +  }
    +
    +  Thread* the_thread = Thread::current();
    +  while (true) {
    +    if (_spin_master == NULL) {
    +      _spin_master = the_thread;
    +
    +      _blocker->unlock();
    +
    +      if (do_spin_master_work(terminator)) {
    +        assert(_offered_termination == _n_threads, "termination condition");
    +        return true;
    +      } else {
    +        _blocker->lock_without_safepoint_check();
    +      }
    +    } else {
    +      _blocker->wait(true, WorkStealingSleepMillis);
    +
    +      if (_offered_termination == _n_threads) {
    +        _blocker->unlock();
    +        return true;
    +      }
    +    }
    +
    +    size_t tasks = tasks_in_queue_set();
    +    if (exit_termination(tasks, terminator)) {
    +      _offered_termination--;
    +      _blocker->unlock();
    +      return false;
    +    }
    +  }
    +}
    +
    +bool OWSTTaskTerminator::do_spin_master_work(TerminatorTerminator* terminator) {
    +  uint yield_count = 0;
    +  // Number of hard spin loops done since last yield
    +  uint hard_spin_count = 0;
    +  // Number of iterations in the hard spin loop.
    +  uint hard_spin_limit = WorkStealingHardSpins;
    +
    +  // If WorkStealingSpinToYieldRatio is 0, no hard spinning is done.
    +  // If it is greater than 0, then start with a small number
    +  // of spins and increase number with each turn at spinning until
    +  // the count of hard spins exceeds WorkStealingSpinToYieldRatio.
    +  // Then do a yield() call and start spinning afresh.
    +  if (WorkStealingSpinToYieldRatio > 0) {
    +    hard_spin_limit = WorkStealingHardSpins >> WorkStealingSpinToYieldRatio;
    +    hard_spin_limit = MAX2(hard_spin_limit, 1U);
    +  }
    +  // Remember the initial spin limit.
    +  uint hard_spin_start = hard_spin_limit;
    +
    +  // Loop waiting for all threads to offer termination or
    +  // more work.
    +  while (true) {
    +    // Look for more work.
    +    // Periodically sleep() instead of yield() to give threads
    +    // waiting on the cores the chance to grab this code
    +    if (yield_count <= WorkStealingYieldsBeforeSleep) {
    +      // Do a yield or hardspin.  For purposes of deciding whether
    +      // to sleep, count this as a yield.
    +      yield_count++;
    +
    +      // Periodically call yield() instead spinning
    +      // After WorkStealingSpinToYieldRatio spins, do a yield() call
    +      // and reset the counts and starting limit.
    +      if (hard_spin_count > WorkStealingSpinToYieldRatio) {
    +        yield();
    +        hard_spin_count = 0;
    +        hard_spin_limit = hard_spin_start;
    +#ifdef TRACESPINNING
    +        _total_yields++;
    +#endif
    +      } else {
    +        // Hard spin this time
    +        // Increase the hard spinning period but only up to a limit.
    +        hard_spin_limit = MIN2(2*hard_spin_limit,
    +                               (uint) WorkStealingHardSpins);
    +        for (uint j = 0; j < hard_spin_limit; j++) {
    +          SpinPause();
    +        }
    +        hard_spin_count++;
    +#ifdef TRACESPINNING
    +        _total_spins++;
    +#endif
    +      }
    +    } else {
    +      log_develop_trace(gc, task)("OWSTTaskTerminator::do_spin_master_work() thread " PTR_FORMAT " sleeps after %u yields",
    +                                  p2i(Thread::current()), yield_count);
    +      yield_count = 0;
    +
    +      MonitorLockerEx locker(_blocker, Mutex::_no_safepoint_check_flag);
    +      _spin_master = NULL;
    +      locker.wait(Mutex::_no_safepoint_check_flag, WorkStealingSleepMillis);
    +      if (_spin_master == NULL) {
    +        _spin_master = Thread::current();
    +      } else {
    +        return false;
    +      }
    +    }
    +
    +#ifdef TRACESPINNING
    +      _total_peeks++;
    +#endif
    +    size_t tasks = tasks_in_queue_set();
    +    if (exit_termination(tasks, terminator)) {
    +      MonitorLockerEx locker(_blocker, Mutex::_no_safepoint_check_flag);
    +      if (tasks >= _offered_termination - 1) {
    +        locker.notify_all();
    +      } else {
    +        for (; tasks > 1; tasks--) {
    +          locker.notify();
    +        }
    +      }
    +      _spin_master = NULL;
    +      return false;
    +    } else if (_offered_termination == _n_threads) {
    +      return true;
    +    }
    +  }
    +}
    diff --git a/src/hotspot/share/gc/shared/owstTaskTerminator.hpp b/src/hotspot/share/gc/shared/owstTaskTerminator.hpp
    new file mode 100644
    index 00000000000..9e6fe135a36
    --- /dev/null
    +++ b/src/hotspot/share/gc/shared/owstTaskTerminator.hpp
    @@ -0,0 +1,79 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +#ifndef SHARE_VM_GC_SHARED_OWSTTASKTERMINATOR_HPP
    +#define SHARE_VM_GC_SHARED_OWSTTASKTERMINATOR_HPP
    +
    +#include "gc/shared/taskqueue.hpp"
    +#include "runtime/mutex.hpp"
    +#include "runtime/thread.hpp"
    +
    +/*
    + * OWST stands for Optimized Work Stealing Threads
    + *
    + * This is an enhanced implementation of Google's work stealing
    + * protocol, which is described in the paper:
    + * "Wessam Hassanein. 2016. Understanding and improving JVM GC work
    + * stealing at the data center scale. In Proceedings of the 2016 ACM
    + * SIGPLAN International Symposium on Memory Management (ISMM 2016). ACM,
    + * New York, NY, USA, 46-54. DOI: https://doi.org/10.1145/2926697.2926706"
    + *
    + * Instead of a dedicated spin-master, our implementation will let spin-master relinquish
    + * the role before it goes to sleep/wait, allowing newly arrived threads to compete for the role.
    + * The intention of above enhancement is to reduce spin-master's latency on detecting new tasks
    + * for stealing and termination condition.
    + */
    +
    +class OWSTTaskTerminator: public ParallelTaskTerminator {
    +private:
    +  Monitor*    _blocker;
    +  Thread*     _spin_master;
    +
    +public:
    +  OWSTTaskTerminator(uint n_threads, TaskQueueSetSuper* queue_set) :
    +    ParallelTaskTerminator(n_threads, queue_set), _spin_master(NULL) {
    +    _blocker = new Monitor(Mutex::leaf, "OWSTTaskTerminator", false, Monitor::_safepoint_check_never);
    +  }
    +
    +  virtual ~OWSTTaskTerminator() {
    +    assert(_blocker != NULL, "Can not be NULL");
    +    delete _blocker;
    +  }
    +
    +  bool offer_termination(TerminatorTerminator* terminator);
    +
    +protected:
    +  // If should exit current termination protocol
    +  virtual bool exit_termination(size_t tasks, TerminatorTerminator* terminator);
    +
    +private:
    +  size_t tasks_in_queue_set() { return _queue_set->tasks(); }
    +
    +  /*
    +   * Perform spin-master task.
    +   * Return true if termination condition is detected, otherwise return false
    +   */
    +  bool do_spin_master_work(TerminatorTerminator* terminator);
    +};
    +
    +
    +#endif // SHARE_VM_GC_SHARED_OWSTTASKTERMINATOR_HPP
    diff --git a/src/hotspot/share/gc/shared/referenceProcessor.cpp b/src/hotspot/share/gc/shared/referenceProcessor.cpp
    index 868aac5062c..e961a3d737a 100644
    --- a/src/hotspot/share/gc/shared/referenceProcessor.cpp
    +++ b/src/hotspot/share/gc/shared/referenceProcessor.cpp
    @@ -1156,7 +1156,7 @@ bool ReferenceProcessor::discover_reference(oop obj, ReferenceType rt) {
           // Check assumption that an object is not potentially
           // discovered twice except by concurrent collectors that potentially
           // trace the same Reference object twice.
    -      assert(UseConcMarkSweepGC || UseG1GC,
    +      assert(UseConcMarkSweepGC || UseG1GC || UseShenandoahGC,
                  "Only possible with a concurrent marking collector");
           return true;
         }
    diff --git a/src/hotspot/share/gc/shared/taskqueue.cpp b/src/hotspot/share/gc/shared/taskqueue.cpp
    index 9f8a43fccff..47639bdf9b5 100644
    --- a/src/hotspot/share/gc/shared/taskqueue.cpp
    +++ b/src/hotspot/share/gc/shared/taskqueue.cpp
    @@ -24,6 +24,7 @@
     
     #include "precompiled.hpp"
     #include "gc/shared/taskqueue.hpp"
    +#include "gc/shared/owstTaskTerminator.hpp"
     #include "oops/oop.inline.hpp"
     #include "logging/log.hpp"
     #include "runtime/atomic.hpp"
    @@ -247,3 +248,25 @@ void ParallelTaskTerminator::reset_for_reuse(uint n_threads) {
       reset_for_reuse();
       _n_threads = n_threads;
     }
    +
    +TaskTerminator::TaskTerminator(uint n_threads, TaskQueueSetSuper* queue_set) :
    +  _terminator(UseOWSTTaskTerminator ? new OWSTTaskTerminator(n_threads, queue_set)
    +                                    : new ParallelTaskTerminator(n_threads, queue_set)) {
    +}
    +
    +TaskTerminator::~TaskTerminator() {
    +  if (_terminator != NULL) {
    +    delete _terminator;
    +  }
    +}
    +
    +// Move assignment
    +TaskTerminator& TaskTerminator::operator=(const TaskTerminator& o) {
    +  if (_terminator != NULL) {
    +    delete _terminator;
    +  }
    +  _terminator = o.terminator();
    +  const_cast(o)._terminator = NULL;
    +  return *this;
    +}
    +
    diff --git a/src/hotspot/share/gc/shared/taskqueue.hpp b/src/hotspot/share/gc/shared/taskqueue.hpp
    index 0c1f9beec43..980de663229 100644
    --- a/src/hotspot/share/gc/shared/taskqueue.hpp
    +++ b/src/hotspot/share/gc/shared/taskqueue.hpp
    @@ -447,8 +447,8 @@ public:
     
     #undef TRACESPINNING
     
    -class ParallelTaskTerminator: public StackObj {
    -private:
    +class ParallelTaskTerminator: public CHeapObj {
    +protected:
       uint _n_threads;
       TaskQueueSetSuper* _queue_set;
       volatile uint _offered_termination;
    @@ -481,7 +481,7 @@ public:
       // As above, but it also terminates if the should_exit_termination()
       // method of the terminator parameter returns true. If terminator is
       // NULL, then it is ignored.
    -  bool offer_termination(TerminatorTerminator* terminator);
    +  virtual bool offer_termination(TerminatorTerminator* terminator);
     
       // Reset the terminator, so that it may be reused again.
       // The caller is responsible for ensuring that this is done
    @@ -500,6 +500,38 @@ public:
     #endif
     };
     
    +#ifdef _MSC_VER
    +#pragma warning(push)
    +// warning C4521: multiple copy constructors specified
    +#pragma warning(disable:4521)
    +// warning C4522: multiple assignment operators specified
    +#pragma warning(disable:4522)
    +#endif
    +
    +class TaskTerminator : public StackObj {
    +private:
    +  ParallelTaskTerminator*  _terminator;
    +
    +  // Disable following copy constructors and assignment operator
    +  TaskTerminator(TaskTerminator& o) { }
    +  TaskTerminator(const TaskTerminator& o) { }
    +  TaskTerminator& operator=(TaskTerminator& o) { return *this; }
    +public:
    +  TaskTerminator(uint n_threads, TaskQueueSetSuper* queue_set);
    +  ~TaskTerminator();
    +
    +  // Move assignment
    +  TaskTerminator& operator=(const TaskTerminator& o);
    +
    +  ParallelTaskTerminator* terminator() const {
    +    return _terminator;
    +  }
    +};
    +#ifdef _MSC_VER
    +#pragma warning(pop)
    +#endif
    +
    +
     typedef GenericTaskQueue             OopTaskQueue;
     typedef GenericTaskQueueSet OopTaskQueueSet;
     
    diff --git a/src/hotspot/share/gc/shared/threadLocalAllocBuffer.cpp b/src/hotspot/share/gc/shared/threadLocalAllocBuffer.cpp
    index 02598307721..408234f13fa 100644
    --- a/src/hotspot/share/gc/shared/threadLocalAllocBuffer.cpp
    +++ b/src/hotspot/share/gc/shared/threadLocalAllocBuffer.cpp
    @@ -279,18 +279,6 @@ void ThreadLocalAllocBuffer::print_stats(const char* tag) {
                 _fast_refill_waste * HeapWordSize);
     }
     
    -void ThreadLocalAllocBuffer::verify() {
    -  HeapWord* p = start();
    -  HeapWord* t = top();
    -  HeapWord* prev_p = NULL;
    -  while (p < t) {
    -    oopDesc::verify(oop(p));
    -    prev_p = p;
    -    p += oop(p)->size();
    -  }
    -  guarantee(p == top(), "end of last object must match end of space");
    -}
    -
     void ThreadLocalAllocBuffer::set_sample_end() {
       size_t heap_words_remaining = pointer_delta(_end, _top);
       size_t bytes_until_sample = thread()->heap_sampler().bytes_until_sample();
    diff --git a/src/hotspot/share/gc/shared/threadLocalAllocBuffer.hpp b/src/hotspot/share/gc/shared/threadLocalAllocBuffer.hpp
    index 91f1bd02757..c05c6f73255 100644
    --- a/src/hotspot/share/gc/shared/threadLocalAllocBuffer.hpp
    +++ b/src/hotspot/share/gc/shared/threadLocalAllocBuffer.hpp
    @@ -188,8 +188,6 @@ public:
       static ByteSize end_offset()                   { return byte_offset_of(ThreadLocalAllocBuffer, _end); }
       static ByteSize top_offset()                   { return byte_offset_of(ThreadLocalAllocBuffer, _top); }
       static ByteSize pf_top_offset()                { return byte_offset_of(ThreadLocalAllocBuffer, _pf_top); }
    -
    -  void verify();
     };
     
     class ThreadLocalAllocStats : public StackObj {
    diff --git a/src/hotspot/share/gc/shared/vmStructs_gc.hpp b/src/hotspot/share/gc/shared/vmStructs_gc.hpp
    index 92c03d4f2bf..cada5922406 100644
    --- a/src/hotspot/share/gc/shared/vmStructs_gc.hpp
    +++ b/src/hotspot/share/gc/shared/vmStructs_gc.hpp
    @@ -50,6 +50,9 @@
     #include "gc/serial/defNewGeneration.hpp"
     #include "gc/serial/vmStructs_serial.hpp"
     #endif
    +#if INCLUDE_SHENANDOAHGC
    +#include "gc/shenandoah/vmStructs_shenandoah.hpp"
    +#endif
     #if INCLUDE_ZGC
     #include "gc/z/vmStructs_z.hpp"
     #endif
    @@ -73,6 +76,9 @@
       SERIALGC_ONLY(VM_STRUCTS_SERIALGC(nonstatic_field,                                                                                 \
                                         volatile_nonstatic_field,                                                                        \
                                         static_field))                                                                                   \
    +  SHENANDOAHGC_ONLY(VM_STRUCTS_SHENANDOAH(nonstatic_field,                                                                           \
    +                               volatile_nonstatic_field,                                                                             \
    +                               static_field))                                                                                        \
       ZGC_ONLY(VM_STRUCTS_ZGC(nonstatic_field,                                                                                           \
                               volatile_nonstatic_field,                                                                                  \
                               static_field))                                                                                             \
    @@ -178,6 +184,9 @@
       SERIALGC_ONLY(VM_TYPES_SERIALGC(declare_type,                           \
                                       declare_toplevel_type,                  \
                                       declare_integer_type))                  \
    +  SHENANDOAHGC_ONLY(VM_TYPES_SHENANDOAH(declare_type,                     \
    +                             declare_toplevel_type,                       \
    +                             declare_integer_type))                       \
       ZGC_ONLY(VM_TYPES_ZGC(declare_type,                                     \
                             declare_toplevel_type,                            \
                             declare_integer_type))                            \
    @@ -253,6 +262,8 @@
                                                   declare_constant_with_value)) \
       SERIALGC_ONLY(VM_INT_CONSTANTS_SERIALGC(declare_constant,                 \
                                               declare_constant_with_value))     \
    +  SHENANDOAHGC_ONLY(VM_INT_CONSTANTS_SHENANDOAH(declare_constant,           \
    +                                     declare_constant_with_value))          \
       ZGC_ONLY(VM_INT_CONSTANTS_ZGC(declare_constant,                           \
                                     declare_constant_with_value))               \
                                                                                 \
    diff --git a/src/hotspot/share/gc/shared/workerDataArray.hpp b/src/hotspot/share/gc/shared/workerDataArray.hpp
    index bb9a24f05a4..9ccf28369c9 100644
    --- a/src/hotspot/share/gc/shared/workerDataArray.hpp
    +++ b/src/hotspot/share/gc/shared/workerDataArray.hpp
    @@ -34,7 +34,7 @@ template 
     class WorkerDataArray  : public CHeapObj {
       friend class WDAPrinter;
     public:
    -  static const uint MaxThreadWorkItems = 3;
    +  static const uint MaxThreadWorkItems = 4;
     private:
       T*          _data;
       uint        _length;
    @@ -49,6 +49,8 @@ private:
       void link_thread_work_items(WorkerDataArray* thread_work_items, uint index = 0);
       void set_thread_work_item(uint worker_i, size_t value, uint index = 0);
       void add_thread_work_item(uint worker_i, size_t value, uint index = 0);
    +  void set_or_add_thread_work_item(uint worker_i, size_t value, uint index = 0);
    +
       WorkerDataArray* thread_work_items(uint index = 0) const {
         assert(index < MaxThreadWorkItems, "Tried to access thread work item %u max %u", index, MaxThreadWorkItems);
         return _thread_work_items[index];
    diff --git a/src/hotspot/share/gc/shared/workerDataArray.inline.hpp b/src/hotspot/share/gc/shared/workerDataArray.inline.hpp
    index 9f4969fb605..f511f4f8762 100644
    --- a/src/hotspot/share/gc/shared/workerDataArray.inline.hpp
    +++ b/src/hotspot/share/gc/shared/workerDataArray.inline.hpp
    @@ -80,6 +80,17 @@ void WorkerDataArray::add_thread_work_item(uint worker_i, size_t value, uint
       _thread_work_items[index]->add(worker_i, value);
     }
     
    +template 
    +void WorkerDataArray::set_or_add_thread_work_item(uint worker_i, size_t value, uint index) {
    +  assert(index < MaxThreadWorkItems, "Tried to access thread work item %u (max %u)", index, MaxThreadWorkItems);
    +  assert(_thread_work_items[index] != NULL, "No sub count");
    +  if (_thread_work_items[index]->get(worker_i) == _thread_work_items[index]->uninitialized()) {
    +    _thread_work_items[index]->set(worker_i, value);
    +  } else {
    +    _thread_work_items[index]->add(worker_i, value);
    +  }
    +}
    +
     template 
     void WorkerDataArray::add(uint worker_i, T value) {
       assert(worker_i < _length, "Worker %d is greater than max: %d", worker_i, _length);
    diff --git a/src/hotspot/share/gc/shared/workerManager.hpp b/src/hotspot/share/gc/shared/workerManager.hpp
    index e12002739ac..02cd50f158d 100644
    --- a/src/hotspot/share/gc/shared/workerManager.hpp
    +++ b/src/hotspot/share/gc/shared/workerManager.hpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -25,7 +25,11 @@
     #ifndef SHARE_VM_GC_SHARED_WORKERMANAGER_HPP
     #define SHARE_VM_GC_SHARED_WORKERMANAGER_HPP
     
    -#include "gc/shared/adaptiveSizePolicy.hpp"
    +#include "logging/log.hpp"
    +#include "memory/allocation.hpp"
    +#include "runtime/os.inline.hpp"
    +#include "runtime/thread.inline.hpp"
    +#include "utilities/globalDefinitions.hpp"
     
     class WorkerManager : public AllStatic {
      public:
    @@ -51,35 +55,7 @@ class WorkerManager : public AllStatic {
                                uint total_workers,
                                uint created_workers,
                                os::ThreadType worker_type,
    -                           bool initializing) {
    -    uint start = created_workers;
    -    uint end = MIN2(active_workers, total_workers);
    -    for (uint worker_id = start; worker_id < end; worker_id += 1) {
    -      WorkerThread* new_worker = NULL;
    -      if (initializing || !InjectGCWorkerCreationFailure) {
    -        new_worker = holder->install_worker(worker_id);
    -      }
    -      if (new_worker == NULL || !os::create_thread(new_worker, worker_type)) {
    -        log_trace(gc, task)("WorkerManager::add_workers() : "
    -                            "creation failed due to failed allocation of native %s",
    -                            new_worker == NULL ?  "memory" : "thread");
    -        if (new_worker != NULL) {
    -           delete new_worker;
    -        }
    -        if (initializing) {
    -          vm_exit_out_of_memory(0, OOM_MALLOC_ERROR, "Cannot create worker GC thread. Out of system resources.");
    -        }
    -        break;
    -      }
    -      created_workers++;
    -      os::start_thread(new_worker);
    -    }
    -
    -    log_trace(gc, task)("WorkerManager::add_workers() : "
    -                        "created_workers: %u", created_workers);
    -
    -    return created_workers;
    -  }
    +                           bool initializing);
     
       // Log (at trace level) a change in the number of created workers.
       template 
    @@ -87,12 +63,56 @@ class WorkerManager : public AllStatic {
                                       uint previous_created_workers,
                                       uint active_workers,
                                       uint created_workers,
    -                                  bool initializing) {
    -    if (previous_created_workers < created_workers) {
    -      const char* initializing_msg =  initializing ? "Adding initial" : "Creating additional";
    -      log_trace(gc, task)("%s %s(s) previously created workers %u active workers %u total created workers %u",
    -                          initializing_msg, holder->group_name(), previous_created_workers, active_workers, created_workers);
    -    }
    -  }
    +                                  bool initializing);
     };
    +
    +template 
    +uint WorkerManager::add_workers(WorkerType* holder,
    +                                uint active_workers,
    +                                uint total_workers,
    +                                uint created_workers,
    +                                os::ThreadType worker_type,
    +                                bool initializing) {
    +  uint start = created_workers;
    +  uint end = MIN2(active_workers, total_workers);
    +  for (uint worker_id = start; worker_id < end; worker_id += 1) {
    +    WorkerThread* new_worker = NULL;
    +    if (initializing || !InjectGCWorkerCreationFailure) {
    +      new_worker = holder->install_worker(worker_id);
    +    }
    +    if (new_worker == NULL || !os::create_thread(new_worker, worker_type)) {
    +      log_trace(gc, task)("WorkerManager::add_workers() : "
    +                          "creation failed due to failed allocation of native %s",
    +                          new_worker == NULL ? "memory" : "thread");
    +      if (new_worker != NULL) {
    +        delete new_worker;
    +      }
    +      if (initializing) {
    +        vm_exit_out_of_memory(0, OOM_MALLOC_ERROR, "Cannot create worker GC thread. Out of system resources.");
    +      }
    +      break;
    +    }
    +    created_workers++;
    +    os::start_thread(new_worker);
    +  }
    +
    +  log_trace(gc, task)("WorkerManager::add_workers() : "
    +                      "created_workers: %u", created_workers);
    +
    +  return created_workers;
    +}
    +
    +template 
    +void WorkerManager::log_worker_creation(WorkerType* holder,
    +                                        uint previous_created_workers,
    +                                        uint active_workers,
    +                                        uint created_workers,
    +                                        bool initializing) {
    +  if (previous_created_workers < created_workers) {
    +    const char* initializing_msg = initializing ? "Adding initial" : "Creating additional";
    +    log_trace(gc, task)("%s %s(s) previously created workers %u active workers %u total created workers %u",
    +                        initializing_msg, holder->group_name(), previous_created_workers, active_workers, created_workers);
    +  }
    +}
    +
     #endif // SHARE_VM_GC_SHARED_WORKERMANAGER_HPP
    diff --git a/src/hotspot/share/gc/shared/workerPolicy.cpp b/src/hotspot/share/gc/shared/workerPolicy.cpp
    new file mode 100644
    index 00000000000..8b0279255ef
    --- /dev/null
    +++ b/src/hotspot/share/gc/shared/workerPolicy.cpp
    @@ -0,0 +1,203 @@
    +/*
    + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
    + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shared/collectedHeap.hpp"
    +#include "gc/shared/workerPolicy.hpp"
    +#include "logging/log.hpp"
    +#include "memory/universe.hpp"
    +#include "runtime/os.inline.hpp"
    +#include "runtime/vm_version.hpp"
    +
    +bool WorkerPolicy::_debug_perturbation = false;
    +uint WorkerPolicy::_parallel_worker_threads = 0;
    +bool WorkerPolicy::_parallel_worker_threads_initialized = false;
    +
    +uint WorkerPolicy::nof_parallel_worker_threads(uint num,
    +                                               uint den,
    +                                               uint switch_pt) {
    +  if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
    +    assert(ParallelGCThreads == 0, "Default ParallelGCThreads is not 0");
    +    uint threads;
    +    // For very large machines, there are diminishing returns
    +    // for large numbers of worker threads.  Instead of
    +    // hogging the whole system, use a fraction of the workers for every
    +    // processor after the first 8.  For example, on a 72 cpu machine
    +    // and a chosen fraction of 5/8
    +    // use 8 + (72 - 8) * (5/8) == 48 worker threads.
    +    uint ncpus = (uint) os::initial_active_processor_count();
    +    threads = (ncpus <= switch_pt) ?
    +              ncpus :
    +              (switch_pt + ((ncpus - switch_pt) * num) / den);
    +#ifndef _LP64
    +    // On 32-bit binaries the virtual address space available to the JVM
    +    // is usually limited to 2-3 GB (depends on the platform).
    +    // Do not use up address space with too many threads (stacks and per-thread
    +    // data). Note that x86 apps running on Win64 have 2 stacks per thread.
    +    // GC may more generally scale down threads by max heap size (etc), but the
    +    // consequences of over-provisioning threads are higher on 32-bit JVMS,
    +    // so add hard limit here:
    +    threads = MIN2(threads, (2 * switch_pt));
    +#endif
    +    return threads;
    +  } else {
    +    return ParallelGCThreads;
    +  }
    +}
    +
    +uint WorkerPolicy::calc_parallel_worker_threads() {
    +  uint den = VM_Version::parallel_worker_threads_denominator();
    +  return nof_parallel_worker_threads(5, den, 8);
    +}
    +
    +uint WorkerPolicy::parallel_worker_threads() {
    +  if (!_parallel_worker_threads_initialized) {
    +    if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
    +      _parallel_worker_threads = WorkerPolicy::calc_parallel_worker_threads();
    +    } else {
    +      _parallel_worker_threads = ParallelGCThreads;
    +    }
    +    _parallel_worker_threads_initialized = true;
    +  }
    +  return _parallel_worker_threads;
    +}
    +
    +//  If the number of GC threads was set on the command line, use it.
    +//  Else
    +//    Calculate the number of GC threads based on the number of Java threads.
    +//    Calculate the number of GC threads based on the size of the heap.
    +//    Use the larger.
    +uint WorkerPolicy::calc_default_active_workers(uintx total_workers,
    +                                               const uintx min_workers,
    +                                               uintx active_workers,
    +                                               uintx application_workers) {
    +  // If the user has specifically set the number of GC threads, use them.
    +
    +  // If the user has turned off using a dynamic number of GC threads
    +  // or the users has requested a specific number, set the active
    +  // number of workers to all the workers.
    +
    +  uintx new_active_workers = total_workers;
    +  uintx prev_active_workers = active_workers;
    +  uintx active_workers_by_JT = 0;
    +  uintx active_workers_by_heap_size = 0;
    +
    +  // Always use at least min_workers but use up to
    +  // GCThreadsPerJavaThreads * application threads.
    +  active_workers_by_JT =
    +    MAX2((uintx) GCWorkersPerJavaThread * application_workers,
    +         min_workers);
    +
    +  // Choose a number of GC threads based on the current size
    +  // of the heap.  This may be complicated because the size of
    +  // the heap depends on factors such as the throughput goal.
    +  // Still a large heap should be collected by more GC threads.
    +  active_workers_by_heap_size =
    +    MAX2((size_t) 2U, Universe::heap()->capacity() / HeapSizePerGCThread);
    +
    +  uintx max_active_workers =
    +    MAX2(active_workers_by_JT, active_workers_by_heap_size);
    +
    +  new_active_workers = MIN2(max_active_workers, (uintx) total_workers);
    +
    +  // Increase GC workers instantly but decrease them more
    +  // slowly.
    +  if (new_active_workers < prev_active_workers) {
    +    new_active_workers =
    +      MAX2(min_workers, (prev_active_workers + new_active_workers) / 2);
    +  }
    +
    +  // Check once more that the number of workers is within the limits.
    +  assert(min_workers <= total_workers, "Minimum workers not consistent with total workers");
    +  assert(new_active_workers >= min_workers, "Minimum workers not observed");
    +  assert(new_active_workers <= total_workers, "Total workers not observed");
    +
    +  if (ForceDynamicNumberOfGCThreads) {
    +    // Assume this is debugging and jiggle the number of GC threads.
    +    if (new_active_workers == prev_active_workers) {
    +      if (new_active_workers < total_workers) {
    +        new_active_workers++;
    +      } else if (new_active_workers > min_workers) {
    +        new_active_workers--;
    +      }
    +    }
    +    if (new_active_workers == total_workers) {
    +      if (_debug_perturbation) {
    +        new_active_workers =  min_workers;
    +      }
    +      _debug_perturbation = !_debug_perturbation;
    +    }
    +    assert((new_active_workers <= ParallelGCThreads) &&
    +           (new_active_workers >= min_workers),
    +           "Jiggled active workers too much");
    +  }
    +
    +  log_trace(gc, task)("WorkerPolicy::calc_default_active_workers() : "
    +    "active_workers(): " UINTX_FORMAT "  new_active_workers: " UINTX_FORMAT "  "
    +    "prev_active_workers: " UINTX_FORMAT "\n"
    +    " active_workers_by_JT: " UINTX_FORMAT "  active_workers_by_heap_size: " UINTX_FORMAT,
    +    active_workers, new_active_workers, prev_active_workers,
    +    active_workers_by_JT, active_workers_by_heap_size);
    +  assert(new_active_workers > 0, "Always need at least 1");
    +  return new_active_workers;
    +}
    +
    +uint WorkerPolicy::calc_active_workers(uintx total_workers,
    +                                       uintx active_workers,
    +                                       uintx application_workers) {
    +  // If the user has specifically set the number of GC threads, use them.
    +
    +  // If the user has turned off using a dynamic number of GC threads
    +  // or the users has requested a specific number, set the active
    +  // number of workers to all the workers.
    +
    +  uint new_active_workers;
    +  if (!UseDynamicNumberOfGCThreads ||
    +     (!FLAG_IS_DEFAULT(ParallelGCThreads) && !ForceDynamicNumberOfGCThreads)) {
    +    new_active_workers = total_workers;
    +  } else {
    +    uintx min_workers = (total_workers == 1) ? 1 : 2;
    +    new_active_workers = calc_default_active_workers(total_workers,
    +                                                     min_workers,
    +                                                     active_workers,
    +                                                     application_workers);
    +  }
    +  assert(new_active_workers > 0, "Always need at least 1");
    +  return new_active_workers;
    +}
    +
    +uint WorkerPolicy::calc_active_conc_workers(uintx total_workers,
    +                                            uintx active_workers,
    +                                            uintx application_workers) {
    +  if (!UseDynamicNumberOfGCThreads ||
    +     (!FLAG_IS_DEFAULT(ConcGCThreads) && !ForceDynamicNumberOfGCThreads)) {
    +    return ConcGCThreads;
    +  } else {
    +    uint no_of_gc_threads = calc_default_active_workers(total_workers,
    +                                                        1, /* Minimum number of workers */
    +                                                        active_workers,
    +                                                        application_workers);
    +    return no_of_gc_threads;
    +  }
    +}
    diff --git a/src/hotspot/share/gc/shared/workerPolicy.hpp b/src/hotspot/share/gc/shared/workerPolicy.hpp
    new file mode 100644
    index 00000000000..407c5424568
    --- /dev/null
    +++ b/src/hotspot/share/gc/shared/workerPolicy.hpp
    @@ -0,0 +1,81 @@
    +/*
    + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
    + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHARED_WORKERPOLICY_HPP
    +#define SHARE_VM_GC_SHARED_WORKERPOLICY_HPP
    +
    +#include "memory/allocation.hpp"
    +#include "utilities/globalDefinitions.hpp"
    +
    +class WorkerPolicy : public AllStatic {
    +  static const uint GCWorkersPerJavaThread = 2;
    +
    +  static bool _debug_perturbation;
    +  static uint _parallel_worker_threads;
    +  static bool _parallel_worker_threads_initialized;
    +
    +  static uint nof_parallel_worker_threads(uint num,
    +                                          uint den,
    +                                          uint switch_pt);
    +
    +  // Calculates and returns the number of parallel GC threads. May
    +  // be CPU-architecture-specific.
    +  static uint calc_parallel_worker_threads();
    +
    +public:
    +  // Returns the number of parallel threads to be used as default value of
    +  // ParallelGCThreads. If that number has not been calculated, do so and
    +  // save it.  Returns ParallelGCThreads if it is set on the
    +  // command line.
    +  static uint parallel_worker_threads();
    +
    +  // Return number default GC threads to use in the next GC.
    +  static uint calc_default_active_workers(uintx total_workers,
    +                                          const uintx min_workers,
    +                                          uintx active_workers,
    +                                          uintx application_workers);
    +
    +  // Return number of GC threads to use in the next GC.
    +  // This is called sparingly so as not to change the
    +  // number of GC workers gratuitously.
    +  //   For ParNew collections
    +  //   For PS scavenge and ParOld collections
    +  //   For G1 evacuation pauses (subject to update)
    +  //   For G1 Full GCs (subject to update)
    +  // Other collection phases inherit the number of
    +  // GC workers from the calls above.  For example,
    +  // a CMS parallel remark uses the same number of GC
    +  // workers as the most recent ParNew collection.
    +  static uint calc_active_workers(uintx total_workers,
    +                                  uintx active_workers,
    +                                  uintx application_workers);
    +
    +  // Return number of GC threads to use in the next concurrent GC phase.
    +  static uint calc_active_conc_workers(uintx total_workers,
    +                                       uintx active_workers,
    +                                       uintx application_workers);
    +
    +};
    +
    +#endif // SHARE_VM_GC_SHARED_WORKERPOLICY_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp b/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp
    new file mode 100644
    index 00000000000..647a2407d67
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp
    @@ -0,0 +1,305 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "c1/c1_IR.hpp"
    +#include "gc/shared/satbMarkQueue.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
    +#include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
    +
    +#ifndef PATCHED_ADDR
    +#define PATCHED_ADDR  (max_jint)
    +#endif
    +
    +#ifdef ASSERT
    +#define __ gen->lir(__FILE__, __LINE__)->
    +#else
    +#define __ gen->lir()->
    +#endif
    +
    +void ShenandoahPreBarrierStub::emit_code(LIR_Assembler* ce) {
    +  ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
    +  bs->gen_pre_barrier_stub(ce, this);
    +}
    +
    +void ShenandoahWriteBarrierStub::emit_code(LIR_Assembler* ce) {
    +  ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
    +  bs->gen_write_barrier_stub(ce, this);
    +}
    +
    +void ShenandoahBarrierSetC1::pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val) {
    +  // First we test whether marking is in progress.
    +  BasicType flag_type;
    +  bool patch = (decorators & C1_NEEDS_PATCHING) != 0;
    +  bool do_load = pre_val == LIR_OprFact::illegalOpr;
    +  if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
    +    flag_type = T_INT;
    +  } else {
    +    guarantee(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1,
    +              "Assumption");
    +    // Use unsigned type T_BOOLEAN here rather than signed T_BYTE since some platforms, eg. ARM,
    +    // need to use unsigned instructions to use the large offset to load the satb_mark_queue.
    +    flag_type = T_BOOLEAN;
    +  }
    +  LIR_Opr thrd = gen->getThreadPointer();
    +  LIR_Address* mark_active_flag_addr =
    +    new LIR_Address(thrd,
    +                    in_bytes(ShenandoahThreadLocalData::satb_mark_queue_active_offset()),
    +                    flag_type);
    +  // Read the marking-in-progress flag.
    +  LIR_Opr flag_val = gen->new_register(T_INT);
    +  __ load(mark_active_flag_addr, flag_val);
    +  __ cmp(lir_cond_notEqual, flag_val, LIR_OprFact::intConst(0));
    +
    +  LIR_PatchCode pre_val_patch_code = lir_patch_none;
    +
    +  CodeStub* slow;
    +
    +  if (do_load) {
    +    assert(pre_val == LIR_OprFact::illegalOpr, "sanity");
    +    assert(addr_opr != LIR_OprFact::illegalOpr, "sanity");
    +
    +    if (patch)
    +      pre_val_patch_code = lir_patch_normal;
    +
    +    pre_val = gen->new_register(T_OBJECT);
    +
    +    if (!addr_opr->is_address()) {
    +      assert(addr_opr->is_register(), "must be");
    +      addr_opr = LIR_OprFact::address(new LIR_Address(addr_opr, T_OBJECT));
    +    }
    +    slow = new ShenandoahPreBarrierStub(addr_opr, pre_val, pre_val_patch_code, info ? new CodeEmitInfo(info) : NULL);
    +  } else {
    +    assert(addr_opr == LIR_OprFact::illegalOpr, "sanity");
    +    assert(pre_val->is_register(), "must be");
    +    assert(pre_val->type() == T_OBJECT, "must be an object");
    +
    +    slow = new ShenandoahPreBarrierStub(pre_val);
    +  }
    +
    +  __ branch(lir_cond_notEqual, T_INT, slow);
    +  __ branch_destination(slow->continuation());
    +}
    +
    +LIR_Opr ShenandoahBarrierSetC1::read_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check) {
    +  if (UseShenandoahGC && ShenandoahReadBarrier) {
    +    return read_barrier_impl(gen, obj, info, need_null_check);
    +  } else {
    +    return obj;
    +  }
    +}
    +
    +LIR_Opr ShenandoahBarrierSetC1::read_barrier_impl(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check) {
    +  assert(UseShenandoahGC && (ShenandoahReadBarrier || ShenandoahStoreValReadBarrier), "Should be enabled");
    +  LabelObj* done = new LabelObj();
    +  LIR_Opr result = gen->new_register(T_OBJECT);
    +  __ move(obj, result);
    +  if (need_null_check) {
    +    __ cmp(lir_cond_equal, result, LIR_OprFact::oopConst(NULL));
    +    __ branch(lir_cond_equal, T_LONG, done->label());
    +  }
    +  LIR_Address* brooks_ptr_address = gen->generate_address(result, ShenandoahBrooksPointer::byte_offset(), T_ADDRESS);
    +  __ load(brooks_ptr_address, result, info ? new CodeEmitInfo(info) : NULL, lir_patch_none);
    +
    +  __ branch_destination(done->label());
    +  return result;
    +}
    +
    +LIR_Opr ShenandoahBarrierSetC1::write_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check) {
    +  if (UseShenandoahGC && ShenandoahWriteBarrier) {
    +    return write_barrier_impl(gen, obj, info, need_null_check);
    +  } else {
    +    return obj;
    +  }
    +}
    +
    +LIR_Opr ShenandoahBarrierSetC1::write_barrier_impl(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check) {
    +  assert(UseShenandoahGC && (ShenandoahWriteBarrier || ShenandoahStoreValEnqueueBarrier), "Should be enabled");
    +
    +  obj = ensure_in_register(gen, obj);
    +  assert(obj->is_register(), "must be a register at this point");
    +  LIR_Opr result = gen->new_register(T_OBJECT);
    +  __ move(obj, result);
    +
    +  LIR_Opr thrd = gen->getThreadPointer();
    +  LIR_Address* active_flag_addr =
    +    new LIR_Address(thrd,
    +                    in_bytes(ShenandoahThreadLocalData::gc_state_offset()),
    +                    T_BYTE);
    +  // Read and check the gc-state-flag.
    +  LIR_Opr flag_val = gen->new_register(T_INT);
    +  __ load(active_flag_addr, flag_val);
    +  LIR_Opr mask = LIR_OprFact::intConst(ShenandoahHeap::HAS_FORWARDED |
    +                                       ShenandoahHeap::EVACUATION |
    +                                       ShenandoahHeap::TRAVERSAL);
    +  LIR_Opr mask_reg = gen->new_register(T_INT);
    +  __ move(mask, mask_reg);
    +
    +  if (TwoOperandLIRForm) {
    +    __ logical_and(flag_val, mask_reg, flag_val);
    +  } else {
    +    LIR_Opr masked_flag = gen->new_register(T_INT);
    +    __ logical_and(flag_val, mask_reg, masked_flag);
    +    flag_val = masked_flag;
    +  }
    +  __ cmp(lir_cond_notEqual, flag_val, LIR_OprFact::intConst(0));
    +
    +  CodeStub* slow = new ShenandoahWriteBarrierStub(obj, result, info ? new CodeEmitInfo(info) : NULL, need_null_check);
    +  __ branch(lir_cond_notEqual, T_INT, slow);
    +  __ branch_destination(slow->continuation());
    +
    +  return result;
    +}
    +
    +LIR_Opr ShenandoahBarrierSetC1::ensure_in_register(LIRGenerator* gen, LIR_Opr obj) {
    +  if (!obj->is_register()) {
    +    LIR_Opr obj_reg = gen->new_register(T_OBJECT);
    +    if (obj->is_constant()) {
    +      __ move(obj, obj_reg);
    +    } else {
    +      __ leal(obj, obj_reg);
    +    }
    +    obj = obj_reg;
    +  }
    +  return obj;
    +}
    +
    +LIR_Opr ShenandoahBarrierSetC1::storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators) {
    +  bool need_null_check = (decorators & IS_NOT_NULL) == 0;
    +  if (ShenandoahStoreValEnqueueBarrier) {
    +    obj = write_barrier_impl(gen, obj, info, need_null_check);
    +    pre_barrier(gen, info, decorators, LIR_OprFact::illegalOpr, obj);
    +  }
    +  if (ShenandoahStoreValReadBarrier) {
    +    obj = read_barrier_impl(gen, obj, info, true /*need_null_check*/);
    +  }
    +  return obj;
    +}
    +
    +LIR_Opr ShenandoahBarrierSetC1::resolve_address(LIRAccess& access, bool resolve_in_register) {
    +  DecoratorSet decorators = access.decorators();
    +  bool is_array = (decorators & IS_ARRAY) != 0;
    +  bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0;
    +
    +  bool is_write = (decorators & ACCESS_WRITE) != 0;
    +  bool needs_null_check = (decorators & IS_NOT_NULL) == 0;
    +
    +  LIR_Opr base = access.base().item().result();
    +  LIR_Opr offset = access.offset().opr();
    +  LIRGenerator* gen = access.gen();
    +
    +  if (is_write) {
    +    base = write_barrier(gen, base, access.access_emit_info(), needs_null_check);
    +  } else {
    +    base = read_barrier(gen, base, access.access_emit_info(), needs_null_check);
    +  }
    +
    +  LIR_Opr addr_opr;
    +  if (is_array) {
    +    addr_opr = LIR_OprFact::address(gen->emit_array_address(base, offset, access.type()));
    +  } else if (needs_patching) {
    +    // we need to patch the offset in the instruction so don't allow
    +    // generate_address to try to be smart about emitting the -1.
    +    // Otherwise the patching code won't know how to find the
    +    // instruction to patch.
    +    addr_opr = LIR_OprFact::address(new LIR_Address(base, PATCHED_ADDR, access.type()));
    +  } else {
    +    addr_opr = LIR_OprFact::address(gen->generate_address(base, offset, 0, 0, access.type()));
    +  }
    +
    +  if (resolve_in_register) {
    +    LIR_Opr resolved_addr = gen->new_pointer_register();
    +    __ leal(addr_opr, resolved_addr);
    +    resolved_addr = LIR_OprFact::address(new LIR_Address(resolved_addr, access.type()));
    +    return resolved_addr;
    +  } else {
    +    return addr_opr;
    +  }
    +}
    +
    +void ShenandoahBarrierSetC1::store_at_resolved(LIRAccess& access, LIR_Opr value) {
    +  if (access.is_oop()) {
    +    if (ShenandoahSATBBarrier) {
    +      pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), access.resolved_addr(), LIR_OprFact::illegalOpr /* pre_val */);
    +    }
    +    value = storeval_barrier(access.gen(), value, access.access_emit_info(), access.decorators());
    +  }
    +  BarrierSetC1::store_at_resolved(access, value);
    +}
    +
    +void ShenandoahBarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) {
    +  BarrierSetC1::load_at_resolved(access, result);
    +
    +  if (ShenandoahKeepAliveBarrier) {
    +    DecoratorSet decorators = access.decorators();
    +    bool is_weak = (decorators & ON_WEAK_OOP_REF) != 0;
    +    bool is_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0;
    +    bool is_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
    +    LIRGenerator *gen = access.gen();
    +    if (access.is_oop() && (is_weak || is_phantom || is_anonymous)) {
    +      // Register the value in the referent field with the pre-barrier
    +      LabelObj *Lcont_anonymous;
    +      if (is_anonymous) {
    +        Lcont_anonymous = new LabelObj();
    +        generate_referent_check(access, Lcont_anonymous);
    +      }
    +      pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), LIR_OprFact::illegalOpr /* addr_opr */,
    +                  result /* pre_val */);
    +      if (is_anonymous) {
    +        __ branch_destination(Lcont_anonymous->label());
    +      }
    +    }
    +  }
    +}
    +
    +LIR_Opr ShenandoahBarrierSetC1::atomic_add_at_resolved(LIRAccess& access, LIRItem& value) {
    +  return BarrierSetC1::atomic_add_at_resolved(access, value);
    +}
    +
    +LIR_Opr ShenandoahBarrierSetC1::resolve(LIRGenerator* gen, DecoratorSet decorators, LIR_Opr obj) {
    +  bool is_write = decorators & ACCESS_WRITE;
    +  if (is_write) {
    +    return write_barrier(gen, obj, NULL, (decorators & IS_NOT_NULL) == 0);
    +  } else {
    +    return read_barrier(gen, obj, NULL, (decorators & IS_NOT_NULL) == 0);
    +  }
    +}
    +
    +class C1ShenandoahPreBarrierCodeGenClosure : public StubAssemblerCodeGenClosure {
    +  virtual OopMapSet* generate_code(StubAssembler* sasm) {
    +    ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
    +    bs->generate_c1_pre_barrier_runtime_stub(sasm);
    +    return NULL;
    +  }
    +};
    +
    +void ShenandoahBarrierSetC1::generate_c1_runtime_stubs(BufferBlob* buffer_blob) {
    +  C1ShenandoahPreBarrierCodeGenClosure pre_code_gen_cl;
    +  _pre_barrier_c1_runtime_code_blob = Runtime1::generate_blob(buffer_blob, -1,
    +                                                              "shenandoah_pre_barrier_slow",
    +                                                              false, &pre_code_gen_cl);
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.hpp b/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.hpp
    new file mode 100644
    index 00000000000..986bbc94829
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.hpp
    @@ -0,0 +1,213 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_C1_SHENANDOAHBARRIERSETC1_HPP
    +#define SHARE_VM_GC_SHENANDOAH_C1_SHENANDOAHBARRIERSETC1_HPP
    +
    +#include "c1/c1_CodeStubs.hpp"
    +#include "gc/shared/c1/barrierSetC1.hpp"
    +
    +class ShenandoahPreBarrierStub: public CodeStub {
    +  friend class ShenandoahBarrierSetC1;
    +private:
    +  bool _do_load;
    +  LIR_Opr _addr;
    +  LIR_Opr _pre_val;
    +  LIR_PatchCode _patch_code;
    +  CodeEmitInfo* _info;
    +
    +public:
    +  // Version that _does_ generate a load of the previous value from addr.
    +  // addr (the address of the field to be read) must be a LIR_Address
    +  // pre_val (a temporary register) must be a register;
    +  ShenandoahPreBarrierStub(LIR_Opr addr, LIR_Opr pre_val, LIR_PatchCode patch_code, CodeEmitInfo* info) :
    +    _do_load(true), _addr(addr), _pre_val(pre_val),
    +    _patch_code(patch_code), _info(info)
    +  {
    +    assert(_pre_val->is_register(), "should be temporary register");
    +    assert(_addr->is_address(), "should be the address of the field");
    +  }
    +
    +  // Version that _does not_ generate load of the previous value; the
    +  // previous value is assumed to have already been loaded into pre_val.
    +  ShenandoahPreBarrierStub(LIR_Opr pre_val) :
    +    _do_load(false), _addr(LIR_OprFact::illegalOpr), _pre_val(pre_val),
    +    _patch_code(lir_patch_none), _info(NULL)
    +  {
    +    assert(_pre_val->is_register(), "should be a register");
    +  }
    +
    +  LIR_Opr addr() const { return _addr; }
    +  LIR_Opr pre_val() const { return _pre_val; }
    +  LIR_PatchCode patch_code() const { return _patch_code; }
    +  CodeEmitInfo* info() const { return _info; }
    +  bool do_load() const { return _do_load; }
    +
    +  virtual void emit_code(LIR_Assembler* e);
    +  virtual void visit(LIR_OpVisitState* visitor) {
    +    if (_do_load) {
    +      // don't pass in the code emit info since it's processed in the fast
    +      // path
    +      if (_info != NULL)
    +        visitor->do_slow_case(_info);
    +      else
    +        visitor->do_slow_case();
    +
    +      visitor->do_input(_addr);
    +      visitor->do_temp(_pre_val);
    +    } else {
    +      visitor->do_slow_case();
    +      visitor->do_input(_pre_val);
    +    }
    +  }
    +#ifndef PRODUCT
    +  virtual void print_name(outputStream* out) const { out->print("ShenandoahPreBarrierStub"); }
    +#endif // PRODUCT
    +};
    +
    +class ShenandoahWriteBarrierStub: public CodeStub {
    +  friend class ShenandoahBarrierSetC1;
    +private:
    +  LIR_Opr _obj;
    +  LIR_Opr _result;
    +  CodeEmitInfo* _info;
    +  bool _needs_null_check;
    +
    +public:
    +  ShenandoahWriteBarrierStub(LIR_Opr obj, LIR_Opr result, CodeEmitInfo* info, bool needs_null_check) :
    +    _obj(obj), _result(result), _info(info), _needs_null_check(needs_null_check)
    +  {
    +    assert(_obj->is_register(), "should be register");
    +    assert(_result->is_register(), "should be register");
    +  }
    +
    +  LIR_Opr obj() const { return _obj; }
    +  LIR_Opr result() const { return _result; }
    +  CodeEmitInfo* info() const { return _info; }
    +  bool needs_null_check() const { return _needs_null_check; }
    +
    +  virtual void emit_code(LIR_Assembler* e);
    +  virtual void visit(LIR_OpVisitState* visitor) {
    +    visitor->do_slow_case();
    +    visitor->do_input(_obj);
    +    visitor->do_temp(_result);
    +  }
    +#ifndef PRODUCT
    +  virtual void print_name(outputStream* out) const { out->print("ShenandoahWritePreBarrierStub"); }
    +#endif // PRODUCT
    +};
    +
    +class LIR_OpShenandoahCompareAndSwap : public LIR_Op {
    + friend class LIR_OpVisitState;
    +
    +private:
    +  LIR_Opr _addr;
    +  LIR_Opr _cmp_value;
    +  LIR_Opr _new_value;
    +  LIR_Opr _tmp1;
    +  LIR_Opr _tmp2;
    +
    +public:
    +  LIR_OpShenandoahCompareAndSwap(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
    +                                 LIR_Opr t1, LIR_Opr t2, LIR_Opr result)
    +    : LIR_Op(lir_none, result, NULL)  // no info
    +    , _addr(addr)
    +    , _cmp_value(cmp_value)
    +    , _new_value(new_value)
    +    , _tmp1(t1)
    +    , _tmp2(t2)                                  { }
    +
    +  LIR_Opr addr()        const                    { return _addr;  }
    +  LIR_Opr cmp_value()   const                    { return _cmp_value; }
    +  LIR_Opr new_value()   const                    { return _new_value; }
    +  LIR_Opr tmp1()        const                    { return _tmp1;      }
    +  LIR_Opr tmp2()        const                    { return _tmp2;      }
    +
    +  virtual void visit(LIR_OpVisitState* state) {
    +      assert(_addr->is_valid(),      "used");
    +      assert(_cmp_value->is_valid(), "used");
    +      assert(_new_value->is_valid(), "used");
    +      if (_info)                    state->do_info(_info);
    +                                    state->do_input(_addr);
    +                                    state->do_temp(_addr);
    +                                    state->do_input(_cmp_value);
    +                                    state->do_temp(_cmp_value);
    +                                    state->do_input(_new_value);
    +                                    state->do_temp(_new_value);
    +      if (_tmp1->is_valid())        state->do_temp(_tmp1);
    +      if (_tmp2->is_valid())        state->do_temp(_tmp2);
    +      if (_result->is_valid())      state->do_output(_result);
    +  }
    +
    +  virtual void emit_code(LIR_Assembler* masm);
    +
    +  virtual void print_instr(outputStream* out) const {
    +    addr()->print(out);      out->print(" ");
    +    cmp_value()->print(out); out->print(" ");
    +    new_value()->print(out); out->print(" ");
    +    tmp1()->print(out);      out->print(" ");
    +    tmp2()->print(out);      out->print(" ");
    +  }
    +#ifndef PRODUCT
    +  virtual const char* name() const {
    +    return "shenandoah_cas_obj";
    +  }
    +#endif // PRODUCT
    +};
    +
    +class ShenandoahBarrierSetC1 : public BarrierSetC1 {
    +private:
    +  CodeBlob* _pre_barrier_c1_runtime_code_blob;
    +
    +  void pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val);
    +
    +  LIR_Opr read_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
    +  LIR_Opr write_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
    +  LIR_Opr storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators);
    +
    +  LIR_Opr read_barrier_impl(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
    +  LIR_Opr write_barrier_impl(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
    +
    +  LIR_Opr ensure_in_register(LIRGenerator* gen, LIR_Opr obj);
    +
    +public:
    +  CodeBlob* pre_barrier_c1_runtime_code_blob() { return _pre_barrier_c1_runtime_code_blob; }
    +
    +protected:
    +  virtual LIR_Opr resolve_address(LIRAccess& access, bool resolve_in_register);
    +
    +  virtual void store_at_resolved(LIRAccess& access, LIR_Opr value);
    +  virtual void load_at_resolved(LIRAccess& access, LIR_Opr result);
    +
    +  virtual LIR_Opr atomic_cmpxchg_at_resolved(LIRAccess& access, LIRItem& cmp_value, LIRItem& new_value);
    +
    +  virtual LIR_Opr atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value);
    +  virtual LIR_Opr atomic_add_at_resolved(LIRAccess& access, LIRItem& value);
    +
    +public:
    +  virtual LIR_Opr resolve(LIRGenerator* gen, DecoratorSet decorators, LIR_Opr obj);
    +
    +  virtual void generate_c1_runtime_stubs(BufferBlob* buffer_blob);
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_C1_SHENANDOAHBARRIERSETC1_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp b/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp
    new file mode 100644
    index 00000000000..20f90f50e00
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp
    @@ -0,0 +1,1545 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahRuntime.hpp"
    +#include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
    +#include "gc/shenandoah/c2/shenandoahSupport.hpp"
    +#include "opto/arraycopynode.hpp"
    +#include "opto/escape.hpp"
    +#include "opto/graphKit.hpp"
    +#include "opto/idealKit.hpp"
    +#include "opto/macro.hpp"
    +#include "opto/movenode.hpp"
    +#include "opto/narrowptrnode.hpp"
    +#include "opto/rootnode.hpp"
    +
    +ShenandoahBarrierSetC2* ShenandoahBarrierSetC2::bsc2() {
    +  return reinterpret_cast(BarrierSet::barrier_set()->barrier_set_c2());
    +}
    +
    +ShenandoahBarrierSetC2State::ShenandoahBarrierSetC2State(Arena* comp_arena)
    +  : _shenandoah_barriers(new (comp_arena) GrowableArray(comp_arena, 8,  0, NULL)) {
    +}
    +
    +int ShenandoahBarrierSetC2State::shenandoah_barriers_count() const {
    +  return _shenandoah_barriers->length();
    +}
    +
    +ShenandoahWriteBarrierNode* ShenandoahBarrierSetC2State::shenandoah_barrier(int idx) const {
    +  return _shenandoah_barriers->at(idx);
    +}
    +
    +void ShenandoahBarrierSetC2State::add_shenandoah_barrier(ShenandoahWriteBarrierNode * n) {
    +  assert(!_shenandoah_barriers->contains(n), "duplicate entry in barrier list");
    +  _shenandoah_barriers->append(n);
    +}
    +
    +void ShenandoahBarrierSetC2State::remove_shenandoah_barrier(ShenandoahWriteBarrierNode * n) {
    +  if (_shenandoah_barriers->contains(n)) {
    +    _shenandoah_barriers->remove(n);
    +  }
    +}
    +
    +#define __ kit->
    +
    +Node* ShenandoahBarrierSetC2::shenandoah_read_barrier(GraphKit* kit, Node* obj) const {
    +  if (ShenandoahReadBarrier) {
    +    obj = shenandoah_read_barrier_impl(kit, obj, false, true, true);
    +  }
    +  return obj;
    +}
    +
    +Node* ShenandoahBarrierSetC2::shenandoah_storeval_barrier(GraphKit* kit, Node* obj) const {
    +  if (ShenandoahStoreValEnqueueBarrier) {
    +    obj = shenandoah_write_barrier(kit, obj);
    +    obj = shenandoah_enqueue_barrier(kit, obj);
    +  }
    +  if (ShenandoahStoreValReadBarrier) {
    +    obj = shenandoah_read_barrier_impl(kit, obj, true, false, false);
    +  }
    +  return obj;
    +}
    +
    +Node* ShenandoahBarrierSetC2::shenandoah_read_barrier_impl(GraphKit* kit, Node* obj, bool use_ctrl, bool use_mem, bool allow_fromspace) const {
    +  const Type* obj_type = obj->bottom_type();
    +  if (obj_type->higher_equal(TypePtr::NULL_PTR)) {
    +    return obj;
    +  }
    +  const TypePtr* adr_type = ShenandoahBarrierNode::brooks_pointer_type(obj_type);
    +  Node* mem = use_mem ? __ memory(adr_type) : __ immutable_memory();
    +
    +  if (! ShenandoahBarrierNode::needs_barrier(&__ gvn(), NULL, obj, mem, allow_fromspace)) {
    +    // We know it is null, no barrier needed.
    +    return obj;
    +  }
    +
    +  if (obj_type->meet(TypePtr::NULL_PTR) == obj_type->remove_speculative()) {
    +
    +    // We don't know if it's null or not. Need null-check.
    +    enum { _not_null_path = 1, _null_path, PATH_LIMIT };
    +    RegionNode* region = new RegionNode(PATH_LIMIT);
    +    Node*       phi    = new PhiNode(region, obj_type);
    +    Node* null_ctrl = __ top();
    +    Node* not_null_obj = __ null_check_oop(obj, &null_ctrl);
    +
    +    region->init_req(_null_path, null_ctrl);
    +    phi   ->init_req(_null_path, __ zerocon(T_OBJECT));
    +
    +    Node* ctrl = use_ctrl ? __ control() : NULL;
    +    ShenandoahReadBarrierNode* rb = new ShenandoahReadBarrierNode(ctrl, mem, not_null_obj, allow_fromspace);
    +    Node* n = __ gvn().transform(rb);
    +
    +    region->init_req(_not_null_path, __ control());
    +    phi   ->init_req(_not_null_path, n);
    +
    +    __ set_control(__ gvn().transform(region));
    +    __ record_for_igvn(region);
    +    return __ gvn().transform(phi);
    +
    +  } else {
    +    // We know it is not null. Simple barrier is sufficient.
    +    Node* ctrl = use_ctrl ? __ control() : NULL;
    +    ShenandoahReadBarrierNode* rb = new ShenandoahReadBarrierNode(ctrl, mem, obj, allow_fromspace);
    +    Node* n = __ gvn().transform(rb);
    +    __ record_for_igvn(n);
    +    return n;
    +  }
    +}
    +
    +Node* ShenandoahBarrierSetC2::shenandoah_write_barrier_helper(GraphKit* kit, Node* obj, const TypePtr* adr_type) const {
    +  ShenandoahWriteBarrierNode* wb = new ShenandoahWriteBarrierNode(kit->C, kit->control(), kit->memory(adr_type), obj);
    +  Node* n = __ gvn().transform(wb);
    +  if (n == wb) { // New barrier needs memory projection.
    +    Node* proj = __ gvn().transform(new ShenandoahWBMemProjNode(n));
    +    __ set_memory(proj, adr_type);
    +  }
    +  return n;
    +}
    +
    +Node* ShenandoahBarrierSetC2::shenandoah_write_barrier(GraphKit* kit, Node* obj) const {
    +  if (ShenandoahWriteBarrier) {
    +    obj = shenandoah_write_barrier_impl(kit, obj);
    +  }
    +  return obj;
    +}
    +
    +Node* ShenandoahBarrierSetC2::shenandoah_write_barrier_impl(GraphKit* kit, Node* obj) const {
    +  if (! ShenandoahBarrierNode::needs_barrier(&__ gvn(), NULL, obj, NULL, true)) {
    +    return obj;
    +  }
    +  const Type* obj_type = obj->bottom_type();
    +  const TypePtr* adr_type = ShenandoahBarrierNode::brooks_pointer_type(obj_type);
    +  Node* n = shenandoah_write_barrier_helper(kit, obj, adr_type);
    +  __ record_for_igvn(n);
    +  return n;
    +}
    +
    +bool ShenandoahBarrierSetC2::satb_can_remove_pre_barrier(GraphKit* kit, PhaseTransform* phase, Node* adr,
    +                                                         BasicType bt, uint adr_idx) const {
    +  intptr_t offset = 0;
    +  Node* base = AddPNode::Ideal_base_and_offset(adr, phase, offset);
    +  AllocateNode* alloc = AllocateNode::Ideal_allocation(base, phase);
    +
    +  if (offset == Type::OffsetBot) {
    +    return false; // cannot unalias unless there are precise offsets
    +  }
    +
    +  if (alloc == NULL) {
    +    return false; // No allocation found
    +  }
    +
    +  intptr_t size_in_bytes = type2aelembytes(bt);
    +
    +  Node* mem = __ memory(adr_idx); // start searching here...
    +
    +  for (int cnt = 0; cnt < 50; cnt++) {
    +
    +    if (mem->is_Store()) {
    +
    +      Node* st_adr = mem->in(MemNode::Address);
    +      intptr_t st_offset = 0;
    +      Node* st_base = AddPNode::Ideal_base_and_offset(st_adr, phase, st_offset);
    +
    +      if (st_base == NULL) {
    +        break; // inscrutable pointer
    +      }
    +
    +      // Break we have found a store with same base and offset as ours so break
    +      if (st_base == base && st_offset == offset) {
    +        break;
    +      }
    +
    +      if (st_offset != offset && st_offset != Type::OffsetBot) {
    +        const int MAX_STORE = BytesPerLong;
    +        if (st_offset >= offset + size_in_bytes ||
    +            st_offset <= offset - MAX_STORE ||
    +            st_offset <= offset - mem->as_Store()->memory_size()) {
    +          // Success:  The offsets are provably independent.
    +          // (You may ask, why not just test st_offset != offset and be done?
    +          // The answer is that stores of different sizes can co-exist
    +          // in the same sequence of RawMem effects.  We sometimes initialize
    +          // a whole 'tile' of array elements with a single jint or jlong.)
    +          mem = mem->in(MemNode::Memory);
    +          continue; // advance through independent store memory
    +        }
    +      }
    +
    +      if (st_base != base
    +          && MemNode::detect_ptr_independence(base, alloc, st_base,
    +                                              AllocateNode::Ideal_allocation(st_base, phase),
    +                                              phase)) {
    +        // Success:  The bases are provably independent.
    +        mem = mem->in(MemNode::Memory);
    +        continue; // advance through independent store memory
    +      }
    +    } else if (mem->is_Proj() && mem->in(0)->is_Initialize()) {
    +
    +      InitializeNode* st_init = mem->in(0)->as_Initialize();
    +      AllocateNode* st_alloc = st_init->allocation();
    +
    +      // Make sure that we are looking at the same allocation site.
    +      // The alloc variable is guaranteed to not be null here from earlier check.
    +      if (alloc == st_alloc) {
    +        // Check that the initialization is storing NULL so that no previous store
    +        // has been moved up and directly write a reference
    +        Node* captured_store = st_init->find_captured_store(offset,
    +                                                            type2aelembytes(T_OBJECT),
    +                                                            phase);
    +        if (captured_store == NULL || captured_store == st_init->zero_memory()) {
    +          return true;
    +        }
    +      }
    +    }
    +
    +    // Unless there is an explicit 'continue', we must bail out here,
    +    // because 'mem' is an inscrutable memory state (e.g., a call).
    +    break;
    +  }
    +
    +  return false;
    +}
    +
    +#undef __
    +#define __ ideal.
    +
    +void ShenandoahBarrierSetC2::satb_write_barrier_pre(GraphKit* kit,
    +                                                    bool do_load,
    +                                                    Node* obj,
    +                                                    Node* adr,
    +                                                    uint alias_idx,
    +                                                    Node* val,
    +                                                    const TypeOopPtr* val_type,
    +                                                    Node* pre_val,
    +                                                    BasicType bt) const {
    +  // Some sanity checks
    +  // Note: val is unused in this routine.
    +
    +  if (do_load) {
    +    // We need to generate the load of the previous value
    +    assert(obj != NULL, "must have a base");
    +    assert(adr != NULL, "where are loading from?");
    +    assert(pre_val == NULL, "loaded already?");
    +    assert(val_type != NULL, "need a type");
    +
    +    if (ReduceInitialCardMarks
    +        && satb_can_remove_pre_barrier(kit, &kit->gvn(), adr, bt, alias_idx)) {
    +      return;
    +    }
    +
    +  } else {
    +    // In this case both val_type and alias_idx are unused.
    +    assert(pre_val != NULL, "must be loaded already");
    +    // Nothing to be done if pre_val is null.
    +    if (pre_val->bottom_type() == TypePtr::NULL_PTR) return;
    +    assert(pre_val->bottom_type()->basic_type() == T_OBJECT, "or we shouldn't be here");
    +  }
    +  assert(bt == T_OBJECT, "or we shouldn't be here");
    +
    +  IdealKit ideal(kit, true);
    +
    +  Node* tls = __ thread(); // ThreadLocalStorage
    +
    +  Node* no_base = __ top();
    +  Node* zero  = __ ConI(0);
    +  Node* zeroX = __ ConX(0);
    +
    +  float likely  = PROB_LIKELY(0.999);
    +  float unlikely  = PROB_UNLIKELY(0.999);
    +
    +  // Offsets into the thread
    +  const int index_offset   = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset());
    +  const int buffer_offset  = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset());
    +
    +  // Now the actual pointers into the thread
    +  Node* buffer_adr  = __ AddP(no_base, tls, __ ConX(buffer_offset));
    +  Node* index_adr   = __ AddP(no_base, tls, __ ConX(index_offset));
    +
    +  // Now some of the values
    +  Node* marking;
    +  Node* gc_state = __ AddP(no_base, tls, __ ConX(in_bytes(ShenandoahThreadLocalData::gc_state_offset())));
    +  Node* ld = __ load(__ ctrl(), gc_state, TypeInt::BYTE, T_BYTE, Compile::AliasIdxRaw);
    +  marking = __ AndI(ld, __ ConI(ShenandoahHeap::MARKING));
    +  assert(ShenandoahWriteBarrierNode::is_gc_state_load(ld), "Should match the shape");
    +
    +  // if (!marking)
    +  __ if_then(marking, BoolTest::ne, zero, unlikely); {
    +    BasicType index_bt = TypeX_X->basic_type();
    +    assert(sizeof(size_t) == type2aelembytes(index_bt), "Loading G1 SATBMarkQueue::_index with wrong size.");
    +    Node* index   = __ load(__ ctrl(), index_adr, TypeX_X, index_bt, Compile::AliasIdxRaw);
    +
    +    if (do_load) {
    +      // load original value
    +      // alias_idx correct??
    +      pre_val = __ load(__ ctrl(), adr, val_type, bt, alias_idx);
    +    }
    +
    +    // if (pre_val != NULL)
    +    __ if_then(pre_val, BoolTest::ne, kit->null()); {
    +      Node* buffer  = __ load(__ ctrl(), buffer_adr, TypeRawPtr::NOTNULL, T_ADDRESS, Compile::AliasIdxRaw);
    +
    +      // is the queue for this thread full?
    +      __ if_then(index, BoolTest::ne, zeroX, likely); {
    +
    +        // decrement the index
    +        Node* next_index = kit->gvn().transform(new SubXNode(index, __ ConX(sizeof(intptr_t))));
    +
    +        // Now get the buffer location we will log the previous value into and store it
    +        Node *log_addr = __ AddP(no_base, buffer, next_index);
    +        __ store(__ ctrl(), log_addr, pre_val, T_OBJECT, Compile::AliasIdxRaw, MemNode::unordered);
    +        // update the index
    +        __ store(__ ctrl(), index_adr, next_index, index_bt, Compile::AliasIdxRaw, MemNode::unordered);
    +
    +      } __ else_(); {
    +
    +        // logging buffer is full, call the runtime
    +        const TypeFunc *tf = ShenandoahBarrierSetC2::write_ref_field_pre_entry_Type();
    +        __ make_leaf_call(tf, CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), "shenandoah_wb_pre", pre_val, tls);
    +      } __ end_if();  // (!index)
    +    } __ end_if();  // (pre_val != NULL)
    +  } __ end_if();  // (!marking)
    +
    +  // Final sync IdealKit and GraphKit.
    +  kit->final_sync(ideal);
    +
    +  if (ShenandoahSATBBarrier && adr != NULL) {
    +    Node* c = kit->control();
    +    Node* call = c->in(1)->in(1)->in(1)->in(0);
    +    assert(is_shenandoah_wb_pre_call(call), "shenandoah_wb_pre call expected");
    +    call->add_req(adr);
    +  }
    +}
    +
    +bool ShenandoahBarrierSetC2::is_shenandoah_wb_pre_call(Node* call) {
    +  return call->is_CallLeaf() &&
    +         call->as_CallLeaf()->entry_point() == CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry);
    +}
    +
    +bool ShenandoahBarrierSetC2::is_shenandoah_wb_call(Node* call) {
    +  return call->is_CallLeaf() &&
    +         call->as_CallLeaf()->entry_point() == CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_JRT);
    +}
    +
    +bool ShenandoahBarrierSetC2::is_shenandoah_marking_if(PhaseTransform *phase, Node* n) {
    +  if (n->Opcode() != Op_If) {
    +    return false;
    +  }
    +
    +  Node* bol = n->in(1);
    +  assert(bol->is_Bool(), "");
    +  Node* cmpx = bol->in(1);
    +  if (bol->as_Bool()->_test._test == BoolTest::ne &&
    +      cmpx->is_Cmp() && cmpx->in(2) == phase->intcon(0) &&
    +      is_shenandoah_state_load(cmpx->in(1)->in(1)) &&
    +      cmpx->in(1)->in(2)->is_Con() &&
    +      cmpx->in(1)->in(2) == phase->intcon(ShenandoahHeap::MARKING)) {
    +    return true;
    +  }
    +
    +  return false;
    +}
    +
    +bool ShenandoahBarrierSetC2::is_shenandoah_state_load(Node* n) {
    +  if (!n->is_Load()) return false;
    +  const int state_offset = in_bytes(ShenandoahThreadLocalData::gc_state_offset());
    +  return n->in(2)->is_AddP() && n->in(2)->in(2)->Opcode() == Op_ThreadLocal
    +         && n->in(2)->in(3)->is_Con()
    +         && n->in(2)->in(3)->bottom_type()->is_intptr_t()->get_con() == state_offset;
    +}
    +
    +void ShenandoahBarrierSetC2::shenandoah_write_barrier_pre(GraphKit* kit,
    +                                                          bool do_load,
    +                                                          Node* obj,
    +                                                          Node* adr,
    +                                                          uint alias_idx,
    +                                                          Node* val,
    +                                                          const TypeOopPtr* val_type,
    +                                                          Node* pre_val,
    +                                                          BasicType bt) const {
    +  if (ShenandoahSATBBarrier) {
    +    IdealKit ideal(kit);
    +    kit->sync_kit(ideal);
    +
    +    satb_write_barrier_pre(kit, do_load, obj, adr, alias_idx, val, val_type, pre_val, bt);
    +
    +    ideal.sync_kit(kit);
    +    kit->final_sync(ideal);
    +  }
    +}
    +
    +Node* ShenandoahBarrierSetC2::shenandoah_enqueue_barrier(GraphKit* kit, Node* pre_val) const {
    +  return kit->gvn().transform(new ShenandoahEnqueueBarrierNode(pre_val));
    +}
    +
    +// Helper that guards and inserts a pre-barrier.
    +void ShenandoahBarrierSetC2::insert_pre_barrier(GraphKit* kit, Node* base_oop, Node* offset,
    +                                                Node* pre_val, bool need_mem_bar) const {
    +  // We could be accessing the referent field of a reference object. If so, when G1
    +  // is enabled, we need to log the value in the referent field in an SATB buffer.
    +  // This routine performs some compile time filters and generates suitable
    +  // runtime filters that guard the pre-barrier code.
    +  // Also add memory barrier for non volatile load from the referent field
    +  // to prevent commoning of loads across safepoint.
    +
    +  // Some compile time checks.
    +
    +  // If offset is a constant, is it java_lang_ref_Reference::_reference_offset?
    +  const TypeX* otype = offset->find_intptr_t_type();
    +  if (otype != NULL && otype->is_con() &&
    +      otype->get_con() != java_lang_ref_Reference::referent_offset) {
    +    // Constant offset but not the reference_offset so just return
    +    return;
    +  }
    +
    +  // We only need to generate the runtime guards for instances.
    +  const TypeOopPtr* btype = base_oop->bottom_type()->isa_oopptr();
    +  if (btype != NULL) {
    +    if (btype->isa_aryptr()) {
    +      // Array type so nothing to do
    +      return;
    +    }
    +
    +    const TypeInstPtr* itype = btype->isa_instptr();
    +    if (itype != NULL) {
    +      // Can the klass of base_oop be statically determined to be
    +      // _not_ a sub-class of Reference and _not_ Object?
    +      ciKlass* klass = itype->klass();
    +      if ( klass->is_loaded() &&
    +          !klass->is_subtype_of(kit->env()->Reference_klass()) &&
    +          !kit->env()->Object_klass()->is_subtype_of(klass)) {
    +        return;
    +      }
    +    }
    +  }
    +
    +  // The compile time filters did not reject base_oop/offset so
    +  // we need to generate the following runtime filters
    +  //
    +  // if (offset == java_lang_ref_Reference::_reference_offset) {
    +  //   if (instance_of(base, java.lang.ref.Reference)) {
    +  //     pre_barrier(_, pre_val, ...);
    +  //   }
    +  // }
    +
    +  float likely   = PROB_LIKELY(  0.999);
    +  float unlikely = PROB_UNLIKELY(0.999);
    +
    +  IdealKit ideal(kit);
    +
    +  Node* referent_off = __ ConX(java_lang_ref_Reference::referent_offset);
    +
    +  __ if_then(offset, BoolTest::eq, referent_off, unlikely); {
    +      // Update graphKit memory and control from IdealKit.
    +      kit->sync_kit(ideal);
    +
    +      Node* ref_klass_con = kit->makecon(TypeKlassPtr::make(kit->env()->Reference_klass()));
    +      Node* is_instof = kit->gen_instanceof(base_oop, ref_klass_con);
    +
    +      // Update IdealKit memory and control from graphKit.
    +      __ sync_kit(kit);
    +
    +      Node* one = __ ConI(1);
    +      // is_instof == 0 if base_oop == NULL
    +      __ if_then(is_instof, BoolTest::eq, one, unlikely); {
    +
    +        // Update graphKit from IdeakKit.
    +        kit->sync_kit(ideal);
    +
    +        // Use the pre-barrier to record the value in the referent field
    +        satb_write_barrier_pre(kit, false /* do_load */,
    +                               NULL /* obj */, NULL /* adr */, max_juint /* alias_idx */, NULL /* val */, NULL /* val_type */,
    +                               pre_val /* pre_val */,
    +                               T_OBJECT);
    +        if (need_mem_bar) {
    +          // Add memory barrier to prevent commoning reads from this field
    +          // across safepoint since GC can change its value.
    +          kit->insert_mem_bar(Op_MemBarCPUOrder);
    +        }
    +        // Update IdealKit from graphKit.
    +        __ sync_kit(kit);
    +
    +      } __ end_if(); // _ref_type != ref_none
    +  } __ end_if(); // offset == referent_offset
    +
    +  // Final sync IdealKit and GraphKit.
    +  kit->final_sync(ideal);
    +}
    +
    +#undef __
    +
    +const TypeFunc* ShenandoahBarrierSetC2::write_ref_field_pre_entry_Type() {
    +  const Type **fields = TypeTuple::fields(2);
    +  fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
    +  fields[TypeFunc::Parms+1] = TypeRawPtr::NOTNULL; // thread
    +  const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
    +
    +  // create result type (range)
    +  fields = TypeTuple::fields(0);
    +  const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
    +
    +  return TypeFunc::make(domain, range);
    +}
    +
    +const TypeFunc* ShenandoahBarrierSetC2::shenandoah_clone_barrier_Type() {
    +  const Type **fields = TypeTuple::fields(1);
    +  fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
    +  const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
    +
    +  // create result type (range)
    +  fields = TypeTuple::fields(0);
    +  const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
    +
    +  return TypeFunc::make(domain, range);
    +}
    +
    +const TypeFunc* ShenandoahBarrierSetC2::shenandoah_write_barrier_Type() {
    +  const Type **fields = TypeTuple::fields(1);
    +  fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
    +  const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
    +
    +  // create result type (range)
    +  fields = TypeTuple::fields(1);
    +  fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL;
    +  const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
    +
    +  return TypeFunc::make(domain, range);
    +}
    +
    +void ShenandoahBarrierSetC2::resolve_address(C2Access& access) const {
    +  const TypePtr* adr_type = access.addr().type();
    +
    +  if ((access.decorators() & IN_NATIVE) == 0 && (adr_type->isa_instptr() || adr_type->isa_aryptr())) {
    +    int off = adr_type->is_ptr()->offset();
    +    int base_off = adr_type->isa_instptr() ? instanceOopDesc::base_offset_in_bytes() :
    +      arrayOopDesc::base_offset_in_bytes(adr_type->is_aryptr()->elem()->array_element_basic_type());
    +    assert(off != Type::OffsetTop, "unexpected offset");
    +    if (off == Type::OffsetBot || off >= base_off) {
    +      DecoratorSet decorators = access.decorators();
    +      bool is_write = (decorators & C2_WRITE_ACCESS) != 0;
    +      GraphKit* kit = NULL;
    +      if (access.is_parse_access()) {
    +        C2ParseAccess& parse_access = static_cast(access);
    +        kit = parse_access.kit();
    +      }
    +      Node* adr = access.addr().node();
    +      assert(adr->is_AddP(), "unexpected address shape");
    +      Node* base = adr->in(AddPNode::Base);
    +
    +      if (is_write) {
    +        if (kit != NULL) {
    +          base = shenandoah_write_barrier(kit, base);
    +        } else {
    +          assert(access.is_opt_access(), "either parse or opt access");
    +          assert((access.decorators() & C2_ARRAY_COPY) != 0, "can be skipped for clone");
    +        }
    +      } else {
    +        if (adr_type->isa_instptr()) {
    +          Compile* C = access.gvn().C;
    +          ciField* field = C->alias_type(adr_type)->field();
    +
    +          // Insert read barrier for Shenandoah.
    +          if (field != NULL &&
    +              ((ShenandoahOptimizeStaticFinals   && field->is_static()  && field->is_final()) ||
    +               (ShenandoahOptimizeInstanceFinals && !field->is_static() && field->is_final()) ||
    +               (ShenandoahOptimizeStableFinals   && field->is_stable()))) {
    +            // Skip the barrier for special fields
    +          } else {
    +            if (kit != NULL) {
    +              base = shenandoah_read_barrier(kit, base);
    +            } else {
    +              assert(access.is_opt_access(), "either parse or opt access");
    +              assert((access.decorators() & C2_ARRAY_COPY) != 0, "can be skipped for arraycopy");
    +            }
    +          }
    +        } else {
    +          if (kit != NULL) {
    +            base = shenandoah_read_barrier(kit, base);
    +          } else {
    +            assert(access.is_opt_access(), "either parse or opt access");
    +            assert((access.decorators() & C2_ARRAY_COPY) != 0, "can be skipped for arraycopy");
    +          }
    +        }
    +      }
    +      if (base != adr->in(AddPNode::Base)) {
    +        assert(kit != NULL, "no barrier should have been added");
    +
    +        Node* address = adr->in(AddPNode::Address);
    +
    +        if (address->is_AddP()) {
    +          assert(address->in(AddPNode::Base) == adr->in(AddPNode::Base), "unexpected address shape");
    +          assert(!address->in(AddPNode::Address)->is_AddP(), "unexpected address shape");
    +          assert(address->in(AddPNode::Address) == adr->in(AddPNode::Base), "unexpected address shape");
    +          address = address->clone();
    +          address->set_req(AddPNode::Base, base);
    +          address->set_req(AddPNode::Address, base);
    +          address = kit->gvn().transform(address);
    +        } else {
    +          assert(address == adr->in(AddPNode::Base), "unexpected address shape");
    +          address = base;
    +        }
    +        adr = adr->clone();
    +        adr->set_req(AddPNode::Base, base);
    +        adr->set_req(AddPNode::Address, address);
    +        adr = kit->gvn().transform(adr);
    +        access.addr().set_node(adr);
    +      }
    +    }
    +  }
    +}
    +
    +Node* ShenandoahBarrierSetC2::store_at_resolved(C2Access& access, C2AccessValue& val) const {
    +  DecoratorSet decorators = access.decorators();
    +
    +  const TypePtr* adr_type = access.addr().type();
    +  Node* adr = access.addr().node();
    +
    +  bool anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
    +  bool on_heap = (decorators & IN_HEAP) != 0;
    +
    +  if (!access.is_oop() || (!on_heap && !anonymous)) {
    +    return BarrierSetC2::store_at_resolved(access, val);
    +  }
    +
    +  if (access.is_parse_access()) {
    +    C2ParseAccess& parse_access = static_cast(access);
    +    GraphKit* kit = parse_access.kit();
    +
    +    uint adr_idx = kit->C->get_alias_index(adr_type);
    +    assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" );
    +    Node* value = val.node();
    +    value = shenandoah_storeval_barrier(kit, value);
    +    val.set_node(value);
    +    shenandoah_write_barrier_pre(kit, true /* do_load */, /*kit->control(),*/ access.base(), adr, adr_idx, val.node(),
    +                                 static_cast(val.type()), NULL /* pre_val */, access.type());
    +  } else {
    +    assert(access.is_opt_access(), "only for optimization passes");
    +    assert(((decorators & C2_TIGHLY_COUPLED_ALLOC) != 0 || !ShenandoahSATBBarrier) && (decorators & C2_ARRAY_COPY) != 0, "unexpected caller of this code");
    +    C2OptAccess& opt_access = static_cast(access);
    +    PhaseGVN& gvn =  opt_access.gvn();
    +    MergeMemNode* mm = opt_access.mem();
    +
    +    if (ShenandoahStoreValReadBarrier) {
    +      RegionNode* region = new RegionNode(3);
    +      const Type* v_t = gvn.type(val.node());
    +      Node* phi = new PhiNode(region, v_t->isa_oopptr() ? v_t->is_oopptr()->cast_to_nonconst() : v_t);
    +      Node* cmp = gvn.transform(new CmpPNode(val.node(), gvn.zerocon(T_OBJECT)));
    +      Node* bol = gvn.transform(new BoolNode(cmp, BoolTest::ne));
    +      IfNode* iff = new IfNode(opt_access.ctl(), bol, PROB_LIKELY_MAG(3), COUNT_UNKNOWN);
    +
    +      gvn.transform(iff);
    +      if (gvn.is_IterGVN()) {
    +        gvn.is_IterGVN()->_worklist.push(iff);
    +      } else {
    +        gvn.record_for_igvn(iff);
    +      }
    +
    +      Node* null_true = gvn.transform(new IfFalseNode(iff));
    +      Node* null_false = gvn.transform(new IfTrueNode(iff));
    +      region->init_req(1, null_true);
    +      region->init_req(2, null_false);
    +      phi->init_req(1, gvn.zerocon(T_OBJECT));
    +      Node* cast = new CastPPNode(val.node(), gvn.type(val.node())->join_speculative(TypePtr::NOTNULL));
    +      cast->set_req(0, null_false);
    +      cast = gvn.transform(cast);
    +      Node* rb = gvn.transform(new ShenandoahReadBarrierNode(null_false, gvn.C->immutable_memory(), cast, false));
    +      phi->init_req(2, rb);
    +      opt_access.set_ctl(gvn.transform(region));
    +      val.set_node(gvn.transform(phi));
    +    }
    +    if (ShenandoahStoreValEnqueueBarrier) {
    +      const TypePtr* adr_type = ShenandoahBarrierNode::brooks_pointer_type(gvn.type(val.node()));
    +      int alias = gvn.C->get_alias_index(adr_type);
    +      Node* wb = new ShenandoahWriteBarrierNode(gvn.C, opt_access.ctl(), mm->memory_at(alias), val.node());
    +      Node* wb_transformed = gvn.transform(wb);
    +      Node* enqueue = gvn.transform(new ShenandoahEnqueueBarrierNode(wb_transformed));
    +      if (wb_transformed == wb) {
    +        Node* proj = gvn.transform(new ShenandoahWBMemProjNode(wb));
    +        mm->set_memory_at(alias, proj);
    +      }
    +      val.set_node(enqueue);
    +    }
    +  }
    +  return BarrierSetC2::store_at_resolved(access, val);
    +}
    +
    +Node* ShenandoahBarrierSetC2::load_at_resolved(C2Access& access, const Type* val_type) const {
    +  DecoratorSet decorators = access.decorators();
    +
    +  Node* adr = access.addr().node();
    +  Node* obj = access.base();
    +
    +  bool mismatched = (decorators & C2_MISMATCHED) != 0;
    +  bool unknown = (decorators & ON_UNKNOWN_OOP_REF) != 0;
    +  bool on_heap = (decorators & IN_HEAP) != 0;
    +  bool on_weak = (decorators & ON_WEAK_OOP_REF) != 0;
    +  bool is_unordered = (decorators & MO_UNORDERED) != 0;
    +  bool need_cpu_mem_bar = !is_unordered || mismatched || !on_heap;
    +
    +  Node* top = Compile::current()->top();
    +
    +  Node* offset = adr->is_AddP() ? adr->in(AddPNode::Offset) : top;
    +  Node* load = BarrierSetC2::load_at_resolved(access, val_type);
    +
    +  // If we are reading the value of the referent field of a Reference
    +  // object (either by using Unsafe directly or through reflection)
    +  // then, if SATB is enabled, we need to record the referent in an
    +  // SATB log buffer using the pre-barrier mechanism.
    +  // Also we need to add memory barrier to prevent commoning reads
    +  // from this field across safepoint since GC can change its value.
    +  bool need_read_barrier = ShenandoahKeepAliveBarrier &&
    +    (on_heap && (on_weak || (unknown && offset != top && obj != top)));
    +
    +  if (!access.is_oop() || !need_read_barrier) {
    +    return load;
    +  }
    +
    +  assert(access.is_parse_access(), "entry not supported at optimization time");
    +  C2ParseAccess& parse_access = static_cast(access);
    +  GraphKit* kit = parse_access.kit();
    +
    +  if (on_weak) {
    +    // Use the pre-barrier to record the value in the referent field
    +    satb_write_barrier_pre(kit, false /* do_load */,
    +                           NULL /* obj */, NULL /* adr */, max_juint /* alias_idx */, NULL /* val */, NULL /* val_type */,
    +                           load /* pre_val */, T_OBJECT);
    +    // Add memory barrier to prevent commoning reads from this field
    +    // across safepoint since GC can change its value.
    +    kit->insert_mem_bar(Op_MemBarCPUOrder);
    +  } else if (unknown) {
    +    // We do not require a mem bar inside pre_barrier if need_mem_bar
    +    // is set: the barriers would be emitted by us.
    +    insert_pre_barrier(kit, obj, offset, load, !need_cpu_mem_bar);
    +  }
    +
    +  return load;
    +}
    +
    +Node* ShenandoahBarrierSetC2::atomic_cmpxchg_val_at_resolved(C2AtomicParseAccess& access, Node* expected_val,
    +                                                   Node* new_val, const Type* value_type) const {
    +  GraphKit* kit = access.kit();
    +  if (access.is_oop()) {
    +    new_val = shenandoah_storeval_barrier(kit, new_val);
    +    shenandoah_write_barrier_pre(kit, false /* do_load */,
    +                                 NULL, NULL, max_juint, NULL, NULL,
    +                                 expected_val /* pre_val */, T_OBJECT);
    +
    +    MemNode::MemOrd mo = access.mem_node_mo();
    +    Node* mem = access.memory();
    +    Node* adr = access.addr().node();
    +    const TypePtr* adr_type = access.addr().type();
    +    Node* load_store = NULL;
    +
    +#ifdef _LP64
    +    if (adr->bottom_type()->is_ptr_to_narrowoop()) {
    +      Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop()));
    +      Node *oldval_enc = kit->gvn().transform(new EncodePNode(expected_val, expected_val->bottom_type()->make_narrowoop()));
    +      load_store = kit->gvn().transform(new ShenandoahCompareAndExchangeNNode(kit->control(), mem, adr, newval_enc, oldval_enc, adr_type, value_type->make_narrowoop(), mo));
    +    } else
    +#endif
    +    {
    +      load_store = kit->gvn().transform(new ShenandoahCompareAndExchangePNode(kit->control(), mem, adr, new_val, expected_val, adr_type, value_type->is_oopptr(), mo));
    +    }
    +
    +    access.set_raw_access(load_store);
    +    pin_atomic_op(access);
    +
    +#ifdef _LP64
    +    if (adr->bottom_type()->is_ptr_to_narrowoop()) {
    +      return kit->gvn().transform(new DecodeNNode(load_store, load_store->get_ptr_type()));
    +    }
    +#endif
    +    return load_store;
    +  }
    +  return BarrierSetC2::atomic_cmpxchg_val_at_resolved(access, expected_val, new_val, value_type);
    +}
    +
    +Node* ShenandoahBarrierSetC2::atomic_cmpxchg_bool_at_resolved(C2AtomicParseAccess& access, Node* expected_val,
    +                                                              Node* new_val, const Type* value_type) const {
    +  GraphKit* kit = access.kit();
    +  if (access.is_oop()) {
    +    new_val = shenandoah_storeval_barrier(kit, new_val);
    +    shenandoah_write_barrier_pre(kit, false /* do_load */,
    +                                 NULL, NULL, max_juint, NULL, NULL,
    +                                 expected_val /* pre_val */, T_OBJECT);
    +    DecoratorSet decorators = access.decorators();
    +    MemNode::MemOrd mo = access.mem_node_mo();
    +    Node* mem = access.memory();
    +    bool is_weak_cas = (decorators & C2_WEAK_CMPXCHG) != 0;
    +    Node* load_store = NULL;
    +    Node* adr = access.addr().node();
    +#ifdef _LP64
    +    if (adr->bottom_type()->is_ptr_to_narrowoop()) {
    +      Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop()));
    +      Node *oldval_enc = kit->gvn().transform(new EncodePNode(expected_val, expected_val->bottom_type()->make_narrowoop()));
    +      if (is_weak_cas) {
    +        load_store = kit->gvn().transform(new ShenandoahWeakCompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo));
    +      } else {
    +        load_store = kit->gvn().transform(new ShenandoahCompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo));
    +      }
    +    } else
    +#endif
    +    {
    +      if (is_weak_cas) {
    +        load_store = kit->gvn().transform(new ShenandoahWeakCompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo));
    +      } else {
    +        load_store = kit->gvn().transform(new ShenandoahCompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo));
    +      }
    +    }
    +    access.set_raw_access(load_store);
    +    pin_atomic_op(access);
    +    return load_store;
    +  }
    +  return BarrierSetC2::atomic_cmpxchg_bool_at_resolved(access, expected_val, new_val, value_type);
    +}
    +
    +Node* ShenandoahBarrierSetC2::atomic_xchg_at_resolved(C2AtomicParseAccess& access, Node* val, const Type* value_type) const {
    +  GraphKit* kit = access.kit();
    +  if (access.is_oop()) {
    +    val = shenandoah_storeval_barrier(kit, val);
    +  }
    +  Node* result = BarrierSetC2::atomic_xchg_at_resolved(access, val, value_type);
    +  if (access.is_oop()) {
    +    shenandoah_write_barrier_pre(kit, false /* do_load */,
    +                                 NULL, NULL, max_juint, NULL, NULL,
    +                                 result /* pre_val */, T_OBJECT);
    +  }
    +  return result;
    +}
    +
    +void ShenandoahBarrierSetC2::clone(GraphKit* kit, Node* src, Node* dst, Node* size, bool is_array) const {
    +  assert(!src->is_AddP(), "unexpected input");
    +  src = shenandoah_read_barrier(kit, src);
    +  BarrierSetC2::clone(kit, src, dst, size, is_array);
    +}
    +
    +Node* ShenandoahBarrierSetC2::resolve(GraphKit* kit, Node* n, DecoratorSet decorators) const {
    +  bool is_write = decorators & ACCESS_WRITE;
    +  if (is_write) {
    +    return shenandoah_write_barrier(kit, n);
    +  } else {
    +  return shenandoah_read_barrier(kit, n);
    +  }
    +}
    +
    +Node* ShenandoahBarrierSetC2::obj_allocate(PhaseMacroExpand* macro, Node* ctrl, Node* mem, Node* toobig_false, Node* size_in_bytes,
    +                                           Node*& i_o, Node*& needgc_ctrl,
    +                                           Node*& fast_oop_ctrl, Node*& fast_oop_rawmem,
    +                                           intx prefetch_lines) const {
    +  PhaseIterGVN& igvn = macro->igvn();
    +
    +  // Allocate several words more for the Shenandoah brooks pointer.
    +  size_in_bytes = new AddXNode(size_in_bytes, igvn.MakeConX(ShenandoahBrooksPointer::byte_size()));
    +  macro->transform_later(size_in_bytes);
    +
    +  Node* fast_oop = BarrierSetC2::obj_allocate(macro, ctrl, mem, toobig_false, size_in_bytes,
    +                                              i_o, needgc_ctrl, fast_oop_ctrl, fast_oop_rawmem,
    +                                              prefetch_lines);
    +
    +  // Bump up object for Shenandoah brooks pointer.
    +  fast_oop = new AddPNode(macro->top(), fast_oop, igvn.MakeConX(ShenandoahBrooksPointer::byte_size()));
    +  macro->transform_later(fast_oop);
    +
    +  // Initialize Shenandoah brooks pointer to point to the object itself.
    +  fast_oop_rawmem = macro->make_store(fast_oop_ctrl, fast_oop_rawmem, fast_oop, ShenandoahBrooksPointer::byte_offset(), fast_oop, T_OBJECT);
    +
    +  return fast_oop;
    +}
    +
    +// Support for GC barriers emitted during parsing
    +bool ShenandoahBarrierSetC2::is_gc_barrier_node(Node* node) const {
    +  if (node->Opcode() != Op_CallLeaf && node->Opcode() != Op_CallLeafNoFP) {
    +    return false;
    +  }
    +  CallLeafNode *call = node->as_CallLeaf();
    +  if (call->_name == NULL) {
    +    return false;
    +  }
    +
    +  return strcmp(call->_name, "shenandoah_clone_barrier") == 0 ||
    +         strcmp(call->_name, "shenandoah_cas_obj") == 0 ||
    +         strcmp(call->_name, "shenandoah_wb_pre") == 0;
    +}
    +
    +Node* ShenandoahBarrierSetC2::step_over_gc_barrier(Node* c) const {
    +  return ShenandoahBarrierNode::skip_through_barrier(c);
    +}
    +
    +bool ShenandoahBarrierSetC2::expand_barriers(Compile* C, PhaseIterGVN& igvn) const {
    +  return !ShenandoahWriteBarrierNode::expand(C, igvn);
    +}
    +
    +bool ShenandoahBarrierSetC2::optimize_loops(PhaseIdealLoop* phase, LoopOptsMode mode, VectorSet& visited, Node_Stack& nstack, Node_List& worklist) const {
    +  if (mode == LoopOptsShenandoahExpand) {
    +    assert(UseShenandoahGC, "only for shenandoah");
    +    ShenandoahWriteBarrierNode::pin_and_expand(phase);
    +    return true;
    +  } else if (mode == LoopOptsShenandoahPostExpand) {
    +    assert(UseShenandoahGC, "only for shenandoah");
    +    visited.Clear();
    +    ShenandoahWriteBarrierNode::optimize_after_expansion(visited, nstack, worklist, phase);
    +    return true;
    +  }
    +  GrowableArray memory_graph_fixers;
    +  ShenandoahWriteBarrierNode::optimize_before_expansion(phase, memory_graph_fixers, false);
    +  return false;
    +}
    +
    +bool ShenandoahBarrierSetC2::array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const {
    +  bool is_oop = type == T_OBJECT || type == T_ARRAY;
    +  if (!is_oop) {
    +    return false;
    +  }
    +
    +  if (tightly_coupled_alloc) {
    +    if (phase == Optimization) {
    +      return false;
    +    }
    +    return !is_clone;
    +  }
    +  if (phase == Optimization) {
    +    return !ShenandoahStoreValEnqueueBarrier;
    +  }
    +  return true;
    +}
    +
    +bool ShenandoahBarrierSetC2::clone_needs_postbarrier(ArrayCopyNode *ac, PhaseIterGVN& igvn) {
    +  Node* src = ac->in(ArrayCopyNode::Src);
    +  const TypeOopPtr* src_type = igvn.type(src)->is_oopptr();
    +  if (src_type->isa_instptr() != NULL) {
    +    ciInstanceKlass* ik = src_type->klass()->as_instance_klass();
    +    if ((src_type->klass_is_exact() || (!ik->is_interface() && !ik->has_subklass())) && !ik->has_injected_fields()) {
    +      if (ik->has_object_fields()) {
    +        return true;
    +      } else {
    +        if (!src_type->klass_is_exact()) {
    +          igvn.C->dependencies()->assert_leaf_type(ik);
    +        }
    +      }
    +    } else {
    +      return true;
    +    }
    +  } else if (src_type->isa_aryptr()) {
    +    BasicType src_elem  = src_type->klass()->as_array_klass()->element_type()->basic_type();
    +    if (src_elem == T_OBJECT || src_elem == T_ARRAY) {
    +      return true;
    +    }
    +  } else {
    +    return true;
    +  }
    +  return false;
    +}
    +
    +void ShenandoahBarrierSetC2::clone_barrier_at_expansion(ArrayCopyNode* ac, Node* call, PhaseIterGVN& igvn) const {
    +  assert(ac->is_clonebasic(), "no other kind of arraycopy here");
    +
    +  if (!clone_needs_postbarrier(ac, igvn)) {
    +    BarrierSetC2::clone_barrier_at_expansion(ac, call, igvn);
    +    return;
    +  }
    +
    +  const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM;
    +  Node* c = new ProjNode(call,TypeFunc::Control);
    +  c = igvn.transform(c);
    +  Node* m = new ProjNode(call, TypeFunc::Memory);
    +  c = igvn.transform(m);
    +
    +  Node* dest = ac->in(ArrayCopyNode::Dest);
    +  assert(dest->is_AddP(), "bad input");
    +  Node* barrier_call = new CallLeafNode(ShenandoahBarrierSetC2::shenandoah_clone_barrier_Type(),
    +                                        CAST_FROM_FN_PTR(address, ShenandoahRuntime::shenandoah_clone_barrier),
    +                                        "shenandoah_clone_barrier", raw_adr_type);
    +  barrier_call->init_req(TypeFunc::Control, c);
    +  barrier_call->init_req(TypeFunc::I_O    , igvn.C->top());
    +  barrier_call->init_req(TypeFunc::Memory , m);
    +  barrier_call->init_req(TypeFunc::ReturnAdr, igvn.C->top());
    +  barrier_call->init_req(TypeFunc::FramePtr, igvn.C->top());
    +  barrier_call->init_req(TypeFunc::Parms+0, dest->in(AddPNode::Base));
    +
    +  barrier_call = igvn.transform(barrier_call);
    +  c = new ProjNode(barrier_call,TypeFunc::Control);
    +  c = igvn.transform(c);
    +  m = new ProjNode(barrier_call, TypeFunc::Memory);
    +  m = igvn.transform(m);
    +
    +  Node* out_c = ac->proj_out(TypeFunc::Control);
    +  Node* out_m = ac->proj_out(TypeFunc::Memory);
    +  igvn.replace_node(out_c, c);
    +  igvn.replace_node(out_m, m);
    +}
    +
    +
    +// Support for macro expanded GC barriers
    +void ShenandoahBarrierSetC2::register_potential_barrier_node(Node* node) const {
    +  if (node->Opcode() == Op_ShenandoahWriteBarrier) {
    +    state()->add_shenandoah_barrier((ShenandoahWriteBarrierNode*) node);
    +  }
    +}
    +
    +void ShenandoahBarrierSetC2::unregister_potential_barrier_node(Node* node) const {
    +  if (node->Opcode() == Op_ShenandoahWriteBarrier) {
    +    state()->remove_shenandoah_barrier((ShenandoahWriteBarrierNode*) node);
    +  }
    +}
    +
    +void ShenandoahBarrierSetC2::eliminate_gc_barrier(PhaseMacroExpand* macro, Node* n) const {
    +  if (is_shenandoah_wb_pre_call(n)) {
    +    shenandoah_eliminate_wb_pre(n, ¯o->igvn());
    +  }
    +}
    +
    +void ShenandoahBarrierSetC2::shenandoah_eliminate_wb_pre(Node* call, PhaseIterGVN* igvn) const {
    +  assert(UseShenandoahGC && is_shenandoah_wb_pre_call(call), "");
    +  Node* c = call->as_Call()->proj_out(TypeFunc::Control);
    +  c = c->unique_ctrl_out();
    +  assert(c->is_Region() && c->req() == 3, "where's the pre barrier control flow?");
    +  c = c->unique_ctrl_out();
    +  assert(c->is_Region() && c->req() == 3, "where's the pre barrier control flow?");
    +  Node* iff = c->in(1)->is_IfProj() ? c->in(1)->in(0) : c->in(2)->in(0);
    +  assert(iff->is_If(), "expect test");
    +  if (!is_shenandoah_marking_if(igvn, iff)) {
    +    c = c->unique_ctrl_out();
    +    assert(c->is_Region() && c->req() == 3, "where's the pre barrier control flow?");
    +    iff = c->in(1)->is_IfProj() ? c->in(1)->in(0) : c->in(2)->in(0);
    +    assert(is_shenandoah_marking_if(igvn, iff), "expect marking test");
    +  }
    +  Node* cmpx = iff->in(1)->in(1);
    +  igvn->replace_node(cmpx, igvn->makecon(TypeInt::CC_EQ));
    +  igvn->rehash_node_delayed(call);
    +  call->del_req(call->req()-1);
    +}
    +
    +void ShenandoahBarrierSetC2::enqueue_useful_gc_barrier(PhaseIterGVN* igvn, Node* node) const {
    +  if (node->Opcode() == Op_AddP && ShenandoahBarrierSetC2::has_only_shenandoah_wb_pre_uses(node)) {
    +    igvn->add_users_to_worklist(node);
    +  }
    +}
    +
    +void ShenandoahBarrierSetC2::eliminate_useless_gc_barriers(Unique_Node_List &useful, Compile* C) const {
    +  for (uint i = 0; i < useful.size(); i++) {
    +    Node* n = useful.at(i);
    +    if (n->Opcode() == Op_AddP && ShenandoahBarrierSetC2::has_only_shenandoah_wb_pre_uses(n)) {
    +      for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
    +        C->record_for_igvn(n->fast_out(i));
    +      }
    +    }
    +  }
    +  for (int i = state()->shenandoah_barriers_count()-1; i >= 0; i--) {
    +    ShenandoahWriteBarrierNode* n = state()->shenandoah_barrier(i);
    +    if (!useful.member(n)) {
    +      state()->remove_shenandoah_barrier(n);
    +    }
    +  }
    +
    +}
    +
    +bool ShenandoahBarrierSetC2::has_special_unique_user(const Node* node) const {
    +  assert(node->outcnt() == 1, "match only for unique out");
    +  Node* n = node->unique_out();
    +  return node->Opcode() == Op_ShenandoahWriteBarrier && n->Opcode() == Op_ShenandoahWBMemProj;
    +}
    +
    +void ShenandoahBarrierSetC2::add_users_to_worklist(Unique_Node_List* worklist) const {}
    +
    +void* ShenandoahBarrierSetC2::create_barrier_state(Arena* comp_arena) const {
    +  return new(comp_arena) ShenandoahBarrierSetC2State(comp_arena);
    +}
    +
    +ShenandoahBarrierSetC2State* ShenandoahBarrierSetC2::state() const {
    +  return reinterpret_cast(Compile::current()->barrier_set_state());
    +}
    +
    +// If the BarrierSetC2 state has kept macro nodes in its compilation unit state to be
    +// expanded later, then now is the time to do so.
    +bool ShenandoahBarrierSetC2::expand_macro_nodes(PhaseMacroExpand* macro) const { return false; }
    +
    +#ifdef ASSERT
    +void ShenandoahBarrierSetC2::verify_gc_barriers(Compile* compile, CompilePhase phase) const {
    +  if (ShenandoahVerifyOptoBarriers && phase == BarrierSetC2::BeforeExpand) {
    +    ShenandoahBarrierNode::verify(Compile::current()->root());
    +  } else if (phase == BarrierSetC2::BeforeCodeGen) {
    +    // Verify G1 pre-barriers
    +    const int marking_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_active_offset());
    +
    +    ResourceArea *area = Thread::current()->resource_area();
    +    Unique_Node_List visited(area);
    +    Node_List worklist(area);
    +    // We're going to walk control flow backwards starting from the Root
    +    worklist.push(compile->root());
    +    while (worklist.size() > 0) {
    +      Node *x = worklist.pop();
    +      if (x == NULL || x == compile->top()) continue;
    +      if (visited.member(x)) {
    +        continue;
    +      } else {
    +        visited.push(x);
    +      }
    +
    +      if (x->is_Region()) {
    +        for (uint i = 1; i < x->req(); i++) {
    +          worklist.push(x->in(i));
    +        }
    +      } else {
    +        worklist.push(x->in(0));
    +        // We are looking for the pattern:
    +        //                            /->ThreadLocal
    +        // If->Bool->CmpI->LoadB->AddP->ConL(marking_offset)
    +        //              \->ConI(0)
    +        // We want to verify that the If and the LoadB have the same control
    +        // See GraphKit::g1_write_barrier_pre()
    +        if (x->is_If()) {
    +          IfNode *iff = x->as_If();
    +          if (iff->in(1)->is_Bool() && iff->in(1)->in(1)->is_Cmp()) {
    +            CmpNode *cmp = iff->in(1)->in(1)->as_Cmp();
    +            if (cmp->Opcode() == Op_CmpI && cmp->in(2)->is_Con() && cmp->in(2)->bottom_type()->is_int()->get_con() == 0
    +                && cmp->in(1)->is_Load()) {
    +              LoadNode *load = cmp->in(1)->as_Load();
    +              if (load->Opcode() == Op_LoadB && load->in(2)->is_AddP() && load->in(2)->in(2)->Opcode() == Op_ThreadLocal
    +                  && load->in(2)->in(3)->is_Con()
    +                  && load->in(2)->in(3)->bottom_type()->is_intptr_t()->get_con() == marking_offset) {
    +
    +                Node *if_ctrl = iff->in(0);
    +                Node *load_ctrl = load->in(0);
    +
    +                if (if_ctrl != load_ctrl) {
    +                  // Skip possible CProj->NeverBranch in infinite loops
    +                  if ((if_ctrl->is_Proj() && if_ctrl->Opcode() == Op_CProj)
    +                      && (if_ctrl->in(0)->is_MultiBranch() && if_ctrl->in(0)->Opcode() == Op_NeverBranch)) {
    +                    if_ctrl = if_ctrl->in(0)->in(0);
    +                  }
    +                }
    +                assert(load_ctrl != NULL && if_ctrl == load_ctrl, "controls must match");
    +              }
    +            }
    +          }
    +        }
    +      }
    +    }
    +  }
    +}
    +#endif
    +
    +Node* ShenandoahBarrierSetC2::ideal_node(PhaseGVN* phase, Node* n, bool can_reshape) const {
    +  if (is_shenandoah_wb_pre_call(n)) {
    +    uint cnt = ShenandoahBarrierSetC2::write_ref_field_pre_entry_Type()->domain()->cnt();
    +    if (n->req() > cnt) {
    +      Node* addp = n->in(cnt);
    +      if (has_only_shenandoah_wb_pre_uses(addp)) {
    +        n->del_req(cnt);
    +        if (can_reshape) {
    +          phase->is_IterGVN()->_worklist.push(addp);
    +        }
    +        return n;
    +      }
    +    }
    +  }
    +  if (n->Opcode() == Op_CmpP) {
    +    Node* in1 = n->in(1);
    +    Node* in2 = n->in(2);
    +    if (in1->bottom_type() == TypePtr::NULL_PTR) {
    +      in2 = step_over_gc_barrier(in2);
    +    }
    +    if (in2->bottom_type() == TypePtr::NULL_PTR) {
    +      in1 = step_over_gc_barrier(in1);
    +    }
    +    PhaseIterGVN* igvn = phase->is_IterGVN();
    +    if (in1 != n->in(1)) {
    +      if (igvn != NULL) {
    +        n->set_req_X(1, in1, igvn);
    +      } else {
    +        n->set_req(1, in1);
    +      }
    +      assert(in2 == n->in(2), "only one change");
    +      return n;
    +    }
    +    if (in2 != n->in(2)) {
    +      if (igvn != NULL) {
    +        n->set_req_X(2, in2, igvn);
    +      } else {
    +        n->set_req(2, in2);
    +      }
    +      return n;
    +    }
    +  } else if (can_reshape &&
    +             n->Opcode() == Op_If &&
    +             ShenandoahWriteBarrierNode::is_heap_stable_test(n) &&
    +             n->in(0) != NULL) {
    +    Node* dom = n->in(0);
    +    Node* prev_dom = n;
    +    int op = n->Opcode();
    +    int dist = 16;
    +    // Search up the dominator tree for another heap stable test
    +    while (dom->Opcode() != op    ||  // Not same opcode?
    +           !ShenandoahWriteBarrierNode::is_heap_stable_test(dom) ||  // Not same input 1?
    +           prev_dom->in(0) != dom) {  // One path of test does not dominate?
    +      if (dist < 0) return NULL;
    +
    +      dist--;
    +      prev_dom = dom;
    +      dom = IfNode::up_one_dom(dom);
    +      if (!dom) return NULL;
    +    }
    +
    +    // Check that we did not follow a loop back to ourselves
    +    if (n == dom) {
    +      return NULL;
    +    }
    +
    +    return n->as_If()->dominated_by(prev_dom, phase->is_IterGVN());
    +  }
    +
    +  return NULL;
    +}
    +
    +Node* ShenandoahBarrierSetC2::identity_node(PhaseGVN* phase, Node* n) const {
    +  if (n->is_Load()) {
    +    Node *mem = n->in(MemNode::Memory);
    +    Node *value = n->as_Load()->can_see_stored_value(mem, phase);
    +    if (value) {
    +      PhaseIterGVN *igvn = phase->is_IterGVN();
    +      if (igvn != NULL &&
    +          value->is_Phi() &&
    +          value->req() > 2 &&
    +          value->in(1) != NULL &&
    +          value->in(1)->is_ShenandoahBarrier()) {
    +        if (igvn->_worklist.member(value) ||
    +            igvn->_worklist.member(value->in(0)) ||
    +            (value->in(0)->in(1) != NULL &&
    +             value->in(0)->in(1)->is_IfProj() &&
    +             (igvn->_worklist.member(value->in(0)->in(1)) ||
    +              (value->in(0)->in(1)->in(0) != NULL &&
    +               igvn->_worklist.member(value->in(0)->in(1)->in(0)))))) {
    +          igvn->_worklist.push(n);
    +          return n;
    +        }
    +      }
    +      // (This works even when value is a Con, but LoadNode::Value
    +      // usually runs first, producing the singleton type of the Con.)
    +      Node *value_no_barrier = step_over_gc_barrier(value->Opcode() == Op_EncodeP ? value->in(1) : value);
    +      if (value->Opcode() == Op_EncodeP) {
    +        if (value_no_barrier != value->in(1)) {
    +          Node *encode = value->clone();
    +          encode->set_req(1, value_no_barrier);
    +          encode = phase->transform(encode);
    +          return encode;
    +        }
    +      } else {
    +        return value_no_barrier;
    +      }
    +    }
    +  }
    +  return n;
    +}
    +
    +bool ShenandoahBarrierSetC2::has_only_shenandoah_wb_pre_uses(Node* n) {
    +  for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
    +    Node* u = n->fast_out(i);
    +    if (!is_shenandoah_wb_pre_call(u)) {
    +      return false;
    +    }
    +  }
    +  return n->outcnt() > 0;
    +}
    +
    +bool ShenandoahBarrierSetC2::flatten_gc_alias_type(const TypePtr*& adr_type) const {
    +  int offset = adr_type->offset();
    +  if (offset == ShenandoahBrooksPointer::byte_offset()) {
    +    if (adr_type->isa_aryptr()) {
    +      adr_type = TypeAryPtr::make(adr_type->ptr(), adr_type->isa_aryptr()->ary(), adr_type->isa_aryptr()->klass(), false, offset);
    +    } else if (adr_type->isa_instptr()) {
    +      adr_type = TypeInstPtr::make(adr_type->ptr(), ciEnv::current()->Object_klass(), false, NULL, offset);
    +    }
    +    return true;
    +  } else {
    +    return false;
    +  }
    +}
    +
    +bool ShenandoahBarrierSetC2::final_graph_reshaping(Compile* compile, Node* n, uint opcode) const {
    +  switch (opcode) {
    +    case Op_CallLeaf:
    +    case Op_CallLeafNoFP: {
    +      assert (n->is_Call(), "");
    +      CallNode *call = n->as_Call();
    +      if (ShenandoahBarrierSetC2::is_shenandoah_wb_pre_call(call)) {
    +        uint cnt = ShenandoahBarrierSetC2::write_ref_field_pre_entry_Type()->domain()->cnt();
    +        if (call->req() > cnt) {
    +          assert(call->req() == cnt + 1, "only one extra input");
    +          Node *addp = call->in(cnt);
    +          assert(!ShenandoahBarrierSetC2::has_only_shenandoah_wb_pre_uses(addp), "useless address computation?");
    +          call->del_req(cnt);
    +        }
    +      }
    +      return false;
    +    }
    +    case Op_ShenandoahCompareAndSwapP:
    +    case Op_ShenandoahCompareAndSwapN:
    +    case Op_ShenandoahWeakCompareAndSwapN:
    +    case Op_ShenandoahWeakCompareAndSwapP:
    +    case Op_ShenandoahCompareAndExchangeP:
    +    case Op_ShenandoahCompareAndExchangeN:
    +#ifdef ASSERT
    +      if( VerifyOptoOopOffsets ) {
    +        MemNode* mem  = n->as_Mem();
    +        // Check to see if address types have grounded out somehow.
    +        const TypeInstPtr *tp = mem->in(MemNode::Address)->bottom_type()->isa_instptr();
    +        ciInstanceKlass *k = tp->klass()->as_instance_klass();
    +        bool oop_offset_is_sane = k->contains_field_offset(tp->offset());
    +        assert( !tp || oop_offset_is_sane, "" );
    +      }
    +#endif
    +      return true;
    +    case Op_ShenandoahReadBarrier:
    +      return true;
    +    case Op_ShenandoahWriteBarrier:
    +      assert(false, "should have been expanded already");
    +      return true;
    +    default:
    +      return false;
    +  }
    +}
    +
    +#ifdef ASSERT
    +bool ShenandoahBarrierSetC2::verify_gc_alias_type(const TypePtr* adr_type, int offset) const {
    +  if (offset == ShenandoahBrooksPointer::byte_offset() &&
    +      (adr_type->base() == Type::AryPtr || adr_type->base() == Type::OopPtr)) {
    +    return true;
    +  } else {
    +    return false;
    +  }
    +}
    +#endif
    +
    +bool ShenandoahBarrierSetC2::escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const {
    +  switch (opcode) {
    +    case Op_ShenandoahCompareAndExchangeP:
    +    case Op_ShenandoahCompareAndExchangeN:
    +      conn_graph->add_objload_to_connection_graph(n, delayed_worklist);
    +      // fallthrough
    +    case Op_ShenandoahWeakCompareAndSwapP:
    +    case Op_ShenandoahWeakCompareAndSwapN:
    +    case Op_ShenandoahCompareAndSwapP:
    +    case Op_ShenandoahCompareAndSwapN:
    +      conn_graph->add_to_congraph_unsafe_access(n, opcode, delayed_worklist);
    +      return true;
    +    case Op_StoreP: {
    +      Node* adr = n->in(MemNode::Address);
    +      const Type* adr_type = gvn->type(adr);
    +      // Pointer stores in G1 barriers looks like unsafe access.
    +      // Ignore such stores to be able scalar replace non-escaping
    +      // allocations.
    +      if (adr_type->isa_rawptr() && adr->is_AddP()) {
    +        Node* base = conn_graph->get_addp_base(adr);
    +        if (base->Opcode() == Op_LoadP &&
    +          base->in(MemNode::Address)->is_AddP()) {
    +          adr = base->in(MemNode::Address);
    +          Node* tls = conn_graph->get_addp_base(adr);
    +          if (tls->Opcode() == Op_ThreadLocal) {
    +             int offs = (int) gvn->find_intptr_t_con(adr->in(AddPNode::Offset), Type::OffsetBot);
    +             const int buf_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset());
    +             if (offs == buf_offset) {
    +               return true; // Pre barrier previous oop value store.
    +             }
    +          }
    +        }
    +      }
    +      return false;
    +    }
    +    case Op_ShenandoahReadBarrier:
    +    case Op_ShenandoahWriteBarrier:
    +      // Barriers 'pass through' its arguments. I.e. what goes in, comes out.
    +      // It doesn't escape.
    +      conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(ShenandoahBarrierNode::ValueIn), delayed_worklist);
    +      break;
    +    case Op_ShenandoahEnqueueBarrier:
    +      conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(1), delayed_worklist);
    +      break;
    +    default:
    +      // Nothing
    +      break;
    +  }
    +  return false;
    +}
    +
    +bool ShenandoahBarrierSetC2::escape_add_final_edges(ConnectionGraph* conn_graph, PhaseGVN* gvn, Node* n, uint opcode) const {
    +  switch (opcode) {
    +    case Op_ShenandoahCompareAndExchangeP:
    +    case Op_ShenandoahCompareAndExchangeN: {
    +      Node *adr = n->in(MemNode::Address);
    +      conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, adr, NULL);
    +      // fallthrough
    +    }
    +    case Op_ShenandoahCompareAndSwapP:
    +    case Op_ShenandoahCompareAndSwapN:
    +    case Op_ShenandoahWeakCompareAndSwapP:
    +    case Op_ShenandoahWeakCompareAndSwapN:
    +      return conn_graph->add_final_edges_unsafe_access(n, opcode);
    +    case Op_ShenandoahReadBarrier:
    +    case Op_ShenandoahWriteBarrier:
    +      // Barriers 'pass through' its arguments. I.e. what goes in, comes out.
    +      // It doesn't escape.
    +      conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(ShenandoahBarrierNode::ValueIn), NULL);
    +      return true;
    +    case Op_ShenandoahEnqueueBarrier:
    +      conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(1), NULL);
    +      return true;
    +    default:
    +      // Nothing
    +      break;
    +  }
    +  return false;
    +}
    +
    +bool ShenandoahBarrierSetC2::escape_has_out_with_unsafe_object(Node* n) const {
    +  return n->has_out_with(Op_ShenandoahCompareAndExchangeP) || n->has_out_with(Op_ShenandoahCompareAndExchangeN) ||
    +         n->has_out_with(Op_ShenandoahCompareAndSwapP, Op_ShenandoahCompareAndSwapN, Op_ShenandoahWeakCompareAndSwapP, Op_ShenandoahWeakCompareAndSwapN);
    +
    +}
    +
    +bool ShenandoahBarrierSetC2::escape_is_barrier_node(Node* n) const {
    +  return n->is_ShenandoahBarrier();
    +}
    +
    +bool ShenandoahBarrierSetC2::matcher_find_shared_visit(Matcher* matcher, Matcher::MStack& mstack, Node* n, uint opcode, bool& mem_op, int& mem_addr_idx) const {
    +  switch (opcode) {
    +    case Op_ShenandoahReadBarrier:
    +      if (n->in(ShenandoahBarrierNode::ValueIn)->is_DecodeNarrowPtr()) {
    +        matcher->set_shared(n->in(ShenandoahBarrierNode::ValueIn)->in(1));
    +      }
    +      matcher->set_shared(n);
    +      return true;
    +    default:
    +      break;
    +  }
    +  return false;
    +}
    +
    +bool ShenandoahBarrierSetC2::matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const {
    +  switch (opcode) {
    +    case Op_ShenandoahCompareAndExchangeP:
    +    case Op_ShenandoahCompareAndExchangeN:
    +    case Op_ShenandoahWeakCompareAndSwapP:
    +    case Op_ShenandoahWeakCompareAndSwapN:
    +    case Op_ShenandoahCompareAndSwapP:
    +    case Op_ShenandoahCompareAndSwapN: {   // Convert trinary to binary-tree
    +      Node* newval = n->in(MemNode::ValueIn);
    +      Node* oldval = n->in(LoadStoreConditionalNode::ExpectedIn);
    +      Node* pair = new BinaryNode(oldval, newval);
    +      n->set_req(MemNode::ValueIn,pair);
    +      n->del_req(LoadStoreConditionalNode::ExpectedIn);
    +      return true;
    +    }
    +    default:
    +      break;
    +  }
    +  return false;
    +}
    +
    +bool ShenandoahBarrierSetC2::matcher_is_store_load_barrier(Node* x, uint xop) const {
    +  return xop == Op_ShenandoahCompareAndExchangeP ||
    +         xop == Op_ShenandoahCompareAndExchangeN ||
    +         xop == Op_ShenandoahWeakCompareAndSwapP ||
    +         xop == Op_ShenandoahWeakCompareAndSwapN ||
    +         xop == Op_ShenandoahCompareAndSwapN ||
    +         xop == Op_ShenandoahCompareAndSwapP;
    +}
    +
    +void ShenandoahBarrierSetC2::igvn_add_users_to_worklist(PhaseIterGVN* igvn, Node* use) const {
    +  if (use->is_ShenandoahBarrier()) {
    +    for (DUIterator_Fast i2max, i2 = use->fast_outs(i2max); i2 < i2max; i2++) {
    +      Node* u = use->fast_out(i2);
    +      Node* cmp = use->find_out_with(Op_CmpP);
    +      if (u->Opcode() == Op_CmpP) {
    +        igvn->_worklist.push(cmp);
    +      }
    +    }
    +  }
    +}
    +
    +void ShenandoahBarrierSetC2::ccp_analyze(PhaseCCP* ccp, Unique_Node_List& worklist, Node* use) const {
    +  if (use->is_ShenandoahBarrier()) {
    +    for (DUIterator_Fast i2max, i2 = use->fast_outs(i2max); i2 < i2max; i2++) {
    +      Node* p = use->fast_out(i2);
    +      if (p->Opcode() == Op_AddP) {
    +        for (DUIterator_Fast i3max, i3 = p->fast_outs(i3max); i3 < i3max; i3++) {
    +          Node* q = p->fast_out(i3);
    +          if (q->is_Load()) {
    +            if(q->bottom_type() != ccp->type(q)) {
    +              worklist.push(q);
    +            }
    +          }
    +        }
    +      }
    +    }
    +  }
    +}
    +
    +Node* ShenandoahBarrierSetC2::split_if_pre(PhaseIdealLoop* phase, Node* n) const {
    +  if (n->Opcode() == Op_ShenandoahReadBarrier) {
    +    ((ShenandoahReadBarrierNode*)n)->try_move(phase);
    +  } else if (n->Opcode() == Op_ShenandoahWriteBarrier) {
    +    return ((ShenandoahWriteBarrierNode*)n)->try_split_thru_phi(phase);
    +  }
    +
    +  return NULL;
    +}
    +
    +bool ShenandoahBarrierSetC2::build_loop_late_post(PhaseIdealLoop* phase, Node* n) const {
    +  return ShenandoahBarrierNode::build_loop_late_post(phase, n);
    +}
    +
    +bool ShenandoahBarrierSetC2::sink_node(PhaseIdealLoop* phase, Node* n, Node* x, Node* x_ctrl, Node* n_ctrl) const {
    +  if (n->is_ShenandoahBarrier()) {
    +    return x->as_ShenandoahBarrier()->sink_node(phase, x_ctrl, n_ctrl);
    +  }
    +  if (n->is_MergeMem()) {
    +    // PhaseIdealLoop::split_if_with_blocks_post() would:
    +    // _igvn._worklist.yank(x);
    +    // which sometimes causes chains of MergeMem which some of
    +    // shenandoah specific code doesn't support
    +    phase->register_new_node(x, x_ctrl);
    +    return true;
    +  }
    +  return false;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.hpp b/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.hpp
    new file mode 100644
    index 00000000000..7631bc38b23
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.hpp
    @@ -0,0 +1,174 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_C2_SHENANDOAHBARRIERSETC2_HPP
    +#define SHARE_VM_GC_SHENANDOAH_C2_SHENANDOAHBARRIERSETC2_HPP
    +
    +#include "gc/shared/c2/barrierSetC2.hpp"
    +#include "gc/shenandoah/c2/shenandoahSupport.hpp"
    +#include "utilities/growableArray.hpp"
    +
    +class ShenandoahBarrierSetC2State : public ResourceObj {
    +private:
    +  GrowableArray* _shenandoah_barriers;
    +
    +public:
    +  ShenandoahBarrierSetC2State(Arena* comp_arena);
    +  int shenandoah_barriers_count() const;
    +  ShenandoahWriteBarrierNode* shenandoah_barrier(int idx) const;
    +  void add_shenandoah_barrier(ShenandoahWriteBarrierNode * n);
    +  void remove_shenandoah_barrier(ShenandoahWriteBarrierNode * n);
    +};
    +
    +class ShenandoahBarrierSetC2 : public BarrierSetC2 {
    +private:
    +  void shenandoah_eliminate_wb_pre(Node* call, PhaseIterGVN* igvn) const;
    +
    +  bool satb_can_remove_pre_barrier(GraphKit* kit, PhaseTransform* phase, Node* adr,
    +                                   BasicType bt, uint adr_idx) const;
    +  void satb_write_barrier_pre(GraphKit* kit, bool do_load,
    +                              Node* obj,
    +                              Node* adr,
    +                              uint alias_idx,
    +                              Node* val,
    +                              const TypeOopPtr* val_type,
    +                              Node* pre_val,
    +                              BasicType bt) const;
    +
    +  void shenandoah_write_barrier_pre(GraphKit* kit,
    +                                    bool do_load,
    +                                    Node* obj,
    +                                    Node* adr,
    +                                    uint alias_idx,
    +                                    Node* val,
    +                                    const TypeOopPtr* val_type,
    +                                    Node* pre_val,
    +                                    BasicType bt) const;
    +
    +  Node* shenandoah_enqueue_barrier(GraphKit* kit, Node* val) const;
    +  Node* shenandoah_read_barrier(GraphKit* kit, Node* obj) const;
    +  Node* shenandoah_storeval_barrier(GraphKit* kit, Node* obj) const;
    +  Node* shenandoah_write_barrier(GraphKit* kit, Node* obj) const;
    +  Node* shenandoah_read_barrier_impl(GraphKit* kit, Node* obj, bool use_ctrl, bool use_mem, bool allow_fromspace) const;
    +  Node* shenandoah_write_barrier_impl(GraphKit* kit, Node* obj) const;
    +  Node* shenandoah_write_barrier_helper(GraphKit* kit, Node* obj, const TypePtr* adr_type) const;
    +
    +  void insert_pre_barrier(GraphKit* kit, Node* base_oop, Node* offset,
    +                          Node* pre_val, bool need_mem_bar) const;
    +
    +  static bool clone_needs_postbarrier(ArrayCopyNode *ac, PhaseIterGVN& igvn);
    +
    +protected:
    +  virtual void resolve_address(C2Access& access) const;
    +  virtual Node* load_at_resolved(C2Access& access, const Type* val_type) const;
    +  virtual Node* store_at_resolved(C2Access& access, C2AccessValue& val) const;
    +  virtual Node* atomic_cmpxchg_val_at_resolved(C2AtomicParseAccess& access, Node* expected_val,
    +                                               Node* new_val, const Type* val_type) const;
    +  virtual Node* atomic_cmpxchg_bool_at_resolved(C2AtomicParseAccess& access, Node* expected_val,
    +                                                Node* new_val, const Type* value_type) const;
    +  virtual Node* atomic_xchg_at_resolved(C2AtomicParseAccess& access, Node* new_val, const Type* val_type) const;
    +
    +public:
    +  static ShenandoahBarrierSetC2* bsc2();
    +
    +  static bool is_shenandoah_wb_pre_call(Node* call);
    +  static bool is_shenandoah_wb_call(Node* call);
    +  static bool is_shenandoah_marking_if(PhaseTransform *phase, Node* n);
    +  static bool is_shenandoah_state_load(Node* n);
    +  static bool has_only_shenandoah_wb_pre_uses(Node* n);
    +
    +  ShenandoahBarrierSetC2State* state() const;
    +
    +  static const TypeFunc* write_ref_field_pre_entry_Type();
    +  static const TypeFunc* shenandoah_clone_barrier_Type();
    +  static const TypeFunc* shenandoah_write_barrier_Type();
    +
    +  // This is the entry-point for the backend to perform accesses through the Access API.
    +  virtual void clone(GraphKit* kit, Node* src, Node* dst, Node* size, bool is_array) const;
    +
    +  virtual Node* resolve(GraphKit* kit, Node* n, DecoratorSet decorators) const;
    +
    +  virtual Node* obj_allocate(PhaseMacroExpand* macro, Node* ctrl, Node* mem, Node* toobig_false, Node* size_in_bytes,
    +                             Node*& i_o, Node*& needgc_ctrl,
    +                             Node*& fast_oop_ctrl, Node*& fast_oop_rawmem,
    +                             intx prefetch_lines) const;
    +
    +  // These are general helper methods used by C2
    +  virtual bool array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const;
    +  virtual void clone_barrier_at_expansion(ArrayCopyNode* ac, Node* call, PhaseIterGVN& igvn) const;
    +
    +  // Support for GC barriers emitted during parsing
    +  virtual bool is_gc_barrier_node(Node* node) const;
    +  virtual Node* step_over_gc_barrier(Node* c) const;
    +  virtual bool expand_barriers(Compile* C, PhaseIterGVN& igvn) const;
    +  virtual bool optimize_loops(PhaseIdealLoop* phase, LoopOptsMode mode, VectorSet& visited, Node_Stack& nstack, Node_List& worklist) const;
    +  virtual bool strip_mined_loops_expanded(LoopOptsMode mode) const { return mode == LoopOptsShenandoahExpand || mode == LoopOptsShenandoahPostExpand; }
    +  virtual bool is_gc_specific_loop_opts_pass(LoopOptsMode mode) const { return mode == LoopOptsShenandoahExpand || mode == LoopOptsShenandoahPostExpand; }
    +
    +  // Support for macro expanded GC barriers
    +  virtual void register_potential_barrier_node(Node* node) const;
    +  virtual void unregister_potential_barrier_node(Node* node) const;
    +  virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const;
    +  virtual void enqueue_useful_gc_barrier(PhaseIterGVN* igvn, Node* node) const;
    +  virtual void eliminate_useless_gc_barriers(Unique_Node_List &useful, Compile* C) const;
    +  virtual void add_users_to_worklist(Unique_Node_List* worklist) const;
    +
    +  // Allow barrier sets to have shared state that is preserved across a compilation unit.
    +  // This could for example comprise macro nodes to be expanded during macro expansion.
    +  virtual void* create_barrier_state(Arena* comp_arena) const;
    +  // If the BarrierSetC2 state has kept macro nodes in its compilation unit state to be
    +  // expanded later, then now is the time to do so.
    +  virtual bool expand_macro_nodes(PhaseMacroExpand* macro) const;
    +
    +#ifdef ASSERT
    +  virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const;
    +#endif
    +
    +  virtual bool flatten_gc_alias_type(const TypePtr*& adr_type) const;
    +#ifdef ASSERT
    +  virtual bool verify_gc_alias_type(const TypePtr* adr_type, int offset) const;
    +#endif
    +
    +  virtual Node* ideal_node(PhaseGVN* phase, Node* n, bool can_reshape) const;
    +  virtual Node* identity_node(PhaseGVN* phase, Node* n) const;
    +  virtual bool final_graph_reshaping(Compile* compile, Node* n, uint opcode) const;
    +
    +  virtual bool escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const;
    +  virtual bool escape_add_final_edges(ConnectionGraph* conn_graph, PhaseGVN* gvn, Node* n, uint opcode) const;
    +  virtual bool escape_has_out_with_unsafe_object(Node* n) const;
    +  virtual bool escape_is_barrier_node(Node* n) const;
    +
    +  virtual bool matcher_find_shared_visit(Matcher* matcher, Matcher::MStack& mstack, Node* n, uint opcode, bool& mem_op, int& mem_addr_idx) const;
    +  virtual bool matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const;
    +  virtual bool matcher_is_store_load_barrier(Node* x, uint xop) const;
    +
    +  virtual void igvn_add_users_to_worklist(PhaseIterGVN* igvn, Node* use) const;
    +  virtual void ccp_analyze(PhaseCCP* ccp, Unique_Node_List& worklist, Node* use) const;
    +
    +  virtual bool has_special_unique_user(const Node* node) const;
    +  virtual Node* split_if_pre(PhaseIdealLoop* phase, Node* n) const;
    +  virtual bool build_loop_late_post(PhaseIdealLoop* phase, Node* n) const;
    +  virtual bool sink_node(PhaseIdealLoop* phase, Node* n, Node* x, Node* x_ctrl, Node* n_ctrl) const;
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_C2_SHENANDOAHBARRIERSETC2_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp
    new file mode 100644
    index 00000000000..637e5bd1200
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp
    @@ -0,0 +1,4278 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/c2/shenandoahSupport.hpp"
    +#include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahRuntime.hpp"
    +#include "opto/arraycopynode.hpp"
    +#include "opto/block.hpp"
    +#include "opto/callnode.hpp"
    +#include "opto/castnode.hpp"
    +#include "opto/movenode.hpp"
    +#include "opto/phaseX.hpp"
    +#include "opto/rootnode.hpp"
    +#include "opto/runtime.hpp"
    +#include "opto/subnode.hpp"
    +
    +Node* ShenandoahBarrierNode::skip_through_barrier(Node* n) {
    +  if (n == NULL) {
    +    return NULL;
    +  }
    +  if (n->Opcode() == Op_ShenandoahEnqueueBarrier) {
    +    n = n->in(1);
    +  }
    +
    +  if (n->is_ShenandoahBarrier()) {
    +    return n->in(ValueIn);
    +  } else if (n->is_Phi() &&
    +             n->req() == 3 &&
    +             n->in(1) != NULL &&
    +             n->in(1)->is_ShenandoahBarrier() &&
    +             n->in(2) != NULL &&
    +             n->in(2)->bottom_type() == TypePtr::NULL_PTR &&
    +             n->in(0) != NULL &&
    +             n->in(0)->in(1) != NULL &&
    +             n->in(0)->in(1)->is_IfProj() &&
    +             n->in(0)->in(2) != NULL &&
    +             n->in(0)->in(2)->is_IfProj() &&
    +             n->in(0)->in(1)->in(0) != NULL &&
    +             n->in(0)->in(1)->in(0) == n->in(0)->in(2)->in(0) &&
    +             n->in(1)->in(ValueIn)->Opcode() == Op_CastPP) {
    +    Node* iff = n->in(0)->in(1)->in(0);
    +    Node* res = n->in(1)->in(ValueIn)->in(1);
    +    if (iff->is_If() &&
    +        iff->in(1) != NULL &&
    +        iff->in(1)->is_Bool() &&
    +        iff->in(1)->as_Bool()->_test._test == BoolTest::ne &&
    +        iff->in(1)->in(1) != NULL &&
    +        iff->in(1)->in(1)->Opcode() == Op_CmpP &&
    +        iff->in(1)->in(1)->in(1) != NULL &&
    +        iff->in(1)->in(1)->in(1) == res &&
    +        iff->in(1)->in(1)->in(2) != NULL &&
    +        iff->in(1)->in(1)->in(2)->bottom_type() == TypePtr::NULL_PTR) {
    +      return res;
    +    }
    +  }
    +  return n;
    +}
    +
    +bool ShenandoahBarrierNode::needs_barrier(PhaseGVN* phase, ShenandoahBarrierNode* orig, Node* n, Node* rb_mem, bool allow_fromspace) {
    +  Unique_Node_List visited;
    +  return needs_barrier_impl(phase, orig, n, rb_mem, allow_fromspace, visited);
    +}
    +
    +bool ShenandoahBarrierNode::needs_barrier_impl(PhaseGVN* phase, ShenandoahBarrierNode* orig, Node* n, Node* rb_mem, bool allow_fromspace, Unique_Node_List &visited) {
    +  if (visited.member(n)) {
    +    return false; // Been there.
    +  }
    +  visited.push(n);
    +
    +  if (n->is_Allocate()) {
    +    return false;
    +  }
    +
    +  if (n->is_CallJava() || n->Opcode() == Op_CallLeafNoFP) {
    +    return true;
    +  }
    +
    +  const Type* type = phase->type(n);
    +  if (type == Type::TOP) {
    +    return false;
    +  }
    +  if (type->make_ptr()->higher_equal(TypePtr::NULL_PTR)) {
    +    return false;
    +  }
    +  if (type->make_oopptr() && type->make_oopptr()->const_oop() != NULL) {
    +    return false;
    +  }
    +
    +  if (ShenandoahOptimizeStableFinals) {
    +    const TypeAryPtr* ary = type->isa_aryptr();
    +    if (ary && ary->is_stable() && allow_fromspace) {
    +      return false;
    +    }
    +  }
    +
    +  if (n->is_CheckCastPP() || n->is_ConstraintCast() || n->Opcode() == Op_ShenandoahEnqueueBarrier) {
    +    return needs_barrier_impl(phase, orig, n->in(1), rb_mem, allow_fromspace, visited);
    +  }
    +  if (n->is_Parm()) {
    +    return true;
    +  }
    +  if (n->is_Proj()) {
    +    return needs_barrier_impl(phase, orig, n->in(0), rb_mem, allow_fromspace, visited);
    +  }
    +
    +  if (n->Opcode() == Op_ShenandoahWBMemProj) {
    +    return needs_barrier_impl(phase, orig, n->in(ShenandoahWBMemProjNode::WriteBarrier), rb_mem, allow_fromspace, visited);
    +  }
    +  if (n->is_Phi()) {
    +    bool need_barrier = false;
    +    for (uint i = 1; i < n->req() && ! need_barrier; i++) {
    +      Node* input = n->in(i);
    +      if (input == NULL) {
    +        need_barrier = true; // Phi not complete yet?
    +      } else if (needs_barrier_impl(phase, orig, input, rb_mem, allow_fromspace, visited)) {
    +        need_barrier = true;
    +      }
    +    }
    +    return need_barrier;
    +  }
    +  if (n->is_CMove()) {
    +    return needs_barrier_impl(phase, orig, n->in(CMoveNode::IfFalse), rb_mem, allow_fromspace, visited) ||
    +           needs_barrier_impl(phase, orig, n->in(CMoveNode::IfTrue ), rb_mem, allow_fromspace, visited);
    +  }
    +  if (n->Opcode() == Op_CreateEx) {
    +    return true;
    +  }
    +  if (n->Opcode() == Op_ShenandoahWriteBarrier) {
    +    return false;
    +  }
    +  if (n->Opcode() == Op_ShenandoahReadBarrier) {
    +    if (rb_mem == n->in(Memory)) {
    +      return false;
    +    } else {
    +      return true;
    +    }
    +  }
    +
    +  if (n->Opcode() == Op_LoadP ||
    +      n->Opcode() == Op_LoadN ||
    +      n->Opcode() == Op_GetAndSetP ||
    +      n->Opcode() == Op_CompareAndExchangeP ||
    +      n->Opcode() == Op_ShenandoahCompareAndExchangeP ||
    +      n->Opcode() == Op_GetAndSetN ||
    +      n->Opcode() == Op_CompareAndExchangeN ||
    +      n->Opcode() == Op_ShenandoahCompareAndExchangeN) {
    +    return true;
    +  }
    +  if (n->Opcode() == Op_DecodeN ||
    +      n->Opcode() == Op_EncodeP) {
    +    return needs_barrier_impl(phase, orig, n->in(1), rb_mem, allow_fromspace, visited);
    +  }
    +
    +#ifdef ASSERT
    +  tty->print("need barrier on?: "); n->dump();
    +  ShouldNotReachHere();
    +#endif
    +  return true;
    +}
    +
    +bool ShenandoahReadBarrierNode::dominates_memory_rb_impl(PhaseGVN* phase,
    +                                                         Node* b1,
    +                                                         Node* b2,
    +                                                         Node* current,
    +                                                         bool linear) {
    +  ResourceMark rm;
    +  VectorSet visited(Thread::current()->resource_area());
    +  Node_Stack phis(0);
    +
    +  for(int i = 0; i < 10; i++) {
    +    if (current == NULL) {
    +      return false;
    +    } else if (visited.test_set(current->_idx) || current->is_top() || current == b1) {
    +      current = NULL;
    +      while (phis.is_nonempty() && current == NULL) {
    +        uint idx = phis.index();
    +        Node* phi = phis.node();
    +        if (idx >= phi->req()) {
    +          phis.pop();
    +        } else {
    +          current = phi->in(idx);
    +          phis.set_index(idx+1);
    +        }
    +      }
    +      if (current == NULL) {
    +        return true;
    +      }
    +    } else if (current == phase->C->immutable_memory()) {
    +      return false;
    +    } else if (current->isa_Phi()) {
    +      if (!linear) {
    +        return false;
    +      }
    +      phis.push(current, 2);
    +      current = current->in(1);
    +    } else if (current->Opcode() == Op_ShenandoahWriteBarrier) {
    +      const Type* in_type = current->bottom_type();
    +      const Type* this_type = b2->bottom_type();
    +      if (is_independent(in_type, this_type)) {
    +        current = current->in(Memory);
    +      } else {
    +        return false;
    +      }
    +    } else if (current->Opcode() == Op_ShenandoahWBMemProj) {
    +      current = current->in(ShenandoahWBMemProjNode::WriteBarrier);
    +    } else if (current->is_Proj()) {
    +      current = current->in(0);
    +    } else if (current->is_Call()) {
    +      return false; // TODO: Maybe improve by looking at the call's memory effects?
    +    } else if (current->is_MemBar()) {
    +      return false; // TODO: Do we need to stop at *any* membar?
    +    } else if (current->is_MergeMem()) {
    +      const TypePtr* adr_type = brooks_pointer_type(phase->type(b2));
    +      uint alias_idx = phase->C->get_alias_index(adr_type);
    +      current = current->as_MergeMem()->memory_at(alias_idx);
    +    } else {
    +#ifdef ASSERT
    +      current->dump();
    +#endif
    +      ShouldNotReachHere();
    +      return false;
    +    }
    +  }
    +  return false;
    +}
    +
    +bool ShenandoahReadBarrierNode::is_independent(Node* mem) {
    +  if (mem->is_Phi() || mem->is_Proj() || mem->is_MergeMem()) {
    +    return true;
    +  } else if (mem->Opcode() == Op_ShenandoahWBMemProj) {
    +    return true;
    +  } else if (mem->Opcode() == Op_ShenandoahWriteBarrier) {
    +    const Type* mem_type = mem->bottom_type();
    +    const Type* this_type = bottom_type();
    +    if (is_independent(mem_type, this_type)) {
    +      return true;
    +    } else {
    +      return false;
    +    }
    +  } else if (mem->is_Call() || mem->is_MemBar()) {
    +    return false;
    +  }
    +#ifdef ASSERT
    +  mem->dump();
    +#endif
    +  ShouldNotReachHere();
    +  return true;
    +}
    +
    +bool ShenandoahReadBarrierNode::dominates_memory_rb(PhaseGVN* phase, Node* b1, Node* b2, bool linear) {
    +  return dominates_memory_rb_impl(phase, b1->in(Memory), b2, b2->in(Memory), linear);
    +}
    +
    +bool ShenandoahReadBarrierNode::is_independent(const Type* in_type, const Type* this_type) {
    +  assert(in_type->isa_oopptr(), "expect oop ptr");
    +  assert(this_type->isa_oopptr(), "expect oop ptr");
    +
    +  ciKlass* in_kls = in_type->is_oopptr()->klass();
    +  ciKlass* this_kls = this_type->is_oopptr()->klass();
    +  if (in_kls != NULL && this_kls != NULL &&
    +      in_kls->is_loaded() && this_kls->is_loaded() &&
    +      (!in_kls->is_subclass_of(this_kls)) &&
    +      (!this_kls->is_subclass_of(in_kls))) {
    +    return true;
    +  }
    +  return false;
    +}
    +
    +Node* ShenandoahReadBarrierNode::Ideal(PhaseGVN *phase, bool can_reshape) {
    +  if (! can_reshape) {
    +    return NULL;
    +  }
    +
    +  if (in(Memory) == phase->C->immutable_memory()) return NULL;
    +
    +  // If memory input is a MergeMem, take the appropriate slice out of it.
    +  Node* mem_in = in(Memory);
    +  if (mem_in->isa_MergeMem()) {
    +    const TypePtr* adr_type = brooks_pointer_type(bottom_type());
    +    uint alias_idx = phase->C->get_alias_index(adr_type);
    +    mem_in = mem_in->as_MergeMem()->memory_at(alias_idx);
    +    set_req(Memory, mem_in);
    +    return this;
    +  }
    +
    +  Node* input = in(Memory);
    +  if (input->Opcode() == Op_ShenandoahWBMemProj) {
    +    ResourceMark rm;
    +    VectorSet seen(Thread::current()->resource_area());
    +    Node* n = in(Memory);
    +    while (n->Opcode() == Op_ShenandoahWBMemProj &&
    +           n->in(ShenandoahWBMemProjNode::WriteBarrier) != NULL &&
    +           n->in(ShenandoahWBMemProjNode::WriteBarrier)->Opcode() == Op_ShenandoahWriteBarrier &&
    +           n->in(ShenandoahWBMemProjNode::WriteBarrier)->in(Memory) != NULL) {
    +      if (seen.test_set(n->_idx)) {
    +        return NULL; // loop
    +      }
    +      n = n->in(ShenandoahWBMemProjNode::WriteBarrier)->in(Memory);
    +    }
    +
    +    Node* wb = input->in(ShenandoahWBMemProjNode::WriteBarrier);
    +    const Type* in_type = phase->type(wb);
    +    // is_top() test not sufficient here: we can come here after CCP
    +    // in a dead branch of the graph that has not yet been removed.
    +    if (in_type == Type::TOP) return NULL; // Dead path.
    +    assert(wb->Opcode() == Op_ShenandoahWriteBarrier, "expect write barrier");
    +    if (is_independent(in_type, _type)) {
    +      phase->igvn_rehash_node_delayed(wb);
    +      set_req(Memory, wb->in(Memory));
    +      if (can_reshape && input->outcnt() == 0) {
    +        phase->is_IterGVN()->_worklist.push(input);
    +      }
    +      return this;
    +    }
    +  }
    +  return NULL;
    +}
    +
    +ShenandoahWriteBarrierNode::ShenandoahWriteBarrierNode(Compile* C, Node* ctrl, Node* mem, Node* obj)
    +  : ShenandoahBarrierNode(ctrl, mem, obj, false) {
    +  assert(UseShenandoahGC && ShenandoahWriteBarrier, "should be enabled");
    +  ShenandoahBarrierSetC2::bsc2()->state()->add_shenandoah_barrier(this);
    +}
    +
    +Node* ShenandoahWriteBarrierNode::Identity(PhaseGVN* phase) {
    +  assert(in(0) != NULL, "should have control");
    +  PhaseIterGVN* igvn = phase->is_IterGVN();
    +  Node* mem_in = in(Memory);
    +  Node* mem_proj = NULL;
    +
    +  if (igvn != NULL) {
    +    mem_proj = find_out_with(Op_ShenandoahWBMemProj);
    +    if (mem_in == mem_proj) {
    +      return this;
    +    }
    +  }
    +
    +  Node* replacement = Identity_impl(phase);
    +  if (igvn != NULL) {
    +    if (replacement != NULL && replacement != this && mem_proj != NULL) {
    +      igvn->replace_node(mem_proj, mem_in);
    +    }
    +  }
    +  return replacement;
    +}
    +
    +Node* ShenandoahWriteBarrierNode::Ideal(PhaseGVN *phase, bool can_reshape) {
    +  assert(in(0) != NULL, "should have control");
    +  if (!can_reshape) {
    +    return NULL;
    +  }
    +
    +  Node* mem_in = in(Memory);
    +
    +  if (mem_in->isa_MergeMem()) {
    +    const TypePtr* adr_type = brooks_pointer_type(bottom_type());
    +    uint alias_idx = phase->C->get_alias_index(adr_type);
    +    mem_in = mem_in->as_MergeMem()->memory_at(alias_idx);
    +    set_req(Memory, mem_in);
    +    return this;
    +  }
    +
    +  Node* val = in(ValueIn);
    +  if (val->is_ShenandoahBarrier()) {
    +    set_req(ValueIn, val->in(ValueIn));
    +    return this;
    +  }
    +
    +  return NULL;
    +}
    +
    +bool ShenandoahWriteBarrierNode::expand(Compile* C, PhaseIterGVN& igvn) {
    +  if (UseShenandoahGC) {
    +    if (ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barriers_count() > 0 || (!ShenandoahWriteBarrier && ShenandoahStoreValEnqueueBarrier)) {
    +      bool attempt_more_loopopts = ShenandoahLoopOptsAfterExpansion;
    +      C->clear_major_progress();
    +      PhaseIdealLoop ideal_loop(igvn, LoopOptsShenandoahExpand);
    +      if (C->failing()) return false;
    +      PhaseIdealLoop::verify(igvn);
    +      DEBUG_ONLY(ShenandoahBarrierNode::verify_raw_mem(C->root());)
    +      if (attempt_more_loopopts) {
    +        C->set_major_progress();
    +        if (!C->optimize_loops(igvn, LoopOptsShenandoahPostExpand)) {
    +          return false;
    +        }
    +        C->clear_major_progress();
    +      }
    +    }
    +  }
    +  return true;
    +}
    +
    +bool ShenandoahWriteBarrierNode::is_heap_state_test(Node* iff, int mask) {
    +  if (!UseShenandoahGC) {
    +    return false;
    +  }
    +  assert(iff->is_If(), "bad input");
    +  if (iff->Opcode() != Op_If) {
    +    return false;
    +  }
    +  Node* bol = iff->in(1);
    +  if (!bol->is_Bool() || bol->as_Bool()->_test._test != BoolTest::ne) {
    +    return false;
    +  }
    +  Node* cmp = bol->in(1);
    +  if (cmp->Opcode() != Op_CmpI) {
    +    return false;
    +  }
    +  Node* in1 = cmp->in(1);
    +  Node* in2 = cmp->in(2);
    +  if (in2->find_int_con(-1) != 0) {
    +    return false;
    +  }
    +  if (in1->Opcode() != Op_AndI) {
    +    return false;
    +  }
    +  in2 = in1->in(2);
    +  if (in2->find_int_con(-1) != mask) {
    +    return false;
    +  }
    +  in1 = in1->in(1);
    +
    +  return is_gc_state_load(in1);
    +}
    +
    +bool ShenandoahWriteBarrierNode::is_heap_stable_test(Node* iff) {
    +  return is_heap_state_test(iff, ShenandoahHeap::HAS_FORWARDED);
    +}
    +
    +bool ShenandoahWriteBarrierNode::is_gc_state_load(Node *n) {
    +  if (!UseShenandoahGC) {
    +    return false;
    +  }
    +  if (n->Opcode() != Op_LoadB && n->Opcode() != Op_LoadUB) {
    +    return false;
    +  }
    +  Node* addp = n->in(MemNode::Address);
    +  if (!addp->is_AddP()) {
    +    return false;
    +  }
    +  Node* base = addp->in(AddPNode::Address);
    +  Node* off = addp->in(AddPNode::Offset);
    +  if (base->Opcode() != Op_ThreadLocal) {
    +    return false;
    +  }
    +  if (off->find_intptr_t_con(-1) != in_bytes(ShenandoahThreadLocalData::gc_state_offset())) {
    +    return false;
    +  }
    +  return true;
    +}
    +
    +bool ShenandoahWriteBarrierNode::has_safepoint_between(Node* start, Node* stop, PhaseIdealLoop *phase) {
    +  assert(phase->is_dominator(stop, start), "bad inputs");
    +  ResourceMark rm;
    +  Unique_Node_List wq;
    +  wq.push(start);
    +  for (uint next = 0; next < wq.size(); next++) {
    +    Node *m = wq.at(next);
    +    if (m == stop) {
    +      continue;
    +    }
    +    if (m->is_SafePoint() && !m->is_CallLeaf()) {
    +      return true;
    +    }
    +    if (m->is_Region()) {
    +      for (uint i = 1; i < m->req(); i++) {
    +        wq.push(m->in(i));
    +      }
    +    } else {
    +      wq.push(m->in(0));
    +    }
    +  }
    +  return false;
    +}
    +
    +bool ShenandoahWriteBarrierNode::try_common_gc_state_load(Node *n, PhaseIdealLoop *phase) {
    +  assert(is_gc_state_load(n), "inconsistent");
    +  Node* addp = n->in(MemNode::Address);
    +  Node* dominator = NULL;
    +  for (DUIterator_Fast imax, i = addp->fast_outs(imax); i < imax; i++) {
    +    Node* u = addp->fast_out(i);
    +    assert(is_gc_state_load(u), "inconsistent");
    +    if (u != n && phase->is_dominator(u->in(0), n->in(0))) {
    +      if (dominator == NULL) {
    +        dominator = u;
    +      } else {
    +        if (phase->dom_depth(u->in(0)) < phase->dom_depth(dominator->in(0))) {
    +          dominator = u;
    +        }
    +      }
    +    }
    +  }
    +  if (dominator == NULL || has_safepoint_between(n->in(0), dominator->in(0), phase)) {
    +    return false;
    +  }
    +  phase->igvn().replace_node(n, dominator);
    +
    +  return true;
    +}
    +
    +bool ShenandoahBarrierNode::dominates_memory_impl(PhaseGVN* phase,
    +                                                  Node* b1,
    +                                                  Node* b2,
    +                                                  Node* current,
    +                                                  bool linear) {
    +  ResourceMark rm;
    +  VectorSet visited(Thread::current()->resource_area());
    +  Node_Stack phis(0);
    +
    +  for(int i = 0; i < 10; i++) {
    +    if (current == NULL) {
    +      return false;
    +    } else if (visited.test_set(current->_idx) || current->is_top() || current == b1) {
    +      current = NULL;
    +      while (phis.is_nonempty() && current == NULL) {
    +        uint idx = phis.index();
    +        Node* phi = phis.node();
    +        if (idx >= phi->req()) {
    +          phis.pop();
    +        } else {
    +          current = phi->in(idx);
    +          phis.set_index(idx+1);
    +        }
    +      }
    +      if (current == NULL) {
    +        return true;
    +      }
    +    } else if (current == b2) {
    +      return false;
    +    } else if (current == phase->C->immutable_memory()) {
    +      return false;
    +    } else if (current->isa_Phi()) {
    +      if (!linear) {
    +        return false;
    +      }
    +      phis.push(current, 2);
    +      current = current->in(1);
    +    } else if (current->Opcode() == Op_ShenandoahWriteBarrier) {
    +      current = current->in(Memory);
    +    } else if (current->Opcode() == Op_ShenandoahWBMemProj) {
    +      current = current->in(ShenandoahWBMemProjNode::WriteBarrier);
    +    } else if (current->is_Proj()) {
    +      current = current->in(0);
    +    } else if (current->is_Call()) {
    +      current = current->in(TypeFunc::Memory);
    +    } else if (current->is_MemBar()) {
    +      current = current->in(TypeFunc::Memory);
    +    } else if (current->is_MergeMem()) {
    +      const TypePtr* adr_type = brooks_pointer_type(phase->type(b2));
    +      uint alias_idx = phase->C->get_alias_index(adr_type);
    +      current = current->as_MergeMem()->memory_at(alias_idx);
    +    } else {
    +#ifdef ASSERT
    +      current->dump();
    +#endif
    +      ShouldNotReachHere();
    +      return false;
    +    }
    +  }
    +  return false;
    +}
    +
    +/**
    + * Determines if b1 dominates b2 through memory inputs. It returns true if:
    + * - b1 can be reached by following each branch in b2's memory input (through phis, etc)
    + * - or we get back to b2 (i.e. through a loop) without seeing b1
    + * In all other cases, (in particular, if we reach immutable_memory without having seen b1)
    + * we return false.
    + */
    +bool ShenandoahBarrierNode::dominates_memory(PhaseGVN* phase, Node* b1, Node* b2, bool linear) {
    +  return dominates_memory_impl(phase, b1, b2, b2->in(Memory), linear);
    +}
    +
    +Node* ShenandoahBarrierNode::Identity_impl(PhaseGVN* phase) {
    +  Node* n = in(ValueIn);
    +
    +  Node* rb_mem = Opcode() == Op_ShenandoahReadBarrier ? in(Memory) : NULL;
    +  if (! needs_barrier(phase, this, n, rb_mem, _allow_fromspace)) {
    +    return n;
    +  }
    +
    +  // Try to find a write barrier sibling with identical inputs that we can fold into.
    +  for (DUIterator i = n->outs(); n->has_out(i); i++) {
    +    Node* sibling = n->out(i);
    +    if (sibling == this) {
    +      continue;
    +    }
    +    if (sibling->Opcode() != Op_ShenandoahWriteBarrier) {
    +      continue;
    +    }
    +
    +    assert(sibling->in(ValueIn) == in(ValueIn), "sanity");
    +    assert(sibling->Opcode() == Op_ShenandoahWriteBarrier, "sanity");
    +
    +    if (dominates_memory(phase, sibling, this, phase->is_IterGVN() == NULL)) {
    +      return sibling;
    +    }
    +  }
    +  return this;
    +}
    +
    +#ifndef PRODUCT
    +void ShenandoahBarrierNode::dump_spec(outputStream *st) const {
    +  const TypePtr* adr = adr_type();
    +  if (adr == NULL) {
    +    return;
    +  }
    +  st->print(" @");
    +  adr->dump_on(st);
    +  st->print(" (");
    +  Compile::current()->alias_type(adr)->adr_type()->dump_on(st);
    +  st->print(") ");
    +}
    +#endif
    +
    +Node* ShenandoahReadBarrierNode::Identity(PhaseGVN* phase) {
    +  Node* id = Identity_impl(phase);
    +
    +  if (id == this && phase->is_IterGVN()) {
    +    Node* n = in(ValueIn);
    +    // No success in super call. Try to combine identical read barriers.
    +    for (DUIterator i = n->outs(); n->has_out(i); i++) {
    +      Node* sibling = n->out(i);
    +      if (sibling == this || sibling->Opcode() != Op_ShenandoahReadBarrier) {
    +        continue;
    +      }
    +      assert(sibling->in(ValueIn)  == in(ValueIn), "sanity");
    +      if (phase->is_IterGVN()->hash_find(sibling) &&
    +          sibling->bottom_type() == bottom_type() &&
    +          sibling->in(Control) == in(Control) &&
    +          dominates_memory_rb(phase, sibling, this, phase->is_IterGVN() == NULL)) {
    +        return sibling;
    +      }
    +    }
    +  }
    +  return id;
    +}
    +
    +const Type* ShenandoahBarrierNode::Value(PhaseGVN* phase) const {
    +  // Either input is TOP ==> the result is TOP
    +  const Type *t1 = phase->type(in(Memory));
    +  if (t1 == Type::TOP) return Type::TOP;
    +  const Type *t2 = phase->type(in(ValueIn));
    +  if( t2 == Type::TOP ) return Type::TOP;
    +
    +  if (t2 == TypePtr::NULL_PTR) {
    +    return _type;
    +  }
    +
    +  const Type* type = t2->is_oopptr()->cast_to_nonconst();
    +  return type;
    +}
    +
    +uint ShenandoahBarrierNode::hash() const {
    +  return TypeNode::hash() + _allow_fromspace;
    +}
    +
    +uint ShenandoahBarrierNode::cmp(const Node& n) const {
    +  return _allow_fromspace == ((ShenandoahBarrierNode&) n)._allow_fromspace
    +    && TypeNode::cmp(n);
    +}
    +
    +uint ShenandoahBarrierNode::size_of() const {
    +  return sizeof(*this);
    +}
    +
    +Node* ShenandoahWBMemProjNode::Identity(PhaseGVN* phase) {
    +  Node* wb = in(WriteBarrier);
    +  if (wb->is_top()) return phase->C->top(); // Dead path.
    +
    +  assert(wb->Opcode() == Op_ShenandoahWriteBarrier, "expect write barrier");
    +  PhaseIterGVN* igvn = phase->is_IterGVN();
    +  // We can't do the below unless the graph is fully constructed.
    +  if (igvn == NULL) {
    +    return this;
    +  }
    +
    +  // If the mem projection has no barrier users, it's not needed anymore.
    +  if (wb->outcnt() == 1) {
    +    return wb->in(ShenandoahBarrierNode::Memory);
    +  }
    +
    +  return this;
    +}
    +
    +#ifdef ASSERT
    +bool ShenandoahBarrierNode::verify_helper(Node* in, Node_Stack& phis, VectorSet& visited, verify_type t, bool trace, Unique_Node_List& barriers_used) {
    +  assert(phis.size() == 0, "");
    +
    +  while (true) {
    +    if (in->bottom_type() == TypePtr::NULL_PTR) {
    +      if (trace) {tty->print_cr("NULL");}
    +    } else if (!in->bottom_type()->make_ptr()->make_oopptr()) {
    +      if (trace) {tty->print_cr("Non oop");}
    +    } else if (t == ShenandoahLoad && ShenandoahOptimizeStableFinals &&
    +               in->bottom_type()->make_ptr()->isa_aryptr() &&
    +               in->bottom_type()->make_ptr()->is_aryptr()->is_stable()) {
    +      if (trace) {tty->print_cr("Stable array load");}
    +    } else {
    +      if (in->is_ConstraintCast()) {
    +        in = in->in(1);
    +        continue;
    +      } else if (in->is_AddP()) {
    +        assert(!in->in(AddPNode::Address)->is_top(), "no raw memory access");
    +        in = in->in(AddPNode::Address);
    +        continue;
    +      } else if (in->is_Con()) {
    +        if (trace) {tty->print("Found constant"); in->dump();}
    +      } else if (in->is_ShenandoahBarrier()) {
    +        if (t == ShenandoahOopStore) {
    +          if (in->Opcode() != Op_ShenandoahWriteBarrier) {
    +            return false;
    +          }
    +          uint i = 0;
    +          for (; i < phis.size(); i++) {
    +            Node* n = phis.node_at(i);
    +            if (n->Opcode() == Op_ShenandoahEnqueueBarrier) {
    +              break;
    +            }
    +          }
    +          if (i == phis.size()) {
    +            return false;
    +          }
    +        } else if (t == ShenandoahStore && in->Opcode() != Op_ShenandoahWriteBarrier) {
    +          return false;
    +        }
    +        barriers_used.push(in);
    +        if (trace) {tty->print("Found barrier"); in->dump();}
    +      } else if (in->Opcode() == Op_ShenandoahEnqueueBarrier) {
    +        if (t != ShenandoahOopStore) {
    +          in = in->in(1);
    +          continue;
    +        }
    +        if (trace) {tty->print("Found enqueue barrier"); in->dump();}
    +        phis.push(in, in->req());
    +        in = in->in(1);
    +        continue;
    +      } else if (in->is_Proj() && in->in(0)->is_Allocate()) {
    +        if (trace) {tty->print("Found alloc"); in->in(0)->dump();}
    +      } else if (in->is_Phi()) {
    +        if (!visited.test_set(in->_idx)) {
    +          if (trace) {tty->print("Pushed phi:"); in->dump();}
    +          phis.push(in, 2);
    +          in = in->in(1);
    +          continue;
    +        }
    +        if (trace) {tty->print("Already seen phi:"); in->dump();}
    +      } else if (in->Opcode() == Op_CMoveP || in->Opcode() == Op_CMoveN) {
    +        if (!visited.test_set(in->_idx)) {
    +          if (trace) {tty->print("Pushed cmovep:"); in->dump();}
    +          phis.push(in, CMoveNode::IfTrue);
    +          in = in->in(CMoveNode::IfFalse);
    +          continue;
    +        }
    +        if (trace) {tty->print("Already seen cmovep:"); in->dump();}
    +      } else if (in->Opcode() == Op_EncodeP || in->Opcode() == Op_DecodeN) {
    +        in = in->in(1);
    +        continue;
    +      } else {
    +        return false;
    +      }
    +    }
    +    bool cont = false;
    +    while (phis.is_nonempty()) {
    +      uint idx = phis.index();
    +      Node* phi = phis.node();
    +      if (idx >= phi->req()) {
    +        if (trace) {tty->print("Popped phi:"); phi->dump();}
    +        phis.pop();
    +        continue;
    +      }
    +      if (trace) {tty->print("Next entry(%d) for phi:", idx); phi->dump();}
    +      in = phi->in(idx);
    +      phis.set_index(idx+1);
    +      cont = true;
    +      break;
    +    }
    +    if (!cont) {
    +      break;
    +    }
    +  }
    +  return true;
    +}
    +
    +void ShenandoahBarrierNode::report_verify_failure(const char *msg, Node *n1, Node *n2) {
    +  if (n1 != NULL) {
    +    n1->dump(+10);
    +  }
    +  if (n2 != NULL) {
    +    n2->dump(+10);
    +  }
    +  fatal("%s", msg);
    +}
    +
    +void ShenandoahBarrierNode::verify(RootNode* root) {
    +  ResourceMark rm;
    +  Unique_Node_List wq;
    +  GrowableArray barriers;
    +  Unique_Node_List barriers_used;
    +  Node_Stack phis(0);
    +  VectorSet visited(Thread::current()->resource_area());
    +  const bool trace = false;
    +  const bool verify_no_useless_barrier = false;
    +
    +  wq.push(root);
    +  for (uint next = 0; next < wq.size(); next++) {
    +    Node *n = wq.at(next);
    +    if (n->is_Load()) {
    +      const bool trace = false;
    +      if (trace) {tty->print("Verifying"); n->dump();}
    +      if (n->Opcode() == Op_LoadRange || n->Opcode() == Op_LoadKlass || n->Opcode() == Op_LoadNKlass) {
    +        if (trace) {tty->print_cr("Load range/klass");}
    +      } else {
    +        const TypePtr* adr_type = n->as_Load()->adr_type();
    +
    +        if (adr_type->isa_oopptr() && adr_type->is_oopptr()->offset() == oopDesc::mark_offset_in_bytes()) {
    +          if (trace) {tty->print_cr("Mark load");}
    +        } else if (adr_type->isa_instptr() &&
    +                   adr_type->is_instptr()->klass()->is_subtype_of(Compile::current()->env()->Reference_klass()) &&
    +                   adr_type->is_instptr()->offset() == java_lang_ref_Reference::referent_offset) {
    +          if (trace) {tty->print_cr("Reference.get()");}
    +        } else {
    +          bool verify = true;
    +          if (adr_type->isa_instptr()) {
    +            const TypeInstPtr* tinst = adr_type->is_instptr();
    +            ciKlass* k = tinst->klass();
    +            assert(k->is_instance_klass(), "");
    +            ciInstanceKlass* ik = (ciInstanceKlass*)k;
    +            int offset = adr_type->offset();
    +
    +            if ((ik->debug_final_field_at(offset) && ShenandoahOptimizeInstanceFinals) ||
    +                (ik->debug_stable_field_at(offset) && ShenandoahOptimizeStableFinals)) {
    +              if (trace) {tty->print_cr("Final/stable");}
    +              verify = false;
    +            } else if (k == ciEnv::current()->Class_klass() &&
    +                       tinst->const_oop() != NULL &&
    +                       tinst->offset() >= (ik->size_helper() * wordSize)) {
    +              ciInstanceKlass* k = tinst->const_oop()->as_instance()->java_lang_Class_klass()->as_instance_klass();
    +              ciField* field = k->get_field_by_offset(tinst->offset(), true);
    +              if ((ShenandoahOptimizeStaticFinals && field->is_final()) ||
    +                  (ShenandoahOptimizeStableFinals && field->is_stable())) {
    +                verify = false;
    +              }
    +            }
    +          }
    +
    +          if (verify && !ShenandoahBarrierNode::verify_helper(n->in(MemNode::Address), phis, visited, ShenandoahLoad, trace, barriers_used)) {
    +            report_verify_failure("Shenandoah verification: Load should have barriers", n);
    +          }
    +        }
    +      }
    +    } else if (n->is_Store()) {
    +      const bool trace = false;
    +
    +      if (trace) {tty->print("Verifying"); n->dump();}
    +      if (n->in(MemNode::ValueIn)->bottom_type()->make_oopptr()) {
    +        Node* adr = n->in(MemNode::Address);
    +        bool verify = true;
    +
    +        if (adr->is_AddP() && adr->in(AddPNode::Base)->is_top()) {
    +          adr = adr->in(AddPNode::Address);
    +          if (adr->is_AddP()) {
    +            assert(adr->in(AddPNode::Base)->is_top(), "");
    +            adr = adr->in(AddPNode::Address);
    +            if (adr->Opcode() == Op_LoadP &&
    +                adr->in(MemNode::Address)->in(AddPNode::Base)->is_top() &&
    +                adr->in(MemNode::Address)->in(AddPNode::Address)->Opcode() == Op_ThreadLocal &&
    +                adr->in(MemNode::Address)->in(AddPNode::Offset)->find_intptr_t_con(-1) == in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset())) {
    +              if (trace) {tty->print_cr("SATB prebarrier");}
    +              verify = false;
    +            }
    +          }
    +        }
    +
    +        if (verify && !ShenandoahBarrierNode::verify_helper(n->in(MemNode::ValueIn), phis, visited, ShenandoahStoreValEnqueueBarrier ? ShenandoahOopStore : ShenandoahValue, trace, barriers_used)) {
    +          report_verify_failure("Shenandoah verification: Store should have barriers", n);
    +        }
    +      }
    +      if (!ShenandoahBarrierNode::verify_helper(n->in(MemNode::Address), phis, visited, ShenandoahStore, trace, barriers_used)) {
    +        report_verify_failure("Shenandoah verification: Store (address) should have barriers", n);
    +      }
    +    } else if (n->Opcode() == Op_CmpP) {
    +      const bool trace = false;
    +
    +      Node* in1 = n->in(1);
    +      Node* in2 = n->in(2);
    +      if (in1->bottom_type()->isa_oopptr()) {
    +        if (trace) {tty->print("Verifying"); n->dump();}
    +
    +        bool mark_inputs = false;
    +        if (in1->bottom_type() == TypePtr::NULL_PTR || in2->bottom_type() == TypePtr::NULL_PTR ||
    +            (in1->is_Con() || in2->is_Con())) {
    +          if (trace) {tty->print_cr("Comparison against a constant");}
    +          mark_inputs = true;
    +        } else if ((in1->is_CheckCastPP() && in1->in(1)->is_Proj() && in1->in(1)->in(0)->is_Allocate()) ||
    +                   (in2->is_CheckCastPP() && in2->in(1)->is_Proj() && in2->in(1)->in(0)->is_Allocate())) {
    +          if (trace) {tty->print_cr("Comparison with newly alloc'ed object");}
    +          mark_inputs = true;
    +        } else {
    +          assert(in2->bottom_type()->isa_oopptr(), "");
    +
    +          if (!ShenandoahBarrierNode::verify_helper(in1, phis, visited, ShenandoahStore, trace, barriers_used) ||
    +              !ShenandoahBarrierNode::verify_helper(in2, phis, visited, ShenandoahStore, trace, barriers_used)) {
    +            report_verify_failure("Shenandoah verification: Cmp should have barriers", n);
    +          }
    +        }
    +        if (verify_no_useless_barrier &&
    +            mark_inputs &&
    +            (!ShenandoahBarrierNode::verify_helper(in1, phis, visited, ShenandoahValue, trace, barriers_used) ||
    +             !ShenandoahBarrierNode::verify_helper(in2, phis, visited, ShenandoahValue, trace, barriers_used))) {
    +          phis.clear();
    +          visited.Reset();
    +        }
    +      }
    +    } else if (n->is_LoadStore()) {
    +      if (n->in(MemNode::ValueIn)->bottom_type()->make_ptr() &&
    +          !ShenandoahBarrierNode::verify_helper(n->in(MemNode::ValueIn), phis, visited, ShenandoahStoreValEnqueueBarrier ? ShenandoahOopStore : ShenandoahValue, trace, barriers_used)) {
    +        report_verify_failure("Shenandoah verification: LoadStore (value) should have barriers", n);
    +      }
    +
    +      if (n->in(MemNode::Address)->bottom_type()->make_oopptr() && !ShenandoahBarrierNode::verify_helper(n->in(MemNode::Address), phis, visited, ShenandoahStore, trace, barriers_used)) {
    +        report_verify_failure("Shenandoah verification: LoadStore (address) should have barriers", n);
    +      }
    +    } else if (n->Opcode() == Op_CallLeafNoFP || n->Opcode() == Op_CallLeaf) {
    +      CallNode* call = n->as_Call();
    +
    +      static struct {
    +        const char* name;
    +        struct {
    +          int pos;
    +          verify_type t;
    +        } args[6];
    +      } calls[] = {
    +        "aescrypt_encryptBlock",
    +        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahStore },  { TypeFunc::Parms+2, ShenandoahLoad },
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "aescrypt_decryptBlock",
    +        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahStore },  { TypeFunc::Parms+2, ShenandoahLoad },
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "multiplyToLen",
    +        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+2, ShenandoahLoad },   { TypeFunc::Parms+4, ShenandoahStore },
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "squareToLen",
    +        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+2, ShenandoahLoad },   { -1,  ShenandoahNone},
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "montgomery_multiply",
    +        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahLoad },   { TypeFunc::Parms+2, ShenandoahLoad },
    +          { TypeFunc::Parms+6, ShenandoahStore }, { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "montgomery_square",
    +        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahLoad },   { TypeFunc::Parms+5, ShenandoahStore },
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "mulAdd",
    +        { { TypeFunc::Parms, ShenandoahStore },  { TypeFunc::Parms+1, ShenandoahLoad },   { -1,  ShenandoahNone},
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "vectorizedMismatch",
    +        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahLoad },   { -1,  ShenandoahNone},
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "updateBytesCRC32",
    +        { { TypeFunc::Parms+1, ShenandoahLoad }, { -1,  ShenandoahNone},                  { -1,  ShenandoahNone},
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "updateBytesAdler32",
    +        { { TypeFunc::Parms+1, ShenandoahLoad }, { -1,  ShenandoahNone},                  { -1,  ShenandoahNone},
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "updateBytesCRC32C",
    +        { { TypeFunc::Parms+1, ShenandoahLoad }, { TypeFunc::Parms+3, ShenandoahLoad},    { -1,  ShenandoahNone},
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "counterMode_AESCrypt",
    +        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahStore },  { TypeFunc::Parms+2, ShenandoahLoad },
    +          { TypeFunc::Parms+3, ShenandoahStore }, { TypeFunc::Parms+5, ShenandoahStore }, { TypeFunc::Parms+6, ShenandoahStore } },
    +        "cipherBlockChaining_encryptAESCrypt",
    +        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahStore },  { TypeFunc::Parms+2, ShenandoahLoad },
    +          { TypeFunc::Parms+3, ShenandoahLoad },  { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "cipherBlockChaining_decryptAESCrypt",
    +        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahStore },  { TypeFunc::Parms+2, ShenandoahLoad },
    +          { TypeFunc::Parms+3, ShenandoahLoad },  { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "shenandoah_clone_barrier",
    +        { { TypeFunc::Parms, ShenandoahLoad },   { -1,  ShenandoahNone},                  { -1,  ShenandoahNone},
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "ghash_processBlocks",
    +        { { TypeFunc::Parms, ShenandoahStore },  { TypeFunc::Parms+1, ShenandoahLoad },   { TypeFunc::Parms+2, ShenandoahLoad },
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "sha1_implCompress",
    +        { { TypeFunc::Parms, ShenandoahLoad },  { TypeFunc::Parms+1, ShenandoahStore },   { -1, ShenandoahNone },
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "sha256_implCompress",
    +        { { TypeFunc::Parms, ShenandoahLoad },  { TypeFunc::Parms+1, ShenandoahStore },   { -1, ShenandoahNone },
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "sha512_implCompress",
    +        { { TypeFunc::Parms, ShenandoahLoad },  { TypeFunc::Parms+1, ShenandoahStore },   { -1, ShenandoahNone },
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "sha1_implCompressMB",
    +        { { TypeFunc::Parms, ShenandoahLoad },  { TypeFunc::Parms+1, ShenandoahStore },   { -1, ShenandoahNone },
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "sha256_implCompressMB",
    +        { { TypeFunc::Parms, ShenandoahLoad },  { TypeFunc::Parms+1, ShenandoahStore },   { -1, ShenandoahNone },
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +        "sha512_implCompressMB",
    +        { { TypeFunc::Parms, ShenandoahLoad },  { TypeFunc::Parms+1, ShenandoahStore },   { -1, ShenandoahNone },
    +          { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
    +      };
    +
    +      if (call->is_call_to_arraycopystub()) {
    +        Node* dest = NULL;
    +        const TypeTuple* args = n->as_Call()->_tf->domain();
    +        for (uint i = TypeFunc::Parms, j = 0; i < args->cnt(); i++) {
    +          if (args->field_at(i)->isa_ptr()) {
    +            j++;
    +            if (j == 2) {
    +              dest = n->in(i);
    +              break;
    +            }
    +          }
    +        }
    +        if (!ShenandoahBarrierNode::verify_helper(n->in(TypeFunc::Parms), phis, visited, ShenandoahLoad, trace, barriers_used) ||
    +            !ShenandoahBarrierNode::verify_helper(dest, phis, visited, ShenandoahStore, trace, barriers_used)) {
    +          report_verify_failure("Shenandoah verification: ArrayCopy should have barriers", n);
    +        }
    +      } else if (strlen(call->_name) > 5 &&
    +                 !strcmp(call->_name + strlen(call->_name) - 5, "_fill")) {
    +        if (!ShenandoahBarrierNode::verify_helper(n->in(TypeFunc::Parms), phis, visited, ShenandoahStore, trace, barriers_used)) {
    +          report_verify_failure("Shenandoah verification: _fill should have barriers", n);
    +        }
    +      } else if (!strcmp(call->_name, "shenandoah_wb_pre")) {
    +        // skip
    +      } else {
    +        const int calls_len = sizeof(calls) / sizeof(calls[0]);
    +        int i = 0;
    +        for (; i < calls_len; i++) {
    +          if (!strcmp(calls[i].name, call->_name)) {
    +            break;
    +          }
    +        }
    +        if (i != calls_len) {
    +          const uint args_len = sizeof(calls[0].args) / sizeof(calls[0].args[0]);
    +          for (uint j = 0; j < args_len; j++) {
    +            int pos = calls[i].args[j].pos;
    +            if (pos == -1) {
    +              break;
    +            }
    +            if (!ShenandoahBarrierNode::verify_helper(call->in(pos), phis, visited, calls[i].args[j].t, trace, barriers_used)) {
    +              report_verify_failure("Shenandoah verification: intrinsic calls should have barriers", n);
    +            }
    +          }
    +          for (uint j = TypeFunc::Parms; j < call->req(); j++) {
    +            if (call->in(j)->bottom_type()->make_ptr() &&
    +                call->in(j)->bottom_type()->make_ptr()->isa_oopptr()) {
    +              uint k = 0;
    +              for (; k < args_len && calls[i].args[k].pos != (int)j; k++);
    +              if (k == args_len) {
    +                fatal("arg %d for call %s not covered", j, call->_name);
    +              }
    +            }
    +          }
    +        } else {
    +          for (uint j = TypeFunc::Parms; j < call->req(); j++) {
    +            if (call->in(j)->bottom_type()->make_ptr() &&
    +                call->in(j)->bottom_type()->make_ptr()->isa_oopptr()) {
    +              fatal("%s not covered", call->_name);
    +            }
    +          }
    +        }
    +      }
    +    } else if (n->is_ShenandoahBarrier()) {
    +      assert(!barriers.contains(n), "");
    +      assert(n->Opcode() != Op_ShenandoahWriteBarrier || n->find_out_with(Op_ShenandoahWBMemProj) != NULL, "bad shenandoah write barrier");
    +      assert(n->Opcode() != Op_ShenandoahWriteBarrier || n->outcnt() > 1, "bad shenandoah write barrier");
    +      barriers.push(n);
    +    } else if (n->Opcode() == Op_ShenandoahEnqueueBarrier) {
    +      // skip
    +    } else if (n->Opcode() == Op_ShenandoahWBMemProj) {
    +      assert(n->in(0) == NULL && n->in(ShenandoahWBMemProjNode::WriteBarrier)->Opcode() == Op_ShenandoahWriteBarrier, "strange ShenandoahWBMemProj");
    +    } else if (n->is_AddP()
    +               || n->is_Phi()
    +               || n->is_ConstraintCast()
    +               || n->Opcode() == Op_Return
    +               || n->Opcode() == Op_CMoveP
    +               || n->Opcode() == Op_CMoveN
    +               || n->Opcode() == Op_Rethrow
    +               || n->is_MemBar()
    +               || n->Opcode() == Op_Conv2B
    +               || n->Opcode() == Op_SafePoint
    +               || n->is_CallJava()
    +               || n->Opcode() == Op_Unlock
    +               || n->Opcode() == Op_EncodeP
    +               || n->Opcode() == Op_DecodeN) {
    +      // nothing to do
    +    } else {
    +      static struct {
    +        int opcode;
    +        struct {
    +          int pos;
    +          verify_type t;
    +        } inputs[2];
    +      } others[] = {
    +        Op_FastLock,
    +        { { 1, ShenandoahLoad },                  { -1, ShenandoahNone} },
    +        Op_Lock,
    +        { { TypeFunc::Parms, ShenandoahLoad },    { -1, ShenandoahNone} },
    +        Op_ArrayCopy,
    +        { { ArrayCopyNode::Src, ShenandoahLoad }, { ArrayCopyNode::Dest, ShenandoahStore } },
    +        Op_StrCompressedCopy,
    +        { { 2, ShenandoahLoad },                  { 3, ShenandoahStore } },
    +        Op_StrInflatedCopy,
    +        { { 2, ShenandoahLoad },                  { 3, ShenandoahStore } },
    +        Op_AryEq,
    +        { { 2, ShenandoahLoad },                  { 3, ShenandoahLoad } },
    +        Op_StrIndexOf,
    +        { { 2, ShenandoahLoad },                  { 4, ShenandoahLoad } },
    +        Op_StrComp,
    +        { { 2, ShenandoahLoad },                  { 4, ShenandoahLoad } },
    +        Op_StrEquals,
    +        { { 2, ShenandoahLoad },                  { 3, ShenandoahLoad } },
    +        Op_EncodeISOArray,
    +        { { 2, ShenandoahLoad },                  { 3, ShenandoahStore } },
    +        Op_HasNegatives,
    +        { { 2, ShenandoahLoad },                  { -1, ShenandoahNone} },
    +        Op_CastP2X,
    +        { { 1, ShenandoahLoad },                  { -1, ShenandoahNone} },
    +        Op_StrIndexOfChar,
    +        { { 2, ShenandoahLoad },                  { -1, ShenandoahNone } },
    +      };
    +
    +      const int others_len = sizeof(others) / sizeof(others[0]);
    +      int i = 0;
    +      for (; i < others_len; i++) {
    +        if (others[i].opcode == n->Opcode()) {
    +          break;
    +        }
    +      }
    +      uint stop = n->is_Call() ? n->as_Call()->tf()->domain()->cnt() : n->req();
    +      if (i != others_len) {
    +        const uint inputs_len = sizeof(others[0].inputs) / sizeof(others[0].inputs[0]);
    +        for (uint j = 0; j < inputs_len; j++) {
    +          int pos = others[i].inputs[j].pos;
    +          if (pos == -1) {
    +            break;
    +          }
    +          if (!ShenandoahBarrierNode::verify_helper(n->in(pos), phis, visited, others[i].inputs[j].t, trace, barriers_used)) {
    +            report_verify_failure("Shenandoah verification: intrinsic calls should have barriers", n);
    +          }
    +        }
    +        for (uint j = 1; j < stop; j++) {
    +          if (n->in(j) != NULL && n->in(j)->bottom_type()->make_ptr() &&
    +              n->in(j)->bottom_type()->make_ptr()->make_oopptr()) {
    +            uint k = 0;
    +            for (; k < inputs_len && others[i].inputs[k].pos != (int)j; k++);
    +            if (k == inputs_len) {
    +              fatal("arg %d for node %s not covered", j, n->Name());
    +            }
    +          }
    +        }
    +      } else {
    +        for (uint j = 1; j < stop; j++) {
    +          if (n->in(j) != NULL && n->in(j)->bottom_type()->make_ptr() &&
    +              n->in(j)->bottom_type()->make_ptr()->make_oopptr()) {
    +            fatal("%s not covered", n->Name());
    +          }
    +        }
    +      }
    +    }
    +
    +    if (n->is_SafePoint()) {
    +      SafePointNode* sfpt = n->as_SafePoint();
    +      if (verify_no_useless_barrier && sfpt->jvms() != NULL) {
    +        for (uint i = sfpt->jvms()->scloff(); i < sfpt->jvms()->endoff(); i++) {
    +          if (!ShenandoahBarrierNode::verify_helper(sfpt->in(i), phis, visited, ShenandoahLoad, trace, barriers_used)) {
    +            phis.clear();
    +            visited.Reset();
    +          }
    +        }
    +      }
    +    }
    +    for( uint i = 0; i < n->len(); ++i ) {
    +      Node *m = n->in(i);
    +      if (m == NULL) continue;
    +
    +      // In most cases, inputs should be known to be non null. If it's
    +      // not the case, it could be a missing cast_not_null() in an
    +      // intrinsic or support might be needed in AddPNode::Ideal() to
    +      // avoid a NULL+offset input.
    +      if (!(n->is_Phi() ||
    +            (n->is_SafePoint() && (!n->is_CallRuntime() || !strcmp(n->as_Call()->_name, "shenandoah_wb_pre") || !strcmp(n->as_Call()->_name, "unsafe_arraycopy"))) ||
    +            n->Opcode() == Op_CmpP ||
    +            n->Opcode() == Op_CmpN ||
    +            (n->Opcode() == Op_StoreP && i == StoreNode::ValueIn) ||
    +            (n->Opcode() == Op_StoreN && i == StoreNode::ValueIn) ||
    +            n->is_ConstraintCast() ||
    +            n->Opcode() == Op_Return ||
    +            n->Opcode() == Op_Conv2B ||
    +            n->is_AddP() ||
    +            n->Opcode() == Op_CMoveP ||
    +            n->Opcode() == Op_CMoveN ||
    +            n->Opcode() == Op_Rethrow ||
    +            n->is_MemBar() ||
    +            n->is_Mem() ||
    +            n->Opcode() == Op_AryEq ||
    +            n->Opcode() == Op_SCMemProj ||
    +            n->Opcode() == Op_EncodeP ||
    +            n->Opcode() == Op_DecodeN ||
    +            n->Opcode() == Op_ShenandoahWriteBarrier ||
    +            n->Opcode() == Op_ShenandoahWBMemProj ||
    +            n->Opcode() == Op_ShenandoahEnqueueBarrier)) {
    +        if (m->bottom_type()->make_oopptr() && m->bottom_type()->make_oopptr()->meet(TypePtr::NULL_PTR) == m->bottom_type()) {
    +          report_verify_failure("Shenandoah verification: null input", n, m);
    +        }
    +      }
    +
    +      wq.push(m);
    +    }
    +  }
    +
    +  if (verify_no_useless_barrier) {
    +    for (int i = 0; i < barriers.length(); i++) {
    +      Node* n = barriers.at(i);
    +      if (!barriers_used.member(n)) {
    +        tty->print("XXX useless barrier"); n->dump(-2);
    +        ShouldNotReachHere();
    +      }
    +    }
    +  }
    +}
    +#endif
    +
    +bool ShenandoahBarrierNode::is_dominator_same_ctrl(Node*c, Node* d, Node* n, PhaseIdealLoop* phase) {
    +  // That both nodes have the same control is not sufficient to prove
    +  // domination, verify that there's no path from d to n
    +  ResourceMark rm;
    +  Unique_Node_List wq;
    +  wq.push(d);
    +  for (uint next = 0; next < wq.size(); next++) {
    +    Node *m = wq.at(next);
    +    if (m == n) {
    +      return false;
    +    }
    +    if (m->is_Phi() && m->in(0)->is_Loop()) {
    +      assert(phase->ctrl_or_self(m->in(LoopNode::EntryControl)) != c, "following loop entry should lead to new control");
    +    } else {
    +      for (uint i = 0; i < m->req(); i++) {
    +        if (m->in(i) != NULL && phase->ctrl_or_self(m->in(i)) == c) {
    +          wq.push(m->in(i));
    +        }
    +      }
    +    }
    +  }
    +  return true;
    +}
    +
    +bool ShenandoahBarrierNode::is_dominator(Node *d_c, Node *n_c, Node* d, Node* n, PhaseIdealLoop* phase) {
    +  if (d_c != n_c) {
    +    return phase->is_dominator(d_c, n_c);
    +  }
    +  return is_dominator_same_ctrl(d_c, d, n, phase);
    +}
    +
    +Node* next_mem(Node* mem, int alias) {
    +  Node* res = NULL;
    +  if (mem->is_Proj()) {
    +    res = mem->in(0);
    +  } else if (mem->is_SafePoint() || mem->is_MemBar()) {
    +    res = mem->in(TypeFunc::Memory);
    +  } else if (mem->is_Phi()) {
    +    res = mem->in(1);
    +  } else if (mem->is_ShenandoahBarrier()) {
    +    res = mem->in(ShenandoahBarrierNode::Memory);
    +  } else if (mem->is_MergeMem()) {
    +    res = mem->as_MergeMem()->memory_at(alias);
    +  } else if (mem->is_Store() || mem->is_LoadStore() || mem->is_ClearArray()) {
    +    assert(alias = Compile::AliasIdxRaw, "following raw memory can't lead to a barrier");
    +    res = mem->in(MemNode::Memory);
    +  } else if (mem->Opcode() == Op_ShenandoahWBMemProj) {
    +    res = mem->in(ShenandoahWBMemProjNode::WriteBarrier);
    +  } else {
    +#ifdef ASSERT
    +    mem->dump();
    +#endif
    +    ShouldNotReachHere();
    +  }
    +  return res;
    +}
    +
    +Node* ShenandoahBarrierNode::no_branches(Node* c, Node* dom, bool allow_one_proj, PhaseIdealLoop* phase) {
    +  Node* iffproj = NULL;
    +  while (c != dom) {
    +    Node* next = phase->idom(c);
    +    assert(next->unique_ctrl_out() == c || c->is_Proj() || c->is_Region(), "multiple control flow out but no proj or region?");
    +    if (c->is_Region()) {
    +      ResourceMark rm;
    +      Unique_Node_List wq;
    +      wq.push(c);
    +      for (uint i = 0; i < wq.size(); i++) {
    +        Node *n = wq.at(i);
    +        if (n == next) {
    +          continue;
    +        }
    +        if (n->is_Region()) {
    +          for (uint j = 1; j < n->req(); j++) {
    +            wq.push(n->in(j));
    +          }
    +        } else {
    +          wq.push(n->in(0));
    +        }
    +      }
    +      for (uint i = 0; i < wq.size(); i++) {
    +        Node *n = wq.at(i);
    +        assert(n->is_CFG(), "");
    +        if (n->is_Multi()) {
    +          for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
    +            Node* u = n->fast_out(j);
    +            if (u->is_CFG()) {
    +              if (!wq.member(u) && !u->as_Proj()->is_uncommon_trap_proj(Deoptimization::Reason_none)) {
    +                return NodeSentinel;
    +              }
    +            }
    +          }
    +        }
    +      }
    +    } else  if (c->is_Proj()) {
    +      if (c->is_IfProj()) {
    +        if (c->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none) != NULL) {
    +          // continue;
    +        } else {
    +          if (!allow_one_proj) {
    +            return NodeSentinel;
    +          }
    +          if (iffproj == NULL) {
    +            iffproj = c;
    +          } else {
    +            return NodeSentinel;
    +          }
    +        }
    +      } else if (c->Opcode() == Op_JumpProj) {
    +        return NodeSentinel; // unsupported
    +      } else if (c->Opcode() == Op_CatchProj) {
    +        return NodeSentinel; // unsupported
    +      } else if (c->Opcode() == Op_CProj && next->Opcode() == Op_NeverBranch) {
    +        return NodeSentinel; // unsupported
    +      } else {
    +        assert(next->unique_ctrl_out() == c, "unsupported branch pattern");
    +      }
    +    }
    +    c = next;
    +  }
    +  return iffproj;
    +}
    +
    +bool ShenandoahBarrierNode::build_loop_late_post(PhaseIdealLoop* phase, Node* n) {
    +  if (n->Opcode() == Op_ShenandoahReadBarrier ||
    +      n->Opcode() == Op_ShenandoahWriteBarrier ||
    +      n->Opcode() == Op_ShenandoahWBMemProj) {
    +
    +    phase->build_loop_late_post_work(n, false);
    +
    +    if (n->Opcode() == Op_ShenandoahWriteBarrier) {
    +      // The write barrier and its memory proj must have the same
    +      // control otherwise some loop opts could put nodes (Phis) between
    +      // them
    +      Node* proj = n->find_out_with(Op_ShenandoahWBMemProj);
    +      if (proj != NULL) {
    +        phase->set_ctrl_and_loop(proj, phase->get_ctrl(n));
    +      }
    +    }
    +    return true;
    +  }
    +  return false;
    +}
    +
    +bool ShenandoahBarrierNode::sink_node(PhaseIdealLoop* phase, Node* ctrl, Node* n_ctrl) {
    +  ctrl = phase->find_non_split_ctrl(ctrl);
    +  assert(phase->dom_depth(n_ctrl) <= phase->dom_depth(ctrl), "n is later than its clone");
    +  set_req(0, ctrl);
    +  phase->register_new_node(this, ctrl);
    +  return true;
    +}
    +
    +#ifdef ASSERT
    +void ShenandoahWriteBarrierNode::memory_dominates_all_paths_helper(Node* c, Node* rep_ctrl, Unique_Node_List& controls, PhaseIdealLoop* phase) {
    +  const bool trace = false;
    +  if (trace) { tty->print("X control is"); c->dump(); }
    +
    +  uint start = controls.size();
    +  controls.push(c);
    +  for (uint i = start; i < controls.size(); i++) {
    +    Node *n = controls.at(i);
    +
    +    if (trace) { tty->print("X from"); n->dump(); }
    +
    +    if (n == rep_ctrl) {
    +      continue;
    +    }
    +
    +    if (n->is_Proj()) {
    +      Node* n_dom = n->in(0);
    +      IdealLoopTree* n_dom_loop = phase->get_loop(n_dom);
    +      if (n->is_IfProj() && n_dom->outcnt() == 2) {
    +        n_dom_loop = phase->get_loop(n_dom->as_If()->proj_out(n->as_Proj()->_con == 0 ? 1 : 0));
    +      }
    +      if (n_dom_loop != phase->ltree_root()) {
    +        Node* tail = n_dom_loop->tail();
    +        if (tail->is_Region()) {
    +          for (uint j = 1; j < tail->req(); j++) {
    +            if (phase->is_dominator(n_dom, tail->in(j)) && !phase->is_dominator(n, tail->in(j))) {
    +              assert(phase->is_dominator(rep_ctrl, tail->in(j)), "why are we here?");
    +              // entering loop from below, mark backedge
    +              if (trace) { tty->print("X pushing backedge"); tail->in(j)->dump(); }
    +              controls.push(tail->in(j));
    +              //assert(n->in(0) == n_dom, "strange flow control");
    +            }
    +          }
    +        } else if (phase->get_loop(n) != n_dom_loop && phase->is_dominator(n_dom, tail)) {
    +          // entering loop from below, mark backedge
    +          if (trace) { tty->print("X pushing backedge"); tail->dump(); }
    +          controls.push(tail);
    +          //assert(n->in(0) == n_dom, "strange flow control");
    +        }
    +      }
    +    }
    +
    +    if (n->is_Loop()) {
    +      Node* c = n->in(LoopNode::EntryControl);
    +      if (trace) { tty->print("X pushing"); c->dump(); }
    +      controls.push(c);
    +    } else if (n->is_Region()) {
    +      for (uint i = 1; i < n->req(); i++) {
    +        Node* c = n->in(i);
    +        if (trace) { tty->print("X pushing"); c->dump(); }
    +        controls.push(c);
    +      }
    +    } else {
    +      Node* c = n->in(0);
    +      if (trace) { tty->print("X pushing"); c->dump(); }
    +      controls.push(c);
    +    }
    +  }
    +}
    +
    +bool ShenandoahWriteBarrierNode::memory_dominates_all_paths(Node* mem, Node* rep_ctrl, int alias, PhaseIdealLoop* phase) {
    +  const bool trace = false;
    +  if (trace) {
    +    tty->print("XXX mem is"); mem->dump();
    +    tty->print("XXX rep ctrl is"); rep_ctrl->dump();
    +    tty->print_cr("XXX alias is %d", alias);
    +  }
    +  ResourceMark rm;
    +  Unique_Node_List wq;
    +  Unique_Node_List controls;
    +  wq.push(mem);
    +  for (uint next = 0; next < wq.size(); next++) {
    +    Node *nn = wq.at(next);
    +    if (trace) { tty->print("XX from mem"); nn->dump(); }
    +    assert(nn->bottom_type() == Type::MEMORY, "memory only");
    +
    +    if (nn->is_Phi()) {
    +      Node* r = nn->in(0);
    +      for (DUIterator_Fast jmax, j = r->fast_outs(jmax); j < jmax; j++) {
    +        Node* u = r->fast_out(j);
    +        if (u->is_Phi() && u->bottom_type() == Type::MEMORY && u != nn &&
    +            (u->adr_type() == TypePtr::BOTTOM || phase->C->get_alias_index(u->adr_type()) == alias)) {
    +          if (trace) { tty->print("XX Next mem (other phi)"); u->dump(); }
    +          wq.push(u);
    +        }
    +      }
    +    }
    +
    +    for (DUIterator_Fast imax, i = nn->fast_outs(imax); i < imax; i++) {
    +      Node* use = nn->fast_out(i);
    +
    +      if (trace) { tty->print("XX use %p", use->adr_type()); use->dump(); }
    +      if (use->is_CFG() && use->in(TypeFunc::Memory) == nn) {
    +        Node* c = use->in(0);
    +        if (phase->is_dominator(rep_ctrl, c)) {
    +          memory_dominates_all_paths_helper(c, rep_ctrl, controls, phase);
    +        } else if (use->is_CallStaticJava() && use->as_CallStaticJava()->uncommon_trap_request() != 0 && c->is_Region()) {
    +          Node* region = c;
    +          if (trace) { tty->print("XX unc region"); region->dump(); }
    +          for (uint j = 1; j < region->req(); j++) {
    +            if (phase->is_dominator(rep_ctrl, region->in(j))) {
    +              if (trace) { tty->print("XX unc follows"); region->in(j)->dump(); }
    +              memory_dominates_all_paths_helper(region->in(j), rep_ctrl, controls, phase);
    +            }
    +          }
    +        }
    +        //continue;
    +      } else if (use->is_Phi()) {
    +        assert(use->bottom_type() == Type::MEMORY, "bad phi");
    +        if ((use->adr_type() == TypePtr::BOTTOM) ||
    +            phase->C->get_alias_index(use->adr_type()) == alias) {
    +          for (uint j = 1; j < use->req(); j++) {
    +            if (use->in(j) == nn) {
    +              Node* c = use->in(0)->in(j);
    +              if (phase->is_dominator(rep_ctrl, c)) {
    +                memory_dominates_all_paths_helper(c, rep_ctrl, controls, phase);
    +              }
    +            }
    +          }
    +        }
    +        //        continue;
    +      }
    +
    +      if (use->is_MergeMem()) {
    +        if (use->as_MergeMem()->memory_at(alias) == nn) {
    +          if (trace) { tty->print("XX Next mem"); use->dump(); }
    +          // follow the memory edges
    +          wq.push(use);
    +        }
    +      } else if (use->is_Phi()) {
    +        assert(use->bottom_type() == Type::MEMORY, "bad phi");
    +        if ((use->adr_type() == TypePtr::BOTTOM) ||
    +            phase->C->get_alias_index(use->adr_type()) == alias) {
    +          if (trace) { tty->print("XX Next mem"); use->dump(); }
    +          // follow the memory edges
    +          wq.push(use);
    +        }
    +      } else if (use->bottom_type() == Type::MEMORY &&
    +                 (use->adr_type() == TypePtr::BOTTOM || phase->C->get_alias_index(use->adr_type()) == alias)) {
    +        if (trace) { tty->print("XX Next mem"); use->dump(); }
    +        // follow the memory edges
    +        wq.push(use);
    +      } else if ((use->is_SafePoint() || use->is_MemBar()) &&
    +                 (use->adr_type() == TypePtr::BOTTOM || phase->C->get_alias_index(use->adr_type()) == alias)) {
    +        for (DUIterator_Fast jmax, j = use->fast_outs(jmax); j < jmax; j++) {
    +          Node* u = use->fast_out(j);
    +          if (u->bottom_type() == Type::MEMORY) {
    +            if (trace) { tty->print("XX Next mem"); u->dump(); }
    +            // follow the memory edges
    +            wq.push(u);
    +          }
    +        }
    +      } else if (use->Opcode() == Op_ShenandoahWriteBarrier && phase->C->get_alias_index(use->adr_type()) == alias) {
    +        Node* m = use->find_out_with(Op_ShenandoahWBMemProj);
    +        if (m != NULL) {
    +          if (trace) { tty->print("XX Next mem"); m->dump(); }
    +          // follow the memory edges
    +          wq.push(m);
    +        }
    +      }
    +    }
    +  }
    +
    +  if (controls.size() == 0) {
    +    return false;
    +  }
    +
    +  for (uint i = 0; i < controls.size(); i++) {
    +    Node *n = controls.at(i);
    +
    +    if (trace) { tty->print("X checking"); n->dump(); }
    +
    +    if (n->unique_ctrl_out() != NULL) {
    +      continue;
    +    }
    +
    +    if (n->Opcode() == Op_NeverBranch) {
    +      Node* taken = n->as_Multi()->proj_out(0);
    +      if (!controls.member(taken)) {
    +        if (trace) { tty->print("X not seen"); taken->dump(); }
    +        return false;
    +      }
    +      continue;
    +    }
    +
    +    for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
    +      Node* u = n->fast_out(j);
    +
    +      if (u->is_CFG()) {
    +        if (!controls.member(u)) {
    +          if (u->is_Proj() && u->as_Proj()->is_uncommon_trap_proj(Deoptimization::Reason_none)) {
    +            if (trace) { tty->print("X not seen but unc"); u->dump(); }
    +          } else {
    +            Node* c = u;
    +            do {
    +              c = c->unique_ctrl_out();
    +            } while (c != NULL && c->is_Region());
    +            if (c != NULL && c->Opcode() == Op_Halt) {
    +              if (trace) { tty->print("X not seen but halt"); c->dump(); }
    +            } else {
    +              if (trace) { tty->print("X not seen"); u->dump(); }
    +              return false;
    +            }
    +          }
    +        } else {
    +          if (trace) { tty->print("X seen"); u->dump(); }
    +        }
    +      }
    +    }
    +  }
    +  return true;
    +}
    +#endif
    +
    +Node* ShenandoahBarrierNode::dom_mem(Node* mem, Node*& mem_ctrl, Node* n, Node* rep_ctrl, int alias, PhaseIdealLoop* phase) {
    +  ResourceMark rm;
    +  VectorSet wq(Thread::current()->resource_area());
    +  wq.set(mem->_idx);
    +  mem_ctrl = phase->get_ctrl(mem);
    +  while (!is_dominator(mem_ctrl, rep_ctrl, mem, n, phase)) {
    +    mem = next_mem(mem, alias);
    +    if (wq.test_set(mem->_idx)) {
    +      return NULL; // hit an unexpected loop
    +    }
    +    mem_ctrl = phase->ctrl_or_self(mem);
    +  }
    +  if (mem->is_MergeMem()) {
    +    mem = mem->as_MergeMem()->memory_at(alias);
    +    mem_ctrl = phase->ctrl_or_self(mem);
    +  }
    +  return mem;
    +}
    +
    +Node* ShenandoahBarrierNode::dom_mem(Node* mem, Node* ctrl, int alias, Node*& mem_ctrl, PhaseIdealLoop* phase) {
    +  ResourceMark rm;
    +  VectorSet wq(Thread::current()->resource_area());
    +  wq.set(mem->_idx);
    +  mem_ctrl = phase->ctrl_or_self(mem);
    +  while (!phase->is_dominator(mem_ctrl, ctrl) || mem_ctrl == ctrl) {
    +    mem = next_mem(mem, alias);
    +    if (wq.test_set(mem->_idx)) {
    +      return NULL;
    +    }
    +    mem_ctrl = phase->ctrl_or_self(mem);
    +  }
    +  if (mem->is_MergeMem()) {
    +    mem = mem->as_MergeMem()->memory_at(alias);
    +    mem_ctrl = phase->ctrl_or_self(mem);
    +  }
    +  return mem;
    +}
    +
    +static void disconnect_barrier_mem(Node* wb, PhaseIterGVN& igvn) {
    +  Node* mem_in = wb->in(ShenandoahBarrierNode::Memory);
    +  Node* proj = wb->find_out_with(Op_ShenandoahWBMemProj);
    +
    +  for (DUIterator_Last imin, i = proj->last_outs(imin); i >= imin; ) {
    +    Node* u = proj->last_out(i);
    +    igvn.rehash_node_delayed(u);
    +    int nb = u->replace_edge(proj, mem_in);
    +    assert(nb > 0, "no replacement?");
    +    i -= nb;
    +  }
    +}
    +
    +Node* ShenandoahWriteBarrierNode::move_above_predicates(LoopNode* cl, Node* val_ctrl, PhaseIdealLoop* phase) {
    +  Node* entry = cl->skip_strip_mined(-1)->in(LoopNode::EntryControl);
    +  Node* above_pred = phase->skip_all_loop_predicates(entry);
    +  Node* ctrl = entry;
    +  while (ctrl != above_pred) {
    +    Node* next = ctrl->in(0);
    +    if (!phase->is_dominator(val_ctrl, next)) {
    +      break;
    +    }
    +    ctrl = next;
    +  }
    +  return ctrl;
    +}
    +
    +static MemoryGraphFixer* find_fixer(GrowableArray& memory_graph_fixers, int alias) {
    +  for (int i = 0; i < memory_graph_fixers.length(); i++) {
    +    if (memory_graph_fixers.at(i)->alias() == alias) {
    +      return memory_graph_fixers.at(i);
    +    }
    +  }
    +  return NULL;
    +}
    +
    +static MemoryGraphFixer* create_fixer(GrowableArray& memory_graph_fixers, int alias, PhaseIdealLoop* phase, bool include_lsm) {
    +  assert(find_fixer(memory_graph_fixers, alias) == NULL, "none should exist yet");
    +  MemoryGraphFixer* fixer = new MemoryGraphFixer(alias, include_lsm, phase);
    +  memory_graph_fixers.push(fixer);
    +  return fixer;
    +}
    +
    +void ShenandoahWriteBarrierNode::try_move_before_loop_helper(LoopNode* cl, Node* val_ctrl, GrowableArray& memory_graph_fixers, PhaseIdealLoop* phase, bool include_lsm, Unique_Node_List& uses) {
    +  assert(cl->is_Loop(), "bad control");
    +  Node* ctrl = move_above_predicates(cl, val_ctrl, phase);
    +  Node* mem_ctrl = NULL;
    +  int alias = phase->C->get_alias_index(adr_type());
    +
    +  MemoryGraphFixer* fixer = find_fixer(memory_graph_fixers, alias);
    +  if (fixer == NULL) {
    +    fixer = create_fixer(memory_graph_fixers, alias, phase, include_lsm);
    +  }
    +
    +  Node* proj = find_out_with(Op_ShenandoahWBMemProj);
    +
    +  fixer->remove(proj);
    +  Node* mem = fixer->find_mem(ctrl, NULL);
    +
    +  assert(!ShenandoahVerifyOptoBarriers || memory_dominates_all_paths(mem, ctrl, alias, phase), "can't fix the memory graph");
    +
    +  phase->set_ctrl_and_loop(this, ctrl);
    +  phase->igvn().replace_input_of(this, Control, ctrl);
    +
    +  disconnect_barrier_mem(this, phase->igvn());
    +
    +  phase->igvn().replace_input_of(this, Memory, mem);
    +  phase->set_ctrl_and_loop(proj, ctrl);
    +
    +  fixer->fix_mem(ctrl, ctrl, mem, mem, proj, uses);
    +  assert(proj->outcnt() > 0, "disconnected write barrier");
    +}
    +
    +LoopNode* ShenandoahWriteBarrierNode::try_move_before_pre_loop(Node* c, Node* val_ctrl, PhaseIdealLoop* phase) {
    +  // A write barrier between a pre and main loop can get in the way of
    +  // vectorization. Move it above the pre loop if possible
    +  CountedLoopNode* cl = NULL;
    +  if (c->is_IfFalse() &&
    +      c->in(0)->is_CountedLoopEnd()) {
    +    cl = c->in(0)->as_CountedLoopEnd()->loopnode();
    +  } else if (c->is_IfProj() &&
    +             c->in(0)->is_If() &&
    +             c->in(0)->in(0)->is_IfFalse() &&
    +             c->in(0)->in(0)->in(0)->is_CountedLoopEnd()) {
    +    cl = c->in(0)->in(0)->in(0)->as_CountedLoopEnd()->loopnode();
    +  }
    +  if (cl != NULL &&
    +      cl->is_pre_loop() &&
    +      val_ctrl != cl &&
    +      phase->is_dominator(val_ctrl, cl)) {
    +    return cl;
    +  }
    +  return NULL;
    +}
    +
    +void ShenandoahWriteBarrierNode::try_move_before_loop(GrowableArray& memory_graph_fixers, PhaseIdealLoop* phase, bool include_lsm, Unique_Node_List& uses) {
    +  Node *n_ctrl = phase->get_ctrl(this);
    +  IdealLoopTree *n_loop = phase->get_loop(n_ctrl);
    +  Node* val = in(ValueIn);
    +  Node* val_ctrl = phase->get_ctrl(val);
    +  if (n_loop != phase->ltree_root() && !n_loop->_irreducible) {
    +    IdealLoopTree *val_loop = phase->get_loop(val_ctrl);
    +    Node* mem = in(Memory);
    +    IdealLoopTree *mem_loop = phase->get_loop(phase->get_ctrl(mem));
    +    if (!n_loop->is_member(val_loop) &&
    +        n_loop->is_member(mem_loop)) {
    +      Node* n_loop_head = n_loop->_head;
    +
    +      if (n_loop_head->is_Loop()) {
    +        LoopNode* loop = n_loop_head->as_Loop();
    +        if (n_loop_head->is_CountedLoop() && n_loop_head->as_CountedLoop()->is_main_loop()) {
    +          LoopNode* res = try_move_before_pre_loop(n_loop_head->in(LoopNode::EntryControl), val_ctrl, phase);
    +          if (res != NULL) {
    +            loop = res;
    +          }
    +        }
    +
    +        try_move_before_loop_helper(loop, val_ctrl, memory_graph_fixers, phase, include_lsm, uses);
    +      }
    +    }
    +  }
    +  LoopNode* ctrl = try_move_before_pre_loop(in(0), val_ctrl, phase);
    +  if (ctrl != NULL) {
    +    try_move_before_loop_helper(ctrl, val_ctrl, memory_graph_fixers, phase, include_lsm, uses);
    +  }
    +}
    +
    +Node* ShenandoahWriteBarrierNode::would_subsume(ShenandoahBarrierNode* other, PhaseIdealLoop* phase) {
    +  Node* val = in(ValueIn);
    +  Node* val_ctrl = phase->get_ctrl(val);
    +  Node* other_mem = other->in(Memory);
    +  Node* other_ctrl = phase->get_ctrl(other);
    +  Node* this_ctrl = phase->get_ctrl(this);
    +  IdealLoopTree* this_loop = phase->get_loop(this_ctrl);
    +  IdealLoopTree* other_loop = phase->get_loop(other_ctrl);
    +
    +  Node* ctrl = phase->dom_lca(other_ctrl, this_ctrl);
    +
    +  if (ctrl->is_Proj() &&
    +      ctrl->in(0)->is_Call() &&
    +      ctrl->unique_ctrl_out() != NULL &&
    +      ctrl->unique_ctrl_out()->Opcode() == Op_Catch &&
    +      !phase->is_dominator(val_ctrl, ctrl->in(0)->in(0))) {
    +    return NULL;
    +  }
    +
    +  IdealLoopTree* loop = phase->get_loop(ctrl);
    +
    +  // We don't want to move a write barrier in a loop
    +  // If the LCA is in a inner loop, try a control out of loop if possible
    +  while (!loop->is_member(this_loop) && (other->Opcode() != Op_ShenandoahWriteBarrier || !loop->is_member(other_loop))) {
    +    ctrl = phase->idom(ctrl);
    +    if (ctrl->is_MultiBranch()) {
    +      ctrl = ctrl->in(0);
    +    }
    +    if (ctrl != val_ctrl && phase->is_dominator(ctrl, val_ctrl)) {
    +      return NULL;
    +    }
    +    loop = phase->get_loop(ctrl);
    +  }
    +
    +  if (ShenandoahDontIncreaseWBFreq) {
    +    Node* this_iffproj = no_branches(this_ctrl, ctrl, true, phase);
    +    if (other->Opcode() == Op_ShenandoahWriteBarrier) {
    +      Node* other_iffproj = no_branches(other_ctrl, ctrl, true, phase);
    +      if (other_iffproj == NULL || this_iffproj == NULL) {
    +        return ctrl;
    +      } else if (other_iffproj != NodeSentinel && this_iffproj != NodeSentinel &&
    +                 other_iffproj->in(0) == this_iffproj->in(0)) {
    +        return ctrl;
    +      }
    +    } else if (this_iffproj == NULL) {
    +      return ctrl;
    +    }
    +    return NULL;
    +  }
    +
    +  return ctrl;
    +}
    +
    +void ShenandoahWriteBarrierNode::optimize_before_expansion(PhaseIdealLoop* phase, GrowableArray memory_graph_fixers, bool include_lsm) {
    +  bool progress = false;
    +  Unique_Node_List uses;
    +  do {
    +    progress = false;
    +    for (int i = 0; i < ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barriers_count(); i++) {
    +      ShenandoahWriteBarrierNode* wb = ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barrier(i);
    +
    +      wb->try_move_before_loop(memory_graph_fixers, phase, include_lsm, uses);
    +
    +      Node* val = wb->in(ValueIn);
    +
    +      for (DUIterator_Fast jmax, j = val->fast_outs(jmax); j < jmax; j++) {
    +        Node* u = val->fast_out(j);
    +        if (u != wb && u->is_ShenandoahBarrier()) {
    +          Node* rep_ctrl = wb->would_subsume(u->as_ShenandoahBarrier(), phase);
    +
    +          if (rep_ctrl != NULL) {
    +            Node* other = u;
    +            Node* val_ctrl = phase->get_ctrl(val);
    +            if (rep_ctrl->is_Proj() &&
    +                rep_ctrl->in(0)->is_Call() &&
    +                rep_ctrl->unique_ctrl_out() != NULL &&
    +                rep_ctrl->unique_ctrl_out()->Opcode() == Op_Catch) {
    +              rep_ctrl = rep_ctrl->in(0)->in(0);
    +
    +              assert(phase->is_dominator(val_ctrl, rep_ctrl), "bad control");
    +            } else {
    +              LoopNode* c = ShenandoahWriteBarrierNode::try_move_before_pre_loop(rep_ctrl, val_ctrl, phase);
    +              if (c != NULL) {
    +                rep_ctrl = ShenandoahWriteBarrierNode::move_above_predicates(c, val_ctrl, phase);
    +              } else {
    +                while (rep_ctrl->is_IfProj()) {
    +                  CallStaticJavaNode* unc = rep_ctrl->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none);
    +                  if (unc != NULL) {
    +                    int req = unc->uncommon_trap_request();
    +                    Deoptimization::DeoptReason trap_reason = Deoptimization::trap_request_reason(req);
    +                    if ((trap_reason == Deoptimization::Reason_loop_limit_check ||
    +                         trap_reason == Deoptimization::Reason_predicate ||
    +                         trap_reason == Deoptimization::Reason_profile_predicate) &&
    +                        phase->is_dominator(val_ctrl, rep_ctrl->in(0)->in(0))) {
    +                      rep_ctrl = rep_ctrl->in(0)->in(0);
    +                      continue;
    +                    }
    +                  }
    +                  break;
    +                }
    +              }
    +            }
    +
    +            Node* wb_ctrl = phase->get_ctrl(wb);
    +            Node* other_ctrl = phase->get_ctrl(other);
    +            int alias = phase->C->get_alias_index(wb->adr_type());
    +            MemoryGraphFixer* fixer = find_fixer(memory_graph_fixers, alias);;
    +            if (!is_dominator(wb_ctrl, other_ctrl, wb, other, phase)) {
    +              if (fixer == NULL) {
    +                fixer = create_fixer(memory_graph_fixers, alias, phase, include_lsm);
    +              }
    +              Node* mem = fixer->find_mem(rep_ctrl, phase->get_ctrl(other) == rep_ctrl ? other : NULL);
    +
    +              if (mem->has_out_with(Op_Lock) || mem->has_out_with(Op_Unlock)) {
    +                continue;
    +              }
    +
    +              Node* wb_proj = wb->find_out_with(Op_ShenandoahWBMemProj);
    +              fixer->remove(wb_proj);
    +              Node* mem_for_ctrl = fixer->find_mem(rep_ctrl, NULL);
    +
    +              if (wb->in(Memory) != mem) {
    +                disconnect_barrier_mem(wb, phase->igvn());
    +                phase->igvn().replace_input_of(wb, Memory, mem);
    +              }
    +              if (rep_ctrl != wb_ctrl) {
    +                phase->set_ctrl_and_loop(wb, rep_ctrl);
    +                phase->igvn().replace_input_of(wb, Control, rep_ctrl);
    +                phase->set_ctrl_and_loop(wb_proj, rep_ctrl);
    +                progress = true;
    +              }
    +
    +              fixer->fix_mem(rep_ctrl, rep_ctrl, mem, mem_for_ctrl, wb_proj, uses);
    +
    +              assert(!ShenandoahVerifyOptoBarriers || ShenandoahWriteBarrierNode::memory_dominates_all_paths(mem, rep_ctrl, alias, phase), "can't fix the memory graph");
    +            }
    +
    +            if (other->Opcode() == Op_ShenandoahWriteBarrier) {
    +              Node* other_proj = other->find_out_with(Op_ShenandoahWBMemProj);
    +              if (fixer != NULL) {
    +                fixer->remove(other_proj);
    +              }
    +              phase->igvn().replace_node(other_proj, other->in(Memory));
    +            }
    +            phase->igvn().replace_node(other, wb);
    +            --j; --jmax;
    +          }
    +        }
    +      }
    +    }
    +  } while(progress);
    +}
    +
    +// Some code duplication with PhaseIdealLoop::split_if_with_blocks_pre()
    +Node* ShenandoahWriteBarrierNode::try_split_thru_phi(PhaseIdealLoop* phase) {
    +  Node *ctrl = phase->get_ctrl(this);
    +  if (ctrl == NULL) {
    +    return this;
    +  }
    +  Node *blk = phase->has_local_phi_input(this);
    +  if (blk == NULL) {
    +    return this;
    +  }
    +
    +  if (in(0) != blk) {
    +    return this;
    +  }
    +
    +  int policy = blk->req() >> 2;
    +
    +  if (blk->is_CountedLoop()) {
    +    IdealLoopTree *lp = phase->get_loop(blk);
    +    if (lp && lp->_rce_candidate) {
    +      return this;
    +    }
    +  }
    +
    +  if (phase->C->live_nodes() > 35000) {
    +    return this;
    +  }
    +
    +  uint unique = phase->C->unique();
    +  Node *phi = phase->split_thru_phi(this, blk, policy);
    +  if (phi == NULL) {
    +    return this;
    +  }
    +
    +  Node* mem_phi = new PhiNode(blk, Type::MEMORY, phase->C->alias_type(adr_type())->adr_type());
    +  for (uint i = 1; i < blk->req(); i++) {
    +    Node* n = phi->in(i);
    +    if (n->Opcode() == Op_ShenandoahWriteBarrier &&
    +        n->_idx >= unique) {
    +      Node* proj = new ShenandoahWBMemProjNode(n);
    +      phase->register_new_node(proj, phase->get_ctrl(n));
    +      mem_phi->init_req(i, proj);
    +    } else {
    +      Node* mem = in(ShenandoahBarrierNode::Memory);
    +      if (mem->is_Phi() && mem->in(0) == blk) {
    +        mem = mem->in(i);
    +      }
    +      mem_phi->init_req(i, mem);
    +    }
    +  }
    +  phase->register_new_node(mem_phi, blk);
    +
    +
    +  Node* proj = find_out_with(Op_ShenandoahWBMemProj);
    +  phase->igvn().replace_node(proj, mem_phi);
    +  phase->igvn().replace_node(this, phi);
    +
    +  return phi;
    +}
    +
    +void ShenandoahReadBarrierNode::try_move(PhaseIdealLoop* phase) {
    +  Node *n_ctrl = phase->get_ctrl(this);
    +  if (n_ctrl == NULL) {
    +    return;
    +  }
    +  Node* mem = in(MemNode::Memory);
    +  int alias = phase->C->get_alias_index(adr_type());
    +  const bool trace = false;
    +
    +#ifdef ASSERT
    +  if (trace) { tty->print("Trying to move mem of"); dump(); }
    +#endif
    +
    +  Node* new_mem = mem;
    +
    +  ResourceMark rm;
    +  VectorSet seen(Thread::current()->resource_area());
    +  Node_List phis;
    +
    +  for (;;) {
    +#ifdef ASSERT
    +    if (trace) { tty->print("Looking for dominator from"); mem->dump(); }
    +#endif
    +    if (mem->is_Proj() && mem->in(0)->is_Start()) {
    +      if (new_mem != in(MemNode::Memory)) {
    +#ifdef ASSERT
    +        if (trace) { tty->print("XXX Setting mem to"); new_mem->dump(); tty->print(" for "); dump(); }
    +#endif
    +        phase->igvn().replace_input_of(this, MemNode::Memory, new_mem);
    +      }
    +      return;
    +    }
    +
    +    Node* candidate = mem;
    +    do {
    +      if (!is_independent(mem)) {
    +        if (trace) { tty->print_cr("Not independent"); }
    +        if (new_mem != in(MemNode::Memory)) {
    +#ifdef ASSERT
    +          if (trace) { tty->print("XXX Setting mem to"); new_mem->dump(); tty->print(" for "); dump(); }
    +#endif
    +          phase->igvn().replace_input_of(this, MemNode::Memory, new_mem);
    +        }
    +        return;
    +      }
    +      if (seen.test_set(mem->_idx)) {
    +        if (trace) { tty->print_cr("Already seen"); }
    +        ShouldNotReachHere();
    +        // Strange graph
    +        if (new_mem != in(MemNode::Memory)) {
    +#ifdef ASSERT
    +          if (trace) { tty->print("XXX Setting mem to"); new_mem->dump(); tty->print(" for "); dump(); }
    +#endif
    +          phase->igvn().replace_input_of(this, MemNode::Memory, new_mem);
    +        }
    +        return;
    +      }
    +      if (mem->is_Phi()) {
    +        phis.push(mem);
    +      }
    +      mem = next_mem(mem, alias);
    +      if (mem->bottom_type() == Type::MEMORY) {
    +        candidate = mem;
    +      }
    +      assert(is_dominator(phase->ctrl_or_self(mem), n_ctrl, mem, this, phase) == phase->is_dominator(phase->ctrl_or_self(mem), n_ctrl), "strange dominator");
    +#ifdef ASSERT
    +      if (trace) { tty->print("Next mem is"); mem->dump(); }
    +#endif
    +    } while (mem->bottom_type() != Type::MEMORY || !phase->is_dominator(phase->ctrl_or_self(mem), n_ctrl));
    +
    +    assert(mem->bottom_type() == Type::MEMORY, "bad mem");
    +
    +    bool not_dom = false;
    +    for (uint i = 0; i < phis.size() && !not_dom; i++) {
    +      Node* nn = phis.at(i);
    +
    +#ifdef ASSERT
    +      if (trace) { tty->print("Looking from phi"); nn->dump(); }
    +#endif
    +      assert(nn->is_Phi(), "phis only");
    +      for (uint j = 2; j < nn->req() && !not_dom; j++) {
    +        Node* m = nn->in(j);
    +#ifdef ASSERT
    +        if (trace) { tty->print("Input %d is", j); m->dump(); }
    +#endif
    +        while (m != mem && !seen.test_set(m->_idx)) {
    +          if (is_dominator(phase->ctrl_or_self(m), phase->ctrl_or_self(mem), m, mem, phase)) {
    +            not_dom = true;
    +            // Scheduling anomaly
    +#ifdef ASSERT
    +            if (trace) { tty->print("Giving up"); m->dump(); }
    +#endif
    +            break;
    +          }
    +          if (!is_independent(m)) {
    +            if (trace) { tty->print_cr("Not independent"); }
    +            if (new_mem != in(MemNode::Memory)) {
    +#ifdef ASSERT
    +              if (trace) { tty->print("XXX Setting mem to"); new_mem->dump(); tty->print(" for "); dump(); }
    +#endif
    +              phase->igvn().replace_input_of(this, MemNode::Memory, new_mem);
    +            }
    +            return;
    +          }
    +          if (m->is_Phi()) {
    +            phis.push(m);
    +          }
    +          m = next_mem(m, alias);
    +#ifdef ASSERT
    +          if (trace) { tty->print("Next mem is"); m->dump(); }
    +#endif
    +        }
    +      }
    +    }
    +    if (!not_dom) {
    +      new_mem = mem;
    +      phis.clear();
    +    } else {
    +      seen.Clear();
    +    }
    +  }
    +}
    +
    +CallStaticJavaNode* ShenandoahWriteBarrierNode::pin_and_expand_null_check(PhaseIterGVN& igvn) {
    +  Node* val = in(ValueIn);
    +
    +  const Type* val_t = igvn.type(val);
    +
    +  if (val_t->meet(TypePtr::NULL_PTR) != val_t &&
    +      val->Opcode() == Op_CastPP &&
    +      val->in(0) != NULL &&
    +      val->in(0)->Opcode() == Op_IfTrue &&
    +      val->in(0)->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none) &&
    +      val->in(0)->in(0)->is_If() &&
    +      val->in(0)->in(0)->in(1)->Opcode() == Op_Bool &&
    +      val->in(0)->in(0)->in(1)->as_Bool()->_test._test == BoolTest::ne &&
    +      val->in(0)->in(0)->in(1)->in(1)->Opcode() == Op_CmpP &&
    +      val->in(0)->in(0)->in(1)->in(1)->in(1) == val->in(1) &&
    +      val->in(0)->in(0)->in(1)->in(1)->in(2)->bottom_type() == TypePtr::NULL_PTR) {
    +    assert(val->in(0)->in(0)->in(1)->in(1)->in(1) == val->in(1), "");
    +    CallStaticJavaNode* unc = val->in(0)->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none);
    +    return unc;
    +  }
    +  return NULL;
    +}
    +
    +void ShenandoahWriteBarrierNode::pin_and_expand_move_barrier(PhaseIdealLoop* phase, GrowableArray& memory_graph_fixers, Unique_Node_List& uses) {
    +  Node* unc = pin_and_expand_null_check(phase->igvn());
    +  Node* val = in(ValueIn);
    +
    +  if (unc != NULL) {
    +    Node* ctrl = phase->get_ctrl(this);
    +    Node* unc_ctrl = val->in(0);
    +
    +    // Don't move write barrier in a loop
    +    IdealLoopTree* loop = phase->get_loop(ctrl);
    +    IdealLoopTree* unc_loop = phase->get_loop(unc_ctrl);
    +
    +    if (!unc_loop->is_member(loop)) {
    +      return;
    +    }
    +
    +    Node* branch = no_branches(ctrl, unc_ctrl, false, phase);
    +    assert(branch == NULL || branch == NodeSentinel, "was not looking for a branch");
    +    if (branch == NodeSentinel) {
    +      return;
    +    }
    +
    +    RegionNode* r = new RegionNode(3);
    +    IfNode* iff = unc_ctrl->in(0)->as_If();
    +
    +    Node* ctrl_use = unc_ctrl->unique_ctrl_out();
    +    Node* unc_ctrl_clone = unc_ctrl->clone();
    +    phase->register_control(unc_ctrl_clone, loop, iff);
    +    Node* c = unc_ctrl_clone;
    +    Node* new_cast = clone_null_check(c, val, unc_ctrl_clone, phase);
    +    r->init_req(1, new_cast->in(0)->in(0)->as_If()->proj_out(0));
    +
    +    phase->igvn().replace_input_of(unc_ctrl, 0, c->in(0));
    +    phase->set_idom(unc_ctrl, c->in(0), phase->dom_depth(unc_ctrl));
    +    phase->lazy_replace(c, unc_ctrl);
    +    c = NULL;;
    +    phase->igvn().replace_input_of(val, 0, unc_ctrl_clone);
    +    phase->set_ctrl(val, unc_ctrl_clone);
    +
    +    IfNode* new_iff = new_cast->in(0)->in(0)->as_If();
    +    fix_null_check(unc, unc_ctrl_clone, r, uses, phase);
    +    Node* iff_proj = iff->proj_out(0);
    +    r->init_req(2, iff_proj);
    +    phase->register_control(r, phase->ltree_root(), iff);
    +
    +    Node* new_bol = new_iff->in(1)->clone();
    +    Node* new_cmp = new_bol->in(1)->clone();
    +    assert(new_cmp->Opcode() == Op_CmpP, "broken");
    +    assert(new_cmp->in(1) == val->in(1), "broken");
    +    new_bol->set_req(1, new_cmp);
    +    new_cmp->set_req(1, this);
    +    phase->register_new_node(new_bol, new_iff->in(0));
    +    phase->register_new_node(new_cmp, new_iff->in(0));
    +    phase->igvn().replace_input_of(new_iff, 1, new_bol);
    +    phase->igvn().replace_input_of(new_cast, 1, this);
    +
    +    for (DUIterator_Fast imax, i = this->fast_outs(imax); i < imax; i++) {
    +      Node* u = this->fast_out(i);
    +      if (u == new_cast || u->Opcode() == Op_ShenandoahWBMemProj || u == new_cmp) {
    +        continue;
    +      }
    +      phase->igvn().rehash_node_delayed(u);
    +      int nb = u->replace_edge(this, new_cast);
    +      assert(nb > 0, "no update?");
    +      --i; imax -= nb;
    +    }
    +
    +    for (DUIterator_Fast imax, i = val->fast_outs(imax); i < imax; i++) {
    +      Node* u = val->fast_out(i);
    +      if (u == this) {
    +        continue;
    +      }
    +      phase->igvn().rehash_node_delayed(u);
    +      int nb = u->replace_edge(val, new_cast);
    +      assert(nb > 0, "no update?");
    +      --i; imax -= nb;
    +    }
    +
    +    Node* new_ctrl = unc_ctrl_clone;
    +
    +    int alias = phase->C->get_alias_index(adr_type());
    +    MemoryGraphFixer* fixer = find_fixer(memory_graph_fixers, alias);
    +    if (fixer == NULL) {
    +      fixer = create_fixer(memory_graph_fixers, alias, phase, true);
    +    }
    +
    +    Node* proj = find_out_with(Op_ShenandoahWBMemProj);
    +    fixer->remove(proj);
    +    Node* mem = fixer->find_mem(new_ctrl, NULL);
    +
    +    if (in(Memory) != mem) {
    +      disconnect_barrier_mem(this, phase->igvn());
    +      phase->igvn().replace_input_of(this, Memory, mem);
    +    }
    +
    +    phase->set_ctrl_and_loop(this, new_ctrl);
    +    phase->igvn().replace_input_of(this, Control, new_ctrl);
    +    phase->set_ctrl_and_loop(proj, new_ctrl);
    +
    +    fixer->fix_mem(new_ctrl, new_ctrl, mem, mem, proj, uses);
    +  }
    +}
    +
    +void ShenandoahWriteBarrierNode::pin_and_expand_helper(PhaseIdealLoop* phase) {
    +  Node* val = in(ValueIn);
    +  CallStaticJavaNode* unc = pin_and_expand_null_check(phase->igvn());
    +  Node* rep = this;
    +  Node* ctrl = phase->get_ctrl(this);
    +  if (unc != NULL && val->in(0) == ctrl) {
    +    Node* unc_ctrl = val->in(0);
    +    IfNode* other_iff = unc_ctrl->unique_ctrl_out()->as_If();
    +    ProjNode* other_unc_ctrl = other_iff->proj_out(1);
    +    Node* cast = NULL;
    +    for (DUIterator_Fast imax, i = other_unc_ctrl->fast_outs(imax); i < imax && cast == NULL; i++) {
    +      Node* u = other_unc_ctrl->fast_out(i);
    +      if (u->Opcode() == Op_CastPP && u->in(1) == this) {
    +        cast = u;
    +      }
    +    }
    +    assert(other_unc_ctrl->is_uncommon_trap_if_pattern(Deoptimization::Reason_none) == unc, "broken");
    +    rep = cast;
    +  }
    +
    +  // Replace all uses of barrier's input that are dominated by ctrl
    +  // with the value returned by the barrier: no need to keep both
    +  // live.
    +  for (DUIterator_Fast imax, i = val->fast_outs(imax); i < imax; i++) {
    +    Node* u = val->fast_out(i);
    +    if (u != this) {
    +      if (u->is_Phi()) {
    +        int nb = 0;
    +        for (uint j = 1; j < u->req(); j++) {
    +          if (u->in(j) == val) {
    +            Node* c = u->in(0)->in(j);
    +            if (phase->is_dominator(ctrl, c)) {
    +              phase->igvn().replace_input_of(u, j, rep);
    +              nb++;
    +            }
    +          }
    +        }
    +        if (nb > 0) {
    +          imax -= nb;
    +          --i;
    +        }
    +      } else {
    +        Node* c = phase->ctrl_or_self(u);
    +        if (is_dominator(ctrl, c, this, u, phase)) {
    +          phase->igvn().rehash_node_delayed(u);
    +          int nb = u->replace_edge(val, rep);
    +          assert(nb > 0, "no update?");
    +          --i, imax -= nb;
    +        }
    +      }
    +    }
    +  }
    +}
    +
    +Node* ShenandoahWriteBarrierNode::find_bottom_mem(Node* ctrl, PhaseIdealLoop* phase) {
    +  Node* mem = NULL;
    +  Node* c = ctrl;
    +  do {
    +    if (c->is_Region()) {
    +      Node* phi_bottom = NULL;
    +      for (DUIterator_Fast imax, i = c->fast_outs(imax); i < imax && mem == NULL; i++) {
    +        Node* u = c->fast_out(i);
    +        if (u->is_Phi() && u->bottom_type() == Type::MEMORY) {
    +          if (u->adr_type() == TypePtr::BOTTOM) {
    +            mem = u;
    +          }
    +        }
    +      }
    +    } else {
    +      if (c->is_Call() && c->as_Call()->adr_type() != NULL) {
    +        CallProjections projs;
    +        c->as_Call()->extract_projections(&projs, true, false);
    +        if (projs.fallthrough_memproj != NULL) {
    +          if (projs.fallthrough_memproj->adr_type() == TypePtr::BOTTOM) {
    +            if (projs.catchall_memproj == NULL) {
    +              mem = projs.fallthrough_memproj;
    +            } else {
    +              if (phase->is_dominator(projs.fallthrough_catchproj, ctrl)) {
    +                mem = projs.fallthrough_memproj;
    +              } else {
    +                assert(phase->is_dominator(projs.catchall_catchproj, ctrl), "one proj must dominate barrier");
    +                mem = projs.catchall_memproj;
    +              }
    +            }
    +          }
    +        } else {
    +          Node* proj = c->as_Call()->proj_out(TypeFunc::Memory);
    +          if (proj != NULL &&
    +              proj->adr_type() == TypePtr::BOTTOM) {
    +            mem = proj;
    +          }
    +        }
    +      } else {
    +        for (DUIterator_Fast imax, i = c->fast_outs(imax); i < imax; i++) {
    +          Node* u = c->fast_out(i);
    +          if (u->is_Proj() &&
    +              u->bottom_type() == Type::MEMORY &&
    +              u->adr_type() == TypePtr::BOTTOM) {
    +              assert(c->is_SafePoint() || c->is_MemBar() || c->is_Start(), "");
    +              assert(mem == NULL, "only one proj");
    +              mem = u;
    +          }
    +        }
    +        assert(!c->is_Call() || c->as_Call()->adr_type() != NULL || mem == NULL, "no mem projection expected");
    +      }
    +    }
    +    c = phase->idom(c);
    +  } while (mem == NULL);
    +  return mem;
    +}
    +
    +void ShenandoahWriteBarrierNode::follow_barrier_uses(Node* n, Node* ctrl, Unique_Node_List& uses, PhaseIdealLoop* phase) {
    +  for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
    +    Node* u = n->fast_out(i);
    +    if (!u->is_CFG() && phase->get_ctrl(u) == ctrl && (!u->is_Phi() || !u->in(0)->is_Loop() || u->in(LoopNode::LoopBackControl) != n)) {
    +      uses.push(u);
    +    }
    +  }
    +}
    +
    +static void hide_strip_mined_loop(OuterStripMinedLoopNode* outer, CountedLoopNode* inner, PhaseIdealLoop* phase) {
    +  OuterStripMinedLoopEndNode* le = inner->outer_loop_end();
    +  Node* new_outer = new LoopNode(outer->in(LoopNode::EntryControl), outer->in(LoopNode::LoopBackControl));
    +  phase->register_control(new_outer, phase->get_loop(outer), outer->in(LoopNode::EntryControl));
    +  Node* new_le = new IfNode(le->in(0), le->in(1), le->_prob, le->_fcnt);
    +  phase->register_control(new_le, phase->get_loop(le), le->in(0));
    +  phase->lazy_replace(outer, new_outer);
    +  phase->lazy_replace(le, new_le);
    +  inner->clear_strip_mined();
    +}
    +
    +void ShenandoahWriteBarrierNode::test_heap_stable(Node*& ctrl, Node* raw_mem, Node*& heap_stable_ctrl,
    +                                                  PhaseIdealLoop* phase) {
    +  IdealLoopTree* loop = phase->get_loop(ctrl);
    +  Node* thread = new ThreadLocalNode();
    +  phase->register_new_node(thread, ctrl);
    +  Node* offset = phase->igvn().MakeConX(in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
    +  phase->set_ctrl(offset, phase->C->root());
    +  Node* gc_state_addr = new AddPNode(phase->C->top(), thread, offset);
    +  phase->register_new_node(gc_state_addr, ctrl);
    +  uint gc_state_idx = Compile::AliasIdxRaw;
    +  const TypePtr* gc_state_adr_type = NULL; // debug-mode-only argument
    +  debug_only(gc_state_adr_type = phase->C->get_adr_type(gc_state_idx));
    +
    +  Node* gc_state = new LoadBNode(ctrl, raw_mem, gc_state_addr, gc_state_adr_type, TypeInt::BYTE, MemNode::unordered);
    +  phase->register_new_node(gc_state, ctrl);
    +  Node* heap_stable_and = new AndINode(gc_state, phase->igvn().intcon(ShenandoahHeap::HAS_FORWARDED));
    +  phase->register_new_node(heap_stable_and, ctrl);
    +  Node* heap_stable_cmp = new CmpINode(heap_stable_and, phase->igvn().zerocon(T_INT));
    +  phase->register_new_node(heap_stable_cmp, ctrl);
    +  Node* heap_stable_test = new BoolNode(heap_stable_cmp, BoolTest::ne);
    +  phase->register_new_node(heap_stable_test, ctrl);
    +  IfNode* heap_stable_iff = new IfNode(ctrl, heap_stable_test, PROB_UNLIKELY(0.999), COUNT_UNKNOWN);
    +  phase->register_control(heap_stable_iff, loop, ctrl);
    +
    +  heap_stable_ctrl = new IfFalseNode(heap_stable_iff);
    +  phase->register_control(heap_stable_ctrl, loop, heap_stable_iff);
    +  ctrl = new IfTrueNode(heap_stable_iff);
    +  phase->register_control(ctrl, loop, heap_stable_iff);
    +
    +  assert(is_heap_stable_test(heap_stable_iff), "Should match the shape");
    +}
    +
    +void ShenandoahWriteBarrierNode::test_null(Node*& ctrl, Node* val, Node*& null_ctrl, PhaseIdealLoop* phase) {
    +  const Type* val_t = phase->igvn().type(val);
    +  if (val_t->meet(TypePtr::NULL_PTR) == val_t) {
    +    IdealLoopTree* loop = phase->get_loop(ctrl);
    +    Node* null_cmp = new CmpPNode(val, phase->igvn().zerocon(T_OBJECT));
    +    phase->register_new_node(null_cmp, ctrl);
    +    Node* null_test = new BoolNode(null_cmp, BoolTest::ne);
    +    phase->register_new_node(null_test, ctrl);
    +    IfNode* null_iff = new IfNode(ctrl, null_test, PROB_LIKELY(0.999), COUNT_UNKNOWN);
    +    phase->register_control(null_iff, loop, ctrl);
    +    ctrl = new IfTrueNode(null_iff);
    +    phase->register_control(ctrl, loop, null_iff);
    +    null_ctrl = new IfFalseNode(null_iff);
    +    phase->register_control(null_ctrl, loop, null_iff);
    +  }
    +}
    +
    +Node* ShenandoahWriteBarrierNode::clone_null_check(Node*& c, Node* val, Node* unc_ctrl, PhaseIdealLoop* phase) {
    +  IdealLoopTree *loop = phase->get_loop(c);
    +  Node* iff = unc_ctrl->in(0);
    +  assert(iff->is_If(), "broken");
    +  Node* new_iff = iff->clone();
    +  new_iff->set_req(0, c);
    +  phase->register_control(new_iff, loop, c);
    +  Node* iffalse = new IfFalseNode(new_iff->as_If());
    +  phase->register_control(iffalse, loop, new_iff);
    +  Node* iftrue = new IfTrueNode(new_iff->as_If());
    +  phase->register_control(iftrue, loop, new_iff);
    +  c = iftrue;
    +  const Type *t = phase->igvn().type(val);
    +  assert(val->Opcode() == Op_CastPP, "expect cast to non null here");
    +  Node* uncasted_val = val->in(1);
    +  val = new CastPPNode(uncasted_val, t);
    +  val->init_req(0, c);
    +  phase->register_new_node(val, c);
    +  return val;
    +}
    +
    +void ShenandoahWriteBarrierNode::fix_null_check(Node* unc, Node* unc_ctrl, Node* new_unc_ctrl,
    +                                                Unique_Node_List& uses, PhaseIdealLoop* phase) {
    +  IfNode* iff = unc_ctrl->in(0)->as_If();
    +  Node* proj = iff->proj_out(0);
    +  assert(proj != unc_ctrl, "bad projection");
    +  Node* use = proj->unique_ctrl_out();
    +
    +  assert(use == unc || use->is_Region(), "what else?");
    +
    +  uses.clear();
    +  if (use == unc) {
    +    phase->set_idom(use, new_unc_ctrl, phase->dom_depth(use));
    +    for (uint i = 1; i < unc->req(); i++) {
    +      Node* n = unc->in(i);
    +      if (phase->has_ctrl(n) && phase->get_ctrl(n) == proj) {
    +        uses.push(n);
    +      }
    +    }
    +  } else {
    +    assert(use->is_Region(), "what else?");
    +    uint idx = 1;
    +    for (; use->in(idx) != proj; idx++);
    +    for (DUIterator_Fast imax, i = use->fast_outs(imax); i < imax; i++) {
    +      Node* u = use->fast_out(i);
    +      if (u->is_Phi() && phase->get_ctrl(u->in(idx)) == proj) {
    +        uses.push(u->in(idx));
    +      }
    +    }
    +  }
    +  for(uint next = 0; next < uses.size(); next++ ) {
    +    Node *n = uses.at(next);
    +    assert(phase->get_ctrl(n) == proj, "bad control");
    +    phase->set_ctrl_and_loop(n, new_unc_ctrl);
    +    if (n->in(0) == proj) {
    +      phase->igvn().replace_input_of(n, 0, new_unc_ctrl);
    +    }
    +    for (uint i = 0; i < n->req(); i++) {
    +      Node* m = n->in(i);
    +      if (m != NULL && phase->has_ctrl(m) && phase->get_ctrl(m) == proj) {
    +        uses.push(m);
    +      }
    +    }
    +  }
    +
    +  phase->igvn().rehash_node_delayed(use);
    +  int nb = use->replace_edge(proj, new_unc_ctrl);
    +  assert(nb == 1, "only use expected");
    +}
    +
    +void ShenandoahWriteBarrierNode::in_cset_fast_test(Node*& ctrl, Node*& not_cset_ctrl, Node* val, Node* raw_mem, PhaseIdealLoop* phase) {
    +  IdealLoopTree *loop = phase->get_loop(ctrl);
    +  Node* raw_rbtrue = new CastP2XNode(ctrl, val);
    +  phase->register_new_node(raw_rbtrue, ctrl);
    +  Node* cset_offset = new URShiftXNode(raw_rbtrue, phase->igvn().intcon(ShenandoahHeapRegion::region_size_bytes_shift_jint()));
    +  phase->register_new_node(cset_offset, ctrl);
    +  Node* in_cset_fast_test_base_addr = phase->igvn().makecon(TypeRawPtr::make(ShenandoahHeap::in_cset_fast_test_addr()));
    +  phase->set_ctrl(in_cset_fast_test_base_addr, phase->C->root());
    +  Node* in_cset_fast_test_adr = new AddPNode(phase->C->top(), in_cset_fast_test_base_addr, cset_offset);
    +  phase->register_new_node(in_cset_fast_test_adr, ctrl);
    +  uint in_cset_fast_test_idx = Compile::AliasIdxRaw;
    +  const TypePtr* in_cset_fast_test_adr_type = NULL; // debug-mode-only argument
    +  debug_only(in_cset_fast_test_adr_type = phase->C->get_adr_type(in_cset_fast_test_idx));
    +  Node* in_cset_fast_test_load = new LoadBNode(ctrl, raw_mem, in_cset_fast_test_adr, in_cset_fast_test_adr_type, TypeInt::BYTE, MemNode::unordered);
    +  phase->register_new_node(in_cset_fast_test_load, ctrl);
    +  Node* in_cset_fast_test_cmp = new CmpINode(in_cset_fast_test_load, phase->igvn().zerocon(T_INT));
    +  phase->register_new_node(in_cset_fast_test_cmp, ctrl);
    +  Node* in_cset_fast_test_test = new BoolNode(in_cset_fast_test_cmp, BoolTest::eq);
    +  phase->register_new_node(in_cset_fast_test_test, ctrl);
    +  IfNode* in_cset_fast_test_iff = new IfNode(ctrl, in_cset_fast_test_test, PROB_UNLIKELY(0.999), COUNT_UNKNOWN);
    +  phase->register_control(in_cset_fast_test_iff, loop, ctrl);
    +
    +  not_cset_ctrl = new IfTrueNode(in_cset_fast_test_iff);
    +  phase->register_control(not_cset_ctrl, loop, in_cset_fast_test_iff);
    +
    +  ctrl = new IfFalseNode(in_cset_fast_test_iff);
    +  phase->register_control(ctrl, loop, in_cset_fast_test_iff);
    +}
    +
    +void ShenandoahWriteBarrierNode::call_wb_stub(Node*& ctrl, Node*& val, Node*& result_mem,
    +                                              Node* raw_mem, Node* wb_mem,
    +                                              int alias,
    +                                              PhaseIdealLoop* phase) {
    +  IdealLoopTree*loop = phase->get_loop(ctrl);
    +  const TypePtr* obj_type = phase->igvn().type(val)->is_oopptr()->cast_to_nonconst();
    +
    +  // The slow path stub consumes and produces raw memory in addition
    +  // to the existing memory edges
    +  Node* base = find_bottom_mem(ctrl, phase);
    +
    +  MergeMemNode* mm = MergeMemNode::make(base);
    +  mm->set_memory_at(alias, wb_mem);
    +  mm->set_memory_at(Compile::AliasIdxRaw, raw_mem);
    +  phase->register_new_node(mm, ctrl);
    +
    +  Node* call = new CallLeafNode(ShenandoahBarrierSetC2::shenandoah_write_barrier_Type(), CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_JRT), "shenandoah_write_barrier", TypeRawPtr::BOTTOM);
    +  call->init_req(TypeFunc::Control, ctrl);
    +  call->init_req(TypeFunc::I_O, phase->C->top());
    +  call->init_req(TypeFunc::Memory, mm);
    +  call->init_req(TypeFunc::FramePtr, phase->C->top());
    +  call->init_req(TypeFunc::ReturnAdr, phase->C->top());
    +  call->init_req(TypeFunc::Parms, val);
    +  phase->register_control(call, loop, ctrl);
    +  ctrl = new ProjNode(call, TypeFunc::Control);
    +  phase->register_control(ctrl, loop, call);
    +  result_mem = new ProjNode(call, TypeFunc::Memory);
    +  phase->register_new_node(result_mem, call);
    +  val = new ProjNode(call, TypeFunc::Parms);
    +  phase->register_new_node(val, call);
    +  val = new CheckCastPPNode(ctrl, val, obj_type);
    +  phase->register_new_node(val, ctrl);
    +}
    +
    +void ShenandoahWriteBarrierNode::fix_ctrl(Node* barrier, Node* region, const MemoryGraphFixer& fixer, Unique_Node_List& uses, Unique_Node_List& uses_to_ignore, uint last, PhaseIdealLoop* phase) {
    +  Node* ctrl = phase->get_ctrl(barrier);
    +  Node* init_raw_mem = fixer.find_mem(ctrl, barrier);
    +
    +  // Update the control of all nodes that should be after the
    +  // barrier control flow
    +  uses.clear();
    +  // Every node that is control dependent on the barrier's input
    +  // control will be after the expanded barrier. The raw memory (if
    +  // its memory is control dependent on the barrier's input control)
    +  // must stay above the barrier.
    +  uses_to_ignore.clear();
    +  if (phase->has_ctrl(init_raw_mem) && phase->get_ctrl(init_raw_mem) == ctrl && !init_raw_mem->is_Phi()) {
    +    uses_to_ignore.push(init_raw_mem);
    +  }
    +  for (uint next = 0; next < uses_to_ignore.size(); next++) {
    +    Node *n = uses_to_ignore.at(next);
    +    for (uint i = 0; i < n->req(); i++) {
    +      Node* in = n->in(i);
    +      if (in != NULL && phase->has_ctrl(in) && phase->get_ctrl(in) == ctrl) {
    +        uses_to_ignore.push(in);
    +      }
    +    }
    +  }
    +  for (DUIterator_Fast imax, i = ctrl->fast_outs(imax); i < imax; i++) {
    +    Node* u = ctrl->fast_out(i);
    +    if (u->_idx < last &&
    +        u != barrier &&
    +        !uses_to_ignore.member(u) &&
    +        (u->in(0) != ctrl || (!u->is_Region() && !u->is_Phi())) &&
    +        (ctrl->Opcode() != Op_CatchProj || u->Opcode() != Op_CreateEx)) {
    +      Node* old_c = phase->ctrl_or_self(u);
    +      Node* c = old_c;
    +      if (c != ctrl ||
    +          is_dominator_same_ctrl(old_c, barrier, u, phase) ||
    +          ShenandoahBarrierSetC2::is_shenandoah_state_load(u)) {
    +        phase->igvn().rehash_node_delayed(u);
    +        int nb = u->replace_edge(ctrl, region);
    +        if (u->is_CFG()) {
    +          if (phase->idom(u) == ctrl) {
    +            phase->set_idom(u, region, phase->dom_depth(region));
    +          }
    +        } else if (phase->get_ctrl(u) == ctrl) {
    +          assert(u != init_raw_mem, "should leave input raw mem above the barrier");
    +          uses.push(u);
    +        }
    +        assert(nb == 1, "more than 1 ctrl input?");
    +        --i, imax -= nb;
    +      }
    +    }
    +  }
    +}
    +
    +void ShenandoahWriteBarrierNode::pin_and_expand(PhaseIdealLoop* phase) {
    +  Node_List enqueue_barriers;
    +  if (ShenandoahStoreValEnqueueBarrier) {
    +    Unique_Node_List wq;
    +    wq.push(phase->C->root());
    +    for (uint i = 0; i < wq.size(); i++) {
    +      Node* n = wq.at(i);
    +      if (n->Opcode() == Op_ShenandoahEnqueueBarrier) {
    +        enqueue_barriers.push(n);
    +      }
    +      for (uint i = 0; i < n->req(); i++) {
    +        Node* in = n->in(i);
    +        if (in != NULL) {
    +          wq.push(in);
    +        }
    +      }
    +    }
    +  }
    +
    +  const bool trace = false;
    +
    +  // Collect raw memory state at CFG points in the entire graph and
    +  // record it in memory_nodes. Optimize the raw memory graph in the
    +  // process. Optimizing the memory graph also makes the memory graph
    +  // simpler.
    +  GrowableArray memory_graph_fixers;
    +
    +  // Let's try to common write barriers again
    +  optimize_before_expansion(phase, memory_graph_fixers, true);
    +
    +  Unique_Node_List uses;
    +  for (int i = 0; i < ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barriers_count(); i++) {
    +    ShenandoahWriteBarrierNode* wb = ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barrier(i);
    +    Node* ctrl = phase->get_ctrl(wb);
    +
    +    Node* val = wb->in(ValueIn);
    +    if (ctrl->is_Proj() && ctrl->in(0)->is_CallJava()) {
    +      assert(is_dominator(phase->get_ctrl(val), ctrl->in(0)->in(0), val, ctrl->in(0), phase), "can't move");
    +      phase->set_ctrl(wb, ctrl->in(0)->in(0));
    +    } else if (ctrl->is_CallRuntime()) {
    +      assert(is_dominator(phase->get_ctrl(val), ctrl->in(0), val, ctrl, phase), "can't move");
    +      phase->set_ctrl(wb, ctrl->in(0));
    +    }
    +
    +    assert(wb->Opcode() == Op_ShenandoahWriteBarrier, "only for write barriers");
    +    // Look for a null check that dominates this barrier and move the
    +    // barrier right after the null check to enable implicit null
    +    // checks
    +    wb->pin_and_expand_move_barrier(phase, memory_graph_fixers, uses);
    +
    +    wb->pin_and_expand_helper(phase);
    +  }
    +
    +  MemoryGraphFixer fixer(Compile::AliasIdxRaw, true, phase);
    +  Unique_Node_List uses_to_ignore;
    +  Unique_Node_List outer_lsms;
    +  for (uint i = 0; i < enqueue_barriers.size(); i++) {
    +    Node* barrier = enqueue_barriers.at(i);
    +    Node* pre_val = barrier->in(1);
    +
    +    if (phase->igvn().type(pre_val)->higher_equal(TypePtr::NULL_PTR)) {
    +      ShouldNotReachHere();
    +      continue;
    +    }
    +
    +    Node* ctrl = phase->get_ctrl(barrier);
    +
    +    if (ctrl->is_Proj() && ctrl->in(0)->is_CallJava()) {
    +      assert(is_dominator(phase->get_ctrl(pre_val), ctrl->in(0)->in(0), pre_val, ctrl->in(0), phase), "can't move");
    +      ctrl = ctrl->in(0)->in(0);
    +      phase->set_ctrl(barrier, ctrl);
    +    } else if (ctrl->is_CallRuntime()) {
    +      assert(is_dominator(phase->get_ctrl(pre_val), ctrl->in(0), pre_val, ctrl, phase), "can't move");
    +      ctrl = ctrl->in(0);
    +      phase->set_ctrl(barrier, ctrl);
    +    }
    +
    +    Node* init_ctrl = ctrl;
    +    IdealLoopTree* loop = phase->get_loop(ctrl);
    +    if (loop->_head->is_OuterStripMinedLoop()) {
    +      outer_lsms.push(loop->_head);
    +    }
    +    Node* raw_mem = fixer.find_mem(ctrl, barrier);
    +    Node* init_raw_mem = raw_mem;
    +    Node* raw_mem_for_ctrl = fixer.find_mem(ctrl, NULL);
    +    Node* heap_stable_ctrl = NULL;
    +    Node* null_ctrl = NULL;
    +    uint last = phase->C->unique();
    +
    +    enum { _heap_stable = 1, _heap_unstable, PATH_LIMIT };
    +    Node* region = new RegionNode(PATH_LIMIT);
    +    Node* phi = PhiNode::make(region, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
    +
    +    enum { _fast_path = 1, _slow_path, _null_path, PATH_LIMIT2 };
    +    Node* region2 = new RegionNode(PATH_LIMIT2);
    +    Node* phi2 = PhiNode::make(region2, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
    +
    +    // Stable path.
    +    test_heap_stable(ctrl, raw_mem, heap_stable_ctrl, phase);
    +    region->init_req(_heap_stable, heap_stable_ctrl);
    +    phi->init_req(_heap_stable, raw_mem);
    +
    +    // Null path
    +    Node* reg2_ctrl = NULL;
    +    test_null(ctrl, pre_val, null_ctrl, phase);
    +    if (null_ctrl != NULL) {
    +      reg2_ctrl = null_ctrl->in(0);
    +      region2->init_req(_null_path, null_ctrl);
    +      phi2->init_req(_null_path, raw_mem);
    +    } else {
    +      region2->del_req(_null_path);
    +      phi2->del_req(_null_path);
    +    }
    +
    +    const int index_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset());
    +    const int buffer_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset());
    +    Node* thread = new ThreadLocalNode();
    +    phase->register_new_node(thread, ctrl);
    +    Node* buffer_adr = new AddPNode(phase->C->top(), thread, phase->igvn().MakeConX(buffer_offset));
    +    phase->register_new_node(buffer_adr, ctrl);
    +    Node* index_adr = new AddPNode(phase->C->top(), thread, phase->igvn().MakeConX(index_offset));
    +    phase->register_new_node(index_adr, ctrl);
    +
    +    BasicType index_bt = TypeX_X->basic_type();
    +    assert(sizeof(size_t) == type2aelembytes(index_bt), "Loading G1 SATBMarkQueue::_index with wrong size.");
    +    const TypePtr* adr_type = TypeRawPtr::BOTTOM;
    +    Node* index = new LoadXNode(ctrl, raw_mem, index_adr, adr_type, TypeX_X, MemNode::unordered);
    +    phase->register_new_node(index, ctrl);
    +    Node* index_cmp = new CmpXNode(index, phase->igvn().MakeConX(0));
    +    phase->register_new_node(index_cmp, ctrl);
    +    Node* index_test = new BoolNode(index_cmp, BoolTest::ne);
    +    phase->register_new_node(index_test, ctrl);
    +    IfNode* queue_full_iff = new IfNode(ctrl, index_test, PROB_LIKELY(0.999), COUNT_UNKNOWN);
    +    if (reg2_ctrl == NULL) reg2_ctrl = queue_full_iff;
    +    phase->register_control(queue_full_iff, loop, ctrl);
    +    Node* not_full = new IfTrueNode(queue_full_iff);
    +    phase->register_control(not_full, loop, queue_full_iff);
    +    Node* full = new IfFalseNode(queue_full_iff);
    +    phase->register_control(full, loop, queue_full_iff);
    +
    +    ctrl = not_full;
    +
    +    Node* next_index = new SubXNode(index, phase->igvn().MakeConX(sizeof(intptr_t)));
    +    phase->register_new_node(next_index, ctrl);
    +
    +    Node* buffer  = new LoadPNode(ctrl, raw_mem, buffer_adr, adr_type, TypeRawPtr::NOTNULL, MemNode::unordered);
    +    phase->register_new_node(buffer, ctrl);
    +    Node *log_addr = new AddPNode(phase->C->top(), buffer, next_index);
    +    phase->register_new_node(log_addr, ctrl);
    +    Node* log_store = new StorePNode(ctrl, raw_mem, log_addr, adr_type, pre_val, MemNode::unordered);
    +    phase->register_new_node(log_store, ctrl);
    +    // update the index
    +    Node* index_update = new StoreXNode(ctrl, log_store, index_adr, adr_type, next_index, MemNode::unordered);
    +    phase->register_new_node(index_update, ctrl);
    +
    +    // Fast-path case
    +    region2->init_req(_fast_path, ctrl);
    +    phi2->init_req(_fast_path, index_update);
    +
    +    ctrl = full;
    +
    +    Node* base = find_bottom_mem(ctrl, phase);
    +
    +    MergeMemNode* mm = MergeMemNode::make(base);
    +    mm->set_memory_at(Compile::AliasIdxRaw, raw_mem);
    +    phase->register_new_node(mm, ctrl);
    +
    +    Node* call = new CallLeafNode(ShenandoahBarrierSetC2::write_ref_field_pre_entry_Type(), CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), "shenandoah_wb_pre", TypeRawPtr::BOTTOM);
    +    call->init_req(TypeFunc::Control, ctrl);
    +    call->init_req(TypeFunc::I_O, phase->C->top());
    +    call->init_req(TypeFunc::Memory, mm);
    +    call->init_req(TypeFunc::FramePtr, phase->C->top());
    +    call->init_req(TypeFunc::ReturnAdr, phase->C->top());
    +    call->init_req(TypeFunc::Parms, pre_val);
    +    call->init_req(TypeFunc::Parms+1, thread);
    +    phase->register_control(call, loop, ctrl);
    +
    +    Node* ctrl_proj = new ProjNode(call, TypeFunc::Control);
    +    phase->register_control(ctrl_proj, loop, call);
    +    Node* mem_proj = new ProjNode(call, TypeFunc::Memory);
    +    phase->register_new_node(mem_proj, call);
    +
    +    // Slow-path case
    +    region2->init_req(_slow_path, ctrl_proj);
    +    phi2->init_req(_slow_path, mem_proj);
    +
    +    phase->register_control(region2, loop, reg2_ctrl);
    +    phase->register_new_node(phi2, region2);
    +
    +    region->init_req(_heap_unstable, region2);
    +    phi->init_req(_heap_unstable, phi2);
    +
    +    phase->register_control(region, loop, heap_stable_ctrl->in(0));
    +    phase->register_new_node(phi, region);
    +
    +    fix_ctrl(barrier, region, fixer, uses, uses_to_ignore, last, phase);
    +    for(uint next = 0; next < uses.size(); next++ ) {
    +      Node *n = uses.at(next);
    +      assert(phase->get_ctrl(n) == init_ctrl, "bad control");
    +      assert(n != init_raw_mem, "should leave input raw mem above the barrier");
    +      phase->set_ctrl(n, region);
    +      follow_barrier_uses(n, init_ctrl, uses, phase);
    +    }
    +    fixer.fix_mem(init_ctrl, region, init_raw_mem, raw_mem_for_ctrl, phi, uses);
    +
    +    phase->igvn().replace_node(barrier, pre_val);
    +  }
    +
    +  for (int i = ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barriers_count(); i > 0; i--) {
    +    int cnt = ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barriers_count();
    +    ShenandoahWriteBarrierNode* wb = ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barrier(i-1);
    +
    +    uint last = phase->C->unique();
    +    Node* ctrl = phase->get_ctrl(wb);
    +    Node* orig_ctrl = ctrl;
    +
    +    Node* raw_mem = fixer.find_mem(ctrl, wb);
    +    Node* init_raw_mem = raw_mem;
    +    Node* raw_mem_for_ctrl = fixer.find_mem(ctrl, NULL);
    +    int alias = phase->C->get_alias_index(wb->adr_type());
    +    Node* wb_mem =  wb->in(Memory);
    +    Node* init_wb_mem = wb_mem;
    +
    +    Node* val = wb->in(ValueIn);
    +    Node* wbproj = wb->find_out_with(Op_ShenandoahWBMemProj);
    +    IdealLoopTree *loop = phase->get_loop(ctrl);
    +    if (loop->_head->is_OuterStripMinedLoop()) {
    +      outer_lsms.push(loop->_head);
    +    }
    +
    +    assert(val->Opcode() != Op_ShenandoahWriteBarrier, "No chain of write barriers");
    +
    +    CallStaticJavaNode* unc = wb->pin_and_expand_null_check(phase->igvn());
    +    Node* unc_ctrl = NULL;
    +    if (unc != NULL) {
    +      if (val->in(0) != ctrl) {
    +        unc = NULL;
    +      } else {
    +        unc_ctrl = val->in(0);
    +      }
    +    }
    +
    +    Node* uncasted_val = val;
    +    if (unc != NULL) {
    +      uncasted_val = val->in(1);
    +    }
    +
    +    Node* heap_stable_ctrl = NULL;
    +    Node* null_ctrl = NULL;
    +
    +    assert(val->bottom_type()->make_oopptr(), "need oop");
    +    assert(val->bottom_type()->make_oopptr()->const_oop() == NULL, "expect non-constant");
    +
    +    enum { _heap_stable = 1, _heap_unstable, PATH_LIMIT };
    +    Node* region = new RegionNode(PATH_LIMIT);
    +    Node* val_phi = new PhiNode(region, uncasted_val->bottom_type()->is_oopptr());
    +    Node* mem_phi = PhiNode::make(region, wb_mem, Type::MEMORY, phase->C->alias_type(wb->adr_type())->adr_type());
    +    Node* raw_mem_phi = PhiNode::make(region, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
    +
    +    enum { _not_cset = 1, _not_equal, _evac_path, _null_path, PATH_LIMIT2 };
    +    Node* region2 = new RegionNode(PATH_LIMIT2);
    +    Node* val_phi2 = new PhiNode(region2, uncasted_val->bottom_type()->is_oopptr());
    +    Node* mem_phi2 = PhiNode::make(region2, wb_mem, Type::MEMORY, phase->C->alias_type(wb->adr_type())->adr_type());
    +    Node* raw_mem_phi2 = PhiNode::make(region2, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
    +
    +      // Stable path.
    +    test_heap_stable(ctrl, raw_mem, heap_stable_ctrl, phase);
    +    IfNode* heap_stable_iff = heap_stable_ctrl->in(0)->as_If();
    +
    +    // Heap stable case
    +    region->init_req(_heap_stable, heap_stable_ctrl);
    +    val_phi->init_req(_heap_stable, uncasted_val);
    +    mem_phi->init_req(_heap_stable, wb_mem);
    +    raw_mem_phi->init_req(_heap_stable, raw_mem);
    +
    +    Node* reg2_ctrl = NULL;
    +    // Null case
    +    test_null(ctrl, val, null_ctrl, phase);
    +    if (null_ctrl != NULL) {
    +      reg2_ctrl = null_ctrl->in(0);
    +      region2->init_req(_null_path, null_ctrl);
    +      val_phi2->init_req(_null_path, uncasted_val);
    +      mem_phi2->init_req(_null_path, wb_mem);
    +      raw_mem_phi2->init_req(_null_path, raw_mem);
    +    } else {
    +      region2->del_req(_null_path);
    +      val_phi2->del_req(_null_path);
    +      mem_phi2->del_req(_null_path);
    +      raw_mem_phi2->del_req(_null_path);
    +    }
    +
    +    // Test for in-cset.
    +    // Wires !in_cset(obj) to slot 2 of region and phis
    +    Node* not_cset_ctrl = NULL;
    +    in_cset_fast_test(ctrl, not_cset_ctrl, uncasted_val, raw_mem, phase);
    +    if (not_cset_ctrl != NULL) {
    +      if (reg2_ctrl == NULL) reg2_ctrl = not_cset_ctrl->in(0);
    +      region2->init_req(_not_cset, not_cset_ctrl);
    +      val_phi2->init_req(_not_cset, uncasted_val);
    +      mem_phi2->init_req(_not_cset, wb_mem);
    +      raw_mem_phi2->init_req(_not_cset, raw_mem);
    +    }
    +
    +    // Resolve object when orig-value is in cset.
    +    // Make the unconditional resolve for fwdptr, not the read barrier.
    +    Node* new_val = uncasted_val;
    +    if (unc_ctrl != NULL) {
    +      // Clone the null check in this branch to allow implicit null check
    +      new_val = clone_null_check(ctrl, val, unc_ctrl, phase);
    +      fix_null_check(unc, unc_ctrl, ctrl->in(0)->as_If()->proj_out(0), uses, phase);
    +
    +      IfNode* iff = unc_ctrl->in(0)->as_If();
    +      phase->igvn().replace_input_of(iff, 1, phase->igvn().intcon(1));
    +    }
    +    Node* addr = new AddPNode(new_val, uncasted_val, phase->igvn().MakeConX(ShenandoahBrooksPointer::byte_offset()));
    +    phase->register_new_node(addr, ctrl);
    +    assert(val->bottom_type()->isa_oopptr(), "what else?");
    +    const TypePtr* obj_type =  val->bottom_type()->is_oopptr();
    +    const TypePtr* adr_type = ShenandoahBarrierNode::brooks_pointer_type(obj_type);
    +    Node* fwd = new LoadPNode(ctrl, wb_mem, addr, adr_type, obj_type, MemNode::unordered);
    +    phase->register_new_node(fwd, ctrl);
    +
    +    // Only branch to WB stub if object is not forwarded; otherwise reply with fwd ptr
    +    Node* cmp = new CmpPNode(fwd, new_val);
    +    phase->register_new_node(cmp, ctrl);
    +    Node* bol = new BoolNode(cmp, BoolTest::eq);
    +    phase->register_new_node(bol, ctrl);
    +
    +    IfNode* iff = new IfNode(ctrl, bol, PROB_UNLIKELY(0.999), COUNT_UNKNOWN);
    +    if (reg2_ctrl == NULL) reg2_ctrl = iff;
    +    phase->register_control(iff, loop, ctrl);
    +    Node* if_not_eq = new IfFalseNode(iff);
    +    phase->register_control(if_not_eq, loop, iff);
    +    Node* if_eq = new IfTrueNode(iff);
    +    phase->register_control(if_eq, loop, iff);
    +
    +    // Wire up not-equal-path in slots 3.
    +    region2->init_req(_not_equal, if_not_eq);
    +    val_phi2->init_req(_not_equal, fwd);
    +    mem_phi2->init_req(_not_equal, wb_mem);
    +    raw_mem_phi2->init_req(_not_equal, raw_mem);
    +
    +    // Call wb-stub and wire up that path in slots 4
    +    Node* result_mem = NULL;
    +    ctrl = if_eq;
    +    call_wb_stub(ctrl, new_val, result_mem,
    +                 raw_mem, wb_mem,
    +                 alias, phase);
    +    region2->init_req(_evac_path, ctrl);
    +    val_phi2->init_req(_evac_path, new_val);
    +    mem_phi2->init_req(_evac_path, result_mem);
    +    raw_mem_phi2->init_req(_evac_path, result_mem);
    +
    +    phase->register_control(region2, loop, reg2_ctrl);
    +    phase->register_new_node(val_phi2, region2);
    +    phase->register_new_node(mem_phi2, region2);
    +    phase->register_new_node(raw_mem_phi2, region2);
    +
    +    region->init_req(_heap_unstable, region2);
    +    val_phi->init_req(_heap_unstable, val_phi2);
    +    mem_phi->init_req(_heap_unstable, mem_phi2);
    +    raw_mem_phi->init_req(_heap_unstable, raw_mem_phi2);
    +
    +    phase->register_control(region, loop, heap_stable_iff);
    +    Node* out_val = val_phi;
    +    phase->register_new_node(val_phi, region);
    +    phase->register_new_node(mem_phi, region);
    +    phase->register_new_node(raw_mem_phi, region);
    +
    +    fix_ctrl(wb, region, fixer, uses, uses_to_ignore, last, phase);
    +
    +    ctrl = orig_ctrl;
    +
    +    phase->igvn().replace_input_of(wbproj, ShenandoahWBMemProjNode::WriteBarrier, phase->C->top());
    +    phase->igvn().replace_node(wbproj, mem_phi);
    +    if (unc != NULL) {
    +      for (DUIterator_Fast imax, i = val->fast_outs(imax); i < imax; i++) {
    +        Node* u = val->fast_out(i);
    +        Node* c = phase->ctrl_or_self(u);
    +        if (u != wb && (c != ctrl || is_dominator_same_ctrl(c, wb, u, phase))) {
    +          phase->igvn().rehash_node_delayed(u);
    +          int nb = u->replace_edge(val, out_val);
    +          --i, imax -= nb;
    +        }
    +      }
    +      if (val->outcnt() == 0) {
    +        phase->igvn()._worklist.push(val);
    +      }
    +    }
    +    phase->igvn().replace_node(wb, out_val);
    +
    +    follow_barrier_uses(mem_phi, ctrl, uses, phase);
    +    follow_barrier_uses(out_val, ctrl, uses, phase);
    +
    +    for(uint next = 0; next < uses.size(); next++ ) {
    +      Node *n = uses.at(next);
    +      assert(phase->get_ctrl(n) == ctrl, "bad control");
    +      assert(n != init_raw_mem, "should leave input raw mem above the barrier");
    +      phase->set_ctrl(n, region);
    +      follow_barrier_uses(n, ctrl, uses, phase);
    +    }
    +
    +    // The slow path call produces memory: hook the raw memory phi
    +    // from the expanded write barrier with the rest of the graph
    +    // which may require adding memory phis at every post dominated
    +    // region and at enclosing loop heads. Use the memory state
    +    // collected in memory_nodes to fix the memory graph. Update that
    +    // memory state as we go.
    +    fixer.fix_mem(ctrl, region, init_raw_mem, raw_mem_for_ctrl, raw_mem_phi, uses);
    +    assert(ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barriers_count() == cnt - 1, "not replaced");
    +  }
    +
    +  assert(ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barriers_count() == 0, "all write barrier nodes should have been replaced");
    +
    +  for (uint i = 0; i < outer_lsms.size(); i++) {
    +    // Expanding a barrier here will break loop strip mining
    +    // verification. Transform the loop so the loop nest doesn't
    +    // appear as strip mined.
    +    OuterStripMinedLoopNode* outer = outer_lsms.at(i)->as_OuterStripMinedLoop();
    +    hide_strip_mined_loop(outer, outer->unique_ctrl_out()->as_CountedLoop(), phase);
    +  }
    +}
    +
    +void ShenandoahWriteBarrierNode::move_heap_stable_test_out_of_loop(IfNode* iff, PhaseIdealLoop* phase) {
    +  IdealLoopTree *loop = phase->get_loop(iff);
    +  Node* loop_head = loop->_head;
    +  Node* entry_c = loop_head->in(LoopNode::EntryControl);
    +
    +  Node* bol = iff->in(1);
    +  Node* cmp = bol->in(1);
    +  Node* andi = cmp->in(1);
    +  Node* load = andi->in(1);
    +
    +  assert(is_gc_state_load(load), "broken");
    +  if (!phase->is_dominator(load->in(0), entry_c)) {
    +    Node* mem_ctrl = NULL;
    +    Node* mem = dom_mem(load->in(MemNode::Memory), loop_head, Compile::AliasIdxRaw, mem_ctrl, phase);
    +    load = load->clone();
    +    load->set_req(MemNode::Memory, mem);
    +    load->set_req(0, entry_c);
    +    phase->register_new_node(load, entry_c);
    +    andi = andi->clone();
    +    andi->set_req(1, load);
    +    phase->register_new_node(andi, entry_c);
    +    cmp = cmp->clone();
    +    cmp->set_req(1, andi);
    +    phase->register_new_node(cmp, entry_c);
    +    bol = bol->clone();
    +    bol->set_req(1, cmp);
    +    phase->register_new_node(bol, entry_c);
    +
    +    Node* old_bol =iff->in(1);
    +    phase->igvn().replace_input_of(iff, 1, bol);
    +  }
    +}
    +
    +bool ShenandoahWriteBarrierNode::identical_backtoback_ifs(Node *n, PhaseIdealLoop* phase) {
    +  if (!n->is_If() || n->is_CountedLoopEnd()) {
    +    return false;
    +  }
    +  Node* region = n->in(0);
    +
    +  if (!region->is_Region()) {
    +    return false;
    +  }
    +  Node* dom = phase->idom(region);
    +  if (!dom->is_If()) {
    +    return false;
    +  }
    +
    +  if (!is_heap_stable_test(n) || !is_heap_stable_test(dom)) {
    +    return false;
    +  }
    +
    +  IfNode* dom_if = dom->as_If();
    +  Node* proj_true = dom_if->proj_out(1);
    +  Node* proj_false = dom_if->proj_out(0);
    +
    +  for (uint i = 1; i < region->req(); i++) {
    +    if (phase->is_dominator(proj_true, region->in(i))) {
    +      continue;
    +    }
    +    if (phase->is_dominator(proj_false, region->in(i))) {
    +      continue;
    +    }
    +    return false;
    +  }
    +
    +  return true;
    +}
    +
    +void ShenandoahWriteBarrierNode::merge_back_to_back_tests(Node* n, PhaseIdealLoop* phase) {
    +  assert(is_heap_stable_test(n), "no other tests");
    +  if (identical_backtoback_ifs(n, phase)) {
    +    Node* n_ctrl = n->in(0);
    +    if (phase->can_split_if(n_ctrl)) {
    +      IfNode* dom_if = phase->idom(n_ctrl)->as_If();
    +      if (is_heap_stable_test(n)) {
    +        Node* gc_state_load = n->in(1)->in(1)->in(1)->in(1);
    +        assert(is_gc_state_load(gc_state_load), "broken");
    +        Node* dom_gc_state_load = dom_if->in(1)->in(1)->in(1)->in(1);
    +        assert(is_gc_state_load(dom_gc_state_load), "broken");
    +        if (gc_state_load != dom_gc_state_load) {
    +          phase->igvn().replace_node(gc_state_load, dom_gc_state_load);
    +        }
    +      }
    +      PhiNode* bolphi = PhiNode::make_blank(n_ctrl, n->in(1));
    +      Node* proj_true = dom_if->proj_out(1);
    +      Node* proj_false = dom_if->proj_out(0);
    +      Node* con_true = phase->igvn().makecon(TypeInt::ONE);
    +      Node* con_false = phase->igvn().makecon(TypeInt::ZERO);
    +
    +      for (uint i = 1; i < n_ctrl->req(); i++) {
    +        if (phase->is_dominator(proj_true, n_ctrl->in(i))) {
    +          bolphi->init_req(i, con_true);
    +        } else {
    +          assert(phase->is_dominator(proj_false, n_ctrl->in(i)), "bad if");
    +          bolphi->init_req(i, con_false);
    +        }
    +      }
    +      phase->register_new_node(bolphi, n_ctrl);
    +      phase->igvn().replace_input_of(n, 1, bolphi);
    +      phase->do_split_if(n);
    +    }
    +  }
    +}
    +
    +IfNode* ShenandoahWriteBarrierNode::find_unswitching_candidate(const IdealLoopTree *loop, PhaseIdealLoop* phase) {
    +  // Find first invariant test that doesn't exit the loop
    +  LoopNode *head = loop->_head->as_Loop();
    +  IfNode* unswitch_iff = NULL;
    +  Node* n = head->in(LoopNode::LoopBackControl);
    +  int loop_has_sfpts = -1;
    +  while (n != head) {
    +    Node* n_dom = phase->idom(n);
    +    if (n->is_Region()) {
    +      if (n_dom->is_If()) {
    +        IfNode* iff = n_dom->as_If();
    +        if (iff->in(1)->is_Bool()) {
    +          BoolNode* bol = iff->in(1)->as_Bool();
    +          if (bol->in(1)->is_Cmp()) {
    +            // If condition is invariant and not a loop exit,
    +            // then found reason to unswitch.
    +            if (is_heap_stable_test(iff) &&
    +                (loop_has_sfpts == -1 || loop_has_sfpts == 0)) {
    +              assert(!loop->is_loop_exit(iff), "both branches should be in the loop");
    +              if (loop_has_sfpts == -1) {
    +                for(uint i = 0; i < loop->_body.size(); i++) {
    +                  Node *m = loop->_body[i];
    +                  if (m->is_SafePoint() && !m->is_CallLeaf()) {
    +                    loop_has_sfpts = 1;
    +                    break;
    +                  }
    +                }
    +                if (loop_has_sfpts == -1) {
    +                  loop_has_sfpts = 0;
    +                }
    +              }
    +              if (!loop_has_sfpts) {
    +                unswitch_iff = iff;
    +              }
    +            }
    +          }
    +        }
    +      }
    +    }
    +    n = n_dom;
    +  }
    +  return unswitch_iff;
    +}
    +
    +
    +void ShenandoahWriteBarrierNode::optimize_after_expansion(VectorSet &visited, Node_Stack &stack, Node_List &old_new, PhaseIdealLoop* phase) {
    +  Node_List heap_stable_tests;
    +  Node_List gc_state_loads;
    +
    +  stack.push(phase->C->start(), 0);
    +  do {
    +    Node* n = stack.node();
    +    uint i = stack.index();
    +
    +    if (i < n->outcnt()) {
    +      Node* u = n->raw_out(i);
    +      stack.set_index(i+1);
    +      if (!visited.test_set(u->_idx)) {
    +        stack.push(u, 0);
    +      }
    +    } else {
    +      stack.pop();
    +      if (ShenandoahCommonGCStateLoads && is_gc_state_load(n)) {
    +        gc_state_loads.push(n);
    +      }
    +      if (n->is_If() && is_heap_stable_test(n)) {
    +        heap_stable_tests.push(n);
    +      }
    +    }
    +  } while (stack.size() > 0);
    +
    +  bool progress;
    +  do {
    +    progress = false;
    +    for (uint i = 0; i < gc_state_loads.size(); i++) {
    +      Node* n = gc_state_loads.at(i);
    +      if (n->outcnt() != 0) {
    +        progress |= try_common_gc_state_load(n, phase);
    +      }
    +    }
    +  } while (progress);
    +
    +  for (uint i = 0; i < heap_stable_tests.size(); i++) {
    +    Node* n = heap_stable_tests.at(i);
    +    assert(is_heap_stable_test(n), "only evacuation test");
    +    merge_back_to_back_tests(n, phase);
    +  }
    +
    +  if (!phase->C->major_progress()) {
    +    VectorSet seen(Thread::current()->resource_area());
    +    for (uint i = 0; i < heap_stable_tests.size(); i++) {
    +      Node* n = heap_stable_tests.at(i);
    +      IdealLoopTree* loop = phase->get_loop(n);
    +      if (loop != phase->ltree_root() &&
    +          loop->_child == NULL &&
    +          !loop->_irreducible) {
    +        LoopNode* head = loop->_head->as_Loop();
    +        if ((!head->is_CountedLoop() || head->as_CountedLoop()->is_main_loop() || head->as_CountedLoop()->is_normal_loop()) &&
    +            !seen.test_set(head->_idx)) {
    +          IfNode* iff = find_unswitching_candidate(loop, phase);
    +          if (iff != NULL) {
    +            Node* bol = iff->in(1);
    +            if (head->is_strip_mined()) {
    +              head->verify_strip_mined(0);
    +            }
    +            move_heap_stable_test_out_of_loop(iff, phase);
    +            if (loop->policy_unswitching(phase)) {
    +              if (head->is_strip_mined()) {
    +                OuterStripMinedLoopNode* outer = head->as_CountedLoop()->outer_loop();
    +                hide_strip_mined_loop(outer, head->as_CountedLoop(), phase);
    +              }
    +              phase->do_unswitching(loop, old_new);
    +            } else {
    +              // Not proceeding with unswitching. Move load back in
    +              // the loop.
    +              phase->igvn().replace_input_of(iff, 1, bol);
    +            }
    +          }
    +        }
    +      }
    +    }
    +  }
    +}
    +
    +#ifdef ASSERT
    +void ShenandoahBarrierNode::verify_raw_mem(RootNode* root) {
    +  const bool trace = false;
    +  ResourceMark rm;
    +  Unique_Node_List nodes;
    +  Unique_Node_List controls;
    +  Unique_Node_List memories;
    +
    +  nodes.push(root);
    +  for (uint next = 0; next < nodes.size(); next++) {
    +    Node *n  = nodes.at(next);
    +    if (ShenandoahBarrierSetC2::is_shenandoah_wb_call(n)) {
    +      controls.push(n);
    +      if (trace) { tty->print("XXXXXX verifying"); n->dump(); }
    +      for (uint next2 = 0; next2 < controls.size(); next2++) {
    +        Node *m = controls.at(next2);
    +        for (DUIterator_Fast imax, i = m->fast_outs(imax); i < imax; i++) {
    +          Node* u = m->fast_out(i);
    +          if (u->is_CFG() && !u->is_Root() &&
    +              !(u->Opcode() == Op_CProj && u->in(0)->Opcode() == Op_NeverBranch && u->as_Proj()->_con == 1) &&
    +              !(u->is_Region() && u->unique_ctrl_out()->Opcode() == Op_Halt)) {
    +            if (trace) { tty->print("XXXXXX pushing control"); u->dump(); }
    +            controls.push(u);
    +          }
    +        }
    +      }
    +      memories.push(n->as_Call()->proj_out(TypeFunc::Memory));
    +      for (uint next2 = 0; next2 < memories.size(); next2++) {
    +        Node *m = memories.at(next2);
    +        assert(m->bottom_type() == Type::MEMORY, "");
    +        for (DUIterator_Fast imax, i = m->fast_outs(imax); i < imax; i++) {
    +          Node* u = m->fast_out(i);
    +          if (u->bottom_type() == Type::MEMORY && (u->is_Mem() || u->is_ClearArray())) {
    +            if (trace) { tty->print("XXXXXX pushing memory"); u->dump(); }
    +            memories.push(u);
    +          } else if (u->is_LoadStore()) {
    +            if (trace) { tty->print("XXXXXX pushing memory"); u->find_out_with(Op_SCMemProj)->dump(); }
    +            memories.push(u->find_out_with(Op_SCMemProj));
    +          } else if (u->is_MergeMem() && u->as_MergeMem()->memory_at(Compile::AliasIdxRaw) == m) {
    +            if (trace) { tty->print("XXXXXX pushing memory"); u->dump(); }
    +            memories.push(u);
    +          } else if (u->is_Phi()) {
    +            assert(u->bottom_type() == Type::MEMORY, "");
    +            if (u->adr_type() == TypeRawPtr::BOTTOM || u->adr_type() == TypePtr::BOTTOM) {
    +              assert(controls.member(u->in(0)), "");
    +              if (trace) { tty->print("XXXXXX pushing memory"); u->dump(); }
    +              memories.push(u);
    +            }
    +          } else if (u->is_SafePoint() || u->is_MemBar()) {
    +            for (DUIterator_Fast jmax, j = u->fast_outs(jmax); j < jmax; j++) {
    +              Node* uu = u->fast_out(j);
    +              if (uu->bottom_type() == Type::MEMORY) {
    +                if (trace) { tty->print("XXXXXX pushing memory"); uu->dump(); }
    +                memories.push(uu);
    +              }
    +            }
    +          }
    +        }
    +      }
    +      for (uint next2 = 0; next2 < controls.size(); next2++) {
    +        Node *m = controls.at(next2);
    +        if (m->is_Region()) {
    +          bool all_in = true;
    +          for (uint i = 1; i < m->req(); i++) {
    +            if (!controls.member(m->in(i))) {
    +              all_in = false;
    +              break;
    +            }
    +          }
    +          if (trace) { tty->print("XXX verifying %s", all_in ? "all in" : ""); m->dump(); }
    +          bool found_phi = false;
    +          for (DUIterator_Fast jmax, j = m->fast_outs(jmax); j < jmax && !found_phi; j++) {
    +            Node* u = m->fast_out(j);
    +            if (u->is_Phi() && memories.member(u)) {
    +              found_phi = true;
    +              for (uint i = 1; i < u->req() && found_phi; i++) {
    +                Node* k = u->in(i);
    +                if (memories.member(k) != controls.member(m->in(i))) {
    +                  found_phi = false;
    +                }
    +              }
    +            }
    +          }
    +          assert(found_phi || all_in, "");
    +        }
    +      }
    +      controls.clear();
    +      memories.clear();
    +    }
    +    for( uint i = 0; i < n->len(); ++i ) {
    +      Node *m = n->in(i);
    +      if (m != NULL) {
    +        nodes.push(m);
    +      }
    +    }
    +  }
    +}
    +#endif
    +
    +const Type* ShenandoahEnqueueBarrierNode::bottom_type() const {
    +  if (in(1) == NULL || in(1)->is_top()) {
    +    return Type::TOP;
    +  }
    +  const Type* t = in(1)->bottom_type();
    +  if (t == TypePtr::NULL_PTR) {
    +    return t;
    +  }
    +  return t->is_oopptr()->cast_to_nonconst();
    +}
    +
    +const Type* ShenandoahEnqueueBarrierNode::Value(PhaseGVN* phase) const {
    +  if (in(1) == NULL) {
    +    return Type::TOP;
    +  }
    +  const Type* t = phase->type(in(1));
    +  if (t == Type::TOP) {
    +    return Type::TOP;
    +  }
    +  if (t == TypePtr::NULL_PTR) {
    +    return t;
    +  }
    +  return t->is_oopptr()->cast_to_nonconst();
    +}
    +
    +int ShenandoahEnqueueBarrierNode::needed(Node* n) {
    +  if (n == NULL ||
    +      n->is_Allocate() ||
    +      n->bottom_type() == TypePtr::NULL_PTR ||
    +      (n->bottom_type()->make_oopptr() != NULL && n->bottom_type()->make_oopptr()->const_oop() != NULL)) {
    +    return NotNeeded;
    +  }
    +  if (n->is_Phi() ||
    +      n->is_CMove()) {
    +    return MaybeNeeded;
    +  }
    +  return Needed;
    +}
    +
    +Node* ShenandoahEnqueueBarrierNode::next(Node* n) {
    +  for (;;) {
    +    if (n == NULL) {
    +      return n;
    +    } else if (n->bottom_type() == TypePtr::NULL_PTR) {
    +      return n;
    +    } else if (n->bottom_type()->make_oopptr() != NULL && n->bottom_type()->make_oopptr()->const_oop() != NULL) {
    +      return n;
    +    } else if (n->is_ConstraintCast() ||
    +               n->Opcode() == Op_DecodeN ||
    +               n->Opcode() == Op_EncodeP) {
    +      n = n->in(1);
    +    } else if (n->is_Proj()) {
    +      n = n->in(0);
    +    } else {
    +      return n;
    +    }
    +  }
    +  ShouldNotReachHere();
    +  return NULL;
    +}
    +
    +Node* ShenandoahEnqueueBarrierNode::Identity(PhaseGVN* phase) {
    +  PhaseIterGVN* igvn = phase->is_IterGVN();
    +
    +  Node* n = next(in(1));
    +
    +  int cont = needed(n);
    +
    +  if (cont == NotNeeded) {
    +    return in(1);
    +  } else if (cont == MaybeNeeded) {
    +    if (igvn == NULL) {
    +      phase->record_for_igvn(this);
    +      return this;
    +    } else {
    +      ResourceMark rm;
    +      Unique_Node_List wq;
    +      uint wq_i = 0;
    +
    +      for (;;) {
    +        if (n->is_Phi()) {
    +          for (uint i = 1; i < n->req(); i++) {
    +            Node* m = n->in(i);
    +            if (m != NULL) {
    +              wq.push(m);
    +            }
    +          }
    +        } else {
    +          assert(n->is_CMove(), "nothing else here");
    +          Node* m = n->in(CMoveNode::IfFalse);
    +          wq.push(m);
    +          m = n->in(CMoveNode::IfTrue);
    +          wq.push(m);
    +        }
    +        Node* orig_n = NULL;
    +        do {
    +          if (wq_i >= wq.size()) {
    +            return in(1);
    +          }
    +          n = wq.at(wq_i);
    +          wq_i++;
    +          orig_n = n;
    +          n = next(n);
    +          cont = needed(n);
    +          if (cont == Needed) {
    +            return this;
    +          }
    +        } while (cont != MaybeNeeded || (orig_n != n && wq.member(n)));
    +      }
    +    }
    +  }
    +
    +  return this;
    +}
    +
    +#ifdef ASSERT
    +static bool has_never_branch(Node* root) {
    +  for (uint i = 1; i < root->req(); i++) {
    +    Node* in = root->in(i);
    +    if (in != NULL && in->Opcode() == Op_Halt && in->in(0)->is_Proj() && in->in(0)->in(0)->Opcode() == Op_NeverBranch) {
    +      return true;
    +    }
    +  }
    +  return false;
    +}
    +#endif
    +
    +void MemoryGraphFixer::collect_memory_nodes() {
    +  Node_Stack stack(0);
    +  VectorSet visited(Thread::current()->resource_area());
    +  Node_List regions;
    +
    +  // Walk the raw memory graph and create a mapping from CFG node to
    +  // memory node. Exclude phis for now.
    +  stack.push(_phase->C->root(), 1);
    +  do {
    +    Node* n = stack.node();
    +    int opc = n->Opcode();
    +    uint i = stack.index();
    +    if (i < n->req()) {
    +      Node* mem = NULL;
    +      if (opc == Op_Root) {
    +        Node* in = n->in(i);
    +        int in_opc = in->Opcode();
    +        if (in_opc == Op_Return || in_opc == Op_Rethrow) {
    +          mem = in->in(TypeFunc::Memory);
    +        } else if (in_opc == Op_Halt) {
    +          if (!in->in(0)->is_Region()) {
    +            Node* proj = in->in(0);
    +            assert(proj->is_Proj(), "");
    +            Node* in = proj->in(0);
    +            assert(in->is_CallStaticJava() || in->Opcode() == Op_NeverBranch || in->Opcode() == Op_Catch || proj->is_IfProj(), "");
    +            if (in->is_CallStaticJava()) {
    +              mem = in->in(TypeFunc::Memory);
    +            } else if (in->Opcode() == Op_Catch) {
    +              Node* call = in->in(0)->in(0);
    +              assert(call->is_Call(), "");
    +              mem = call->in(TypeFunc::Memory);
    +            }
    +          }
    +        } else {
    +#ifdef ASSERT
    +          n->dump();
    +          in->dump();
    +#endif
    +          ShouldNotReachHere();
    +        }
    +      } else {
    +        assert(n->is_Phi() && n->bottom_type() == Type::MEMORY, "");
    +        assert(n->adr_type() == TypePtr::BOTTOM || _phase->C->get_alias_index(n->adr_type()) == _alias, "");
    +        mem = n->in(i);
    +      }
    +      i++;
    +      stack.set_index(i);
    +      if (mem == NULL) {
    +        continue;
    +      }
    +      for (;;) {
    +        if (visited.test_set(mem->_idx) || mem->is_Start()) {
    +          break;
    +        }
    +        if (mem->is_Phi()) {
    +          stack.push(mem, 2);
    +          mem = mem->in(1);
    +        } else if (mem->is_Proj()) {
    +          stack.push(mem, mem->req());
    +          mem = mem->in(0);
    +        } else if (mem->is_SafePoint() || mem->is_MemBar()) {
    +          mem = mem->in(TypeFunc::Memory);
    +        } else if (mem->is_MergeMem()) {
    +          MergeMemNode* mm = mem->as_MergeMem();
    +          mem = mm->memory_at(_alias);
    +        } else if (mem->is_Store() || mem->is_LoadStore() || mem->is_ClearArray()) {
    +          assert(_alias == Compile::AliasIdxRaw, "");
    +          stack.push(mem, mem->req());
    +          mem = mem->in(MemNode::Memory);
    +        } else if (mem->Opcode() == Op_ShenandoahWriteBarrier) {
    +          assert(_alias != Compile::AliasIdxRaw, "");
    +          mem = mem->in(ShenandoahBarrierNode::Memory);
    +        } else if (mem->Opcode() == Op_ShenandoahWBMemProj) {
    +          stack.push(mem, mem->req());
    +          mem = mem->in(ShenandoahWBMemProjNode::WriteBarrier);
    +        } else {
    +#ifdef ASSERT
    +          mem->dump();
    +#endif
    +          ShouldNotReachHere();
    +        }
    +      }
    +    } else {
    +      if (n->is_Phi()) {
    +        // Nothing
    +      } else if (!n->is_Root()) {
    +        Node* c = get_ctrl(n);
    +        _memory_nodes.map(c->_idx, n);
    +      }
    +      stack.pop();
    +    }
    +  } while(stack.is_nonempty());
    +
    +  // Iterate over CFG nodes in rpo and propagate memory state to
    +  // compute memory state at regions, creating new phis if needed.
    +  Node_List rpo_list;
    +  visited.Clear();
    +  _phase->rpo(_phase->C->root(), stack, visited, rpo_list);
    +  Node* root = rpo_list.pop();
    +  assert(root == _phase->C->root(), "");
    +
    +  const bool trace = false;
    +#ifdef ASSERT
    +  if (trace) {
    +    for (int i = rpo_list.size() - 1; i >= 0; i--) {
    +      Node* c = rpo_list.at(i);
    +      if (_memory_nodes[c->_idx] != NULL) {
    +        tty->print("X %d", c->_idx);  _memory_nodes[c->_idx]->dump();
    +      }
    +    }
    +  }
    +#endif
    +  uint last = _phase->C->unique();
    +
    +#ifdef ASSERT
    +  uint8_t max_depth = 0;
    +  for (LoopTreeIterator iter(_phase->ltree_root()); !iter.done(); iter.next()) {
    +    IdealLoopTree* lpt = iter.current();
    +    max_depth = MAX2(max_depth, lpt->_nest);
    +  }
    +#endif
    +
    +  bool progress = true;
    +  int iteration = 0;
    +  Node_List dead_phis;
    +  while (progress) {
    +    progress = false;
    +    iteration++;
    +    assert(iteration <= 2+max_depth || _phase->C->has_irreducible_loop(), "");
    +    if (trace) { tty->print_cr("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); }
    +    IdealLoopTree* last_updated_ilt = NULL;
    +    for (int i = rpo_list.size() - 1; i >= 0; i--) {
    +      Node* c = rpo_list.at(i);
    +
    +      Node* prev_mem = _memory_nodes[c->_idx];
    +      if (c->is_Region() && (_include_lsm || !c->is_OuterStripMinedLoop())) {
    +        Node* prev_region = regions[c->_idx];
    +        Node* unique = NULL;
    +        for (uint j = 1; j < c->req() && unique != NodeSentinel; j++) {
    +          Node* m = _memory_nodes[c->in(j)->_idx];
    +          assert(m != NULL || (c->is_Loop() && j == LoopNode::LoopBackControl && iteration == 1) || _phase->C->has_irreducible_loop() || has_never_branch(_phase->C->root()), "expect memory state");
    +          if (m != NULL) {
    +            if (m == prev_region && ((c->is_Loop() && j == LoopNode::LoopBackControl) || (prev_region->is_Phi() && prev_region->in(0) == c))) {
    +              assert(c->is_Loop() && j == LoopNode::LoopBackControl || _phase->C->has_irreducible_loop(), "");
    +              // continue
    +            } else if (unique == NULL) {
    +              unique = m;
    +            } else if (m == unique) {
    +              // continue
    +            } else {
    +              unique = NodeSentinel;
    +            }
    +          }
    +        }
    +        assert(unique != NULL, "empty phi???");
    +        if (unique != NodeSentinel) {
    +          if (prev_region != NULL && prev_region->is_Phi() && prev_region->in(0) == c) {
    +            dead_phis.push(prev_region);
    +          }
    +          regions.map(c->_idx, unique);
    +        } else {
    +          Node* phi = NULL;
    +          if (prev_region != NULL && prev_region->is_Phi() && prev_region->in(0) == c && prev_region->_idx >= last) {
    +            phi = prev_region;
    +            for (uint k = 1; k < c->req(); k++) {
    +              Node* m = _memory_nodes[c->in(k)->_idx];
    +              assert(m != NULL, "expect memory state");
    +              phi->set_req(k, m);
    +            }
    +          } else {
    +            for (DUIterator_Fast jmax, j = c->fast_outs(jmax); j < jmax && phi == NULL; j++) {
    +              Node* u = c->fast_out(j);
    +              if (u->is_Phi() && u->bottom_type() == Type::MEMORY &&
    +                  (u->adr_type() == TypePtr::BOTTOM || _phase->C->get_alias_index(u->adr_type()) == _alias)) {
    +                phi = u;
    +                for (uint k = 1; k < c->req() && phi != NULL; k++) {
    +                  Node* m = _memory_nodes[c->in(k)->_idx];
    +                  assert(m != NULL, "expect memory state");
    +                  if (u->in(k) != m) {
    +                    phi = NULL;
    +                  }
    +                }
    +              }
    +            }
    +            if (phi == NULL) {
    +              phi = new PhiNode(c, Type::MEMORY, _phase->C->get_adr_type(_alias));
    +              for (uint k = 1; k < c->req(); k++) {
    +                Node* m = _memory_nodes[c->in(k)->_idx];
    +                assert(m != NULL, "expect memory state");
    +                phi->init_req(k, m);
    +              }
    +            }
    +          }
    +          assert(phi != NULL, "");
    +          regions.map(c->_idx, phi);
    +        }
    +        Node* current_region = regions[c->_idx];
    +        if (current_region != prev_region) {
    +          progress = true;
    +          if (prev_region == prev_mem) {
    +            _memory_nodes.map(c->_idx, current_region);
    +          }
    +        }
    +      } else if (prev_mem == NULL || prev_mem->is_Phi() || ctrl_or_self(prev_mem) != c) {
    +        Node* m = _memory_nodes[_phase->idom(c)->_idx];
    +        assert(m != NULL, "expect memory state");
    +        if (m != prev_mem) {
    +          _memory_nodes.map(c->_idx, m);
    +          progress = true;
    +        }
    +      }
    +#ifdef ASSERT
    +      if (trace) { tty->print("X %d", c->_idx);  _memory_nodes[c->_idx]->dump(); }
    +#endif
    +    }
    +  }
    +
    +  // Replace existing phi with computed memory state for that region
    +  // if different (could be a new phi or a dominating memory node if
    +  // that phi was found to be useless).
    +  while (dead_phis.size() > 0) {
    +    Node* n = dead_phis.pop();
    +    n->replace_by(_phase->C->top());
    +    n->destruct();
    +  }
    +  for (int i = rpo_list.size() - 1; i >= 0; i--) {
    +    Node* c = rpo_list.at(i);
    +    if (c->is_Region() && (_include_lsm || !c->is_OuterStripMinedLoop())) {
    +      Node* n = regions[c->_idx];
    +      if (n->is_Phi() && n->_idx >= last && n->in(0) == c) {
    +        _phase->register_new_node(n, c);
    +      }
    +    }
    +  }
    +  for (int i = rpo_list.size() - 1; i >= 0; i--) {
    +    Node* c = rpo_list.at(i);
    +    if (c->is_Region() && (_include_lsm || !c->is_OuterStripMinedLoop())) {
    +      Node* n = regions[c->_idx];
    +      for (DUIterator_Fast imax, i = c->fast_outs(imax); i < imax; i++) {
    +        Node* u = c->fast_out(i);
    +        if (u->is_Phi() && u->bottom_type() == Type::MEMORY &&
    +            u != n) {
    +          if (u->adr_type() == TypePtr::BOTTOM) {
    +            fix_memory_uses(u, n, n, c);
    +          } else if (_phase->C->get_alias_index(u->adr_type()) == _alias) {
    +            _phase->lazy_replace(u, n);
    +            --i; --imax;
    +          }
    +        }
    +      }
    +    }
    +  }
    +}
    +
    +Node* MemoryGraphFixer::get_ctrl(Node* n) const {
    +  Node* c = _phase->get_ctrl(n);
    +  if (n->is_Proj() && n->in(0) != NULL && n->in(0)->is_Call()) {
    +    assert(c == n->in(0), "");
    +    CallNode* call = c->as_Call();
    +    CallProjections projs;
    +    call->extract_projections(&projs, true, false);
    +    if (projs.catchall_memproj != NULL) {
    +      if (projs.fallthrough_memproj == n) {
    +        c = projs.fallthrough_catchproj;
    +      } else {
    +        assert(projs.catchall_memproj == n, "");
    +        c = projs.catchall_catchproj;
    +      }
    +    }
    +  }
    +  return c;
    +}
    +
    +Node* MemoryGraphFixer::ctrl_or_self(Node* n) const {
    +  if (_phase->has_ctrl(n))
    +    return get_ctrl(n);
    +  else {
    +    assert (n->is_CFG(), "must be a CFG node");
    +    return n;
    +  }
    +}
    +
    +bool MemoryGraphFixer::mem_is_valid(Node* m, Node* c) const {
    +  return m != NULL && get_ctrl(m) == c;
    +}
    +
    +Node* MemoryGraphFixer::find_mem(Node* ctrl, Node* n) const {
    +  assert(n == NULL || _phase->ctrl_or_self(n) == ctrl, "");
    +  Node* mem = _memory_nodes[ctrl->_idx];
    +  Node* c = ctrl;
    +  while (!mem_is_valid(mem, c) &&
    +         (!c->is_CatchProj() || mem == NULL || c->in(0)->in(0)->in(0) != get_ctrl(mem))) {
    +    c = _phase->idom(c);
    +    mem = _memory_nodes[c->_idx];
    +  }
    +  if (n != NULL && mem_is_valid(mem, c)) {
    +    while (!ShenandoahWriteBarrierNode::is_dominator_same_ctrl(c, mem, n, _phase) && _phase->ctrl_or_self(mem) == ctrl) {
    +      mem = next_mem(mem, _alias);
    +    }
    +    if (mem->is_MergeMem()) {
    +      mem = mem->as_MergeMem()->memory_at(_alias);
    +    }
    +    if (!mem_is_valid(mem, c)) {
    +      do {
    +        c = _phase->idom(c);
    +        mem = _memory_nodes[c->_idx];
    +      } while (!mem_is_valid(mem, c) &&
    +               (!c->is_CatchProj() || mem == NULL || c->in(0)->in(0)->in(0) != get_ctrl(mem)));
    +    }
    +  }
    +  assert(mem->bottom_type() == Type::MEMORY, "");
    +  return mem;
    +}
    +
    +bool MemoryGraphFixer::has_mem_phi(Node* region) const {
    +  for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) {
    +    Node* use = region->fast_out(i);
    +    if (use->is_Phi() && use->bottom_type() == Type::MEMORY &&
    +        (_phase->C->get_alias_index(use->adr_type()) == _alias)) {
    +      return true;
    +    }
    +  }
    +  return false;
    +}
    +
    +void MemoryGraphFixer::fix_mem(Node* ctrl, Node* new_ctrl, Node* mem, Node* mem_for_ctrl, Node* new_mem, Unique_Node_List& uses) {
    +  assert(_phase->ctrl_or_self(new_mem) == new_ctrl, "");
    +  const bool trace = false;
    +  DEBUG_ONLY(if (trace) { tty->print("ZZZ control is"); ctrl->dump(); });
    +  DEBUG_ONLY(if (trace) { tty->print("ZZZ mem is"); mem->dump(); });
    +  GrowableArray phis;
    +  if (mem_for_ctrl != mem) {
    +    Node* old = mem_for_ctrl;
    +    Node* prev = NULL;
    +    while (old != mem) {
    +      prev = old;
    +      if (old->is_Store() || old->is_ClearArray() || old->is_LoadStore()) {
    +        assert(_alias == Compile::AliasIdxRaw, "");
    +        old = old->in(MemNode::Memory);
    +      } else if (old->Opcode() == Op_SCMemProj) {
    +        assert(_alias == Compile::AliasIdxRaw, "");
    +        old = old->in(0);
    +      } else if (old->Opcode() == Op_ShenandoahWBMemProj) {
    +        assert(_alias != Compile::AliasIdxRaw, "");
    +        old = old->in(ShenandoahWBMemProjNode::WriteBarrier);
    +      } else if (old->Opcode() == Op_ShenandoahWriteBarrier) {
    +        assert(_alias != Compile::AliasIdxRaw, "");
    +        old = old->in(ShenandoahBarrierNode::Memory);
    +      } else {
    +        ShouldNotReachHere();
    +      }
    +    }
    +    assert(prev != NULL, "");
    +    if (new_ctrl != ctrl) {
    +      _memory_nodes.map(ctrl->_idx, mem);
    +      _memory_nodes.map(new_ctrl->_idx, mem_for_ctrl);
    +    }
    +    uint input = prev->Opcode() == Op_ShenandoahWriteBarrier ? (uint)ShenandoahBarrierNode::Memory : (uint)MemNode::Memory;
    +    _phase->igvn().replace_input_of(prev, input, new_mem);
    +  } else {
    +    uses.clear();
    +    _memory_nodes.map(new_ctrl->_idx, new_mem);
    +    uses.push(new_ctrl);
    +    for(uint next = 0; next < uses.size(); next++ ) {
    +      Node *n = uses.at(next);
    +      assert(n->is_CFG(), "");
    +      DEBUG_ONLY(if (trace) { tty->print("ZZZ ctrl"); n->dump(); });
    +      for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
    +        Node* u = n->fast_out(i);
    +        if (!u->is_Root() && u->is_CFG() && u != n) {
    +          Node* m = _memory_nodes[u->_idx];
    +          if (u->is_Region() && (!u->is_OuterStripMinedLoop() || _include_lsm) &&
    +              !has_mem_phi(u) &&
    +              u->unique_ctrl_out()->Opcode() != Op_Halt) {
    +            DEBUG_ONLY(if (trace) { tty->print("ZZZ region"); u->dump(); });
    +            DEBUG_ONLY(if (trace && m != NULL) { tty->print("ZZZ mem"); m->dump(); });
    +
    +            if (!mem_is_valid(m, u) || !m->is_Phi()) {
    +              bool push = true;
    +              bool create_phi = true;
    +              if (_phase->is_dominator(new_ctrl, u)) {
    +                create_phi = false;
    +              } else if (!_phase->C->has_irreducible_loop()) {
    +                IdealLoopTree* loop = _phase->get_loop(ctrl);
    +                bool do_check = true;
    +                IdealLoopTree* l = loop;
    +                create_phi = false;
    +                while (l != _phase->ltree_root()) {
    +                  if (_phase->is_dominator(l->_head, u) && _phase->is_dominator(_phase->idom(u), l->_head)) {
    +                    create_phi = true;
    +                    do_check = false;
    +                    break;
    +                  }
    +                  l = l->_parent;
    +                }
    +
    +                if (do_check) {
    +                  assert(!create_phi, "");
    +                  IdealLoopTree* u_loop = _phase->get_loop(u);
    +                  if (u_loop != _phase->ltree_root() && u_loop->is_member(loop)) {
    +                    Node* c = ctrl;
    +                    while (!_phase->is_dominator(c, u_loop->tail())) {
    +                      c = _phase->idom(c);
    +                    }
    +                    if (!_phase->is_dominator(c, u)) {
    +                      do_check = false;
    +                    }
    +                  }
    +                }
    +
    +                if (do_check && _phase->is_dominator(_phase->idom(u), new_ctrl)) {
    +                  create_phi = true;
    +                }
    +              }
    +              if (create_phi) {
    +                Node* phi = new PhiNode(u, Type::MEMORY, _phase->C->get_adr_type(_alias));
    +                _phase->register_new_node(phi, u);
    +                phis.push(phi);
    +                DEBUG_ONLY(if (trace) { tty->print("ZZZ new phi"); phi->dump(); });
    +                if (!mem_is_valid(m, u)) {
    +                  DEBUG_ONLY(if (trace) { tty->print("ZZZ setting mem"); phi->dump(); });
    +                  _memory_nodes.map(u->_idx, phi);
    +                } else {
    +                  DEBUG_ONLY(if (trace) { tty->print("ZZZ NOT setting mem"); m->dump(); });
    +                  for (;;) {
    +                    assert(m->is_Mem() || m->is_LoadStore() || m->is_Proj() || m->Opcode() == Op_ShenandoahWriteBarrier || m->Opcode() == Op_ShenandoahWBMemProj, "");
    +                    Node* next = NULL;
    +                    if (m->is_Proj()) {
    +                      next = m->in(0);
    +                    } else if (m->Opcode() == Op_ShenandoahWBMemProj) {
    +                      next = m->in(ShenandoahWBMemProjNode::WriteBarrier);
    +                    } else if (m->is_Mem() || m->is_LoadStore()) {
    +                      assert(_alias == Compile::AliasIdxRaw, "");
    +                      next = m->in(MemNode::Memory);
    +                    } else {
    +                      assert(_alias != Compile::AliasIdxRaw, "");
    +                      assert (m->Opcode() == Op_ShenandoahWriteBarrier, "");
    +                      next = m->in(ShenandoahBarrierNode::Memory);
    +                    }
    +                    if (_phase->get_ctrl(next) != u) {
    +                      break;
    +                    }
    +                    if (next->is_MergeMem()) {
    +                      assert(_phase->get_ctrl(next->as_MergeMem()->memory_at(_alias)) != u, "");
    +                      break;
    +                    }
    +                    if (next->is_Phi()) {
    +                      assert(next->adr_type() == TypePtr::BOTTOM && next->in(0) == u, "");
    +                      break;
    +                    }
    +                    m = next;
    +                  }
    +
    +                  DEBUG_ONLY(if (trace) { tty->print("ZZZ setting to phi"); m->dump(); });
    +                  assert(m->is_Mem() || m->is_LoadStore() || m->Opcode() == Op_ShenandoahWriteBarrier, "");
    +                  uint input = (m->is_Mem() || m->is_LoadStore()) ? (uint)MemNode::Memory : (uint)ShenandoahBarrierNode::Memory;
    +                  _phase->igvn().replace_input_of(m, input, phi);
    +                  push = false;
    +                }
    +              } else {
    +                DEBUG_ONLY(if (trace) { tty->print("ZZZ skipping region"); u->dump(); });
    +              }
    +              if (push) {
    +                uses.push(u);
    +              }
    +            }
    +          } else if (!mem_is_valid(m, u) &&
    +                     !(u->Opcode() == Op_CProj && u->in(0)->Opcode() == Op_NeverBranch && u->as_Proj()->_con == 1)) {
    +            uses.push(u);
    +          }
    +        }
    +      }
    +    }
    +    for (int i = 0; i < phis.length(); i++) {
    +      Node* n = phis.at(i);
    +      Node* r = n->in(0);
    +      DEBUG_ONLY(if (trace) { tty->print("ZZZ fixing new phi"); n->dump(); });
    +      for (uint j = 1; j < n->req(); j++) {
    +        Node* m = find_mem(r->in(j), NULL);
    +        _phase->igvn().replace_input_of(n, j, m);
    +        DEBUG_ONLY(if (trace) { tty->print("ZZZ fixing new phi: %d", j); m->dump(); });
    +      }
    +    }
    +  }
    +  uint last = _phase->C->unique();
    +  MergeMemNode* mm = NULL;
    +  int alias = _alias;
    +  DEBUG_ONLY(if (trace) { tty->print("ZZZ raw mem is"); mem->dump(); });
    +  for (DUIterator i = mem->outs(); mem->has_out(i); i++) {
    +    Node* u = mem->out(i);
    +    if (u->_idx < last) {
    +      if (u->is_Mem()) {
    +        if (_phase->C->get_alias_index(u->adr_type()) == alias) {
    +          Node* m = find_mem(_phase->get_ctrl(u), u);
    +          if (m != mem) {
    +            DEBUG_ONLY(if (trace) { tty->print("ZZZ setting memory of use"); u->dump(); });
    +            _phase->igvn().replace_input_of(u, MemNode::Memory, m);
    +            --i;
    +          }
    +        }
    +      } else if (u->is_MergeMem()) {
    +        MergeMemNode* u_mm = u->as_MergeMem();
    +        if (u_mm->memory_at(alias) == mem) {
    +          MergeMemNode* newmm = NULL;
    +          for (DUIterator_Fast jmax, j = u->fast_outs(jmax); j < jmax; j++) {
    +            Node* uu = u->fast_out(j);
    +            assert(!uu->is_MergeMem(), "chain of MergeMems?");
    +            if (uu->is_Phi()) {
    +              assert(uu->adr_type() == TypePtr::BOTTOM, "");
    +              Node* region = uu->in(0);
    +              int nb = 0;
    +              for (uint k = 1; k < uu->req(); k++) {
    +                if (uu->in(k) == u) {
    +                  Node* m = find_mem(region->in(k), NULL);
    +                  if (m != mem) {
    +                    DEBUG_ONLY(if (trace) { tty->print("ZZZ setting memory of phi %d", k); uu->dump(); });
    +                    newmm = clone_merge_mem(u, mem, m, _phase->ctrl_or_self(m), i);
    +                    if (newmm != u) {
    +                      _phase->igvn().replace_input_of(uu, k, newmm);
    +                      nb++;
    +                      --jmax;
    +                    }
    +                  }
    +                }
    +              }
    +              if (nb > 0) {
    +                --j;
    +              }
    +            } else {
    +              Node* m = find_mem(_phase->ctrl_or_self(uu), uu);
    +              if (m != mem) {
    +                DEBUG_ONLY(if (trace) { tty->print("ZZZ setting memory of use"); uu->dump(); });
    +                newmm = clone_merge_mem(u, mem, m, _phase->ctrl_or_self(m), i);
    +                if (newmm != u) {
    +                  _phase->igvn().replace_input_of(uu, uu->find_edge(u), newmm);
    +                  --j, --jmax;
    +                }
    +              }
    +            }
    +          }
    +        }
    +      } else if (u->is_Phi()) {
    +        assert(u->bottom_type() == Type::MEMORY, "what else?");
    +        if (_phase->C->get_alias_index(u->adr_type()) == alias || u->adr_type() == TypePtr::BOTTOM) {
    +          Node* region = u->in(0);
    +          bool replaced = false;
    +          for (uint j = 1; j < u->req(); j++) {
    +            if (u->in(j) == mem) {
    +              Node* m = find_mem(region->in(j), NULL);
    +              Node* nnew = m;
    +              if (m != mem) {
    +                if (u->adr_type() == TypePtr::BOTTOM) {
    +                  mm = allocate_merge_mem(mem, m, _phase->ctrl_or_self(m));
    +                  nnew = mm;
    +                }
    +                DEBUG_ONLY(if (trace) { tty->print("ZZZ setting memory of phi %d", j); u->dump(); });
    +                _phase->igvn().replace_input_of(u, j, nnew);
    +                replaced = true;
    +              }
    +            }
    +          }
    +          if (replaced) {
    +            --i;
    +          }
    +        }
    +      } else if ((u->adr_type() == TypePtr::BOTTOM && u->Opcode() != Op_StrInflatedCopy) ||
    +                 u->adr_type() == NULL) {
    +        assert(u->adr_type() != NULL ||
    +               u->Opcode() == Op_Rethrow ||
    +               u->Opcode() == Op_Return ||
    +               u->Opcode() == Op_SafePoint ||
    +               (u->is_CallStaticJava() && u->as_CallStaticJava()->uncommon_trap_request() != 0) ||
    +               (u->is_CallStaticJava() && u->as_CallStaticJava()->_entry_point == OptoRuntime::rethrow_stub()) ||
    +               u->Opcode() == Op_CallLeaf, "");
    +        Node* m = find_mem(_phase->ctrl_or_self(u), u);
    +        if (m != mem) {
    +          mm = allocate_merge_mem(mem, m, _phase->get_ctrl(m));
    +          _phase->igvn().replace_input_of(u, u->find_edge(mem), mm);
    +          --i;
    +        }
    +      } else if (_phase->C->get_alias_index(u->adr_type()) == alias) {
    +        Node* m = find_mem(_phase->ctrl_or_self(u), u);
    +        if (m != mem) {
    +          DEBUG_ONLY(if (trace) { tty->print("ZZZ setting memory of use"); u->dump(); });
    +          _phase->igvn().replace_input_of(u, u->find_edge(mem), m);
    +          --i;
    +        }
    +      } else if (u->adr_type() != TypePtr::BOTTOM &&
    +                 _memory_nodes[_phase->ctrl_or_self(u)->_idx] == u) {
    +        Node* m = find_mem(_phase->ctrl_or_self(u), u);
    +        assert(m != mem, "");
    +        // u is on the wrong slice...
    +        assert(u->is_ClearArray(), "");
    +        DEBUG_ONLY(if (trace) { tty->print("ZZZ setting memory of use"); u->dump(); });
    +        _phase->igvn().replace_input_of(u, u->find_edge(mem), m);
    +        --i;
    +      }
    +    }
    +  }
    +#ifdef ASSERT
    +  assert(new_mem->outcnt() > 0, "");
    +  for (int i = 0; i < phis.length(); i++) {
    +    Node* n = phis.at(i);
    +    assert(n->outcnt() > 0, "new phi must have uses now");
    +  }
    +#endif
    +}
    +
    +MergeMemNode* MemoryGraphFixer::allocate_merge_mem(Node* mem, Node* rep_proj, Node* rep_ctrl) const {
    +  MergeMemNode* mm = MergeMemNode::make(mem);
    +  mm->set_memory_at(_alias, rep_proj);
    +  _phase->register_new_node(mm, rep_ctrl);
    +  return mm;
    +}
    +
    +MergeMemNode* MemoryGraphFixer::clone_merge_mem(Node* u, Node* mem, Node* rep_proj, Node* rep_ctrl, DUIterator& i) const {
    +  MergeMemNode* newmm = NULL;
    +  MergeMemNode* u_mm = u->as_MergeMem();
    +  Node* c = _phase->get_ctrl(u);
    +  if (_phase->is_dominator(c, rep_ctrl)) {
    +    c = rep_ctrl;
    +  } else {
    +    assert(_phase->is_dominator(rep_ctrl, c), "one must dominate the other");
    +  }
    +  if (u->outcnt() == 1) {
    +    if (u->req() > (uint)_alias && u->in(_alias) == mem) {
    +      _phase->igvn().replace_input_of(u, _alias, rep_proj);
    +      --i;
    +    } else {
    +      _phase->igvn().rehash_node_delayed(u);
    +      u_mm->set_memory_at(_alias, rep_proj);
    +    }
    +    newmm = u_mm;
    +    _phase->set_ctrl_and_loop(u, c);
    +  } else {
    +    // can't simply clone u and then change one of its input because
    +    // it adds and then removes an edge which messes with the
    +    // DUIterator
    +    newmm = MergeMemNode::make(u_mm->base_memory());
    +    for (uint j = 0; j < u->req(); j++) {
    +      if (j < newmm->req()) {
    +        if (j == (uint)_alias) {
    +          newmm->set_req(j, rep_proj);
    +        } else if (newmm->in(j) != u->in(j)) {
    +          newmm->set_req(j, u->in(j));
    +        }
    +      } else if (j == (uint)_alias) {
    +        newmm->add_req(rep_proj);
    +      } else {
    +        newmm->add_req(u->in(j));
    +      }
    +    }
    +    if ((uint)_alias >= u->req()) {
    +      newmm->set_memory_at(_alias, rep_proj);
    +    }
    +    _phase->register_new_node(newmm, c);
    +  }
    +  return newmm;
    +}
    +
    +bool MemoryGraphFixer::should_process_phi(Node* phi) const {
    +  if (phi->adr_type() == TypePtr::BOTTOM) {
    +    Node* region = phi->in(0);
    +    for (DUIterator_Fast jmax, j = region->fast_outs(jmax); j < jmax; j++) {
    +      Node* uu = region->fast_out(j);
    +      if (uu->is_Phi() && uu != phi && uu->bottom_type() == Type::MEMORY && _phase->C->get_alias_index(uu->adr_type()) == _alias) {
    +        return false;
    +      }
    +    }
    +    return true;
    +  }
    +  return _phase->C->get_alias_index(phi->adr_type()) == _alias;
    +}
    +
    +void MemoryGraphFixer::fix_memory_uses(Node* mem, Node* replacement, Node* rep_proj, Node* rep_ctrl) const {
    +  uint last = _phase-> C->unique();
    +  MergeMemNode* mm = NULL;
    +  assert(mem->bottom_type() == Type::MEMORY, "");
    +  for (DUIterator i = mem->outs(); mem->has_out(i); i++) {
    +    Node* u = mem->out(i);
    +    if (u != replacement && u->_idx < last) {
    +      if (u->is_ShenandoahBarrier() && _alias != Compile::AliasIdxRaw) {
    +        if (_phase->C->get_alias_index(u->adr_type()) == _alias && ShenandoahWriteBarrierNode::is_dominator(rep_ctrl, _phase->ctrl_or_self(u), replacement, u, _phase)) {
    +          _phase->igvn().replace_input_of(u, u->find_edge(mem), rep_proj);
    +          assert(u->find_edge(mem) == -1, "only one edge");
    +          --i;
    +        }
    +      } else if (u->is_Mem()) {
    +        if (_phase->C->get_alias_index(u->adr_type()) == _alias && ShenandoahWriteBarrierNode::is_dominator(rep_ctrl, _phase->ctrl_or_self(u), replacement, u, _phase)) {
    +          assert(_alias == Compile::AliasIdxRaw , "only raw memory can lead to a memory operation");
    +          _phase->igvn().replace_input_of(u, u->find_edge(mem), rep_proj);
    +          assert(u->find_edge(mem) == -1, "only one edge");
    +          --i;
    +        }
    +      } else if (u->is_MergeMem()) {
    +        MergeMemNode* u_mm = u->as_MergeMem();
    +        if (u_mm->memory_at(_alias) == mem) {
    +          MergeMemNode* newmm = NULL;
    +          for (DUIterator_Fast jmax, j = u->fast_outs(jmax); j < jmax; j++) {
    +            Node* uu = u->fast_out(j);
    +            assert(!uu->is_MergeMem(), "chain of MergeMems?");
    +            if (uu->is_Phi()) {
    +              if (should_process_phi(uu)) {
    +                Node* region = uu->in(0);
    +                int nb = 0;
    +                for (uint k = 1; k < uu->req(); k++) {
    +                  if (uu->in(k) == u && _phase->is_dominator(rep_ctrl, region->in(k))) {
    +                    if (newmm == NULL) {
    +                      newmm = clone_merge_mem(u, mem, rep_proj, rep_ctrl, i);
    +                    }
    +                    if (newmm != u) {
    +                      _phase->igvn().replace_input_of(uu, k, newmm);
    +                      nb++;
    +                      --jmax;
    +                    }
    +                  }
    +                }
    +                if (nb > 0) {
    +                  --j;
    +                }
    +              }
    +            } else {
    +              if (rep_ctrl != uu && ShenandoahWriteBarrierNode::is_dominator(rep_ctrl, _phase->ctrl_or_self(uu), replacement, uu, _phase)) {
    +                if (newmm == NULL) {
    +                  newmm = clone_merge_mem(u, mem, rep_proj, rep_ctrl, i);
    +                }
    +                if (newmm != u) {
    +                  _phase->igvn().replace_input_of(uu, uu->find_edge(u), newmm);
    +                  --j, --jmax;
    +                }
    +              }
    +            }
    +          }
    +        }
    +      } else if (u->is_Phi()) {
    +        assert(u->bottom_type() == Type::MEMORY, "what else?");
    +        Node* region = u->in(0);
    +        if (should_process_phi(u)) {
    +          bool replaced = false;
    +          for (uint j = 1; j < u->req(); j++) {
    +            if (u->in(j) == mem && _phase->is_dominator(rep_ctrl, region->in(j))) {
    +              Node* nnew = rep_proj;
    +              if (u->adr_type() == TypePtr::BOTTOM) {
    +                if (mm == NULL) {
    +                  mm = allocate_merge_mem(mem, rep_proj, rep_ctrl);
    +                }
    +                nnew = mm;
    +              }
    +              _phase->igvn().replace_input_of(u, j, nnew);
    +              replaced = true;
    +            }
    +          }
    +          if (replaced) {
    +            --i;
    +          }
    +
    +        }
    +      } else if ((u->adr_type() == TypePtr::BOTTOM && u->Opcode() != Op_StrInflatedCopy) ||
    +                 u->adr_type() == NULL) {
    +        assert(u->adr_type() != NULL ||
    +               u->Opcode() == Op_Rethrow ||
    +               u->Opcode() == Op_Return ||
    +               u->Opcode() == Op_SafePoint ||
    +               (u->is_CallStaticJava() && u->as_CallStaticJava()->uncommon_trap_request() != 0) ||
    +               (u->is_CallStaticJava() && u->as_CallStaticJava()->_entry_point == OptoRuntime::rethrow_stub()) ||
    +               u->Opcode() == Op_CallLeaf, "");
    +        if (ShenandoahWriteBarrierNode::is_dominator(rep_ctrl, _phase->ctrl_or_self(u), replacement, u, _phase)) {
    +          if (mm == NULL) {
    +            mm = allocate_merge_mem(mem, rep_proj, rep_ctrl);
    +          }
    +          _phase->igvn().replace_input_of(u, u->find_edge(mem), mm);
    +          --i;
    +        }
    +      } else if (_phase->C->get_alias_index(u->adr_type()) == _alias) {
    +        if (ShenandoahWriteBarrierNode::is_dominator(rep_ctrl, _phase->ctrl_or_self(u), replacement, u, _phase)) {
    +          _phase->igvn().replace_input_of(u, u->find_edge(mem), rep_proj);
    +          --i;
    +        }
    +      }
    +    }
    +  }
    +}
    +
    +void MemoryGraphFixer::remove(Node* n) {
    +  assert(n->Opcode() == Op_ShenandoahWBMemProj, "");
    +  Node* c = _phase->get_ctrl(n);
    +  Node* mem = find_mem(c, NULL);
    +  if (mem == n) {
    +    _memory_nodes.map(c->_idx, mem->in(ShenandoahWBMemProjNode::WriteBarrier)->in(ShenandoahBarrierNode::Memory));
    +  }
    +}
    +
    +
    diff --git a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.hpp b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.hpp
    new file mode 100644
    index 00000000000..39cd7855e2b
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.hpp
    @@ -0,0 +1,385 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_C2_SHENANDOAH_SUPPORT_HPP
    +#define SHARE_VM_GC_SHENANDOAH_C2_SHENANDOAH_SUPPORT_HPP
    +
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +#include "memory/allocation.hpp"
    +#include "opto/addnode.hpp"
    +#include "opto/graphKit.hpp"
    +#include "opto/machnode.hpp"
    +#include "opto/memnode.hpp"
    +#include "opto/multnode.hpp"
    +#include "opto/node.hpp"
    +
    +class PhaseGVN;
    +class MemoryGraphFixer;
    +
    +class ShenandoahBarrierNode : public TypeNode {
    +private:
    +  bool _allow_fromspace;
    +
    +#ifdef ASSERT
    +  enum verify_type {
    +    ShenandoahLoad,
    +    ShenandoahStore,
    +    ShenandoahValue,
    +    ShenandoahOopStore,
    +    ShenandoahNone,
    +  };
    +
    +  static bool verify_helper(Node* in, Node_Stack& phis, VectorSet& visited, verify_type t, bool trace, Unique_Node_List& barriers_used);
    +#endif
    +
    +public:
    +  enum { Control,
    +         Memory,
    +         ValueIn
    +  };
    +
    +  ShenandoahBarrierNode(Node* ctrl, Node* mem, Node* obj, bool allow_fromspace)
    +    : TypeNode(obj->bottom_type()->isa_oopptr() ? obj->bottom_type()->is_oopptr()->cast_to_nonconst() : obj->bottom_type(), 3),
    +      _allow_fromspace(allow_fromspace) {
    +
    +    init_req(Control, ctrl);
    +    init_req(Memory, mem);
    +    init_req(ValueIn, obj);
    +
    +    init_class_id(Class_ShenandoahBarrier);
    +  }
    +
    +  static Node* skip_through_barrier(Node* n);
    +
    +  static const TypeOopPtr* brooks_pointer_type(const Type* t) {
    +    return t->is_oopptr()->cast_to_nonconst()->add_offset(ShenandoahBrooksPointer::byte_offset())->is_oopptr();
    +  }
    +
    +  virtual const TypePtr* adr_type() const {
    +    if (bottom_type() == Type::TOP) {
    +      return NULL;
    +    }
    +    //const TypePtr* adr_type = in(MemNode::Address)->bottom_type()->is_ptr();
    +    const TypePtr* adr_type = brooks_pointer_type(bottom_type());
    +    assert(adr_type->offset() == ShenandoahBrooksPointer::byte_offset(), "sane offset");
    +    assert(Compile::current()->alias_type(adr_type)->is_rewritable(), "brooks ptr must be rewritable");
    +    return adr_type;
    +  }
    +
    +  virtual uint  ideal_reg() const { return Op_RegP; }
    +  virtual uint match_edge(uint idx) const {
    +    return idx >= ValueIn;
    +  }
    +
    +  Node* Identity_impl(PhaseGVN* phase);
    +
    +  virtual const Type* Value(PhaseGVN* phase) const;
    +  virtual bool depends_only_on_test() const {
    +    return true;
    +  };
    +
    +  static bool needs_barrier(PhaseGVN* phase, ShenandoahBarrierNode* orig, Node* n, Node* rb_mem, bool allow_fromspace);
    +
    +#ifdef ASSERT
    +  static void report_verify_failure(const char* msg, Node* n1 = NULL, Node* n2 = NULL);
    +  static void verify(RootNode* root);
    +  static void verify_raw_mem(RootNode* root);
    +#endif
    +#ifndef PRODUCT
    +  virtual void dump_spec(outputStream *st) const;
    +#endif
    +
    +  // protected:
    +  static Node* dom_mem(Node* mem, Node*& mem_ctrl, Node* n, Node* rep_ctrl, int alias, PhaseIdealLoop* phase);
    +  static Node* dom_mem(Node* mem, Node* ctrl, int alias, Node*& mem_ctrl, PhaseIdealLoop* phase);
    +  static bool is_dominator(Node *d_c, Node *n_c, Node* d, Node* n, PhaseIdealLoop* phase);
    +  static bool is_dominator_same_ctrl(Node* c, Node* d, Node* n, PhaseIdealLoop* phase);
    +  static Node* no_branches(Node* c, Node* dom, bool allow_one_proj, PhaseIdealLoop* phase);
    +  static bool build_loop_late_post(PhaseIdealLoop* phase, Node* n);
    +  bool sink_node(PhaseIdealLoop* phase, Node* ctrl, Node* n_ctrl);
    +
    +protected:
    +  uint hash() const;
    +  uint cmp(const Node& n) const;
    +  uint size_of() const;
    +
    +private:
    +  static bool needs_barrier_impl(PhaseGVN* phase, ShenandoahBarrierNode* orig, Node* n, Node* rb_mem, bool allow_fromspace, Unique_Node_List &visited);
    +
    +  static bool dominates_memory(PhaseGVN* phase, Node* b1, Node* b2, bool linear);
    +  static bool dominates_memory_impl(PhaseGVN* phase, Node* b1, Node* b2, Node* current, bool linear);
    +};
    +
    +class ShenandoahReadBarrierNode : public ShenandoahBarrierNode {
    +public:
    +  ShenandoahReadBarrierNode(Node* ctrl, Node* mem, Node* obj)
    +    : ShenandoahBarrierNode(ctrl, mem, obj, true) {
    +    assert(UseShenandoahGC && (ShenandoahReadBarrier || ShenandoahStoreValReadBarrier ||
    +                               ShenandoahWriteBarrier || ShenandoahAcmpBarrier),
    +           "should be enabled");
    +  }
    +  ShenandoahReadBarrierNode(Node* ctrl, Node* mem, Node* obj, bool allow_fromspace)
    +    : ShenandoahBarrierNode(ctrl, mem, obj, allow_fromspace) {
    +    assert(UseShenandoahGC && (ShenandoahReadBarrier || ShenandoahStoreValReadBarrier ||
    +                               ShenandoahWriteBarrier || ShenandoahAcmpBarrier),
    +           "should be enabled");
    +  }
    +
    +  virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
    +  virtual Node* Identity(PhaseGVN* phase);
    +  virtual int Opcode() const;
    +
    +  bool is_independent(Node* mem);
    +
    +  void try_move(PhaseIdealLoop* phase);
    +
    +private:
    +  static bool is_independent(const Type* in_type, const Type* this_type);
    +  static bool dominates_memory_rb(PhaseGVN* phase, Node* b1, Node* b2, bool linear);
    +  static bool dominates_memory_rb_impl(PhaseGVN* phase, Node* b1, Node* b2, Node* current, bool linear);
    +};
    +
    +class ShenandoahWriteBarrierNode : public ShenandoahBarrierNode {
    +public:
    +  ShenandoahWriteBarrierNode(Compile* C, Node* ctrl, Node* mem, Node* obj);
    +
    +  virtual int Opcode() const;
    +  virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
    +  virtual Node* Identity(PhaseGVN* phase);
    +  virtual bool depends_only_on_test() const { return false; }
    +
    +  static bool expand(Compile* C, PhaseIterGVN& igvn);
    +  static bool is_gc_state_load(Node *n);
    +  static bool is_heap_state_test(Node* iff, int mask);
    +  static bool is_heap_stable_test(Node* iff);
    +  static bool try_common_gc_state_load(Node *n, PhaseIdealLoop *phase);
    +  static bool has_safepoint_between(Node* start, Node* stop, PhaseIdealLoop *phase);
    +
    +  static LoopNode* try_move_before_pre_loop(Node* c, Node* val_ctrl, PhaseIdealLoop* phase);
    +  static Node* move_above_predicates(LoopNode* cl, Node* val_ctrl, PhaseIdealLoop* phase);
    +#ifdef ASSERT
    +  static bool memory_dominates_all_paths(Node* mem, Node* rep_ctrl, int alias, PhaseIdealLoop* phase);
    +  static void memory_dominates_all_paths_helper(Node* c, Node* rep_ctrl, Unique_Node_List& controls, PhaseIdealLoop* phase);
    +#endif
    +  void try_move_before_loop(GrowableArray& memory_graph_fixers, PhaseIdealLoop* phase, bool include_lsm, Unique_Node_List& uses);
    +  void try_move_before_loop_helper(LoopNode* cl, Node* val_ctrl, GrowableArray& memory_graph_fixers, PhaseIdealLoop* phase, bool include_lsm, Unique_Node_List& uses);
    +  static void pin_and_expand(PhaseIdealLoop* phase);
    +  CallStaticJavaNode* pin_and_expand_null_check(PhaseIterGVN& igvn);
    +  void pin_and_expand_move_barrier(PhaseIdealLoop* phase, GrowableArray& memory_graph_fixers, Unique_Node_List& uses);
    +  void pin_and_expand_helper(PhaseIdealLoop* phase);
    +  static Node* find_bottom_mem(Node* ctrl, PhaseIdealLoop* phase);
    +  static void follow_barrier_uses(Node* n, Node* ctrl, Unique_Node_List& uses, PhaseIdealLoop* phase);
    +  static void test_null(Node*& ctrl, Node* val, Node*& null_ctrl, PhaseIdealLoop* phase);
    +
    +  static void test_heap_stable(Node*& ctrl, Node* raw_mem, Node*& heap_stable_ctrl,
    +                               PhaseIdealLoop* phase);
    +  static void call_wb_stub(Node*& ctrl, Node*& val, Node*& result_mem,
    +                           Node* raw_mem, Node* wb_mem, int alias,
    +                           PhaseIdealLoop* phase);
    +  static Node* clone_null_check(Node*& c, Node* val, Node* unc_ctrl, PhaseIdealLoop* phase);
    +  static void fix_null_check(Node* unc, Node* unc_ctrl, Node* new_unc_ctrl, Unique_Node_List& uses,
    +                             PhaseIdealLoop* phase);
    +  static void in_cset_fast_test(Node*& ctrl, Node*& not_cset_ctrl, Node* val, Node* raw_mem, PhaseIdealLoop* phase);
    +  static void move_heap_stable_test_out_of_loop(IfNode* iff, PhaseIdealLoop* phase);
    +
    +  static void optimize_after_expansion(VectorSet &visited, Node_Stack &nstack, Node_List &old_new, PhaseIdealLoop* phase);
    +  static void merge_back_to_back_tests(Node* n, PhaseIdealLoop* phase);
    +  static bool identical_backtoback_ifs(Node *n, PhaseIdealLoop* phase);
    +  static void fix_ctrl(Node* barrier, Node* region, const MemoryGraphFixer& fixer, Unique_Node_List& uses, Unique_Node_List& uses_to_ignore, uint last, PhaseIdealLoop* phase);
    +
    +  static void optimize_before_expansion(PhaseIdealLoop* phase, GrowableArray memory_graph_fixers, bool include_lsm);
    +  Node* would_subsume(ShenandoahBarrierNode* other, PhaseIdealLoop* phase);
    +  static IfNode* find_unswitching_candidate(const IdealLoopTree *loop, PhaseIdealLoop* phase);
    +
    +  Node* try_split_thru_phi(PhaseIdealLoop* phase);
    +};
    +
    +class ShenandoahWBMemProjNode : public Node {
    +public:
    +  enum { Control,
    +         WriteBarrier };
    +
    +  ShenandoahWBMemProjNode(Node *src) : Node(NULL, src) {
    +    assert(UseShenandoahGC && ShenandoahWriteBarrier, "should be enabled");
    +    assert(src->Opcode() == Op_ShenandoahWriteBarrier || src->is_Mach(), "epxect wb");
    +  }
    +  virtual Node* Identity(PhaseGVN* phase);
    +
    +  virtual int Opcode() const;
    +  virtual bool      is_CFG() const  { return false; }
    +  virtual const Type *bottom_type() const {return Type::MEMORY;}
    +  virtual const TypePtr *adr_type() const {
    +    Node* wb = in(WriteBarrier);
    +    if (wb == NULL || wb->is_top())  return NULL; // node is dead
    +    assert(wb->Opcode() == Op_ShenandoahWriteBarrier || (wb->is_Mach() && wb->as_Mach()->ideal_Opcode() == Op_ShenandoahWriteBarrier) || wb->is_Phi(), "expect wb");
    +    return ShenandoahBarrierNode::brooks_pointer_type(wb->bottom_type());
    +  }
    +
    +  virtual uint ideal_reg() const { return 0;} // memory projections don't have a register
    +  virtual const Type *Value(PhaseGVN* phase ) const {
    +    return bottom_type();
    +  }
    +#ifndef PRODUCT
    +  virtual void dump_spec(outputStream *st) const {};
    +#endif
    +};
    +
    +class ShenandoahEnqueueBarrierNode : public Node {
    +public:
    +  ShenandoahEnqueueBarrierNode(Node* val) : Node(NULL, val) {
    +  }
    +
    +  const Type *bottom_type() const;
    +  const Type* Value(PhaseGVN* phase) const;
    +  Node* Identity(PhaseGVN* phase);
    +
    +  int Opcode() const;
    +
    +private:
    +  enum { Needed, NotNeeded, MaybeNeeded };
    +
    +  static int needed(Node* n);
    +  static Node* next(Node* n);
    +};
    +
    +class MemoryGraphFixer : public ResourceObj {
    +private:
    +  Node_List _memory_nodes;
    +  int _alias;
    +  PhaseIdealLoop* _phase;
    +  bool _include_lsm;
    +
    +  void collect_memory_nodes();
    +  Node* get_ctrl(Node* n) const;
    +  Node* ctrl_or_self(Node* n) const;
    +  bool mem_is_valid(Node* m, Node* c) const;
    +  MergeMemNode* allocate_merge_mem(Node* mem, Node* rep_proj, Node* rep_ctrl) const;
    +  MergeMemNode* clone_merge_mem(Node* u, Node* mem, Node* rep_proj, Node* rep_ctrl, DUIterator& i) const;
    +  void fix_memory_uses(Node* mem, Node* replacement, Node* rep_proj, Node* rep_ctrl) const;
    +  bool should_process_phi(Node* phi) const;
    +  bool has_mem_phi(Node* region) const;
    +
    +public:
    +  MemoryGraphFixer(int alias, bool include_lsm, PhaseIdealLoop* phase) :
    +    _alias(alias), _phase(phase), _include_lsm(include_lsm) {
    +    assert(_alias != Compile::AliasIdxBot, "unsupported");
    +    collect_memory_nodes();
    +  }
    +
    +  Node* find_mem(Node* ctrl, Node* n) const;
    +  void fix_mem(Node* ctrl, Node* region, Node* mem, Node* mem_for_ctrl, Node* mem_phi, Unique_Node_List& uses);
    +  int alias() const { return _alias; }
    +  void remove(Node* n);
    +};
    +
    +class ShenandoahCompareAndSwapPNode : public CompareAndSwapPNode {
    +public:
    +  ShenandoahCompareAndSwapPNode(Node *c, Node *mem, Node *adr, Node *val, Node *ex, MemNode::MemOrd mem_ord)
    +    : CompareAndSwapPNode(c, mem, adr, val, ex, mem_ord) { }
    +
    +  virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) {
    +    if (in(ExpectedIn) != NULL && phase->type(in(ExpectedIn)) == TypePtr::NULL_PTR) {
    +      return new CompareAndSwapPNode(in(MemNode::Control), in(MemNode::Memory), in(MemNode::Address), in(MemNode::ValueIn), in(ExpectedIn), order());
    +    }
    +    return NULL;
    +  }
    +
    +  virtual int Opcode() const;
    +};
    +
    +class ShenandoahCompareAndSwapNNode : public CompareAndSwapNNode {
    +public:
    +  ShenandoahCompareAndSwapNNode(Node *c, Node *mem, Node *adr, Node *val, Node *ex, MemNode::MemOrd mem_ord)
    +    : CompareAndSwapNNode(c, mem, adr, val, ex, mem_ord) { }
    +
    +  virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) {
    +    if (in(ExpectedIn) != NULL && phase->type(in(ExpectedIn)) == TypeNarrowOop::NULL_PTR) {
    +      return new CompareAndSwapNNode(in(MemNode::Control), in(MemNode::Memory), in(MemNode::Address), in(MemNode::ValueIn), in(ExpectedIn), order());
    +    }
    +    return NULL;
    +  }
    +
    +  virtual int Opcode() const;
    +};
    +
    +class ShenandoahWeakCompareAndSwapPNode : public WeakCompareAndSwapPNode {
    +public:
    +  ShenandoahWeakCompareAndSwapPNode(Node *c, Node *mem, Node *adr, Node *val, Node *ex, MemNode::MemOrd mem_ord)
    +    : WeakCompareAndSwapPNode(c, mem, adr, val, ex, mem_ord) { }
    +
    +  virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) {
    +    if (in(ExpectedIn) != NULL && phase->type(in(ExpectedIn)) == TypePtr::NULL_PTR) {
    +      return new WeakCompareAndSwapPNode(in(MemNode::Control), in(MemNode::Memory), in(MemNode::Address), in(MemNode::ValueIn), in(ExpectedIn), order());
    +    }
    +    return NULL;
    +  }
    +
    +  virtual int Opcode() const;
    +};
    +
    +class ShenandoahWeakCompareAndSwapNNode : public WeakCompareAndSwapNNode {
    +public:
    +  ShenandoahWeakCompareAndSwapNNode(Node *c, Node *mem, Node *adr, Node *val, Node *ex, MemNode::MemOrd mem_ord)
    +    : WeakCompareAndSwapNNode(c, mem, adr, val, ex, mem_ord) { }
    +
    +  virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) {
    +    if (in(ExpectedIn) != NULL && phase->type(in(ExpectedIn)) == TypeNarrowOop::NULL_PTR) {
    +      return new WeakCompareAndSwapNNode(in(MemNode::Control), in(MemNode::Memory), in(MemNode::Address), in(MemNode::ValueIn), in(ExpectedIn), order());
    +    }
    +    return NULL;
    +  }
    +
    +  virtual int Opcode() const;
    +};
    +
    +class ShenandoahCompareAndExchangePNode : public CompareAndExchangePNode {
    +public:
    +  ShenandoahCompareAndExchangePNode(Node *c, Node *mem, Node *adr, Node *val, Node *ex, const TypePtr* at, const Type* t, MemNode::MemOrd mem_ord)
    +    : CompareAndExchangePNode(c, mem, adr, val, ex, at, t, mem_ord) { }
    +
    +  virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) {
    +    if (in(ExpectedIn) != NULL && phase->type(in(ExpectedIn)) == TypePtr::NULL_PTR) {
    +      return new CompareAndExchangePNode(in(MemNode::Control), in(MemNode::Memory), in(MemNode::Address), in(MemNode::ValueIn), in(ExpectedIn), adr_type(), bottom_type(), order());
    +    }
    +    return NULL;
    +  }
    +
    +  virtual int Opcode() const;
    +};
    +
    +class ShenandoahCompareAndExchangeNNode : public CompareAndExchangeNNode {
    +public:
    +  ShenandoahCompareAndExchangeNNode(Node *c, Node *mem, Node *adr, Node *val, Node *ex, const TypePtr* at, const Type* t, MemNode::MemOrd mem_ord)
    +    : CompareAndExchangeNNode(c, mem, adr, val, ex, at, t, mem_ord) { }
    +
    +  virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) {
    +    if (in(ExpectedIn) != NULL && phase->type(in(ExpectedIn)) == TypeNarrowOop::NULL_PTR) {
    +      return new CompareAndExchangeNNode(in(MemNode::Control), in(MemNode::Memory), in(MemNode::Address), in(MemNode::ValueIn), in(ExpectedIn), adr_type(), bottom_type(), order());
    +    }
    +    return NULL;
    +  }
    +
    +  virtual int Opcode() const;
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_C2_SHENANDOAH_SUPPORT_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp
    new file mode 100644
    index 00000000000..3d8d3f39f7b
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp
    @@ -0,0 +1,214 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/shenandoahFreeSet.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "logging/log.hpp"
    +#include "logging/logTag.hpp"
    +#include "utilities/quickSort.hpp"
    +
    +ShenandoahAdaptiveHeuristics::ShenandoahAdaptiveHeuristics() :
    +  ShenandoahHeuristics(),
    +  _cycle_gap_history(new TruncatedSeq(5)),
    +  _conc_mark_duration_history(new TruncatedSeq(5)),
    +  _conc_uprefs_duration_history(new TruncatedSeq(5)) {
    +
    +  SHENANDOAH_ERGO_ENABLE_FLAG(ExplicitGCInvokesConcurrent);
    +  SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent);
    +
    +  // Final configuration checks
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahReadBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahWriteBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahStoreValReadBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahKeepAliveBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahAcmpBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
    +}
    +
    +ShenandoahAdaptiveHeuristics::~ShenandoahAdaptiveHeuristics() {}
    +
    +void ShenandoahAdaptiveHeuristics::choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
    +                                                                         RegionData* data, size_t size,
    +                                                                         size_t actual_free) {
    +  size_t garbage_threshold = ShenandoahHeapRegion::region_size_bytes() * ShenandoahGarbageThreshold / 100;
    +
    +  // The logic for cset selection in adaptive is as follows:
    +  //
    +  //   1. We cannot get cset larger than available free space. Otherwise we guarantee OOME
    +  //      during evacuation, and thus guarantee full GC. In practice, we also want to let
    +  //      application to allocate something. This is why we limit CSet to some fraction of
    +  //      available space. In non-overloaded heap, max_cset would contain all plausible candidates
    +  //      over garbage threshold.
    +  //
    +  //   2. We should not get cset too low so that free threshold would not be met right
    +  //      after the cycle. Otherwise we get back-to-back cycles for no reason if heap is
    +  //      too fragmented. In non-overloaded non-fragmented heap min_garbage would be around zero.
    +  //
    +  // Therefore, we start by sorting the regions by garbage. Then we unconditionally add the best candidates
    +  // before we meet min_garbage. Then we add all candidates that fit with a garbage threshold before
    +  // we hit max_cset. When max_cset is hit, we terminate the cset selection. Note that in this scheme,
    +  // ShenandoahGarbageThreshold is the soft threshold which would be ignored until min_garbage is hit.
    +
    +  size_t capacity    = ShenandoahHeap::heap()->capacity();
    +  size_t free_target = ShenandoahMinFreeThreshold * capacity / 100;
    +  size_t min_garbage = free_target > actual_free ? (free_target - actual_free) : 0;
    +  size_t max_cset    = (size_t)(1.0 * ShenandoahEvacReserve * capacity / 100 / ShenandoahEvacWaste);
    +
    +  log_info(gc, ergo)("Adaptive CSet Selection. Target Free: " SIZE_FORMAT "M, Actual Free: "
    +                     SIZE_FORMAT "M, Max CSet: " SIZE_FORMAT "M, Min Garbage: " SIZE_FORMAT "M",
    +                     free_target / M, actual_free / M, max_cset / M, min_garbage / M);
    +
    +  // Better select garbage-first regions
    +  QuickSort::sort(data, (int)size, compare_by_garbage, false);
    +
    +  size_t cur_cset = 0;
    +  size_t cur_garbage = 0;
    +  _bytes_in_cset = 0;
    +
    +  for (size_t idx = 0; idx < size; idx++) {
    +    ShenandoahHeapRegion* r = data[idx]._region;
    +
    +    size_t new_cset    = cur_cset + r->get_live_data_bytes();
    +    size_t new_garbage = cur_garbage + r->garbage();
    +
    +    if (new_cset > max_cset) {
    +      break;
    +    }
    +
    +    if ((new_garbage < min_garbage) || (r->garbage() > garbage_threshold)) {
    +      cset->add_region(r);
    +      _bytes_in_cset += r->used();
    +      cur_cset = new_cset;
    +      cur_garbage = new_garbage;
    +    }
    +  }
    +}
    +
    +void ShenandoahAdaptiveHeuristics::record_cycle_start() {
    +  ShenandoahHeuristics::record_cycle_start();
    +  double last_cycle_gap = (_cycle_start - _last_cycle_end);
    +  _cycle_gap_history->add(last_cycle_gap);
    +}
    +
    +void ShenandoahAdaptiveHeuristics::record_phase_time(ShenandoahPhaseTimings::Phase phase, double secs) {
    +  if (phase == ShenandoahPhaseTimings::conc_mark) {
    +    _conc_mark_duration_history->add(secs);
    +  } else if (phase == ShenandoahPhaseTimings::conc_update_refs) {
    +    _conc_uprefs_duration_history->add(secs);
    +  } // Else ignore
    +}
    +
    +bool ShenandoahAdaptiveHeuristics::should_start_normal_gc() const {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  size_t capacity = heap->capacity();
    +  size_t available = heap->free_set()->available();
    +
    +  // Check if we are falling below the worst limit, time to trigger the GC, regardless of
    +  // anything else.
    +  size_t min_threshold = ShenandoahMinFreeThreshold * heap->capacity() / 100;
    +  if (available < min_threshold) {
    +    log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below minimum threshold (" SIZE_FORMAT "M)",
    +                 available / M, min_threshold / M);
    +    return true;
    +  }
    +
    +  // Check if are need to learn a bit about the application
    +  const size_t max_learn = ShenandoahLearningSteps;
    +  if (_gc_times_learned < max_learn) {
    +    size_t init_threshold = ShenandoahInitFreeThreshold * heap->capacity() / 100;
    +    if (available < init_threshold) {
    +      log_info(gc)("Trigger: Learning " SIZE_FORMAT " of " SIZE_FORMAT ". Free (" SIZE_FORMAT "M) is below initial threshold (" SIZE_FORMAT "M)",
    +                   _gc_times_learned + 1, max_learn, available / M, init_threshold / M);
    +      return true;
    +    }
    +  }
    +
    +  // Check if allocation headroom is still okay. This also factors in:
    +  //   1. Some space to absorb allocation spikes
    +  //   2. Accumulated penalties from Degenerated and Full GC
    +
    +  size_t allocation_headroom = available;
    +
    +  size_t spike_headroom = ShenandoahAllocSpikeFactor * capacity / 100;
    +  size_t penalties      = _gc_time_penalties         * capacity / 100;
    +
    +  allocation_headroom -= MIN2(allocation_headroom, spike_headroom);
    +  allocation_headroom -= MIN2(allocation_headroom, penalties);
    +
    +  // TODO: Allocation rate is way too averaged to be useful during state changes
    +
    +  double average_gc = _gc_time_history->avg();
    +  double time_since_last = time_since_last_gc();
    +  double allocation_rate = heap->bytes_allocated_since_gc_start() / time_since_last;
    +
    +  if (average_gc > allocation_headroom / allocation_rate) {
    +    log_info(gc)("Trigger: Average GC time (%.2f ms) is above the time for allocation rate (%.2f MB/s) to deplete free headroom (" SIZE_FORMAT "M)",
    +                 average_gc * 1000, allocation_rate / M, allocation_headroom / M);
    +    log_info(gc, ergo)("Free headroom: " SIZE_FORMAT "M (free) - " SIZE_FORMAT "M (spike) - " SIZE_FORMAT "M (penalties) = " SIZE_FORMAT "M",
    +                       available / M, spike_headroom / M, penalties / M, allocation_headroom / M);
    +    return true;
    +  }
    +
    +  return ShenandoahHeuristics::should_start_normal_gc();
    +}
    +
    +bool ShenandoahAdaptiveHeuristics::should_start_update_refs() {
    +  if (! _update_refs_adaptive) {
    +    return _update_refs_early;
    +  }
    +
    +  double cycle_gap_avg = _cycle_gap_history->avg();
    +  double conc_mark_avg = _conc_mark_duration_history->avg();
    +  double conc_uprefs_avg = _conc_uprefs_duration_history->avg();
    +
    +  if (_update_refs_early) {
    +    double threshold = ShenandoahMergeUpdateRefsMinGap / 100.0;
    +    if (conc_mark_avg + conc_uprefs_avg > cycle_gap_avg * threshold) {
    +      _update_refs_early = false;
    +    }
    +  } else {
    +    double threshold = ShenandoahMergeUpdateRefsMaxGap / 100.0;
    +    if (conc_mark_avg + conc_uprefs_avg < cycle_gap_avg * threshold) {
    +      _update_refs_early = true;
    +    }
    +  }
    +  return _update_refs_early;
    +}
    +
    +const char* ShenandoahAdaptiveHeuristics::name() {
    +  return "adaptive";
    +}
    +
    +bool ShenandoahAdaptiveHeuristics::is_diagnostic() {
    +  return false;
    +}
    +
    +bool ShenandoahAdaptiveHeuristics::is_experimental() {
    +  return false;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.hpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.hpp
    new file mode 100644
    index 00000000000..8a05958b4c2
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.hpp
    @@ -0,0 +1,61 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHADAPTIVEHEURISTICS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHADAPTIVEHEURISTICS_HPP
    +
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "utilities/numberSeq.hpp"
    +
    +class ShenandoahAdaptiveHeuristics : public ShenandoahHeuristics {
    +private:
    +  TruncatedSeq* _cycle_gap_history;
    +  TruncatedSeq* _conc_mark_duration_history;
    +  TruncatedSeq* _conc_uprefs_duration_history;
    +
    +public:
    +  ShenandoahAdaptiveHeuristics();
    +
    +  virtual ~ShenandoahAdaptiveHeuristics();
    +
    +  virtual void choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
    +                                                     RegionData* data, size_t size,
    +                                                     size_t actual_free);
    +
    +  void record_cycle_start();
    +
    +  virtual void record_phase_time(ShenandoahPhaseTimings::Phase phase, double secs);
    +
    +  virtual bool should_start_normal_gc() const;
    +
    +  virtual bool should_start_update_refs();
    +
    +  virtual const char* name();
    +
    +  virtual bool is_diagnostic();
    +
    +  virtual bool is_experimental();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHADAPTIVEHEURISTICS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAggressiveHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAggressiveHeuristics.cpp
    new file mode 100644
    index 00000000000..21b1a725293
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAggressiveHeuristics.cpp
    @@ -0,0 +1,99 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/heuristics/shenandoahAggressiveHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "logging/log.hpp"
    +#include "logging/logTag.hpp"
    +#include "runtime/os.hpp"
    +
    +ShenandoahAggressiveHeuristics::ShenandoahAggressiveHeuristics() : ShenandoahHeuristics() {
    +  // Do not shortcut evacuation
    +  SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahImmediateThreshold, 100);
    +
    +  // Aggressive runs with max speed for allocation, to capture races against mutator
    +  SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahPacing);
    +
    +  // Aggressive evacuates everything, so it needs as much evac space as it can get
    +  SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahEvacReserveOverflow);
    +
    +  // If class unloading is globally enabled, aggressive does unloading even with
    +  // concurrent cycles.
    +  if (ClassUnloading) {
    +    SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahUnloadClassesFrequency, 1);
    +  }
    +
    +  // Final configuration checks
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahReadBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahWriteBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahStoreValReadBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahKeepAliveBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahAcmpBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
    +}
    +
    +void ShenandoahAggressiveHeuristics::choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
    +                                                                           RegionData* data, size_t size,
    +                                                                           size_t free) {
    +  for (size_t idx = 0; idx < size; idx++) {
    +    ShenandoahHeapRegion* r = data[idx]._region;
    +    if (r->garbage() > 0) {
    +      cset->add_region(r);
    +    }
    +  }
    +}
    +
    +bool ShenandoahAggressiveHeuristics::should_start_normal_gc() const {
    +  log_info(gc)("Trigger: Start next cycle immediately");
    +  return true;
    +}
    +
    +bool ShenandoahAggressiveHeuristics::should_process_references() {
    +  if (!can_process_references()) return false;
    +  // Randomly process refs with 50% chance.
    +  return (os::random() & 1) == 1;
    +}
    +
    +bool ShenandoahAggressiveHeuristics::should_unload_classes() {
    +  if (!can_unload_classes_normal()) return false;
    +  if (has_metaspace_oom()) return true;
    +  // Randomly unload classes with 50% chance.
    +  return (os::random() & 1) == 1;
    +}
    +
    +const char* ShenandoahAggressiveHeuristics::name() {
    +  return "aggressive";
    +}
    +
    +bool ShenandoahAggressiveHeuristics::is_diagnostic() {
    +  return true;
    +}
    +
    +bool ShenandoahAggressiveHeuristics::is_experimental() {
    +  return false;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAggressiveHeuristics.hpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAggressiveHeuristics.hpp
    new file mode 100644
    index 00000000000..f7c5658dd1a
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAggressiveHeuristics.hpp
    @@ -0,0 +1,50 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHAGGRESSIVEHEURISTICS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHAGGRESSIVEHEURISTICS_HPP
    +
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +
    +class ShenandoahAggressiveHeuristics : public ShenandoahHeuristics {
    +public:
    +  ShenandoahAggressiveHeuristics();
    +
    +  virtual void choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
    +                                                     RegionData* data, size_t size,
    +                                                     size_t free);
    +
    +  virtual bool should_start_normal_gc() const;
    +
    +  virtual bool should_process_references();
    +
    +  virtual bool should_unload_classes();
    +
    +  virtual const char* name();
    +
    +  virtual bool is_diagnostic();
    +
    +  virtual bool is_experimental();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHAGGRESSIVEHEURISTICS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.cpp
    new file mode 100644
    index 00000000000..7447c3200e6
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.cpp
    @@ -0,0 +1,116 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/heuristics/shenandoahCompactHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahFreeSet.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "logging/log.hpp"
    +#include "logging/logTag.hpp"
    +
    +ShenandoahCompactHeuristics::ShenandoahCompactHeuristics() : ShenandoahHeuristics() {
    +  SHENANDOAH_ERGO_ENABLE_FLAG(ExplicitGCInvokesConcurrent);
    +  SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent);
    +  SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahUncommit);
    +  SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahAlwaysClearSoftRefs);
    +  SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahAllocationThreshold,  10);
    +  SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahImmediateThreshold,   100);
    +  SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahUncommitDelay,        1000);
    +  SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahGuaranteedGCInterval, 30000);
    +  SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahGarbageThreshold,     10);
    +
    +  // Final configuration checks
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahReadBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahWriteBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahStoreValReadBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahKeepAliveBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahAcmpBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
    +}
    +
    +bool ShenandoahCompactHeuristics::should_start_normal_gc() const {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  size_t available = heap->free_set()->available();
    +  size_t threshold_bytes_allocated = heap->capacity() * ShenandoahAllocationThreshold / 100;
    +  size_t min_threshold = ShenandoahMinFreeThreshold * heap->capacity() / 100;
    +
    +  if (available < min_threshold) {
    +    log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below minimum threshold (" SIZE_FORMAT "M)",
    +                 available / M, min_threshold / M);
    +    return true;
    +  }
    +
    +  if (available < threshold_bytes_allocated) {
    +    log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is lower than allocated recently (" SIZE_FORMAT "M)",
    +                 available / M, threshold_bytes_allocated / M);
    +    return true;
    +  }
    +
    +  size_t bytes_allocated = heap->bytes_allocated_since_gc_start();
    +  if (bytes_allocated > threshold_bytes_allocated) {
    +    log_info(gc)("Trigger: Allocated since last cycle (" SIZE_FORMAT "M) is larger than allocation threshold (" SIZE_FORMAT "M)",
    +                 bytes_allocated / M, threshold_bytes_allocated / M);
    +    return true;
    +  }
    +
    +  return ShenandoahHeuristics::should_start_normal_gc();
    +}
    +
    +void ShenandoahCompactHeuristics::choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
    +                                                                        RegionData* data, size_t size,
    +                                                                        size_t actual_free) {
    +  // Do not select too large CSet that would overflow the available free space
    +  size_t max_cset = actual_free * 3 / 4;
    +
    +  log_info(gc, ergo)("CSet Selection. Actual Free: " SIZE_FORMAT "M, Max CSet: " SIZE_FORMAT "M",
    +                     actual_free / M, max_cset / M);
    +
    +  size_t threshold = ShenandoahHeapRegion::region_size_bytes() * ShenandoahGarbageThreshold / 100;
    +
    +  size_t live_cset = 0;
    +  for (size_t idx = 0; idx < size; idx++) {
    +    ShenandoahHeapRegion* r = data[idx]._region;
    +    size_t new_cset = live_cset + r->get_live_data_bytes();
    +    if (new_cset < max_cset && r->garbage() > threshold) {
    +      live_cset = new_cset;
    +      cset->add_region(r);
    +    }
    +  }
    +}
    +
    +const char* ShenandoahCompactHeuristics::name() {
    +  return "compact";
    +}
    +
    +bool ShenandoahCompactHeuristics::is_diagnostic() {
    +  return false;
    +}
    +
    +bool ShenandoahCompactHeuristics::is_experimental() {
    +  return false;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.hpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.hpp
    new file mode 100644
    index 00000000000..28d3f705c24
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.hpp
    @@ -0,0 +1,46 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHCOMPACTHEURISTICS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHCOMPACTHEURISTICS_HPP
    +
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +
    +class ShenandoahCompactHeuristics : public ShenandoahHeuristics {
    +public:
    +  ShenandoahCompactHeuristics();
    +
    +  virtual bool should_start_normal_gc() const;
    +
    +  virtual void choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
    +                                                     RegionData* data, size_t size,
    +                                                     size_t actual_free);
    +
    +  virtual const char* name();
    +
    +  virtual bool is_diagnostic();
    +
    +  virtual bool is_experimental();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHCOMPACTHEURISTICS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahPassiveHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahPassiveHeuristics.cpp
    new file mode 100644
    index 00000000000..6bb325185a5
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahPassiveHeuristics.cpp
    @@ -0,0 +1,117 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/heuristics/shenandoahPassiveHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "logging/log.hpp"
    +#include "logging/logTag.hpp"
    +
    +ShenandoahPassiveHeuristics::ShenandoahPassiveHeuristics() : ShenandoahHeuristics() {
    +  // Do not allow concurrent cycles.
    +  FLAG_SET_DEFAULT(ExplicitGCInvokesConcurrent, false);
    +  FLAG_SET_DEFAULT(ShenandoahImplicitGCInvokesConcurrent, false);
    +
    +  // Passive runs with max speed, reacts on allocation failure.
    +  FLAG_SET_DEFAULT(ShenandoahPacing, false);
    +
    +  // No need for evacuation reserve with Full GC, only for Degenerated GC.
    +  if (!ShenandoahDegeneratedGC) {
    +    SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahEvacReserve, 0);
    +  }
    +
    +  // Disable known barriers by default.
    +  SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahSATBBarrier);
    +  SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahKeepAliveBarrier);
    +  SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahWriteBarrier);
    +  SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahReadBarrier);
    +  SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahStoreValEnqueueBarrier);
    +  SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahStoreValReadBarrier);
    +  SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahCASBarrier);
    +  SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahAcmpBarrier);
    +  SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahCloneBarrier);
    +
    +  // Final configuration checks
    +  // No barriers are required to run.
    +}
    +
    +bool ShenandoahPassiveHeuristics::should_start_normal_gc() const {
    +  // Never do concurrent GCs.
    +  return false;
    +}
    +
    +bool ShenandoahPassiveHeuristics::should_process_references() {
    +  // Always process references, if we can.
    +  return can_process_references();
    +}
    +
    +bool ShenandoahPassiveHeuristics::should_unload_classes() {
    +  // Always unload classes, if we can.
    +  return can_unload_classes();
    +}
    +
    +bool ShenandoahPassiveHeuristics::should_degenerate_cycle() {
    +  // Always fail to Degenerated GC, if enabled
    +  return ShenandoahDegeneratedGC;
    +}
    +
    +void ShenandoahPassiveHeuristics::choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
    +                                                                        RegionData* data, size_t size,
    +                                                                        size_t actual_free) {
    +  assert(ShenandoahDegeneratedGC, "This path is only taken for Degenerated GC");
    +
    +  // Do not select too large CSet that would overflow the available free space.
    +  // Take at least the entire evacuation reserve, and be free to overflow to free space.
    +  size_t capacity  = ShenandoahHeap::heap()->capacity();
    +  size_t available = MAX2(ShenandoahEvacReserve * capacity / 100, actual_free);
    +  size_t max_cset  = (size_t)(available / ShenandoahEvacWaste);
    +
    +  log_info(gc, ergo)("CSet Selection. Actual Free: " SIZE_FORMAT "M, Max CSet: " SIZE_FORMAT "M",
    +                     actual_free / M, max_cset / M);
    +
    +  size_t threshold = ShenandoahHeapRegion::region_size_bytes() * ShenandoahGarbageThreshold / 100;
    +
    +  size_t live_cset = 0;
    +  for (size_t idx = 0; idx < size; idx++) {
    +    ShenandoahHeapRegion* r = data[idx]._region;
    +    size_t new_cset = live_cset + r->get_live_data_bytes();
    +    if (new_cset < max_cset && r->garbage() > threshold) {
    +      live_cset = new_cset;
    +      cset->add_region(r);
    +    }
    +  }
    +}
    +
    +const char* ShenandoahPassiveHeuristics::name() {
    +  return "passive";
    +}
    +
    +bool ShenandoahPassiveHeuristics::is_diagnostic() {
    +  return true;
    +}
    +
    +bool ShenandoahPassiveHeuristics::is_experimental() {
    +  return false;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahPassiveHeuristics.hpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahPassiveHeuristics.hpp
    new file mode 100644
    index 00000000000..57191b04961
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahPassiveHeuristics.hpp
    @@ -0,0 +1,52 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHPASSIVEHEURISTICS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHPASSIVEHEURISTICS_HPP
    +
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +
    +class ShenandoahPassiveHeuristics : public ShenandoahHeuristics {
    +public:
    +  ShenandoahPassiveHeuristics();
    +
    +  virtual bool should_start_normal_gc() const;
    +
    +  virtual bool should_process_references();
    +
    +  virtual bool should_unload_classes();
    +
    +  virtual bool should_degenerate_cycle();
    +
    +  virtual void choose_collection_set_from_regiondata(ShenandoahCollectionSet* set,
    +                                                     RegionData* data, size_t data_size,
    +                                                     size_t free);
    +
    +  virtual const char* name();
    +
    +  virtual bool is_diagnostic();
    +
    +  virtual bool is_experimental();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHPASSIVEHEURISTICS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahStaticHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahStaticHeuristics.cpp
    new file mode 100644
    index 00000000000..db6aa6fcd6a
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahStaticHeuristics.cpp
    @@ -0,0 +1,93 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/heuristics/shenandoahStaticHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/shenandoahFreeSet.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "logging/log.hpp"
    +#include "logging/logTag.hpp"
    +
    +ShenandoahStaticHeuristics::ShenandoahStaticHeuristics() : ShenandoahHeuristics() {
    +  // Static heuristics may degrade to continuous if live data is larger
    +  // than free threshold. ShenandoahAllocationThreshold is supposed to break this,
    +  // but it only works if it is non-zero.
    +  SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahAllocationThreshold, 1);
    +
    +  SHENANDOAH_ERGO_ENABLE_FLAG(ExplicitGCInvokesConcurrent);
    +  SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent);
    +
    +  // Final configuration checks
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahReadBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahWriteBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahStoreValReadBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahKeepAliveBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahAcmpBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
    +}
    +
    +ShenandoahStaticHeuristics::~ShenandoahStaticHeuristics() {}
    +
    +bool ShenandoahStaticHeuristics::should_start_normal_gc() const {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  size_t capacity = heap->capacity();
    +  size_t available = heap->free_set()->available();
    +  size_t threshold_available = (capacity * ShenandoahFreeThreshold) / 100;
    +
    +  if (available < threshold_available) {
    +    log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below free threshold (" SIZE_FORMAT "M)",
    +                 available / M, threshold_available / M);
    +    return true;
    +  }
    +  return ShenandoahHeuristics::should_start_normal_gc();
    +}
    +
    +void ShenandoahStaticHeuristics::choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
    +                                                                       RegionData* data, size_t size,
    +                                                                       size_t free) {
    +  size_t threshold = ShenandoahHeapRegion::region_size_bytes() * ShenandoahGarbageThreshold / 100;
    +
    +  for (size_t idx = 0; idx < size; idx++) {
    +    ShenandoahHeapRegion* r = data[idx]._region;
    +    if (r->garbage() > threshold) {
    +      cset->add_region(r);
    +    }
    +  }
    +}
    +
    +const char* ShenandoahStaticHeuristics::name() {
    +  return "static";
    +}
    +
    +bool ShenandoahStaticHeuristics::is_diagnostic() {
    +  return false;
    +}
    +
    +bool ShenandoahStaticHeuristics::is_experimental() {
    +  return false;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahStaticHeuristics.hpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahStaticHeuristics.hpp
    new file mode 100644
    index 00000000000..5f20c86b971
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahStaticHeuristics.hpp
    @@ -0,0 +1,48 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHSTATICHEURISTICS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHSTATICHEURISTICS_HPP
    +
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +
    +class ShenandoahStaticHeuristics : public ShenandoahHeuristics {
    +public:
    +  ShenandoahStaticHeuristics();
    +
    +  virtual ~ShenandoahStaticHeuristics();
    +
    +  virtual bool should_start_normal_gc() const;
    +
    +  virtual void choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
    +                                                     RegionData* data, size_t size,
    +                                                     size_t free);
    +
    +  virtual const char* name();
    +
    +  virtual bool is_diagnostic();
    +
    +  virtual bool is_experimental();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHSTATICHEURISTICS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahTraversalHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahTraversalHeuristics.cpp
    new file mode 100644
    index 00000000000..09fe79dfd78
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahTraversalHeuristics.cpp
    @@ -0,0 +1,273 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/heuristics/shenandoahTraversalHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahFreeSet.hpp"
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahTraversalGC.hpp"
    +#include "logging/log.hpp"
    +#include "logging/logTag.hpp"
    +#include "utilities/quickSort.hpp"
    +
    +ShenandoahTraversalHeuristics::ShenandoahTraversalHeuristics() : ShenandoahHeuristics(),
    +  _last_cset_select(0)
    + {
    +  FLAG_SET_DEFAULT(ShenandoahSATBBarrier,            false);
    +  FLAG_SET_DEFAULT(ShenandoahStoreValReadBarrier,    false);
    +  FLAG_SET_DEFAULT(ShenandoahStoreValEnqueueBarrier, true);
    +  FLAG_SET_DEFAULT(ShenandoahKeepAliveBarrier,       false);
    +  FLAG_SET_DEFAULT(ShenandoahAllowMixedAllocs,       false);
    +
    +  SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahRefProcFrequency, 1);
    +
    +  // Adjust class unloading settings only if globally enabled.
    +  if (ClassUnloadingWithConcurrentMark) {
    +    SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahUnloadClassesFrequency, 1);
    +  }
    +
    +  SHENANDOAH_ERGO_ENABLE_FLAG(ExplicitGCInvokesConcurrent);
    +  SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent);
    +
    +  // Final configuration checks
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahReadBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahWriteBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahStoreValEnqueueBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahAcmpBarrier);
    +  SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
    +}
    +
    +bool ShenandoahTraversalHeuristics::should_start_normal_gc() const {
    +  return false;
    +}
    +
    +bool ShenandoahTraversalHeuristics::is_experimental() {
    +  return true;
    +}
    +
    +bool ShenandoahTraversalHeuristics::is_diagnostic() {
    +  return false;
    +}
    +
    +bool ShenandoahTraversalHeuristics::can_do_traversal_gc() {
    +  return true;
    +}
    +
    +const char* ShenandoahTraversalHeuristics::name() {
    +  return "traversal";
    +}
    +
    +void ShenandoahTraversalHeuristics::choose_collection_set(ShenandoahCollectionSet* collection_set) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  ShenandoahTraversalGC* traversal_gc = heap->traversal_gc();
    +
    +  ShenandoahHeapRegionSet* traversal_set = traversal_gc->traversal_set();
    +  traversal_set->clear();
    +
    +  RegionData *data = get_region_data_cache(heap->num_regions());
    +  size_t cnt = 0;
    +
    +  // Step 0. Prepare all regions
    +
    +  for (size_t i = 0; i < heap->num_regions(); i++) {
    +    ShenandoahHeapRegion* r = heap->get_region(i);
    +    if (r->used() > 0) {
    +      if (r->is_regular()) {
    +        data[cnt]._region = r;
    +        data[cnt]._garbage = r->garbage();
    +        data[cnt]._seqnum_last_alloc = r->seqnum_last_alloc_mutator();
    +        cnt++;
    +      }
    +      traversal_set->add_region(r);
    +    }
    +  }
    +
    +  // The logic for cset selection is similar to that of adaptive:
    +  //
    +  //   1. We cannot get cset larger than available free space. Otherwise we guarantee OOME
    +  //      during evacuation, and thus guarantee full GC. In practice, we also want to let
    +  //      application to allocate something. This is why we limit CSet to some fraction of
    +  //      available space. In non-overloaded heap, max_cset would contain all plausible candidates
    +  //      over garbage threshold.
    +  //
    +  //   2. We should not get cset too low so that free threshold would not be met right
    +  //      after the cycle. Otherwise we get back-to-back cycles for no reason if heap is
    +  //      too fragmented. In non-overloaded non-fragmented heap min_garbage would be around zero.
    +  //
    +  // Therefore, we start by sorting the regions by garbage. Then we unconditionally add the best candidates
    +  // before we meet min_garbage. Then we add all candidates that fit with a garbage threshold before
    +  // we hit max_cset. When max_cset is hit, we terminate the cset selection. Note that in this scheme,
    +  // ShenandoahGarbageThreshold is the soft threshold which would be ignored until min_garbage is hit.
    +  //
    +  // The significant complication is that liveness data was collected at the previous cycle, and only
    +  // for those regions that were allocated before previous cycle started.
    +
    +  size_t capacity    = heap->capacity();
    +  size_t actual_free = heap->free_set()->available();
    +  size_t free_target = ShenandoahMinFreeThreshold * capacity / 100;
    +  size_t min_garbage = free_target > actual_free ? (free_target - actual_free) : 0;
    +  size_t max_cset    = (size_t)(1.0 * ShenandoahEvacReserve * capacity / 100 / ShenandoahEvacWaste);
    +
    +  log_info(gc, ergo)("Adaptive CSet Selection. Target Free: " SIZE_FORMAT "M, Actual Free: "
    +                     SIZE_FORMAT "M, Max CSet: " SIZE_FORMAT "M, Min Garbage: " SIZE_FORMAT "M",
    +                     free_target / M, actual_free / M, max_cset / M, min_garbage / M);
    +
    +  // Better select garbage-first regions, and then older ones
    +  QuickSort::sort(data, (int) cnt, compare_by_garbage_then_alloc_seq_ascending, false);
    +
    +  size_t cur_cset = 0;
    +  size_t cur_garbage = 0;
    +
    +  size_t garbage_threshold = ShenandoahHeapRegion::region_size_bytes() / 100 * ShenandoahGarbageThreshold;
    +
    +  // Step 1. Add trustworthy regions to collection set.
    +  //
    +  // We can trust live/garbage data from regions that were fully traversed during
    +  // previous cycle. Even if actual liveness is different now, we can only have _less_
    +  // live objects, because dead objects are not resurrected. Which means we can undershoot
    +  // the collection set, but not overshoot it.
    +
    +  for (size_t i = 0; i < cnt; i++) {
    +    if (data[i]._seqnum_last_alloc > _last_cset_select) continue;
    +
    +    ShenandoahHeapRegion* r = data[i]._region;
    +    assert (r->is_regular(), "should have been filtered before");
    +
    +    size_t new_garbage = cur_garbage + r->garbage();
    +    size_t new_cset    = cur_cset    + r->get_live_data_bytes();
    +
    +    if (new_cset > max_cset) {
    +      break;
    +    }
    +
    +    if ((new_garbage < min_garbage) || (r->garbage() > garbage_threshold)) {
    +      assert(!collection_set->is_in(r), "must not yet be in cset");
    +      collection_set->add_region(r);
    +      cur_cset = new_cset;
    +      cur_garbage = new_garbage;
    +    }
    +  }
    +
    +  // Step 2. Try to catch some recently allocated regions for evacuation ride.
    +  //
    +  // Pessimistically assume we are going to evacuate the entire region. While this
    +  // is very pessimistic and in most cases undershoots the collection set when regions
    +  // are mostly dead, it also provides more safety against running into allocation
    +  // failure when newly allocated regions are fully live.
    +
    +  for (size_t i = 0; i < cnt; i++) {
    +    if (data[i]._seqnum_last_alloc <= _last_cset_select) continue;
    +
    +    ShenandoahHeapRegion* r = data[i]._region;
    +    assert (r->is_regular(), "should have been filtered before");
    +
    +    // size_t new_garbage = cur_garbage + 0; (implied)
    +    size_t new_cset = cur_cset + r->used();
    +
    +    if (new_cset > max_cset) {
    +      break;
    +    }
    +
    +    assert(!collection_set->is_in(r), "must not yet be in cset");
    +    collection_set->add_region(r);
    +    cur_cset = new_cset;
    +  }
    +
    +  // Step 3. Clear liveness data
    +  // TODO: Merge it with step 0, but save live data in RegionData before.
    +  for (size_t i = 0; i < heap->num_regions(); i++) {
    +    ShenandoahHeapRegion* r = heap->get_region(i);
    +    if (r->used() > 0) {
    +      r->clear_live_data();
    +    }
    +  }
    +
    +  collection_set->update_region_status();
    +
    +  _last_cset_select = ShenandoahHeapRegion::seqnum_current_alloc();
    +}
    +
    +bool ShenandoahTraversalHeuristics::should_start_traversal_gc() {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  assert(!heap->has_forwarded_objects(), "no forwarded objects here");
    +
    +  size_t capacity = heap->capacity();
    +  size_t available = heap->free_set()->available();
    +
    +  // Check if we are falling below the worst limit, time to trigger the GC, regardless of
    +  // anything else.
    +  size_t min_threshold = ShenandoahMinFreeThreshold * heap->capacity() / 100;
    +  if (available < min_threshold) {
    +    log_info(gc)("Trigger: Free (" SIZE_FORMAT "M) is below minimum threshold (" SIZE_FORMAT "M)",
    +                 available / M, min_threshold / M);
    +    return true;
    +  }
    +
    +  // Check if are need to learn a bit about the application
    +  const size_t max_learn = ShenandoahLearningSteps;
    +  if (_gc_times_learned < max_learn) {
    +    size_t init_threshold = ShenandoahInitFreeThreshold * heap->capacity() / 100;
    +    if (available < init_threshold) {
    +      log_info(gc)("Trigger: Learning " SIZE_FORMAT " of " SIZE_FORMAT ". Free (" SIZE_FORMAT "M) is below initial threshold (" SIZE_FORMAT "M)",
    +                   _gc_times_learned + 1, max_learn, available / M, init_threshold / M);
    +      return true;
    +    }
    +  }
    +
    +  // Check if allocation headroom is still okay. This also factors in:
    +  //   1. Some space to absorb allocation spikes
    +  //   2. Accumulated penalties from Degenerated and Full GC
    +
    +  size_t allocation_headroom = available;
    +
    +  size_t spike_headroom = ShenandoahAllocSpikeFactor * capacity / 100;
    +  size_t penalties      = _gc_time_penalties         * capacity / 100;
    +
    +  allocation_headroom -= MIN2(allocation_headroom, spike_headroom);
    +  allocation_headroom -= MIN2(allocation_headroom, penalties);
    +
    +  double average_gc = _gc_time_history->avg();
    +  double time_since_last = time_since_last_gc();
    +  double allocation_rate = heap->bytes_allocated_since_gc_start() / time_since_last;
    +
    +  if (average_gc > allocation_headroom / allocation_rate) {
    +    log_info(gc)("Trigger: Average GC time (%.2f ms) is above the time for allocation rate (%.2f MB/s) to deplete free headroom (" SIZE_FORMAT "M)",
    +                 average_gc * 1000, allocation_rate / M, allocation_headroom / M);
    +    log_info(gc, ergo)("Free headroom: " SIZE_FORMAT "M (free) - " SIZE_FORMAT "M (spike) - " SIZE_FORMAT "M (penalties) = " SIZE_FORMAT "M",
    +                       available / M, spike_headroom / M, penalties / M, allocation_headroom / M);
    +    return true;
    +  } else if (ShenandoahHeuristics::should_start_normal_gc()) {
    +    return true;
    +  }
    +
    +  return false;
    +}
    +
    +void ShenandoahTraversalHeuristics::choose_collection_set_from_regiondata(ShenandoahCollectionSet* set,
    +                                                                          RegionData* data, size_t data_size,
    +                                                                          size_t free) {
    +  ShouldNotReachHere();
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahTraversalHeuristics.hpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahTraversalHeuristics.hpp
    new file mode 100644
    index 00000000000..dedabe34a96
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahTraversalHeuristics.hpp
    @@ -0,0 +1,56 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHTRAVERSALHEURISTICS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHTRAVERSALHEURISTICS_HPP
    +
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +
    +class ShenandoahTraversalHeuristics : public ShenandoahHeuristics {
    +private:
    +  uint64_t _last_cset_select;
    +
    +protected:
    +  virtual void choose_collection_set_from_regiondata(ShenandoahCollectionSet* set,
    +                                                     RegionData* data, size_t data_size,
    +                                                     size_t free);
    +
    +public:
    +  ShenandoahTraversalHeuristics();
    +
    +  virtual bool should_start_normal_gc() const;
    +
    +  virtual bool is_experimental();
    +
    +  virtual bool is_diagnostic();
    +
    +  virtual bool can_do_traversal_gc();
    +
    +  virtual const char* name();
    +
    +  virtual void choose_collection_set(ShenandoahCollectionSet* collection_set);
    +
    +  virtual bool should_start_traversal_gc();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_HEURISTICS_SHENANDOAHTRAVERSALHEURISTICS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahAllocRequest.hpp b/src/hotspot/share/gc/shenandoah/shenandoahAllocRequest.hpp
    new file mode 100644
    index 00000000000..ae9d4f3a733
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahAllocRequest.hpp
    @@ -0,0 +1,158 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHALLOCREQUEST_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHALLOCREQUEST_HPP
    +
    +#include "memory/allocation.hpp"
    +
    +class ShenandoahAllocRequest : StackObj {
    +public:
    +  enum Type {
    +    _alloc_shared,      // Allocate common, outside of TLAB
    +    _alloc_shared_gc,   // Allocate common, outside of GCLAB
    +    _alloc_tlab,        // Allocate TLAB
    +    _alloc_gclab,       // Allocate GCLAB
    +    _ALLOC_LIMIT,
    +  };
    +
    +  static const char* alloc_type_to_string(Type type) {
    +    switch (type) {
    +      case _alloc_shared:
    +        return "Shared";
    +      case _alloc_shared_gc:
    +        return "Shared GC";
    +      case _alloc_tlab:
    +        return "TLAB";
    +      case _alloc_gclab:
    +        return "GCLAB";
    +      default:
    +        ShouldNotReachHere();
    +        return "";
    +    }
    +  }
    +
    +private:
    +  size_t _min_size;
    +  size_t _requested_size;
    +  size_t _actual_size;
    +  Type _alloc_type;
    +#ifdef ASSERT
    +  bool _actual_size_set;
    +#endif
    +
    +  ShenandoahAllocRequest(size_t _min_size, size_t _requested_size, Type _alloc_type) :
    +          _min_size(_min_size), _requested_size(_requested_size),
    +          _actual_size(0), _alloc_type(_alloc_type)
    +#ifdef ASSERT
    +          , _actual_size_set(false)
    +#endif
    +  {}
    +
    +public:
    +  static inline ShenandoahAllocRequest for_tlab(size_t min_size, size_t requested_size) {
    +    return ShenandoahAllocRequest(min_size, requested_size, _alloc_tlab);
    +  }
    +
    +  static inline ShenandoahAllocRequest for_gclab(size_t min_size, size_t requested_size) {
    +    return ShenandoahAllocRequest(min_size, requested_size, _alloc_gclab);
    +  }
    +
    +  static inline ShenandoahAllocRequest for_shared_gc(size_t requested_size) {
    +    return ShenandoahAllocRequest(0, requested_size, _alloc_shared_gc);
    +  }
    +
    +  static inline ShenandoahAllocRequest for_shared(size_t requested_size) {
    +    return ShenandoahAllocRequest(0, requested_size, _alloc_shared);
    +  }
    +
    +  inline size_t size() {
    +    return _requested_size;
    +  }
    +
    +  inline Type type() {
    +    return _alloc_type;
    +  }
    +
    +  inline size_t min_size() {
    +    assert (is_lab_alloc(), "Only access for LAB allocs");
    +    return _min_size;
    +  }
    +
    +  inline size_t actual_size() {
    +    assert (_actual_size_set, "Should be set");
    +    return _actual_size;
    +  }
    +
    +  inline void set_actual_size(size_t v) {
    +#ifdef ASSERT
    +    assert (!_actual_size_set, "Should not be set");
    +    _actual_size_set = true;
    +#endif
    +    _actual_size = v;
    +  }
    +
    +  inline bool is_mutator_alloc() {
    +    switch (_alloc_type) {
    +      case _alloc_tlab:
    +      case _alloc_shared:
    +        return true;
    +      case _alloc_gclab:
    +      case _alloc_shared_gc:
    +        return false;
    +      default:
    +        ShouldNotReachHere();
    +        return false;
    +    }
    +  }
    +
    +  inline bool is_gc_alloc() {
    +    switch (_alloc_type) {
    +      case _alloc_tlab:
    +      case _alloc_shared:
    +        return false;
    +      case _alloc_gclab:
    +      case _alloc_shared_gc:
    +        return true;
    +      default:
    +        ShouldNotReachHere();
    +        return false;
    +    }
    +  }
    +
    +  inline bool is_lab_alloc() {
    +    switch (_alloc_type) {
    +      case _alloc_tlab:
    +      case _alloc_gclab:
    +        return true;
    +      case _alloc_shared:
    +      case _alloc_shared_gc:
    +        return false;
    +      default:
    +        ShouldNotReachHere();
    +        return false;
    +    }
    +  }
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHALLOCREQUEST_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahAllocTracker.cpp b/src/hotspot/share/gc/shenandoah/shenandoahAllocTracker.cpp
    new file mode 100644
    index 00000000000..e49a6f2d5f2
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahAllocTracker.cpp
    @@ -0,0 +1,98 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahAllocTracker.hpp"
    +#include "utilities/ostream.hpp"
    +
    +void ShenandoahAllocTracker::print_on(outputStream* out) const {
    +  out->print_cr("ALLOCATION TRACING");
    +  out->print_cr("  These are the slow-path allocations, including TLAB/GCLAB refills, and out-of-TLAB allocations.");
    +  out->print_cr("  In-TLAB/GCLAB allocations happen orders of magnitude more frequently, and without delays.");
    +  out->cr();
    +
    +  out->print("%22s", "");
    +  for (size_t t = 0; t < ShenandoahAllocRequest::_ALLOC_LIMIT; t++) {
    +    out->print("%12s", ShenandoahAllocRequest::alloc_type_to_string(ShenandoahAllocRequest::Type(t)));
    +  }
    +  out->cr();
    +
    +  out->print_cr("Counts:");
    +  out->print("%22s", "#");
    +  for (size_t t = 0; t < ShenandoahAllocRequest::_ALLOC_LIMIT; t++) {
    +    out->print(SIZE_FORMAT_W(12), _alloc_size[t].num());
    +  }
    +  out->cr();
    +  out->cr();
    +
    +  // Figure out max and min levels
    +  int lat_min_level = +1000;
    +  int lat_max_level = -1000;
    +  int size_min_level = +1000;
    +  int size_max_level = -1000;
    +  for (size_t t = 0; t < ShenandoahAllocRequest::_ALLOC_LIMIT; t++) {
    +    lat_min_level = MIN2(lat_min_level, _alloc_latency[t].min_level());
    +    lat_max_level = MAX2(lat_max_level, _alloc_latency[t].max_level());
    +    size_min_level = MIN2(size_min_level, _alloc_size[t].min_level());
    +    size_max_level = MAX2(size_max_level, _alloc_size[t].max_level());
    +  }
    +
    +  out->print_cr("Latency summary:");
    +  out->print("%22s", "sum, ms:");
    +  for (size_t t = 0; t < ShenandoahAllocRequest::_ALLOC_LIMIT; t++) {
    +    out->print(SIZE_FORMAT_W(12), _alloc_latency[t].sum() / K);
    +  }
    +  out->cr();
    +  out->cr();
    +
    +  out->print_cr("Sizes summary:");
    +  out->print("%22s", "sum, M:");
    +  for (size_t t = 0; t < ShenandoahAllocRequest::_ALLOC_LIMIT; t++) {
    +    out->print(SIZE_FORMAT_W(12), _alloc_size[t].sum() * HeapWordSize / M);
    +  }
    +  out->cr();
    +  out->cr();
    +
    +  out->print_cr("Latency histogram (time in microseconds):");
    +  for (int c = lat_min_level; c <= lat_max_level; c++) {
    +    out->print("%9d - %9d:", (c == 0) ? 0 : 1 << (c - 1), 1 << c);
    +    for (size_t t = 0; t < ShenandoahAllocRequest::_ALLOC_LIMIT; t++) {
    +      out->print(SIZE_FORMAT_W(12), _alloc_latency[t].level(c));
    +    }
    +    out->cr();
    +  }
    +  out->cr();
    +
    +  out->print_cr("Sizes histogram (size in bytes):");
    +  for (int c = size_min_level; c <= size_max_level; c++) {
    +    int l = (c == 0) ? 0 : 1 << (c - 1);
    +    int r = 1 << c;
    +    out->print("%9d - %9d:", l * HeapWordSize, r * HeapWordSize);
    +    for (size_t t = 0; t < ShenandoahAllocRequest::_ALLOC_LIMIT; t++) {
    +      out->print(SIZE_FORMAT_W(12), _alloc_size[t].level(c));
    +    }
    +    out->cr();
    +  }
    +  out->cr();
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahAllocTracker.hpp b/src/hotspot/share/gc/shenandoah/shenandoahAllocTracker.hpp
    new file mode 100644
    index 00000000000..56986c5a292
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahAllocTracker.hpp
    @@ -0,0 +1,48 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHALLOCTRACKER_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHALLOCTRACKER_HPP
    +
    +#include "gc/shenandoah/shenandoahAllocRequest.hpp"
    +#include "gc/shenandoah/shenandoahNumberSeq.hpp"
    +#include "memory/allocation.hpp"
    +#include "utilities/ostream.hpp"
    +
    +class ShenandoahAllocTracker : public CHeapObj {
    +private:
    +  BinaryMagnitudeSeq _alloc_size[ShenandoahAllocRequest::_ALLOC_LIMIT];
    +  BinaryMagnitudeSeq _alloc_latency[ShenandoahAllocRequest::_ALLOC_LIMIT];
    +
    +public:
    +  void record_alloc_latency(size_t words_size,
    +                            ShenandoahAllocRequest::Type _alloc_type,
    +                            double latency_us) {
    +    _alloc_size[_alloc_type].add(words_size);
    +    _alloc_latency[_alloc_type].add((size_t)latency_us);
    +  }
    +
    +  void print_on(outputStream* out) const;
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHALLOCTRACKER_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahArguments.cpp b/src/hotspot/share/gc/shenandoah/shenandoahArguments.cpp
    new file mode 100644
    index 00000000000..581e69acbab
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahArguments.cpp
    @@ -0,0 +1,225 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shared/gcArguments.inline.hpp"
    +#include "gc/shared/workerPolicy.hpp"
    +#include "gc/shenandoah/shenandoahArguments.hpp"
    +#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +#include "utilities/defaultStream.hpp"
    +
    +void ShenandoahArguments::initialize() {
    +#if !(defined AARCH64 || defined AMD64 || defined IA32)
    +  vm_exit_during_initialization("Shenandoah GC is not supported on this platform.");
    +#endif
    +
    +#ifdef IA32
    +  log_warning(gc)("Shenandoah GC is not fully supported on this platform:");
    +  log_warning(gc)("  concurrent modes are not supported, only STW cycles are enabled;");
    +  log_warning(gc)("  arch-specific barrier code is not implemented, disabling barriers;");
    +
    +  FLAG_SET_DEFAULT(ShenandoahGCHeuristics,           "passive");
    +
    +  FLAG_SET_DEFAULT(ShenandoahSATBBarrier,            false);
    +  FLAG_SET_DEFAULT(ShenandoahKeepAliveBarrier,       false);
    +  FLAG_SET_DEFAULT(ShenandoahWriteBarrier,           false);
    +  FLAG_SET_DEFAULT(ShenandoahReadBarrier,            false);
    +  FLAG_SET_DEFAULT(ShenandoahStoreValEnqueueBarrier, false);
    +  FLAG_SET_DEFAULT(ShenandoahStoreValReadBarrier,    false);
    +  FLAG_SET_DEFAULT(ShenandoahCASBarrier,             false);
    +  FLAG_SET_DEFAULT(ShenandoahAcmpBarrier,            false);
    +  FLAG_SET_DEFAULT(ShenandoahCloneBarrier,           false);
    +#endif
    +
    +#ifdef _LP64
    +  // The optimized ObjArrayChunkedTask takes some bits away from the full 64 addressable
    +  // bits, fail if we ever attempt to address more than we can. Only valid on 64bit.
    +  if (MaxHeapSize >= ObjArrayChunkedTask::max_addressable()) {
    +    jio_fprintf(defaultStream::error_stream(),
    +                "Shenandoah GC cannot address more than " SIZE_FORMAT " bytes, and " SIZE_FORMAT " bytes heap requested.",
    +                ObjArrayChunkedTask::max_addressable(), MaxHeapSize);
    +    vm_exit(1);
    +  }
    +#endif
    +
    +  if (UseLargePages && (MaxHeapSize / os::large_page_size()) < ShenandoahHeapRegion::MIN_NUM_REGIONS) {
    +    warning("Large pages size (" SIZE_FORMAT "K) is too large to afford page-sized regions, disabling uncommit",
    +            os::large_page_size() / K);
    +    FLAG_SET_DEFAULT(ShenandoahUncommit, false);
    +  }
    +
    +  // Enable NUMA by default. While Shenandoah is not NUMA-aware, enabling NUMA makes
    +  // storage allocation code NUMA-aware, and NUMA interleaving makes the storage
    +  // allocated in consistent manner (interleaving) to minimize run-to-run variance.
    +  if (FLAG_IS_DEFAULT(UseNUMA)) {
    +    FLAG_SET_DEFAULT(UseNUMA, true);
    +    FLAG_SET_DEFAULT(UseNUMAInterleaving, true);
    +  }
    +
    +  FLAG_SET_DEFAULT(ParallelGCThreads,
    +                   WorkerPolicy::parallel_worker_threads());
    +
    +  if (FLAG_IS_DEFAULT(ConcGCThreads)) {
    +    uint conc_threads = MAX2((uint) 1, ParallelGCThreads);
    +    FLAG_SET_DEFAULT(ConcGCThreads, conc_threads);
    +  }
    +
    +  if (FLAG_IS_DEFAULT(ParallelRefProcEnabled)) {
    +    FLAG_SET_DEFAULT(ParallelRefProcEnabled, true);
    +  }
    +
    +  if (ShenandoahRegionSampling && FLAG_IS_DEFAULT(PerfDataMemorySize)) {
    +    // When sampling is enabled, max out the PerfData memory to get more
    +    // Shenandoah data in, including Matrix.
    +    FLAG_SET_DEFAULT(PerfDataMemorySize, 2048*K);
    +  }
    +
    +#ifdef COMPILER2
    +  // Shenandoah cares more about pause times, rather than raw throughput.
    +  if (FLAG_IS_DEFAULT(UseCountedLoopSafepoints)) {
    +    FLAG_SET_DEFAULT(UseCountedLoopSafepoints, true);
    +    if (FLAG_IS_DEFAULT(LoopStripMiningIter)) {
    +      FLAG_SET_DEFAULT(LoopStripMiningIter, 1000);
    +    }
    +  }
    +#ifdef ASSERT
    +  // C2 barrier verification is only reliable when all default barriers are enabled
    +  if (ShenandoahVerifyOptoBarriers &&
    +          (!FLAG_IS_DEFAULT(ShenandoahSATBBarrier)            ||
    +           !FLAG_IS_DEFAULT(ShenandoahKeepAliveBarrier)       ||
    +           !FLAG_IS_DEFAULT(ShenandoahWriteBarrier)           ||
    +           !FLAG_IS_DEFAULT(ShenandoahReadBarrier)            ||
    +           !FLAG_IS_DEFAULT(ShenandoahStoreValEnqueueBarrier) ||
    +           !FLAG_IS_DEFAULT(ShenandoahStoreValReadBarrier)    ||
    +           !FLAG_IS_DEFAULT(ShenandoahCASBarrier)             ||
    +           !FLAG_IS_DEFAULT(ShenandoahAcmpBarrier)            ||
    +           !FLAG_IS_DEFAULT(ShenandoahCloneBarrier)
    +          )) {
    +    warning("Unusual barrier configuration, disabling C2 barrier verification");
    +    FLAG_SET_DEFAULT(ShenandoahVerifyOptoBarriers, false);
    +  }
    +#else
    +  guarantee(!ShenandoahVerifyOptoBarriers, "Should be disabled");
    +#endif // ASSERT
    +#endif // COMPILER2
    +
    +  if (AlwaysPreTouch) {
    +    // Shenandoah handles pre-touch on its own. It does not let the
    +    // generic storage code to do the pre-touch before Shenandoah has
    +    // a chance to do it on its own.
    +    FLAG_SET_DEFAULT(AlwaysPreTouch, false);
    +    FLAG_SET_DEFAULT(ShenandoahAlwaysPreTouch, true);
    +  }
    +
    +  // Shenandoah C2 optimizations apparently dislike the shape of thread-local handshakes.
    +  // Disable it by default, unless we enable it specifically for debugging.
    +  if (FLAG_IS_DEFAULT(ThreadLocalHandshakes)) {
    +    if (ThreadLocalHandshakes) {
    +      FLAG_SET_DEFAULT(ThreadLocalHandshakes, false);
    +    }
    +  } else {
    +    if (ThreadLocalHandshakes) {
    +      warning("Thread-local handshakes are not working correctly with Shenandoah at the moment. Enable at your own risk.");
    +    }
    +  }
    +
    +  // Record more information about previous cycles for improved debugging pleasure
    +  if (FLAG_IS_DEFAULT(LogEventsBufferEntries)) {
    +    FLAG_SET_DEFAULT(LogEventsBufferEntries, 250);
    +  }
    +
    +  if (ShenandoahAlwaysPreTouch) {
    +    if (!FLAG_IS_DEFAULT(ShenandoahUncommit)) {
    +      warning("AlwaysPreTouch is enabled, disabling ShenandoahUncommit");
    +    }
    +    FLAG_SET_DEFAULT(ShenandoahUncommit, false);
    +  }
    +
    +  // If class unloading is disabled, no unloading for concurrent cycles as well.
    +  // If class unloading is enabled, users should opt-in for unloading during
    +  // concurrent cycles.
    +  if (!ClassUnloading || !FLAG_IS_CMDLINE(ClassUnloadingWithConcurrentMark)) {
    +    log_info(gc)("Consider -XX:+ClassUnloadingWithConcurrentMark if large pause times "
    +                 "are observed on class-unloading sensitive workloads");
    +    FLAG_SET_DEFAULT(ClassUnloadingWithConcurrentMark, false);
    +  }
    +
    +  // AOT is not supported yet
    +  if (UseAOT) {
    +    if (!FLAG_IS_DEFAULT(UseAOT)) {
    +      warning("Shenandoah does not support AOT at this moment, disabling UseAOT");
    +    }
    +    FLAG_SET_DEFAULT(UseAOT, false);
    +  }
    +
    +  // JNI fast get field stuff is not currently supported by Shenandoah.
    +  // It would introduce another heap memory access for reading the forwarding
    +  // pointer, which would have to be guarded by the signal handler machinery.
    +  // See:
    +  // http://mail.openjdk.java.net/pipermail/hotspot-dev/2018-June/032763.html
    +  FLAG_SET_DEFAULT(UseFastJNIAccessors, false);
    +
    +  // TLAB sizing policy makes resizing decisions before each GC cycle. It averages
    +  // historical data, assigning more recent data the weight according to TLABAllocationWeight.
    +  // Current default is good for generational collectors that run frequent young GCs.
    +  // With Shenandoah, GC cycles are much less frequent, so we need we need sizing policy
    +  // to converge faster over smaller number of resizing decisions.
    +  if (FLAG_IS_DEFAULT(TLABAllocationWeight)) {
    +    FLAG_SET_DEFAULT(TLABAllocationWeight, 90);
    +  }
    +
    +  // Shenandoah needs more C2 nodes to compile some methods with lots of barriers.
    +  // NodeLimitFudgeFactor needs to stay the same relative to MaxNodeLimit.
    +#ifdef COMPILER2
    +  if (FLAG_IS_DEFAULT(MaxNodeLimit)) {
    +    FLAG_SET_DEFAULT(MaxNodeLimit, MaxNodeLimit * 3);
    +    FLAG_SET_DEFAULT(NodeLimitFudgeFactor, NodeLimitFudgeFactor * 3);
    +  }
    +#endif
    +
    +  // Make sure safepoint deadlocks are failing predictably. This sets up VM to report
    +  // fatal error after 10 seconds of wait for safepoint syncronization (not the VM
    +  // operation itself). There is no good reason why Shenandoah would spend that
    +  // much time synchronizing.
    +#ifdef ASSERT
    +  FLAG_SET_DEFAULT(SafepointTimeout, true);
    +  FLAG_SET_DEFAULT(SafepointTimeoutDelay, 10000);
    +  FLAG_SET_DEFAULT(AbortVMOnSafepointTimeout, true);
    +#endif
    +}
    +
    +size_t ShenandoahArguments::conservative_max_heap_alignment() {
    +  size_t align = ShenandoahMaxRegionSize;
    +  if (UseLargePages) {
    +    align = MAX2(align, os::large_page_size());
    +  }
    +  return align;
    +}
    +
    +CollectedHeap* ShenandoahArguments::create_heap() {
    +  return create_heap_with_policy();
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahArguments.hpp b/src/hotspot/share/gc/shenandoah/shenandoahArguments.hpp
    new file mode 100644
    index 00000000000..a03cac2deb8
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahArguments.hpp
    @@ -0,0 +1,41 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_GC_SHENANDOAH_SHENANDOAHARGUMENTS_HPP
    +#define SHARE_GC_SHENANDOAH_SHENANDOAHARGUMENTS_HPP
    +
    +#include "gc/shared/gcArguments.hpp"
    +
    +class CollectedHeap;
    +
    +class ShenandoahArguments : public GCArguments {
    +public:
    +  virtual void initialize();
    +
    +  virtual size_t conservative_max_heap_alignment();
    +
    +  virtual CollectedHeap* create_heap();
    +};
    +
    +#endif // SHARE_GC_SHENANDOAH_SHENANDOAHARGUMENTS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp
    new file mode 100644
    index 00000000000..8277d8094b1
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp
    @@ -0,0 +1,361 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahAsserts.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
    +#include "gc/shenandoah/shenandoahTraversalGC.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "memory/resourceArea.hpp"
    +
    +void print_raw_memory(ShenandoahMessageBuffer &msg, void* loc) {
    +  // Be extra safe. Only access data that is guaranteed to be safe:
    +  // should be in heap, in known committed region, within that region.
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  if (!heap->is_in(loc)) return;
    +
    +  ShenandoahHeapRegion* r = heap->heap_region_containing(loc);
    +  if (r != NULL && r->is_committed()) {
    +    address start = MAX2((address) r->bottom(), (address) loc - 32);
    +    address end   = MIN2((address) r->end(),    (address) loc + 128);
    +    if (start >= end) return;
    +
    +    stringStream ss;
    +    os::print_hex_dump(&ss, start, end, 4);
    +    msg.append("\n");
    +    msg.append("Raw heap memory:\n%s", ss.as_string());
    +  }
    +}
    +
    +void ShenandoahAsserts::print_obj(ShenandoahMessageBuffer& msg, oop obj) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  ShenandoahHeapRegion *r = heap->heap_region_containing(obj);
    +
    +  ResourceMark rm;
    +  stringStream ss;
    +  r->print_on(&ss);
    +
    +  ShenandoahMarkingContext* const ctx = heap->marking_context();
    +
    +  msg.append("  " PTR_FORMAT " - klass " PTR_FORMAT " %s\n", p2i(obj), p2i(obj->klass()), obj->klass()->external_name());
    +  msg.append("    %3s allocated after mark start\n", ctx->allocated_after_mark_start((HeapWord *) obj) ? "" : "not");
    +  msg.append("    %3s marked \n",                    ctx->is_marked(obj) ? "" : "not");
    +  msg.append("    %3s in collection set\n",          heap->in_collection_set(obj) ? "" : "not");
    +  if (heap->traversal_gc() != NULL) {
    +    msg.append("    %3s in traversal set\n",         heap->traversal_gc()->traversal_set()->is_in((HeapWord*) obj) ? "" : "not");
    +  }
    +  msg.append("  region: %s", ss.as_string());
    +}
    +
    +void ShenandoahAsserts::print_non_obj(ShenandoahMessageBuffer& msg, void* loc) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  if (heap->is_in(loc)) {
    +    msg.append("  inside Java heap\n");
    +    ShenandoahHeapRegion *r = heap->heap_region_containing(loc);
    +    stringStream ss;
    +    r->print_on(&ss);
    +
    +    msg.append("    %3s in collection set\n",    heap->in_collection_set(loc) ? "" : "not");
    +    msg.append("  region: %s", ss.as_string());
    +  } else {
    +    msg.append("  outside of Java heap\n");
    +    stringStream ss;
    +    os::print_location(&ss, (intptr_t) loc, false);
    +    msg.append("  %s", ss.as_string());
    +  }
    +}
    +
    +void ShenandoahAsserts::print_obj_safe(ShenandoahMessageBuffer& msg, void* loc) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  msg.append("  " PTR_FORMAT " - safe print, no details\n", p2i(loc));
    +  if (heap->is_in(loc)) {
    +    ShenandoahHeapRegion* r = heap->heap_region_containing(loc);
    +    if (r != NULL) {
    +      stringStream ss;
    +      r->print_on(&ss);
    +      msg.append("  region: %s", ss.as_string());
    +      print_raw_memory(msg, loc);
    +    }
    +  }
    +}
    +
    +void ShenandoahAsserts::print_failure(SafeLevel level, oop obj, void* interior_loc, oop loc,
    +                                       const char* phase, const char* label,
    +                                       const char* file, int line) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  ResourceMark rm;
    +
    +  bool loc_in_heap = (loc != NULL && heap->is_in(loc));
    +
    +  ShenandoahMessageBuffer msg("%s; %s\n\n", phase, label);
    +
    +  msg.append("Referenced from:\n");
    +  if (interior_loc != NULL) {
    +    msg.append("  interior location: " PTR_FORMAT "\n", p2i(interior_loc));
    +    if (loc_in_heap) {
    +      print_obj(msg, loc);
    +    } else {
    +      print_non_obj(msg, interior_loc);
    +    }
    +  } else {
    +    msg.append("  no interior location recorded (probably a plain heap scan, or detached oop)\n");
    +  }
    +  msg.append("\n");
    +
    +  msg.append("Object:\n");
    +  if (level >= _safe_oop) {
    +    print_obj(msg, obj);
    +  } else {
    +    print_obj_safe(msg, obj);
    +  }
    +  msg.append("\n");
    +
    +  if (level >= _safe_oop) {
    +    oop fwd = (oop) ShenandoahBrooksPointer::get_raw_unchecked(obj);
    +    msg.append("Forwardee:\n");
    +    if (!oopDesc::equals_raw(obj, fwd)) {
    +      if (level >= _safe_oop_fwd) {
    +        print_obj(msg, fwd);
    +      } else {
    +        print_obj_safe(msg, fwd);
    +      }
    +    } else {
    +      msg.append("  (the object itself)");
    +    }
    +    msg.append("\n");
    +  }
    +
    +  if (level >= _safe_oop_fwd) {
    +    oop fwd = (oop) ShenandoahBrooksPointer::get_raw_unchecked(obj);
    +    oop fwd2 = (oop) ShenandoahBrooksPointer::get_raw_unchecked(fwd);
    +    if (!oopDesc::equals_raw(fwd, fwd2)) {
    +      msg.append("Second forwardee:\n");
    +      print_obj_safe(msg, fwd2);
    +      msg.append("\n");
    +    }
    +  }
    +
    +  report_vm_error(file, line, msg.buffer());
    +}
    +
    +void ShenandoahAsserts::assert_in_heap(void* interior_loc, oop obj, const char *file, int line) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap_no_check();
    +
    +  if (!heap->is_in(obj)) {
    +    print_failure(_safe_unknown, obj, interior_loc, NULL, "Shenandoah assert_in_heap failed",
    +                  "oop must point to a heap address",
    +                  file, line);
    +  }
    +}
    +
    +void ShenandoahAsserts::assert_correct(void* interior_loc, oop obj, const char* file, int line) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap_no_check();
    +
    +  // Step 1. Check that obj is correct.
    +  // After this step, it is safe to call heap_region_containing().
    +  if (!heap->is_in(obj)) {
    +    print_failure(_safe_unknown, obj, interior_loc, NULL, "Shenandoah assert_correct failed",
    +                  "oop must point to a heap address",
    +                  file, line);
    +  }
    +
    +  Klass* obj_klass = obj->klass_or_null();
    +  if (obj_klass == NULL) {
    +    print_failure(_safe_unknown, obj, interior_loc, NULL, "Shenandoah assert_correct failed",
    +                  "Object klass pointer should not be NULL",
    +                  file,line);
    +  }
    +
    +  if (!Metaspace::contains(obj_klass)) {
    +    print_failure(_safe_unknown, obj, interior_loc, NULL, "Shenandoah assert_correct failed",
    +                  "Object klass pointer must go to metaspace",
    +                  file,line);
    +  }
    +
    +  oop fwd = oop(ShenandoahBrooksPointer::get_raw_unchecked(obj));
    +
    +  if (!oopDesc::equals_raw(obj, fwd)) {
    +    // When Full GC moves the objects, we cannot trust fwdptrs. If we got here, it means something
    +    // tries fwdptr manipulation when Full GC is running. The only exception is using the fwdptr
    +    // that still points to the object itself.
    +    if (heap->is_full_gc_move_in_progress()) {
    +      print_failure(_safe_oop, obj, interior_loc, NULL, "Shenandoah assert_correct failed",
    +                    "Non-trivial forwarding pointer during Full GC moves, probable bug.",
    +                    file, line);
    +    }
    +
    +    // Step 2. Check that forwardee is correct
    +    if (!heap->is_in(fwd)) {
    +      print_failure(_safe_oop, obj, interior_loc, NULL, "Shenandoah assert_correct failed",
    +                    "Forwardee must point to a heap address",
    +                    file, line);
    +    }
    +
    +    if (obj_klass != fwd->klass()) {
    +      print_failure(_safe_oop, obj, interior_loc, NULL, "Shenandoah assert_correct failed",
    +                    "Forwardee klass disagrees with object class",
    +                    file, line);
    +    }
    +
    +    // Step 3. Check that forwardee points to correct region
    +    if (heap->heap_region_index_containing(fwd) == heap->heap_region_index_containing(obj)) {
    +      print_failure(_safe_all, obj, interior_loc, NULL, "Shenandoah assert_correct failed",
    +                    "Non-trivial forwardee should in another region",
    +                    file, line);
    +    }
    +
    +    // Step 4. Check for multiple forwardings
    +    oop fwd2 = oop(ShenandoahBrooksPointer::get_raw_unchecked(fwd));
    +    if (!oopDesc::equals_raw(fwd, fwd2)) {
    +      print_failure(_safe_all, obj, interior_loc, NULL, "Shenandoah assert_correct failed",
    +                    "Multiple forwardings",
    +                    file, line);
    +    }
    +  }
    +}
    +
    +void ShenandoahAsserts::assert_in_correct_region(void* interior_loc, oop obj, const char* file, int line) {
    +  assert_correct(interior_loc, obj, file, line);
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap_no_check();
    +  ShenandoahHeapRegion* r = heap->heap_region_containing(obj);
    +  if (!r->is_active()) {
    +    print_failure(_safe_unknown, obj, interior_loc, NULL, "Shenandoah assert_in_correct_region failed",
    +                  "Object must reside in active region",
    +                  file, line);
    +  }
    +
    +  size_t alloc_size = obj->size() + ShenandoahBrooksPointer::word_size();
    +  if (alloc_size > ShenandoahHeapRegion::humongous_threshold_words()) {
    +    size_t idx = r->region_number();
    +    size_t num_regions = ShenandoahHeapRegion::required_regions(alloc_size * HeapWordSize);
    +    for (size_t i = idx; i < idx + num_regions; i++) {
    +      ShenandoahHeapRegion* chain_reg = heap->get_region(i);
    +      if (i == idx && !chain_reg->is_humongous_start()) {
    +        print_failure(_safe_unknown, obj, interior_loc, NULL, "Shenandoah assert_in_correct_region failed",
    +                      "Object must reside in humongous start",
    +                      file, line);
    +      }
    +      if (i != idx && !chain_reg->is_humongous_continuation()) {
    +        print_failure(_safe_oop, obj, interior_loc, NULL, "Shenandoah assert_in_correct_region failed",
    +                      "Humongous continuation should be of proper size",
    +                      file, line);
    +      }
    +    }
    +  }
    +}
    +
    +void ShenandoahAsserts::assert_forwarded(void* interior_loc, oop obj, const char* file, int line) {
    +  assert_correct(interior_loc, obj, file, line);
    +  oop fwd = oop(ShenandoahBrooksPointer::get_raw_unchecked(obj));
    +
    +  if (oopDesc::equals_raw(obj, fwd)) {
    +    print_failure(_safe_all, obj, interior_loc, NULL, "Shenandoah assert_forwarded failed",
    +                  "Object should be forwarded",
    +                  file, line);
    +  }
    +}
    +
    +void ShenandoahAsserts::assert_not_forwarded(void* interior_loc, oop obj, const char* file, int line) {
    +  assert_correct(interior_loc, obj, file, line);
    +  oop fwd = oop(ShenandoahBrooksPointer::get_raw_unchecked(obj));
    +
    +  if (!oopDesc::equals_raw(obj, fwd)) {
    +    print_failure(_safe_all, obj, interior_loc, NULL, "Shenandoah assert_not_forwarded failed",
    +                  "Object should not be forwarded",
    +                  file, line);
    +  }
    +}
    +
    +void ShenandoahAsserts::assert_marked(void *interior_loc, oop obj, const char *file, int line) {
    +  assert_correct(interior_loc, obj, file, line);
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap_no_check();
    +  if (!heap->marking_context()->is_marked(obj)) {
    +    print_failure(_safe_all, obj, interior_loc, NULL, "Shenandoah assert_marked failed",
    +                  "Object should be marked",
    +                  file, line);
    +  }
    +}
    +
    +void ShenandoahAsserts::assert_in_cset(void* interior_loc, oop obj, const char* file, int line) {
    +  assert_correct(interior_loc, obj, file, line);
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap_no_check();
    +  if (!heap->in_collection_set(obj)) {
    +    print_failure(_safe_all, obj, interior_loc, NULL, "Shenandoah assert_in_cset failed",
    +                  "Object should be in collection set",
    +                  file, line);
    +  }
    +}
    +
    +void ShenandoahAsserts::assert_not_in_cset(void* interior_loc, oop obj, const char* file, int line) {
    +  assert_correct(interior_loc, obj, file, line);
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap_no_check();
    +  if (heap->in_collection_set(obj)) {
    +    print_failure(_safe_all, obj, interior_loc, NULL, "Shenandoah assert_not_in_cset failed",
    +                  "Object should not be in collection set",
    +                  file, line);
    +  }
    +}
    +
    +void ShenandoahAsserts::assert_not_in_cset_loc(void* interior_loc, const char* file, int line) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap_no_check();
    +  if (heap->in_collection_set(interior_loc)) {
    +    print_failure(_safe_unknown, NULL, interior_loc, NULL, "Shenandoah assert_not_in_cset_loc failed",
    +                  "Interior location should not be in collection set",
    +                  file, line);
    +  }
    +}
    +
    +void ShenandoahAsserts::print_rp_failure(const char *label, BoolObjectClosure* actual,
    +                                         const char *file, int line) {
    +  ShenandoahMessageBuffer msg("%s\n", label);
    +  msg.append(" Actual:                  " PTR_FORMAT "\n", p2i(actual));
    +  report_vm_error(file, line, msg.buffer());
    +}
    +
    +void ShenandoahAsserts::assert_rp_isalive_not_installed(const char *file, int line) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  ReferenceProcessor* rp = heap->ref_processor();
    +  if (rp->is_alive_non_header() != NULL) {
    +    print_rp_failure("Shenandoah assert_rp_isalive_not_installed failed", rp->is_alive_non_header(),
    +                     file, line);
    +  }
    +}
    +
    +void ShenandoahAsserts::assert_rp_isalive_installed(const char *file, int line) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  ReferenceProcessor* rp = heap->ref_processor();
    +  if (rp->is_alive_non_header() == NULL) {
    +    print_rp_failure("Shenandoah assert_rp_isalive_installed failed", rp->is_alive_non_header(),
    +                     file, line);
    +  }
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahAsserts.hpp b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.hpp
    new file mode 100644
    index 00000000000..ae014ddbdf1
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.hpp
    @@ -0,0 +1,170 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHASSERTS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHASSERTS_HPP
    +
    +#include "memory/iterator.hpp"
    +#include "utilities/formatBuffer.hpp"
    +
    +typedef FormatBuffer<8192> ShenandoahMessageBuffer;
    +
    +class ShenandoahAsserts {
    +public:
    +  enum SafeLevel {
    +    _safe_unknown,
    +    _safe_oop,
    +    _safe_oop_fwd,
    +    _safe_all,
    +  };
    +
    +  static void print_obj(ShenandoahMessageBuffer &msg, oop obj);
    +
    +  static void print_non_obj(ShenandoahMessageBuffer &msg, void *loc);
    +
    +  static void print_obj_safe(ShenandoahMessageBuffer &msg, void *loc);
    +
    +  static void print_failure(SafeLevel level, oop obj, void *interior_loc, oop loc,
    +                            const char *phase, const char *label,
    +                            const char *file, int line);
    +
    +  static void print_rp_failure(const char *label, BoolObjectClosure* actual,
    +                               const char *file, int line);
    +
    +  static void assert_in_heap(void* interior_loc, oop obj, const char* file, int line);
    +  static void assert_in_correct_region(void* interior_loc, oop obj, const char* file, int line);
    +
    +  static void assert_correct(void* interior_loc, oop obj, const char* file, int line);
    +  static void assert_forwarded(void* interior_loc, oop obj, const char* file, int line);
    +  static void assert_not_forwarded(void* interior_loc, oop obj, const char* file, int line);
    +  static void assert_marked(void* interior_loc, oop obj, const char* file, int line);
    +  static void assert_in_cset(void* interior_loc, oop obj, const char* file, int line);
    +  static void assert_not_in_cset(void* interior_loc, oop obj, const char* file, int line);
    +  static void assert_not_in_cset_loc(void* interior_loc, const char* file, int line);
    +
    +  static void assert_rp_isalive_not_installed(const char *file, int line);
    +  static void assert_rp_isalive_installed(const char *file, int line);
    +
    +#ifdef ASSERT
    +#define shenandoah_assert_in_heap(interior_loc, obj) \
    +                    ShenandoahAsserts::assert_in_heap(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_in_correct_region(interior_loc, obj) \
    +                    ShenandoahAsserts::assert_in_correct_region(interior_loc, obj, __FILE__, __LINE__);
    +
    +#define shenandoah_assert_correct_if(interior_loc, obj, condition) \
    +  if (condition)    ShenandoahAsserts::assert_correct(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_correct_except(interior_loc, obj, exception) \
    +  if (!(exception)) ShenandoahAsserts::assert_correct(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_correct(interior_loc, obj) \
    +                    ShenandoahAsserts::assert_correct(interior_loc, obj, __FILE__, __LINE__);
    +
    +#define shenandoah_assert_forwarded_if(interior_loc, obj, condition) \
    +  if (condition)    ShenandoahAsserts::assert_forwarded(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_forwarded_except(interior_loc, obj, exception) \
    +  if (!(exception)) ShenandoahAsserts::assert_forwarded(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_forwarded(interior_loc, obj) \
    +                    ShenandoahAsserts::assert_forwarded(interior_loc, obj, __FILE__, __LINE__);
    +
    +#define shenandoah_assert_not_forwarded_if(interior_loc, obj, condition) \
    +  if (condition)    ShenandoahAsserts::assert_not_forwarded(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_not_forwarded_except(interior_loc, obj, exception) \
    +  if (!(exception)) ShenandoahAsserts::assert_not_forwarded(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_not_forwarded(interior_loc, obj) \
    +                    ShenandoahAsserts::assert_not_forwarded(interior_loc, obj, __FILE__, __LINE__);
    +
    +#define shenandoah_assert_marked_if(interior_loc, obj, condition) \
    +  if (condition)    ShenandoahAsserts::assert_marked(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_marked_except(interior_loc, obj, exception) \
    +  if (!(exception)) ShenandoahAsserts::assert_marked(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_marked(interior_loc, obj) \
    +                    ShenandoahAsserts::assert_marked(interior_loc, obj, __FILE__, __LINE__);
    +
    +#define shenandoah_assert_in_cset_if(interior_loc, obj, condition) \
    +  if (condition)    ShenandoahAsserts::assert_in_cset(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_in_cset_except(interior_loc, obj, exception) \
    +  if (!(exception)) ShenandoahAsserts::assert_in_cset(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_in_cset(interior_loc, obj) \
    +                    ShenandoahAsserts::assert_in_cset(interior_loc, obj, __FILE__, __LINE__);
    +
    +#define shenandoah_assert_not_in_cset_if(interior_loc, obj, condition) \
    +  if (condition)    ShenandoahAsserts::assert_not_in_cset(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_not_in_cset_except(interior_loc, obj, exception) \
    +  if (!(exception)) ShenandoahAsserts::assert_not_in_cset(interior_loc, obj, __FILE__, __LINE__);
    +#define shenandoah_assert_not_in_cset(interior_loc, obj) \
    +                    ShenandoahAsserts::assert_not_in_cset(interior_loc, obj, __FILE__, __LINE__);
    +
    +#define shenandoah_assert_not_in_cset_loc_if(interior_loc, condition) \
    +  if (condition)    ShenandoahAsserts::assert_not_in_cset_loc(interior_loc, __FILE__, __LINE__);
    +#define shenandoah_assert_not_in_cset_loc_except(interior_loc, exception) \
    +  if (!(exception)) ShenandoahAsserts::assert_not_in_cset_loc(interior_loc, __FILE__, __LINE__);
    +#define shenandoah_assert_not_in_cset_loc(interior_loc) \
    +                    ShenandoahAsserts::assert_not_in_cset_loc(interior_loc, __FILE__, __LINE__);
    +
    +#define shenandoah_assert_rp_isalive_installed() \
    +                    ShenandoahAsserts::assert_rp_isalive_installed(__FILE__, __LINE__);
    +#define shenandoah_assert_rp_isalive_not_installed() \
    +                    ShenandoahAsserts::assert_rp_isalive_not_installed(__FILE__, __LINE__);
    +#else
    +#define shenandoah_assert_in_heap(interior_loc, obj)
    +#define shenandoah_assert_in_correct_region(interior_loc, obj)
    +
    +#define shenandoah_assert_correct_if(interior_loc, obj, condition)
    +#define shenandoah_assert_correct_except(interior_loc, obj, exception)
    +#define shenandoah_assert_correct(interior_loc, obj)
    +
    +#define shenandoah_assert_forwarded_if(interior_loc, obj, condition)
    +#define shenandoah_assert_forwarded_except(interior_loc, obj, exception)
    +#define shenandoah_assert_forwarded(interior_loc, obj)
    +
    +#define shenandoah_assert_not_forwarded_if(interior_loc, obj, condition)
    +#define shenandoah_assert_not_forwarded_except(interior_loc, obj, exception)
    +#define shenandoah_assert_not_forwarded(interior_loc, obj)
    +
    +#define shenandoah_assert_marked_if(interior_loc, obj, condition)
    +#define shenandoah_assert_marked_except(interior_loc, obj, exception)
    +#define shenandoah_assert_marked(interior_loc, obj)
    +
    +#define shenandoah_assert_in_cset_if(interior_loc, obj, condition)
    +#define shenandoah_assert_in_cset_except(interior_loc, obj, exception)
    +#define shenandoah_assert_in_cset(interior_loc, obj)
    +
    +#define shenandoah_assert_not_in_cset_if(interior_loc, obj, condition)
    +#define shenandoah_assert_not_in_cset_except(interior_loc, obj, exception)
    +#define shenandoah_assert_not_in_cset(interior_loc, obj)
    +
    +#define shenandoah_assert_not_in_cset_loc_if(interior_loc, condition)
    +#define shenandoah_assert_not_in_cset_loc_except(interior_loc, exception)
    +#define shenandoah_assert_not_in_cset_loc(interior_loc)
    +
    +#define shenandoah_assert_rp_isalive_installed()
    +#define shenandoah_assert_rp_isalive_not_installed()
    +#endif
    +
    +#define shenandoah_not_implemented \
    +                    { fatal("Deliberately not implemented."); }
    +#define shenandoah_not_implemented_return(v) \
    +                    { fatal("Deliberately not implemented."); return v; }
    +
    +};
    +
    +#endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHASSERTS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp
    new file mode 100644
    index 00000000000..25ded749c54
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp
    @@ -0,0 +1,376 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/g1/g1BarrierSet.hpp"
    +#include "gc/shenandoah/shenandoahAsserts.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSet.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
    +#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahTraversalGC.hpp"
    +#include "memory/iterator.inline.hpp"
    +#include "runtime/interfaceSupport.inline.hpp"
    +#ifdef COMPILER1
    +#include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
    +#endif
    +#ifdef COMPILER2
    +#include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
    +#endif
    +
    +class ShenandoahBarrierSetC1;
    +class ShenandoahBarrierSetC2;
    +
    +template 
    +class ShenandoahUpdateRefsForOopClosure: public BasicOopIterateClosure {
    +private:
    +  ShenandoahHeap* _heap;
    +  ShenandoahBarrierSet* _bs;
    +
    +  template 
    +  inline void do_oop_work(T* p) {
    +    oop o;
    +    if (STOREVAL_WRITE_BARRIER) {
    +      o = _heap->evac_update_with_forwarded(p);
    +      if (!CompressedOops::is_null(o)) {
    +        _bs->enqueue(o);
    +      }
    +    } else {
    +      _heap->maybe_update_with_forwarded(p);
    +    }
    +  }
    +public:
    +  ShenandoahUpdateRefsForOopClosure() : _heap(ShenandoahHeap::heap()), _bs(ShenandoahBarrierSet::barrier_set()) {
    +    assert(UseShenandoahGC && ShenandoahCloneBarrier, "should be enabled");
    +  }
    +
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +};
    +
    +ShenandoahBarrierSet::ShenandoahBarrierSet(ShenandoahHeap* heap) :
    +  BarrierSet(make_barrier_set_assembler(),
    +             make_barrier_set_c1(),
    +             make_barrier_set_c2(),
    +             NULL /* barrier_set_nmethod */,
    +             BarrierSet::FakeRtti(BarrierSet::ShenandoahBarrierSet)),
    +  _heap(heap),
    +  _satb_mark_queue_set()
    +{
    +}
    +
    +ShenandoahBarrierSetAssembler* ShenandoahBarrierSet::assembler() {
    +  BarrierSetAssembler* const bsa = BarrierSet::barrier_set()->barrier_set_assembler();
    +  return reinterpret_cast(bsa);
    +}
    +
    +void ShenandoahBarrierSet::print_on(outputStream* st) const {
    +  st->print("ShenandoahBarrierSet");
    +}
    +
    +bool ShenandoahBarrierSet::is_a(BarrierSet::Name bsn) {
    +  return bsn == BarrierSet::ShenandoahBarrierSet;
    +}
    +
    +bool ShenandoahBarrierSet::is_aligned(HeapWord* hw) {
    +  return true;
    +}
    +
    +template 
    +void ShenandoahBarrierSet::write_ref_array_loop(HeapWord* start, size_t count) {
    +  assert(UseShenandoahGC && ShenandoahCloneBarrier, "should be enabled");
    +  ShenandoahUpdateRefsForOopClosure cl;
    +  T* dst = (T*) start;
    +  for (size_t i = 0; i < count; i++) {
    +    cl.do_oop(dst++);
    +  }
    +}
    +
    +void ShenandoahBarrierSet::write_ref_array(HeapWord* start, size_t count) {
    +  assert(UseShenandoahGC, "should be enabled");
    +  if (count == 0) return;
    +  if (!ShenandoahCloneBarrier) return;
    +
    +  if (!need_update_refs_barrier()) return;
    +
    +  if (_heap->is_concurrent_traversal_in_progress()) {
    +    ShenandoahEvacOOMScope oom_evac_scope;
    +    if (UseCompressedOops) {
    +      write_ref_array_loop(start, count);
    +    } else {
    +      write_ref_array_loop(start, count);
    +    }
    +  } else {
    +    if (UseCompressedOops) {
    +      write_ref_array_loop(start, count);
    +    } else {
    +      write_ref_array_loop(start, count);
    +    }
    +  }
    +}
    +
    +template 
    +void ShenandoahBarrierSet::write_ref_array_pre_work(T* dst, size_t count) {
    +  shenandoah_assert_not_in_cset_loc_except(dst, _heap->cancelled_gc());
    +  if (ShenandoahSATBBarrier && _heap->is_concurrent_mark_in_progress()) {
    +    T* elem_ptr = dst;
    +    for (size_t i = 0; i < count; i++, elem_ptr++) {
    +      T heap_oop = RawAccess<>::oop_load(elem_ptr);
    +      if (!CompressedOops::is_null(heap_oop)) {
    +        enqueue(CompressedOops::decode_not_null(heap_oop));
    +      }
    +    }
    +  }
    +}
    +
    +void ShenandoahBarrierSet::write_ref_array_pre(oop* dst, size_t count, bool dest_uninitialized) {
    +  if (! dest_uninitialized) {
    +    write_ref_array_pre_work(dst, count);
    +  }
    +}
    +
    +void ShenandoahBarrierSet::write_ref_array_pre(narrowOop* dst, size_t count, bool dest_uninitialized) {
    +  if (! dest_uninitialized) {
    +    write_ref_array_pre_work(dst, count);
    +  }
    +}
    +
    +template 
    +inline void ShenandoahBarrierSet::inline_write_ref_field_pre(T* field, oop new_val) {
    +  shenandoah_assert_not_in_cset_loc_except(field, _heap->cancelled_gc());
    +  if (_heap->is_concurrent_mark_in_progress()) {
    +    T heap_oop = RawAccess<>::oop_load(field);
    +    if (!CompressedOops::is_null(heap_oop)) {
    +      enqueue(CompressedOops::decode(heap_oop));
    +    }
    +  }
    +}
    +
    +// These are the more general virtual versions.
    +void ShenandoahBarrierSet::write_ref_field_pre_work(oop* field, oop new_val) {
    +  inline_write_ref_field_pre(field, new_val);
    +}
    +
    +void ShenandoahBarrierSet::write_ref_field_pre_work(narrowOop* field, oop new_val) {
    +  inline_write_ref_field_pre(field, new_val);
    +}
    +
    +void ShenandoahBarrierSet::write_ref_field_pre_work(void* field, oop new_val) {
    +  guarantee(false, "Not needed");
    +}
    +
    +void ShenandoahBarrierSet::write_ref_field_work(void* v, oop o, bool release) {
    +  shenandoah_assert_not_in_cset_loc_except(v, _heap->cancelled_gc());
    +  shenandoah_assert_not_forwarded_except  (v, o, o == NULL || _heap->cancelled_gc() || !_heap->is_concurrent_mark_in_progress());
    +  shenandoah_assert_not_in_cset_except    (v, o, o == NULL || _heap->cancelled_gc() || !_heap->is_concurrent_mark_in_progress());
    +}
    +
    +void ShenandoahBarrierSet::write_region(MemRegion mr) {
    +  assert(UseShenandoahGC, "should be enabled");
    +  if (!ShenandoahCloneBarrier) return;
    +  if (! need_update_refs_barrier()) return;
    +
    +  // This is called for cloning an object (see jvm.cpp) after the clone
    +  // has been made. We are not interested in any 'previous value' because
    +  // it would be NULL in any case. But we *are* interested in any oop*
    +  // that potentially need to be updated.
    +
    +  oop obj = oop(mr.start());
    +  shenandoah_assert_correct(NULL, obj);
    +  if (_heap->is_concurrent_traversal_in_progress()) {
    +    ShenandoahEvacOOMScope oom_evac_scope;
    +    ShenandoahUpdateRefsForOopClosure cl;
    +    obj->oop_iterate(&cl);
    +  } else {
    +    ShenandoahUpdateRefsForOopClosure cl;
    +    obj->oop_iterate(&cl);
    +  }
    +}
    +
    +oop ShenandoahBarrierSet::read_barrier(oop src) {
    +  // Check for forwarded objects, because on Full GC path we might deal with
    +  // non-trivial fwdptrs that contain Full GC specific metadata. We could check
    +  // for is_full_gc_in_progress(), but this also covers the case of stable heap,
    +  // which provides a bit of performance improvement.
    +  if (ShenandoahReadBarrier && _heap->has_forwarded_objects()) {
    +    return ShenandoahBarrierSet::resolve_forwarded(src);
    +  } else {
    +    return src;
    +  }
    +}
    +
    +bool ShenandoahBarrierSet::obj_equals(oop obj1, oop obj2) {
    +  bool eq = oopDesc::equals_raw(obj1, obj2);
    +  if (! eq && ShenandoahAcmpBarrier) {
    +    OrderAccess::loadload();
    +    obj1 = resolve_forwarded(obj1);
    +    obj2 = resolve_forwarded(obj2);
    +    eq = oopDesc::equals_raw(obj1, obj2);
    +  }
    +  return eq;
    +}
    +
    +oop ShenandoahBarrierSet::write_barrier_mutator(oop obj) {
    +  assert(UseShenandoahGC && ShenandoahWriteBarrier, "should be enabled");
    +  assert(_heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL), "evac should be in progress");
    +  shenandoah_assert_in_cset(NULL, obj);
    +
    +  oop fwd = resolve_forwarded_not_null(obj);
    +  if (oopDesc::equals_raw(obj, fwd)) {
    +    ShenandoahEvacOOMScope oom_evac_scope;
    +
    +    Thread* thread = Thread::current();
    +    oop res_oop = _heap->evacuate_object(obj, thread);
    +
    +    // Since we are already here and paid the price of getting through runtime call adapters
    +    // and acquiring oom-scope, it makes sense to try and evacuate more adjacent objects,
    +    // thus amortizing the overhead. For sparsely live heaps, scan costs easily dominate
    +    // total assist costs, and can introduce a lot of evacuation latency. This is why we
    +    // only scan for _nearest_ N objects, regardless if they are eligible for evac or not.
    +    // The scan itself should also avoid touching the non-marked objects below TAMS, because
    +    // their metadata (notably, klasses) may be incorrect already.
    +
    +    size_t max = ShenandoahEvacAssist;
    +    if (max > 0) {
    +      // Traversal is special: it uses incomplete marking context, because it coalesces evac with mark.
    +      // Other code uses complete marking context, because evac happens after the mark.
    +      ShenandoahMarkingContext* ctx = _heap->is_concurrent_traversal_in_progress() ?
    +                                      _heap->marking_context() : _heap->complete_marking_context();
    +
    +      ShenandoahHeapRegion* r = _heap->heap_region_containing(obj);
    +      assert(r->is_cset(), "sanity");
    +
    +      HeapWord* cur = (HeapWord*)obj + obj->size() + ShenandoahBrooksPointer::word_size();
    +
    +      size_t count = 0;
    +      while ((cur < r->top()) && ctx->is_marked(oop(cur)) && (count++ < max)) {
    +        oop cur_oop = oop(cur);
    +        if (oopDesc::equals_raw(cur_oop, resolve_forwarded_not_null(cur_oop))) {
    +          _heap->evacuate_object(cur_oop, thread);
    +        }
    +        cur = cur + cur_oop->size() + ShenandoahBrooksPointer::word_size();
    +      }
    +    }
    +
    +    return res_oop;
    +  }
    +  return fwd;
    +}
    +
    +oop ShenandoahBarrierSet::write_barrier_impl(oop obj) {
    +  assert(UseShenandoahGC && ShenandoahWriteBarrier, "should be enabled");
    +  if (!CompressedOops::is_null(obj)) {
    +    bool evac_in_progress = _heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL);
    +    oop fwd = resolve_forwarded_not_null(obj);
    +    if (evac_in_progress &&
    +        _heap->in_collection_set(obj) &&
    +        oopDesc::equals_raw(obj, fwd)) {
    +      Thread *t = Thread::current();
    +      if (t->is_GC_task_thread()) {
    +        return _heap->evacuate_object(obj, t);
    +      } else {
    +        ShenandoahEvacOOMScope oom_evac_scope;
    +        return _heap->evacuate_object(obj, t);
    +      }
    +    } else {
    +      return fwd;
    +    }
    +  } else {
    +    return obj;
    +  }
    +}
    +
    +oop ShenandoahBarrierSet::write_barrier(oop obj) {
    +  if (ShenandoahWriteBarrier && _heap->has_forwarded_objects()) {
    +    return write_barrier_impl(obj);
    +  } else {
    +    return obj;
    +  }
    +}
    +
    +oop ShenandoahBarrierSet::storeval_barrier(oop obj) {
    +  if (ShenandoahStoreValEnqueueBarrier) {
    +    if (!CompressedOops::is_null(obj)) {
    +      obj = write_barrier(obj);
    +      enqueue(obj);
    +    }
    +  }
    +  if (ShenandoahStoreValReadBarrier) {
    +    obj = resolve_forwarded(obj);
    +  }
    +  return obj;
    +}
    +
    +void ShenandoahBarrierSet::keep_alive_barrier(oop obj) {
    +  if (ShenandoahKeepAliveBarrier && _heap->is_concurrent_mark_in_progress()) {
    +    enqueue(obj);
    +  }
    +}
    +
    +void ShenandoahBarrierSet::enqueue(oop obj) {
    +  shenandoah_assert_not_forwarded_if(NULL, obj, _heap->is_concurrent_traversal_in_progress());
    +  if (!_satb_mark_queue_set.is_active()) return;
    +
    +  // Filter marked objects before hitting the SATB queues. The same predicate would
    +  // be used by SATBMQ::filter to eliminate already marked objects downstream, but
    +  // filtering here helps to avoid wasteful SATB queueing work to begin with.
    +  if (!_heap->requires_marking(obj)) return;
    +
    +  Thread* thr = Thread::current();
    +  if (thr->is_Java_thread()) {
    +    ShenandoahThreadLocalData::satb_mark_queue(thr).enqueue(obj);
    +  } else {
    +    MutexLockerEx x(Shared_SATB_Q_lock, Mutex::_no_safepoint_check_flag);
    +    _satb_mark_queue_set.shared_satb_queue()->enqueue(obj);
    +  }
    +}
    +
    +void ShenandoahBarrierSet::on_thread_create(Thread* thread) {
    +  // Create thread local data
    +  ShenandoahThreadLocalData::create(thread);
    +}
    +
    +void ShenandoahBarrierSet::on_thread_destroy(Thread* thread) {
    +  // Destroy thread local data
    +  ShenandoahThreadLocalData::destroy(thread);
    +}
    +
    +void ShenandoahBarrierSet::on_thread_attach(JavaThread* thread) {
    +  assert(!SafepointSynchronize::is_at_safepoint(), "We should not be at a safepoint");
    +  assert(!ShenandoahThreadLocalData::satb_mark_queue(thread).is_active(), "SATB queue should not be active");
    +  assert(ShenandoahThreadLocalData::satb_mark_queue(thread).is_empty(), "SATB queue should be empty");
    +  if (ShenandoahBarrierSet::satb_mark_queue_set().is_active()) {
    +    ShenandoahThreadLocalData::satb_mark_queue(thread).set_active(true);
    +  }
    +  ShenandoahThreadLocalData::set_gc_state(thread, _heap->gc_state());
    +  ShenandoahThreadLocalData::initialize_gclab(thread);
    +}
    +
    +void ShenandoahBarrierSet::on_thread_detach(JavaThread* thread) {
    +  ShenandoahThreadLocalData::satb_mark_queue(thread).flush();
    +  PLAB* gclab = ShenandoahThreadLocalData::gclab(thread);
    +  if (gclab != NULL) {
    +    gclab->retire();
    +  }
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp
    new file mode 100644
    index 00000000000..4a07da645a0
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp
    @@ -0,0 +1,296 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_HPP
    +
    +#include "gc/shared/accessBarrierSupport.hpp"
    +#include "gc/shared/barrierSet.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahSATBMarkQueueSet.hpp"
    +
    +class ShenandoahBarrierSetAssembler;
    +
    +class ShenandoahBarrierSet: public BarrierSet {
    +private:
    +  enum ArrayCopyStoreValMode {
    +    NONE,
    +    READ_BARRIER,
    +    WRITE_BARRIER
    +  };
    +
    +  ShenandoahHeap* _heap;
    +  ShenandoahSATBMarkQueueSet _satb_mark_queue_set;
    +
    +public:
    +  ShenandoahBarrierSet(ShenandoahHeap* heap);
    +
    +  static ShenandoahBarrierSetAssembler* assembler();
    +
    +  inline static ShenandoahBarrierSet* barrier_set() {
    +    return barrier_set_cast(BarrierSet::barrier_set());
    +  }
    +
    +  static ShenandoahSATBMarkQueueSet& satb_mark_queue_set() {
    +    return barrier_set()->_satb_mark_queue_set;
    +  }
    +
    +  void print_on(outputStream* st) const;
    +
    +  bool is_a(BarrierSet::Name bsn);
    +
    +  bool is_aligned(HeapWord* hw);
    +
    +  void write_ref_array(HeapWord* start, size_t count);
    +
    +  template  void
    +  write_ref_array_pre_work(T* dst, size_t count);
    +
    +  void write_ref_array_pre(oop* dst, size_t count, bool dest_uninitialized);
    +
    +  void write_ref_array_pre(narrowOop* dst, size_t count, bool dest_uninitialized);
    +
    +  // We export this to make it available in cases where the static
    +  // type of the barrier set is known.  Note that it is non-virtual.
    +  template  inline void inline_write_ref_field_pre(T* field, oop new_val);
    +
    +  // These are the more general virtual versions.
    +  void write_ref_field_pre_work(oop* field, oop new_val);
    +  void write_ref_field_pre_work(narrowOop* field, oop new_val);
    +  void write_ref_field_pre_work(void* field, oop new_val);
    +
    +  void write_ref_field_work(void* v, oop o, bool release = false);
    +  void write_region(MemRegion mr);
    +
    +  virtual void on_thread_create(Thread* thread);
    +  virtual void on_thread_destroy(Thread* thread);
    +  virtual void on_thread_attach(JavaThread* thread);
    +  virtual void on_thread_detach(JavaThread* thread);
    +
    +  virtual oop read_barrier(oop src);
    +
    +  static inline oop resolve_forwarded_not_null(oop p);
    +  static inline oop resolve_forwarded(oop p);
    +
    +  virtual oop write_barrier(oop obj);
    +
    +  oop write_barrier_mutator(oop obj);
    +
    +  virtual oop storeval_barrier(oop obj);
    +
    +  virtual void keep_alive_barrier(oop obj);
    +
    +  bool obj_equals(oop obj1, oop obj2);
    +
    +#ifdef CHECK_UNHANDLED_OOPS
    +  bool oop_equals_operator_allowed() { return !ShenandoahVerifyObjectEquals; }
    +#endif
    +
    +  void enqueue(oop obj);
    +
    +private:
    +  inline bool need_update_refs_barrier();
    +
    +  template 
    +  void write_ref_array_loop(HeapWord* start, size_t count);
    +
    +  oop write_barrier_impl(oop obj);
    +
    +  static void keep_alive_if_weak(DecoratorSet decorators, oop value) {
    +    assert((decorators & ON_UNKNOWN_OOP_REF) == 0, "Reference strength must be known");
    +    const bool on_strong_oop_ref = (decorators & ON_STRONG_OOP_REF) != 0;
    +    const bool peek              = (decorators & AS_NO_KEEPALIVE) != 0;
    +    if (!peek && !on_strong_oop_ref && value != NULL) {
    +      ShenandoahBarrierSet::barrier_set()->keep_alive_barrier(value);
    +    }
    +  }
    +
    +  template 
    +  bool arraycopy_loop_1(T* src, T* dst, size_t length, Klass* bound,
    +                        bool checkcast, bool satb, bool disjoint, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
    +
    +  template 
    +  bool arraycopy_loop_2(T* src, T* dst, size_t length, Klass* bound,
    +                        bool satb, bool disjoint, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
    +
    +  template 
    +  bool arraycopy_loop_3(T* src, T* dst, size_t length, Klass* bound,
    +                        bool disjoint, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
    +
    +  template 
    +  bool arraycopy_loop(T* src, T* dst, size_t length, Klass* bound, bool disjoint);
    +
    +  template 
    +  bool arraycopy_element(T* cur_src, T* cur_dst, Klass* bound, Thread* thread);
    +
    +public:
    +  // Callbacks for runtime accesses.
    +  template 
    +  class AccessBarrier: public BarrierSet::AccessBarrier {
    +    typedef BarrierSet::AccessBarrier Raw;
    +
    +  public:
    +    // Primitive heap accesses. These accessors get resolved when
    +    // IN_HEAP is set (e.g. when using the HeapAccess API), it is
    +    // not an oop_* overload, and the barrier strength is AS_NORMAL.
    +    template 
    +    static T load_in_heap(T* addr) {
    +      ShouldNotReachHere();
    +      return Raw::template load(addr);
    +    }
    +
    +    template 
    +    static T load_in_heap_at(oop base, ptrdiff_t offset) {
    +      base = ShenandoahBarrierSet::resolve_forwarded(base);
    +      return Raw::template load_at(base, offset);
    +    }
    +
    +    template 
    +    static void store_in_heap(T* addr, T value) {
    +      ShouldNotReachHere();
    +      Raw::store(addr, value);
    +    }
    +
    +    template 
    +    static void store_in_heap_at(oop base, ptrdiff_t offset, T value) {
    +      base = ShenandoahBarrierSet::barrier_set()->write_barrier(base);
    +      Raw::store_at(base, offset, value);
    +    }
    +
    +    template 
    +    static T atomic_cmpxchg_in_heap(T new_value, T* addr, T compare_value) {
    +      ShouldNotReachHere();
    +      return Raw::atomic_cmpxchg(new_value, addr, compare_value);
    +    }
    +
    +    template 
    +    static T atomic_cmpxchg_in_heap_at(T new_value, oop base, ptrdiff_t offset, T compare_value) {
    +      base = ShenandoahBarrierSet::barrier_set()->write_barrier(base);
    +      return Raw::atomic_cmpxchg_at(new_value, base, offset, compare_value);
    +    }
    +
    +    template 
    +    static T atomic_xchg_in_heap(T new_value, T* addr) {
    +      ShouldNotReachHere();
    +      return Raw::atomic_xchg(new_value, addr);
    +    }
    +
    +    template 
    +    static T atomic_xchg_in_heap_at(T new_value, oop base, ptrdiff_t offset) {
    +      base = ShenandoahBarrierSet::barrier_set()->write_barrier(base);
    +      return Raw::atomic_xchg_at(new_value, base, offset);
    +    }
    +
    +    template 
    +    static void arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw,
    +                                  arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
    +                                  size_t length);
    +
    +    // Heap oop accesses. These accessors get resolved when
    +    // IN_HEAP is set (e.g. when using the HeapAccess API), it is
    +    // an oop_* overload, and the barrier strength is AS_NORMAL.
    +    template 
    +    static oop oop_load_in_heap(T* addr) {
    +      // ShouldNotReachHere();
    +      oop value = Raw::template oop_load(addr);
    +      keep_alive_if_weak(decorators, value);
    +      return value;
    +    }
    +
    +    static oop oop_load_in_heap_at(oop base, ptrdiff_t offset) {
    +      base = ShenandoahBarrierSet::resolve_forwarded(base);
    +      oop value = Raw::template oop_load_at(base, offset);
    +      keep_alive_if_weak(AccessBarrierSupport::resolve_possibly_unknown_oop_ref_strength(base, offset), value);
    +      return value;
    +    }
    +
    +    template 
    +    static void oop_store_in_heap(T* addr, oop value) {
    +      ShenandoahBarrierSet::barrier_set()->write_ref_field_pre_work(addr, value);
    +      Raw::oop_store(addr, value);
    +    }
    +
    +    static void oop_store_in_heap_at(oop base, ptrdiff_t offset, oop value) {
    +      base = ShenandoahBarrierSet::barrier_set()->write_barrier(base);
    +      value = ShenandoahBarrierSet::barrier_set()->storeval_barrier(value);
    +
    +      oop_store_in_heap(AccessInternal::oop_field_addr(base, offset), value);
    +    }
    +
    +    template 
    +    static oop oop_atomic_cmpxchg_in_heap(oop new_value, T* addr, oop compare_value);
    +
    +    static oop oop_atomic_cmpxchg_in_heap_at(oop new_value, oop base, ptrdiff_t offset, oop compare_value) {
    +      base = ShenandoahBarrierSet::barrier_set()->write_barrier(base);
    +      new_value = ShenandoahBarrierSet::barrier_set()->storeval_barrier(new_value);
    +      return oop_atomic_cmpxchg_in_heap(new_value, AccessInternal::oop_field_addr(base, offset), compare_value);
    +    }
    +
    +    template 
    +    static oop oop_atomic_xchg_in_heap(oop new_value, T* addr);
    +
    +    static oop oop_atomic_xchg_in_heap_at(oop new_value, oop base, ptrdiff_t offset) {
    +      base = ShenandoahBarrierSet::barrier_set()->write_barrier(base);
    +      new_value = ShenandoahBarrierSet::barrier_set()->storeval_barrier(new_value);
    +      return oop_atomic_xchg_in_heap(new_value, AccessInternal::oop_field_addr(base, offset));
    +    }
    +
    +    template 
    +    static bool oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw,
    +                                      arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
    +                                      size_t length);
    +
    +    // Clone barrier support
    +    static void clone_in_heap(oop src, oop dst, size_t size);
    +
    +    // Needed for loads on non-heap weak references
    +    template 
    +    static oop oop_load_not_in_heap(T* addr) {
    +      oop value = Raw::oop_load_not_in_heap(addr);
    +      keep_alive_if_weak(decorators, value);
    +      return value;
    +    }
    +
    +    static oop resolve(oop obj) {
    +      return ShenandoahBarrierSet::barrier_set()->write_barrier(obj);
    +    }
    +
    +    static bool equals(oop o1, oop o2) {
    +      return ShenandoahBarrierSet::barrier_set()->obj_equals(o1, o2);
    +    }
    +
    +  };
    +
    +};
    +
    +template<>
    +struct BarrierSet::GetName {
    +  static const BarrierSet::Name value = BarrierSet::ShenandoahBarrierSet;
    +};
    +
    +template<>
    +struct BarrierSet::GetType {
    +  typedef ::ShenandoahBarrierSet type;
    +};
    +
    +#endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp
    new file mode 100644
    index 00000000000..1a3977c829d
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp
    @@ -0,0 +1,282 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
    +
    +#include "gc/shared/barrierSet.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSet.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +
    +bool ShenandoahBarrierSet::need_update_refs_barrier() {
    +  return _heap->is_update_refs_in_progress() ||
    +         _heap->is_concurrent_traversal_in_progress() ||
    +         (_heap->is_concurrent_mark_in_progress() && _heap->has_forwarded_objects());
    +}
    +
    +inline oop ShenandoahBarrierSet::resolve_forwarded_not_null(oop p) {
    +  return ShenandoahBrooksPointer::forwardee(p);
    +}
    +
    +inline oop ShenandoahBarrierSet::resolve_forwarded(oop p) {
    +  if (((HeapWord*) p) != NULL) {
    +    return resolve_forwarded_not_null(p);
    +  } else {
    +    return p;
    +  }
    +}
    +
    +template 
    +template 
    +inline oop ShenandoahBarrierSet::AccessBarrier::oop_atomic_cmpxchg_in_heap(oop new_value, T* addr, oop compare_value) {
    +  oop res;
    +  oop expected = compare_value;
    +  do {
    +    compare_value = expected;
    +    res = Raw::oop_atomic_cmpxchg(new_value, addr, compare_value);
    +    expected = res;
    +  } while ((! oopDesc::equals_raw(compare_value, expected)) && oopDesc::equals_raw(resolve_forwarded(compare_value), resolve_forwarded(expected)));
    +  if (oopDesc::equals_raw(expected, compare_value)) {
    +    if (ShenandoahSATBBarrier && !CompressedOops::is_null(compare_value)) {
    +      ShenandoahBarrierSet::barrier_set()->enqueue(compare_value);
    +    }
    +  }
    +  return res;
    +}
    +
    +template 
    +template 
    +inline oop ShenandoahBarrierSet::AccessBarrier::oop_atomic_xchg_in_heap(oop new_value, T* addr) {
    +  oop previous = Raw::oop_atomic_xchg(new_value, addr);
    +  if (ShenandoahSATBBarrier) {
    +    if (!CompressedOops::is_null(previous)) {
    +      ShenandoahBarrierSet::barrier_set()->enqueue(previous);
    +    }
    +  }
    +  return previous;
    +}
    +
    +template 
    +template 
    +void ShenandoahBarrierSet::AccessBarrier::arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw,
    +                                                                                     arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
    +                                                                                     size_t length) {
    +  if (!CompressedOops::is_null(src_obj)) {
    +    src_obj = arrayOop(ShenandoahBarrierSet::barrier_set()->read_barrier(src_obj));
    +  }
    +  if (!CompressedOops::is_null(dst_obj)) {
    +    dst_obj = arrayOop(ShenandoahBarrierSet::barrier_set()->write_barrier(dst_obj));
    +  }
    +  Raw::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length);
    +}
    +
    +template 
    +bool ShenandoahBarrierSet::arraycopy_loop_1(T* src, T* dst, size_t length, Klass* bound,
    +                                            bool checkcast, bool satb, bool disjoint,
    +                                            ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode) {
    +  if (checkcast) {
    +    return arraycopy_loop_2(src, dst, length, bound, satb, disjoint, storeval_mode);
    +  } else {
    +    return arraycopy_loop_2(src, dst, length, bound, satb, disjoint, storeval_mode);
    +  }
    +}
    +
    +template 
    +bool ShenandoahBarrierSet::arraycopy_loop_2(T* src, T* dst, size_t length, Klass* bound,
    +                                            bool satb, bool disjoint,
    +                                            ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode) {
    +  if (satb) {
    +    return arraycopy_loop_3(src, dst, length, bound, disjoint, storeval_mode);
    +  } else {
    +    return arraycopy_loop_3(src, dst, length, bound, disjoint, storeval_mode);
    +  }
    +}
    +
    +template 
    +bool ShenandoahBarrierSet::arraycopy_loop_3(T* src, T* dst, size_t length, Klass* bound, bool disjoint,
    +                                            ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode) {
    +  switch (storeval_mode) {
    +    case NONE:
    +      return arraycopy_loop(src, dst, length, bound, disjoint);
    +    case READ_BARRIER:
    +      return arraycopy_loop(src, dst, length, bound, disjoint);
    +    case WRITE_BARRIER:
    +      return arraycopy_loop(src, dst, length, bound, disjoint);
    +    default:
    +      ShouldNotReachHere();
    +      return true; // happy compiler
    +  }
    +}
    +
    +template 
    +bool ShenandoahBarrierSet::arraycopy_loop(T* src, T* dst, size_t length, Klass* bound, bool disjoint) {
    +  Thread* thread = Thread::current();
    +
    +  ShenandoahEvacOOMScope oom_evac_scope;
    +
    +  // We need to handle four cases:
    +  //
    +  // a) src < dst, conjoint, can only copy backward only
    +  //   [...src...]
    +  //         [...dst...]
    +  //
    +  // b) src < dst, disjoint, can only copy forward, because types may mismatch
    +  //   [...src...]
    +  //              [...dst...]
    +  //
    +  // c) src > dst, conjoint, can copy forward only
    +  //         [...src...]
    +  //   [...dst...]
    +  //
    +  // d) src > dst, disjoint, can only copy forward, because types may mismatch
    +  //              [...src...]
    +  //   [...dst...]
    +  //
    +  if (src > dst || disjoint) {
    +    // copy forward:
    +    T* cur_src = src;
    +    T* cur_dst = dst;
    +    T* src_end = src + length;
    +    for (; cur_src < src_end; cur_src++, cur_dst++) {
    +      if (!arraycopy_element(cur_src, cur_dst, bound, thread)) {
    +        return false;
    +      }
    +    }
    +  } else {
    +    // copy backward:
    +    T* cur_src = src + length - 1;
    +    T* cur_dst = dst + length - 1;
    +    for (; cur_src >= src; cur_src--, cur_dst--) {
    +      if (!arraycopy_element(cur_src, cur_dst, bound, thread)) {
    +        return false;
    +      }
    +    }
    +  }
    +  return true;
    +}
    +
    +template 
    +bool ShenandoahBarrierSet::arraycopy_element(T* cur_src, T* cur_dst, Klass* bound, Thread* thread) {
    +  T o = RawAccess<>::oop_load(cur_src);
    +
    +  if (SATB) {
    +    T prev = RawAccess<>::oop_load(cur_dst);
    +    if (!CompressedOops::is_null(prev)) {
    +      oop prev_obj = CompressedOops::decode_not_null(prev);
    +      enqueue(prev_obj);
    +    }
    +  }
    +
    +  if (!CompressedOops::is_null(o)) {
    +    oop obj = CompressedOops::decode_not_null(o);
    +
    +    if (CHECKCAST) {
    +      assert(bound != NULL, "need element klass for checkcast");
    +      if (!oopDesc::is_instanceof_or_null(obj, bound)) {
    +        return false;
    +      }
    +    }
    +
    +    switch (STOREVAL_MODE) {
    +    case NONE:
    +      break;
    +    case READ_BARRIER:
    +      obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    +      break;
    +    case WRITE_BARRIER:
    +      if (_heap->in_collection_set(obj)) {
    +        oop forw = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    +        if (oopDesc::equals_raw(forw, obj)) {
    +          forw = _heap->evacuate_object(forw, thread);
    +        }
    +        obj = forw;
    +      }
    +      enqueue(obj);
    +      break;
    +    default:
    +      ShouldNotReachHere();
    +    }
    +
    +    RawAccess::oop_store(cur_dst, obj);
    +  } else {
    +    // Store null.
    +    RawAccess<>::oop_store(cur_dst, o);
    +  }
    +  return true;
    +}
    +
    +// Clone barrier support
    +template 
    +void ShenandoahBarrierSet::AccessBarrier::clone_in_heap(oop src, oop dst, size_t size) {
    +  src = arrayOop(ShenandoahBarrierSet::barrier_set()->read_barrier(src));
    +  dst = arrayOop(ShenandoahBarrierSet::barrier_set()->write_barrier(dst));
    +  Raw::clone(src, dst, size);
    +  ShenandoahBarrierSet::barrier_set()->write_region(MemRegion((HeapWord*) dst, size));
    +}
    +
    +template 
    +template 
    +bool ShenandoahBarrierSet::AccessBarrier::oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw,
    +                                                                                         arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
    +                                                                                         size_t length) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  if (!CompressedOops::is_null(src_obj)) {
    +    src_obj = arrayOop(ShenandoahBarrierSet::barrier_set()->read_barrier(src_obj));
    +  }
    +  if (!CompressedOops::is_null(dst_obj)) {
    +    dst_obj = arrayOop(ShenandoahBarrierSet::barrier_set()->write_barrier(dst_obj));
    +  }
    +
    +  bool satb = ShenandoahSATBBarrier && heap->is_concurrent_mark_in_progress();
    +  bool checkcast = HasDecorator::value;
    +  bool disjoint = HasDecorator::value;
    +  ArrayCopyStoreValMode storeval_mode;
    +  if (heap->has_forwarded_objects()) {
    +    if (heap->is_concurrent_traversal_in_progress()) {
    +      storeval_mode = WRITE_BARRIER;
    +    } else if (heap->is_concurrent_mark_in_progress() || heap->is_update_refs_in_progress()) {
    +      storeval_mode = READ_BARRIER;
    +    } else {
    +      assert(heap->is_idle() || heap->is_evacuation_in_progress(), "must not have anything in progress");
    +      storeval_mode = NONE; // E.g. during evac or outside cycle
    +    }
    +  } else {
    +    assert(heap->is_stable() || heap->is_concurrent_mark_in_progress(), "must not have anything in progress");
    +    storeval_mode = NONE;
    +  }
    +
    +  if (!satb && !checkcast && storeval_mode == NONE) {
    +    // Short-circuit to bulk copy.
    +    return Raw::oop_arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length);
    +  }
    +
    +  src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw);
    +  dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw);
    +
    +  Klass* bound = objArrayOop(dst_obj)->element_klass();
    +  ShenandoahBarrierSet* bs = ShenandoahBarrierSet::barrier_set();
    +  return bs->arraycopy_loop_1(src_raw, dst_raw, length, bound, checkcast, satb, disjoint, storeval_mode);
    +}
    +
    +#endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSetAssembler.hpp b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSetAssembler.hpp
    new file mode 100644
    index 00000000000..6ab21abebe4
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSetAssembler.hpp
    @@ -0,0 +1,32 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSETASSEMBLER_HPP
    +#define SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSETASSEMBLER_HPP
    +
    +#include "utilities/macros.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +
    +#include CPU_HEADER(gc/shenandoah/shenandoahBarrierSetAssembler)
    +
    +#endif // SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSETASSEMBLER_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahBrooksPointer.hpp b/src/hotspot/share/gc/shenandoah/shenandoahBrooksPointer.hpp
    new file mode 100644
    index 00000000000..8a2704bce53
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahBrooksPointer.hpp
    @@ -0,0 +1,106 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHBROOKSPOINTER_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHBROOKSPOINTER_HPP
    +
    +#include "oops/oop.hpp"
    +#include "utilities/globalDefinitions.hpp"
    +
    +class ShenandoahBrooksPointer {
    +  /*
    +   * Notes:
    +   *
    +   *  a. It is important to have byte_offset and word_offset return constant
    +   *     expressions, because that will allow to constant-fold forwarding ptr
    +   *     accesses. This is not a problem in JIT compilers that would generate
    +   *     the code once, but it is problematic in GC hotpath code.
    +   *
    +   *  b. With filler object mechanics, we may need to allocate more space for
    +   *     the forwarding ptr to meet alignment requirements for objects. This
    +   *     means *_offset and *_size calls are NOT interchangeable. The accesses
    +   *     to forwarding ptrs should always be via *_offset. Storage size
    +   *     calculations should always be via *_size.
    +   */
    +
    +public:
    +  /* Offset from the object start, in HeapWords. */
    +  static inline int word_offset() {
    +    return -1; // exactly one HeapWord
    +  }
    +
    +  /* Offset from the object start, in bytes. */
    +  static inline int byte_offset() {
    +    return -HeapWordSize; // exactly one HeapWord
    +  }
    +
    +  /* Allocated size, in HeapWords. */
    +  static inline uint word_size() {
    +    return (uint) MinObjAlignment;
    +  }
    +
    +  /* Allocated size, in bytes */
    +  static inline uint byte_size() {
    +    return (uint) MinObjAlignmentInBytes;
    +  }
    +
    +  /* Assert basic stuff once at startup. */
    +  static void initial_checks() {
    +    guarantee (MinObjAlignment > 0, "sanity, word_size is correct");
    +    guarantee (MinObjAlignmentInBytes > 0, "sanity, byte_size is correct");
    +  }
    +
    +  /* Initializes Brooks pointer (to self).
    +   */
    +  static inline void initialize(oop obj);
    +
    +  /* Gets forwardee from the given object.
    +   */
    +  static inline oop forwardee(oop obj);
    +
    +  /* Tries to atomically update forwardee in $holder object to $update.
    +   * Assumes $holder points at itself.
    +   * Asserts $holder is in from-space.
    +   * Asserts $update is in to-space.
    +   */
    +  static inline oop try_update_forwardee(oop obj, oop update);
    +
    +  /* Sets raw value for forwardee slot.
    +   * THIS IS DANGEROUS: USERS HAVE TO INITIALIZE/SET FORWARDEE BACK AFTER THEY ARE DONE.
    +   */
    +  static inline void set_raw(oop obj, HeapWord* update);
    +
    +  /* Returns the raw value from forwardee slot.
    +   */
    +  static inline HeapWord* get_raw(oop obj);
    +
    +  /* Returns the raw value from forwardee slot without any checks.
    +   * Used for quick verification.
    +   */
    +  static inline HeapWord* get_raw_unchecked(oop obj);
    +
    +private:
    +  static inline HeapWord** brooks_ptr_addr(oop obj);
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHBROOKSPOINTER_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahBrooksPointer.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahBrooksPointer.inline.hpp
    new file mode 100644
    index 00000000000..b63ab2022d3
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahBrooksPointer.inline.hpp
    @@ -0,0 +1,65 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHBROOKSPOINTER_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHBROOKSPOINTER_INLINE_HPP
    +
    +#include "gc/shenandoah/shenandoahAsserts.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +#include "runtime/atomic.hpp"
    +
    +inline HeapWord** ShenandoahBrooksPointer::brooks_ptr_addr(oop obj) {
    +  return (HeapWord**)((HeapWord*) obj + word_offset());
    +}
    +
    +inline void ShenandoahBrooksPointer::initialize(oop obj) {
    +  shenandoah_assert_in_heap(NULL, obj);
    +  *brooks_ptr_addr(obj) = (HeapWord*) obj;
    +}
    +
    +inline void ShenandoahBrooksPointer::set_raw(oop obj, HeapWord* update) {
    +  shenandoah_assert_in_heap(NULL, obj);
    +  *brooks_ptr_addr(obj) = update;
    +}
    +
    +inline HeapWord* ShenandoahBrooksPointer::get_raw(oop obj) {
    +  shenandoah_assert_in_heap(NULL, obj);
    +  return *brooks_ptr_addr(obj);
    +}
    +
    +inline HeapWord* ShenandoahBrooksPointer::get_raw_unchecked(oop obj) {
    +  return *brooks_ptr_addr(obj);
    +}
    +
    +inline oop ShenandoahBrooksPointer::forwardee(oop obj) {
    +  shenandoah_assert_correct(NULL, obj);
    +  return oop(*brooks_ptr_addr(obj));
    +}
    +
    +inline oop ShenandoahBrooksPointer::try_update_forwardee(oop obj, oop update) {
    +  oop result = (oop) Atomic::cmpxchg(update, (oop*)brooks_ptr_addr(obj), obj);
    +  shenandoah_assert_correct_except(NULL, obj, !oopDesc::equals_raw(result, obj));
    +  return result;
    +}
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHBROOKSPOINTER_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
    new file mode 100644
    index 00000000000..f91a1cc4de2
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
    @@ -0,0 +1,377 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "code/codeCache.hpp"
    +#include "code/nmethod.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahCodeRoots.hpp"
    +#include "memory/resourceArea.hpp"
    +
    +ShenandoahParallelCodeCacheIterator::ShenandoahParallelCodeCacheIterator(const GrowableArray* heaps) {
    +  _length = heaps->length();
    +  _iters = NEW_C_HEAP_ARRAY(ShenandoahParallelCodeHeapIterator, _length, mtGC);
    +  for (int h = 0; h < _length; h++) {
    +    _iters[h] = ShenandoahParallelCodeHeapIterator(heaps->at(h));
    +  }
    +}
    +
    +ShenandoahParallelCodeCacheIterator::~ShenandoahParallelCodeCacheIterator() {
    +  FREE_C_HEAP_ARRAY(ParallelCodeHeapIterator, _iters);
    +}
    +
    +void ShenandoahParallelCodeCacheIterator::parallel_blobs_do(CodeBlobClosure* f) {
    +  for (int c = 0; c < _length; c++) {
    +    _iters[c].parallel_blobs_do(f);
    +  }
    +}
    +
    +ShenandoahParallelCodeHeapIterator::ShenandoahParallelCodeHeapIterator(CodeHeap* heap) :
    +        _heap(heap), _claimed_idx(0), _finished(false) {
    +}
    +
    +void ShenandoahParallelCodeHeapIterator::parallel_blobs_do(CodeBlobClosure* f) {
    +  assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint");
    +
    +  /*
    +   * Parallel code heap walk.
    +   *
    +   * This code makes all threads scan all code heaps, but only one thread would execute the
    +   * closure on given blob. This is achieved by recording the "claimed" blocks: if a thread
    +   * had claimed the block, it can process all blobs in it. Others have to fast-forward to
    +   * next attempt without processing.
    +   *
    +   * Late threads would return immediately if iterator is finished.
    +   */
    +
    +  if (_finished) {
    +    return;
    +  }
    +
    +  int stride = 256; // educated guess
    +  int stride_mask = stride - 1;
    +  assert (is_power_of_2(stride), "sanity");
    +
    +  int count = 0;
    +  bool process_block = true;
    +
    +  for (CodeBlob *cb = CodeCache::first_blob(_heap); cb != NULL; cb = CodeCache::next_blob(_heap, cb)) {
    +    int current = count++;
    +    if ((current & stride_mask) == 0) {
    +      process_block = (current >= _claimed_idx) &&
    +                      (Atomic::cmpxchg(current + stride, &_claimed_idx, current) == current);
    +    }
    +    if (process_block) {
    +      if (cb->is_alive()) {
    +        f->do_code_blob(cb);
    +#ifdef ASSERT
    +        if (cb->is_nmethod())
    +          Universe::heap()->verify_nmethod((nmethod*)cb);
    +#endif
    +      }
    +    }
    +  }
    +
    +  _finished = true;
    +}
    +
    +class ShenandoahNMethodOopDetector : public OopClosure {
    +private:
    +  ResourceMark rm; // For growable array allocation below.
    +  GrowableArray _oops;
    +
    +public:
    +  ShenandoahNMethodOopDetector() : _oops(10) {};
    +
    +  void do_oop(oop* o) {
    +    _oops.append(o);
    +  }
    +  void do_oop(narrowOop* o) {
    +    fatal("NMethods should not have compressed oops embedded.");
    +  }
    +
    +  GrowableArray* oops() {
    +    return &_oops;
    +  }
    +
    +  bool has_oops() {
    +    return !_oops.is_empty();
    +  }
    +};
    +
    +class ShenandoahNMethodOopInitializer : public OopClosure {
    +private:
    +  ShenandoahHeap* const _heap;
    +
    +public:
    +  ShenandoahNMethodOopInitializer() : _heap(ShenandoahHeap::heap()) {};
    +
    +private:
    +  template 
    +  inline void do_oop_work(T* p) {
    +    T o = RawAccess<>::oop_load(p);
    +    if (! CompressedOops::is_null(o)) {
    +      oop obj1 = CompressedOops::decode_not_null(o);
    +      oop obj2 = ShenandoahBarrierSet::barrier_set()->write_barrier(obj1);
    +      if (! oopDesc::equals_raw(obj1, obj2)) {
    +        shenandoah_assert_not_in_cset(NULL, obj2);
    +        RawAccess::oop_store(p, obj2);
    +        if (_heap->is_concurrent_traversal_in_progress()) {
    +          ShenandoahBarrierSet::barrier_set()->enqueue(obj2);
    +        }
    +      }
    +    }
    +  }
    +
    +public:
    +  void do_oop(oop* o) {
    +    do_oop_work(o);
    +  }
    +  void do_oop(narrowOop* o) {
    +    do_oop_work(o);
    +  }
    +};
    +
    +ShenandoahCodeRoots::PaddedLock ShenandoahCodeRoots::_recorded_nms_lock;
    +GrowableArray* ShenandoahCodeRoots::_recorded_nms;
    +
    +void ShenandoahCodeRoots::initialize() {
    +  _recorded_nms_lock._lock = 0;
    +  _recorded_nms = new (ResourceObj::C_HEAP, mtGC) GrowableArray(100, true, mtGC);
    +}
    +
    +void ShenandoahCodeRoots::add_nmethod(nmethod* nm) {
    +  switch (ShenandoahCodeRootsStyle) {
    +    case 0:
    +    case 1: {
    +      ShenandoahNMethodOopInitializer init;
    +      nm->oops_do(&init);
    +      nm->fix_oop_relocations();
    +      break;
    +    }
    +    case 2: {
    +      ShenandoahNMethodOopDetector detector;
    +      nm->oops_do(&detector);
    +
    +      if (detector.has_oops()) {
    +        ShenandoahNMethodOopInitializer init;
    +        nm->oops_do(&init);
    +        nm->fix_oop_relocations();
    +
    +        ShenandoahNMethod* nmr = new ShenandoahNMethod(nm, detector.oops());
    +        nmr->assert_alive_and_correct();
    +
    +        ShenandoahCodeRootsLock lock(true);
    +
    +        int idx = _recorded_nms->find(nm, ShenandoahNMethod::find_with_nmethod);
    +        if (idx != -1) {
    +          ShenandoahNMethod* old = _recorded_nms->at(idx);
    +          _recorded_nms->at_put(idx, nmr);
    +          delete old;
    +        } else {
    +          _recorded_nms->append(nmr);
    +        }
    +      }
    +      break;
    +    }
    +    default:
    +      ShouldNotReachHere();
    +  }
    +};
    +
    +void ShenandoahCodeRoots::remove_nmethod(nmethod* nm) {
    +  switch (ShenandoahCodeRootsStyle) {
    +    case 0:
    +    case 1: {
    +      break;
    +    }
    +    case 2: {
    +      ShenandoahNMethodOopDetector detector;
    +      nm->oops_do(&detector, /* allow_zombie = */ true);
    +
    +      if (detector.has_oops()) {
    +        ShenandoahCodeRootsLock lock(true);
    +
    +        int idx = _recorded_nms->find(nm, ShenandoahNMethod::find_with_nmethod);
    +        assert(idx != -1, "nmethod " PTR_FORMAT " should be registered", p2i(nm));
    +        ShenandoahNMethod* old = _recorded_nms->at(idx);
    +        old->assert_same_oops(detector.oops());
    +        _recorded_nms->delete_at(idx);
    +        delete old;
    +      }
    +      break;
    +    }
    +    default:
    +      ShouldNotReachHere();
    +  }
    +}
    +
    +ShenandoahCodeRootsIterator::ShenandoahCodeRootsIterator() :
    +        _heap(ShenandoahHeap::heap()),
    +        _par_iterator(CodeCache::heaps()),
    +        _claimed(0) {
    +  assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint");
    +  assert(!Thread::current()->is_Worker_thread(), "Should not be acquired by workers");
    +  switch (ShenandoahCodeRootsStyle) {
    +    case 0:
    +    case 1: {
    +      // No need to do anything here
    +      break;
    +    }
    +    case 2: {
    +      ShenandoahCodeRoots::acquire_lock(false);
    +      break;
    +    }
    +    default:
    +      ShouldNotReachHere();
    +  }
    +}
    +
    +ShenandoahCodeRootsIterator::~ShenandoahCodeRootsIterator() {
    +  switch (ShenandoahCodeRootsStyle) {
    +    case 0:
    +    case 1: {
    +      // No need to do anything here
    +      break;
    +    }
    +    case 2: {
    +      ShenandoahCodeRoots::release_lock(false);
    +      break;
    +    }
    +    default:
    +      ShouldNotReachHere();
    +  }
    +}
    +
    +template
    +void ShenandoahCodeRootsIterator::dispatch_parallel_blobs_do(CodeBlobClosure *f) {
    +  switch (ShenandoahCodeRootsStyle) {
    +    case 0: {
    +      if (_seq_claimed.try_set()) {
    +        CodeCache::blobs_do(f);
    +      }
    +      break;
    +    }
    +    case 1: {
    +      _par_iterator.parallel_blobs_do(f);
    +      break;
    +    }
    +    case 2: {
    +      ShenandoahCodeRootsIterator::fast_parallel_blobs_do(f);
    +      break;
    +    }
    +    default:
    +      ShouldNotReachHere();
    +  }
    +}
    +
    +ShenandoahAllCodeRootsIterator ShenandoahCodeRoots::iterator() {
    +  return ShenandoahAllCodeRootsIterator();
    +}
    +
    +ShenandoahCsetCodeRootsIterator ShenandoahCodeRoots::cset_iterator() {
    +  return ShenandoahCsetCodeRootsIterator();
    +}
    +
    +void ShenandoahAllCodeRootsIterator::possibly_parallel_blobs_do(CodeBlobClosure *f) {
    +  ShenandoahCodeRootsIterator::dispatch_parallel_blobs_do(f);
    +}
    +
    +void ShenandoahCsetCodeRootsIterator::possibly_parallel_blobs_do(CodeBlobClosure *f) {
    +  ShenandoahCodeRootsIterator::dispatch_parallel_blobs_do(f);
    +}
    +
    +template 
    +void ShenandoahCodeRootsIterator::fast_parallel_blobs_do(CodeBlobClosure *f) {
    +  assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint");
    +
    +  size_t stride = 256; // educated guess
    +
    +  GrowableArray* list = ShenandoahCodeRoots::_recorded_nms;
    +
    +  size_t max = (size_t)list->length();
    +  while (_claimed < max) {
    +    size_t cur = Atomic::add(stride, &_claimed) - stride;
    +    size_t start = cur;
    +    size_t end = MIN2(cur + stride, max);
    +    if (start >= max) break;
    +
    +    for (size_t idx = start; idx < end; idx++) {
    +      ShenandoahNMethod* nmr = list->at((int) idx);
    +      nmr->assert_alive_and_correct();
    +
    +      if (CSET_FILTER && !nmr->has_cset_oops(_heap)) {
    +        continue;
    +      }
    +
    +      f->do_code_blob(nmr->nm());
    +    }
    +  }
    +}
    +
    +ShenandoahNMethod::ShenandoahNMethod(nmethod* nm, GrowableArray* oops) {
    +  _nm = nm;
    +  _oops = NEW_C_HEAP_ARRAY(oop*, oops->length(), mtGC);
    +  _oops_count = oops->length();
    +  for (int c = 0; c < _oops_count; c++) {
    +    _oops[c] = oops->at(c);
    +  }
    +}
    +
    +ShenandoahNMethod::~ShenandoahNMethod() {
    +  if (_oops != NULL) {
    +    FREE_C_HEAP_ARRAY(oop*, _oops);
    +  }
    +}
    +
    +bool ShenandoahNMethod::has_cset_oops(ShenandoahHeap *heap) {
    +  for (int c = 0; c < _oops_count; c++) {
    +    oop o = RawAccess<>::oop_load(_oops[c]);
    +    if (heap->in_collection_set(o)) {
    +      return true;
    +    }
    +  }
    +  return false;
    +}
    +
    +#ifdef ASSERT
    +void ShenandoahNMethod::assert_alive_and_correct() {
    +  assert(_nm->is_alive(), "only alive nmethods here");
    +  assert(_oops_count > 0, "should have filtered nmethods without oops before");
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  for (int c = 0; c < _oops_count; c++) {
    +    oop *loc = _oops[c];
    +    assert(_nm->code_contains((address) loc) || _nm->oops_contains(loc), "nmethod should contain the oop*");
    +    oop o = RawAccess<>::oop_load(loc);
    +    shenandoah_assert_correct_except(loc, o, o == NULL || heap->is_full_gc_move_in_progress());
    +  }
    +}
    +
    +void ShenandoahNMethod::assert_same_oops(GrowableArray* oops) {
    +  assert(_oops_count == oops->length(), "should have the same number of oop*");
    +  for (int c = 0; c < _oops_count; c++) {
    +    assert(_oops[c] == oops->at(c), "should be the same oop*");
    +  }
    +}
    +#endif
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.hpp b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.hpp
    new file mode 100644
    index 00000000000..60ad3f4d180
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.hpp
    @@ -0,0 +1,200 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHCODEROOTS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHCODEROOTS_HPP
    +
    +#include "code/codeCache.hpp"
    +#include "gc/shenandoah/shenandoahSharedVariables.hpp"
    +#include "memory/allocation.hpp"
    +#include "memory/iterator.hpp"
    +
    +class ShenandoahHeap;
    +class ShenandoahHeapRegion;
    +class ShenandoahCodeRootsLock;
    +
    +class ShenandoahParallelCodeHeapIterator {
    +  friend class CodeCache;
    +private:
    +  CodeHeap*     _heap;
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile int));
    +  volatile int  _claimed_idx;
    +  volatile bool _finished;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +public:
    +  ShenandoahParallelCodeHeapIterator(CodeHeap* heap);
    +  void parallel_blobs_do(CodeBlobClosure* f);
    +};
    +
    +class ShenandoahParallelCodeCacheIterator {
    +  friend class CodeCache;
    +private:
    +  ShenandoahParallelCodeHeapIterator* _iters;
    +  int                       _length;
    +public:
    +  ShenandoahParallelCodeCacheIterator(const GrowableArray* heaps);
    +  ~ShenandoahParallelCodeCacheIterator();
    +  void parallel_blobs_do(CodeBlobClosure* f);
    +};
    +
    +// ShenandoahNMethod tuple records the internal locations of oop slots within the nmethod.
    +// This allows us to quickly scan the oops without doing the nmethod-internal scans, that
    +// sometimes involves parsing the machine code. Note it does not record the oops themselves,
    +// because it would then require handling these tuples as the new class of roots.
    +class ShenandoahNMethod : public CHeapObj {
    +private:
    +  nmethod* _nm;
    +  oop**    _oops;
    +  int      _oops_count;
    +
    +public:
    +  ShenandoahNMethod(nmethod *nm, GrowableArray* oops);
    +  ~ShenandoahNMethod();
    +
    +  nmethod* nm() {
    +    return _nm;
    +  }
    +
    +  bool has_cset_oops(ShenandoahHeap* heap);
    +
    +  void assert_alive_and_correct() PRODUCT_RETURN;
    +  void assert_same_oops(GrowableArray* oops) PRODUCT_RETURN;
    +
    +  static bool find_with_nmethod(void* nm, ShenandoahNMethod* other) {
    +    return other->_nm == nm;
    +  }
    +};
    +
    +class ShenandoahCodeRootsIterator {
    +  friend class ShenandoahCodeRoots;
    +protected:
    +  ShenandoahHeap* _heap;
    +  ShenandoahParallelCodeCacheIterator _par_iterator;
    +  ShenandoahSharedFlag _seq_claimed;
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile size_t));
    +  volatile size_t _claimed;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +protected:
    +  ShenandoahCodeRootsIterator();
    +  ~ShenandoahCodeRootsIterator();
    +
    +  template
    +  void dispatch_parallel_blobs_do(CodeBlobClosure *f);
    +
    +  template
    +  void fast_parallel_blobs_do(CodeBlobClosure *f);
    +};
    +
    +class ShenandoahAllCodeRootsIterator : public ShenandoahCodeRootsIterator {
    +public:
    +  ShenandoahAllCodeRootsIterator() : ShenandoahCodeRootsIterator() {};
    +  void possibly_parallel_blobs_do(CodeBlobClosure *f);
    +};
    +
    +class ShenandoahCsetCodeRootsIterator : public ShenandoahCodeRootsIterator {
    +public:
    +  ShenandoahCsetCodeRootsIterator() : ShenandoahCodeRootsIterator() {};
    +  void possibly_parallel_blobs_do(CodeBlobClosure* f);
    +};
    +
    +class ShenandoahCodeRoots : public CHeapObj {
    +  friend class ShenandoahHeap;
    +  friend class ShenandoahCodeRootsLock;
    +  friend class ShenandoahCodeRootsIterator;
    +
    +public:
    +  static void initialize();
    +  static void add_nmethod(nmethod* nm);
    +  static void remove_nmethod(nmethod* nm);
    +
    +  /**
    +   * Provides the iterator over all nmethods in the code cache that have oops.
    +   * @return
    +   */
    +  static ShenandoahAllCodeRootsIterator iterator();
    +
    +  /**
    +   * Provides the iterator over nmethods that have at least one oop in collection set.
    +   * @return
    +   */
    +  static ShenandoahCsetCodeRootsIterator cset_iterator();
    +
    +private:
    +  struct PaddedLock {
    +    DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile int));
    +    volatile int _lock;
    +    DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +  };
    +
    +  static PaddedLock _recorded_nms_lock;
    +  static GrowableArray* _recorded_nms;
    +
    +  static void acquire_lock(bool write) {
    +    volatile int* loc = &_recorded_nms_lock._lock;
    +    if (write) {
    +      while ((OrderAccess::load_acquire(loc) != 0) ||
    +             Atomic::cmpxchg(-1, loc, 0) != 0) {
    +        SpinPause();
    +      }
    +      assert (*loc == -1, "acquired for write");
    +    } else {
    +      while (true) {
    +        int cur = OrderAccess::load_acquire(loc);
    +        if (cur >= 0) {
    +          if (Atomic::cmpxchg(cur + 1, loc, cur) == cur) {
    +            // Success!
    +            assert (*loc > 0, "acquired for read");
    +            return;
    +          }
    +        }
    +        SpinPause();
    +      }
    +    }
    +  }
    +
    +  static void release_lock(bool write) {
    +    volatile int* loc = &ShenandoahCodeRoots::_recorded_nms_lock._lock;
    +    if (write) {
    +      OrderAccess::release_store_fence(loc, 0);
    +    } else {
    +      Atomic::dec(loc);
    +    }
    +  }
    +};
    +
    +// Very simple unranked read-write lock
    +class ShenandoahCodeRootsLock : public StackObj {
    +  friend class ShenandoahCodeRoots;
    +private:
    +  const bool _write;
    +public:
    +  ShenandoahCodeRootsLock(bool write) : _write(write) {
    +    ShenandoahCodeRoots::acquire_lock(write);
    +  }
    +
    +  ~ShenandoahCodeRootsLock() {
    +    ShenandoahCodeRoots::release_lock(_write);
    +  }
    +};
    +
    +#endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHCODEROOTS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp
    new file mode 100644
    index 00000000000..e3ca6420f64
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp
    @@ -0,0 +1,160 @@
    +/*
    + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "runtime/atomic.hpp"
    +#include "utilities/copy.hpp"
    +
    +ShenandoahCollectionSet::ShenandoahCollectionSet(ShenandoahHeap* heap, HeapWord* heap_base) :
    +  _map_size(heap->num_regions()),
    +  _region_size_bytes_shift(ShenandoahHeapRegion::region_size_bytes_shift()),
    +  _cset_map(NEW_C_HEAP_ARRAY(jbyte, _map_size, mtGC)),
    +  _biased_cset_map(_cset_map - ((uintx)heap_base >> _region_size_bytes_shift)),
    +  _heap(heap),
    +  _garbage(0),
    +  _live_data(0),
    +  _used(0),
    +  _region_count(0),
    +  _current_index(0) {
    +  // Use 1-byte data type
    +  STATIC_ASSERT(sizeof(jbyte) == 1);
    +
    +  // Initialize cset map
    +  Copy::zero_to_bytes(_cset_map, _map_size);
    +}
    +
    +void ShenandoahCollectionSet::add_region(ShenandoahHeapRegion* r) {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +  assert(Thread::current()->is_VM_thread(), "Must be VMThread");
    +  assert(!is_in(r), "Already in collection set");
    +  _cset_map[r->region_number()] = 1;
    +  _region_count ++;
    +  _garbage += r->garbage();
    +  _live_data += r->get_live_data_bytes();
    +  _used += r->used();
    +}
    +
    +bool ShenandoahCollectionSet::add_region_check_for_duplicates(ShenandoahHeapRegion* r) {
    +  if (!is_in(r)) {
    +    add_region(r);
    +    return true;
    +  } else {
    +    return false;
    +  }
    +}
    +
    +void ShenandoahCollectionSet::remove_region(ShenandoahHeapRegion* r) {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +  assert(Thread::current()->is_VM_thread(), "Must be VMThread");
    +  assert(is_in(r), "Not in collection set");
    +  _cset_map[r->region_number()] = 0;
    +  _region_count --;
    +}
    +
    +void ShenandoahCollectionSet::update_region_status() {
    +  for (size_t index = 0; index < _heap->num_regions(); index ++) {
    +    ShenandoahHeapRegion* r = _heap->get_region(index);
    +    if (is_in(r)) {
    +      r->make_cset();
    +    } else {
    +      assert (!r->is_cset(), "should not be cset");
    +    }
    +  }
    +}
    +
    +void ShenandoahCollectionSet::clear() {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +  Copy::zero_to_bytes(_cset_map, _map_size);
    +
    +#ifdef ASSERT
    +  for (size_t index = 0; index < _heap->num_regions(); index ++) {
    +    assert (!_heap->get_region(index)->is_cset(), "should have been cleared before");
    +  }
    +#endif
    +
    +  _garbage = 0;
    +  _live_data = 0;
    +  _used = 0;
    +
    +  _region_count = 0;
    +  _current_index = 0;
    +}
    +
    +ShenandoahHeapRegion* ShenandoahCollectionSet::claim_next() {
    +  size_t num_regions = _heap->num_regions();
    +  if (_current_index >= (jint)num_regions) {
    +    return NULL;
    +  }
    +
    +  jint saved_current = _current_index;
    +  size_t index = (size_t)saved_current;
    +
    +  while(index < num_regions) {
    +    if (is_in(index)) {
    +      jint cur = Atomic::cmpxchg((jint)(index + 1), &_current_index, saved_current);
    +      assert(cur >= (jint)saved_current, "Must move forward");
    +      if (cur == saved_current) {
    +        assert(is_in(index), "Invariant");
    +        return _heap->get_region(index);
    +      } else {
    +        index = (size_t)cur;
    +        saved_current = cur;
    +      }
    +    } else {
    +      index ++;
    +    }
    +  }
    +  return NULL;
    +}
    +
    +ShenandoahHeapRegion* ShenandoahCollectionSet::next() {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +  assert(Thread::current()->is_VM_thread(), "Must be VMThread");
    +  size_t num_regions = _heap->num_regions();
    +  for (size_t index = (size_t)_current_index; index < num_regions; index ++) {
    +    if (is_in(index)) {
    +      _current_index = (jint)(index + 1);
    +      return _heap->get_region(index);
    +    }
    +  }
    +
    +  return NULL;
    +}
    +
    +void ShenandoahCollectionSet::print_on(outputStream* out) const {
    +  out->print_cr("Collection Set : " SIZE_FORMAT "", count());
    +
    +  debug_only(size_t regions = 0;)
    +  for (size_t index = 0; index < _heap->num_regions(); index ++) {
    +    if (is_in(index)) {
    +      _heap->get_region(index)->print_on(out);
    +      debug_only(regions ++;)
    +    }
    +  }
    +  assert(regions == count(), "Must match");
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.hpp
    new file mode 100644
    index 00000000000..3f4e5ab54e0
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.hpp
    @@ -0,0 +1,96 @@
    +/*
    + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHCOLLECTIONSET_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHCOLLECTIONSET_HPP
    +
    +#include "memory/allocation.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +
    +class ShenandoahCollectionSet : public CHeapObj {
    +  friend class ShenandoahHeap;
    +private:
    +  size_t const          _map_size;
    +  size_t const          _region_size_bytes_shift;
    +  jbyte* const          _cset_map;
    +  // Bias cset map's base address for fast test if an oop is in cset
    +  jbyte* const          _biased_cset_map;
    +
    +  ShenandoahHeap* const _heap;
    +
    +  size_t                _garbage;
    +  size_t                _live_data;
    +  size_t                _used;
    +  size_t                _region_count;
    +
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile size_t));
    +  volatile jint         _current_index;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +public:
    +  ShenandoahCollectionSet(ShenandoahHeap* heap, HeapWord* heap_base);
    +
    +  // Add region to collection set
    +  void add_region(ShenandoahHeapRegion* r);
    +  bool add_region_check_for_duplicates(ShenandoahHeapRegion* r);
    +
    +  // Bring per-region statuses to consistency with this collection.
    +  // TODO: This is a transitional interface that bridges the gap between
    +  // region statuses and this collection. Should go away after we merge them.
    +  void update_region_status();
    +
    +  // Remove region from collection set
    +  void remove_region(ShenandoahHeapRegion* r);
    +
    +  // MT version
    +  ShenandoahHeapRegion* claim_next();
    +
    +  // Single-thread version
    +  ShenandoahHeapRegion* next();
    +
    +  size_t count()  const { return _region_count; }
    +  bool is_empty() const { return _region_count == 0; }
    +
    +  void clear_current_index() {
    +    _current_index = 0;
    +  }
    +
    +  inline bool is_in(ShenandoahHeapRegion* r) const;
    +  inline bool is_in(size_t region_number)    const;
    +  inline bool is_in(HeapWord* p)             const;
    +
    +  void print_on(outputStream* out) const;
    +
    +  size_t used()      const { return _used; }
    +  size_t live_data() const { return _live_data; }
    +  size_t garbage()   const { return _garbage;   }
    +  void clear();
    +
    +private:
    +  jbyte* biased_map_address() const {
    +    return _biased_cset_map;
    +  }
    +};
    +
    +#endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHCOLLECTIONSET_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.inline.hpp
    new file mode 100644
    index 00000000000..09c0f1368f8
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.inline.hpp
    @@ -0,0 +1,49 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHCOLLECTIONSET_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHCOLLECTIONSET_INLINE_HPP
    +
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +
    +bool ShenandoahCollectionSet::is_in(size_t region_number) const {
    +  assert(region_number < _heap->num_regions(), "Sanity");
    +  return _cset_map[region_number] == 1;
    +}
    +
    +bool ShenandoahCollectionSet::is_in(ShenandoahHeapRegion* r) const {
    +  return is_in(r->region_number());
    +}
    +
    +bool ShenandoahCollectionSet::is_in(HeapWord* p) const {
    +  assert(_heap->is_in(p), "Must be in the heap");
    +  uintx index = ((uintx) p) >> _region_size_bytes_shift;
    +  // no need to subtract the bottom of the heap from p,
    +  // _biased_cset_map is biased
    +  return _biased_cset_map[index] == 1;
    +}
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHCOLLECTIONSET_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCollectorPolicy.cpp b/src/hotspot/share/gc/shenandoah/shenandoahCollectorPolicy.cpp
    new file mode 100644
    index 00000000000..a606465d5ca
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahCollectorPolicy.cpp
    @@ -0,0 +1,149 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "runtime/os.hpp"
    +
    +ShenandoahCollectorPolicy::ShenandoahCollectorPolicy() :
    +  _success_concurrent_gcs(0),
    +  _success_degenerated_gcs(0),
    +  _success_full_gcs(0),
    +  _alloc_failure_degenerated(0),
    +  _alloc_failure_degenerated_upgrade_to_full(0),
    +  _alloc_failure_full(0),
    +  _explicit_concurrent(0),
    +  _explicit_full(0),
    +  _implicit_concurrent(0),
    +  _implicit_full(0),
    +  _cycle_counter(0) {
    +
    +  Copy::zero_to_bytes(_degen_points, sizeof(size_t) * ShenandoahHeap::_DEGENERATED_LIMIT);
    +
    +  ShenandoahHeapRegion::setup_sizes(initial_heap_byte_size(), max_heap_byte_size());
    +
    +  initialize_all();
    +
    +  _tracer = new (ResourceObj::C_HEAP, mtGC) ShenandoahTracer();
    +
    +}
    +
    +void ShenandoahCollectorPolicy::initialize_alignments() {
    +  // This is expected by our algorithm for ShenandoahHeap::heap_region_containing().
    +  size_t align = ShenandoahHeapRegion::region_size_bytes();
    +  if (UseLargePages) {
    +    align = MAX2(align, os::large_page_size());
    +  }
    +  _space_alignment = align;
    +  _heap_alignment = align;
    +}
    +
    +void ShenandoahCollectorPolicy::record_explicit_to_concurrent() {
    +  _explicit_concurrent++;
    +}
    +
    +void ShenandoahCollectorPolicy::record_explicit_to_full() {
    +  _explicit_full++;
    +}
    +
    +void ShenandoahCollectorPolicy::record_implicit_to_concurrent() {
    +  _implicit_concurrent++;
    +}
    +
    +void ShenandoahCollectorPolicy::record_implicit_to_full() {
    +  _implicit_full++;
    +}
    +
    +void ShenandoahCollectorPolicy::record_alloc_failure_to_full() {
    +  _alloc_failure_full++;
    +}
    +
    +void ShenandoahCollectorPolicy::record_alloc_failure_to_degenerated(ShenandoahHeap::ShenandoahDegenPoint point) {
    +  assert(point < ShenandoahHeap::_DEGENERATED_LIMIT, "sanity");
    +  _alloc_failure_degenerated++;
    +  _degen_points[point]++;
    +}
    +
    +void ShenandoahCollectorPolicy::record_degenerated_upgrade_to_full() {
    +  _alloc_failure_degenerated_upgrade_to_full++;
    +}
    +
    +void ShenandoahCollectorPolicy::record_success_concurrent() {
    +  _success_concurrent_gcs++;
    +}
    +
    +void ShenandoahCollectorPolicy::record_success_degenerated() {
    +  _success_degenerated_gcs++;
    +}
    +
    +void ShenandoahCollectorPolicy::record_success_full() {
    +  _success_full_gcs++;
    +}
    +
    +size_t ShenandoahCollectorPolicy::cycle_counter() const {
    +  return _cycle_counter;
    +}
    +
    +void ShenandoahCollectorPolicy::record_cycle_start() {
    +  _cycle_counter++;
    +}
    +
    +void ShenandoahCollectorPolicy::record_shutdown() {
    +  _in_shutdown.set();
    +}
    +
    +bool ShenandoahCollectorPolicy::is_at_shutdown() {
    +  return _in_shutdown.is_set();
    +}
    +
    +void ShenandoahCollectorPolicy::print_gc_stats(outputStream* out) const {
    +  out->print_cr("Under allocation pressure, concurrent cycles may cancel, and either continue cycle");
    +  out->print_cr("under stop-the-world pause or result in stop-the-world Full GC. Increase heap size,");
    +  out->print_cr("tune GC heuristics, set more aggressive pacing delay, or lower allocation rate");
    +  out->print_cr("to avoid Degenerated and Full GC cycles.");
    +  out->cr();
    +
    +  out->print_cr(SIZE_FORMAT_W(5) " successful concurrent GCs",         _success_concurrent_gcs);
    +  out->print_cr("  " SIZE_FORMAT_W(5) " invoked explicitly",           _explicit_concurrent);
    +  out->print_cr("  " SIZE_FORMAT_W(5) " invoked implicitly",           _implicit_concurrent);
    +  out->cr();
    +
    +  out->print_cr(SIZE_FORMAT_W(5) " Degenerated GCs",                   _success_degenerated_gcs);
    +  out->print_cr("  " SIZE_FORMAT_W(5) " caused by allocation failure", _alloc_failure_degenerated);
    +  for (int c = 0; c < ShenandoahHeap::_DEGENERATED_LIMIT; c++) {
    +    if (_degen_points[c] > 0) {
    +      const char* desc = ShenandoahHeap::degen_point_to_string((ShenandoahHeap::ShenandoahDegenPoint)c);
    +      out->print_cr("    " SIZE_FORMAT_W(5) " happened at %s",         _degen_points[c], desc);
    +    }
    +  }
    +  out->print_cr("  " SIZE_FORMAT_W(5) " upgraded to Full GC",          _alloc_failure_degenerated_upgrade_to_full);
    +  out->cr();
    +
    +  out->print_cr(SIZE_FORMAT_W(5) " Full GCs",                          _success_full_gcs + _alloc_failure_degenerated_upgrade_to_full);
    +  out->print_cr("  " SIZE_FORMAT_W(5) " invoked explicitly",           _explicit_full);
    +  out->print_cr("  " SIZE_FORMAT_W(5) " invoked implicitly",           _implicit_full);
    +  out->print_cr("  " SIZE_FORMAT_W(5) " caused by allocation failure", _alloc_failure_full);
    +  out->print_cr("  " SIZE_FORMAT_W(5) " upgraded from Degenerated GC", _alloc_failure_degenerated_upgrade_to_full);
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCollectorPolicy.hpp b/src/hotspot/share/gc/shenandoah/shenandoahCollectorPolicy.hpp
    new file mode 100644
    index 00000000000..d54037e5098
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahCollectorPolicy.hpp
    @@ -0,0 +1,82 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHCOLLECTORPOLICY_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHCOLLECTORPOLICY_HPP
    +
    +#include "gc/shared/collectorPolicy.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahTracer.hpp"
    +#include "utilities/ostream.hpp"
    +
    +class ShenandoahCollectorPolicy: public CollectorPolicy {
    +private:
    +  size_t _success_concurrent_gcs;
    +  size_t _success_degenerated_gcs;
    +  size_t _success_full_gcs;
    +  size_t _alloc_failure_degenerated;
    +  size_t _alloc_failure_degenerated_upgrade_to_full;
    +  size_t _alloc_failure_full;
    +  size_t _explicit_concurrent;
    +  size_t _explicit_full;
    +  size_t _implicit_concurrent;
    +  size_t _implicit_full;
    +  size_t _degen_points[ShenandoahHeap::_DEGENERATED_LIMIT];
    +
    +  ShenandoahSharedFlag _in_shutdown;
    +
    +  ShenandoahTracer* _tracer;
    +
    +  size_t _cycle_counter;
    +
    +public:
    +  ShenandoahCollectorPolicy();
    +
    +  void initialize_alignments();
    +
    +  // TODO: This is different from gc_end: that one encompasses one VM operation.
    +  // These two encompass the entire cycle.
    +  void record_cycle_start();
    +
    +  void record_success_concurrent();
    +  void record_success_degenerated();
    +  void record_success_full();
    +  void record_alloc_failure_to_degenerated(ShenandoahHeap::ShenandoahDegenPoint point);
    +  void record_alloc_failure_to_full();
    +  void record_degenerated_upgrade_to_full();
    +  void record_explicit_to_concurrent();
    +  void record_explicit_to_full();
    +  void record_implicit_to_concurrent();
    +  void record_implicit_to_full();
    +
    +  void record_shutdown();
    +  bool is_at_shutdown();
    +
    +  ShenandoahTracer* tracer() {return _tracer;}
    +
    +  size_t cycle_counter() const;
    +
    +  void print_gc_stats(outputStream* out) const;
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHCOLLECTORPOLICY_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp
    new file mode 100644
    index 00000000000..5a9bdd238a0
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp
    @@ -0,0 +1,1007 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "classfile/symbolTable.hpp"
    +#include "classfile/systemDictionary.hpp"
    +#include "code/codeCache.hpp"
    +
    +#include "gc/shared/weakProcessor.hpp"
    +#include "gc/shared/weakProcessor.inline.hpp"
    +#include "gc/shared/gcTimer.hpp"
    +#include "gc/shared/referenceProcessor.hpp"
    +#include "gc/shared/referenceProcessorPhaseTimes.hpp"
    +
    +#include "gc/shenandoah/shenandoahBarrierSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahConcurrentMark.inline.hpp"
    +#include "gc/shenandoah/shenandoahMarkCompact.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahRootProcessor.hpp"
    +#include "gc/shenandoah/shenandoahOopClosures.hpp"
    +#include "gc/shenandoah/shenandoahOopClosures.inline.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.inline.hpp"
    +#include "gc/shenandoah/shenandoahTimingTracker.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +
    +#include "memory/iterator.inline.hpp"
    +#include "memory/metaspace.hpp"
    +#include "memory/resourceArea.hpp"
    +#include "oops/oop.inline.hpp"
    +
    +template
    +class ShenandoahInitMarkRootsClosure : public OopClosure {
    +private:
    +  ShenandoahObjToScanQueue* _queue;
    +  ShenandoahHeap* _heap;
    +  ShenandoahMarkingContext* const _mark_context;
    +
    +  template 
    +  inline void do_oop_work(T* p) {
    +    ShenandoahConcurrentMark::mark_through_ref(p, _heap, _queue, _mark_context);
    +  }
    +
    +public:
    +  ShenandoahInitMarkRootsClosure(ShenandoahObjToScanQueue* q) :
    +    _queue(q),
    +    _heap(ShenandoahHeap::heap()),
    +    _mark_context(_heap->marking_context()) {};
    +
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +ShenandoahMarkRefsSuperClosure::ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +  MetadataVisitingOopIterateClosure(rp),
    +  _queue(q),
    +  _heap(ShenandoahHeap::heap()),
    +  _mark_context(_heap->marking_context())
    +{ }
    +
    +template
    +class ShenandoahInitMarkRootsTask : public AbstractGangTask {
    +private:
    +  ShenandoahRootProcessor* _rp;
    +  bool _process_refs;
    +public:
    +  ShenandoahInitMarkRootsTask(ShenandoahRootProcessor* rp, bool process_refs) :
    +    AbstractGangTask("Shenandoah init mark roots task"),
    +    _rp(rp),
    +    _process_refs(process_refs) {
    +  }
    +
    +  void work(uint worker_id) {
    +    assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +    ShenandoahParallelWorkerSession worker_session(worker_id);
    +
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +    ShenandoahObjToScanQueueSet* queues = heap->concurrent_mark()->task_queues();
    +    assert(queues->get_reserved() > worker_id, "Queue has not been reserved for worker id: %d", worker_id);
    +
    +    ShenandoahObjToScanQueue* q = queues->queue(worker_id);
    +
    +    if (ShenandoahStringDedup::is_enabled()) {
    +      ShenandoahInitMarkRootsClosure mark_cl(q);
    +      do_work(heap, &mark_cl, worker_id);
    +    } else {
    +      ShenandoahInitMarkRootsClosure mark_cl(q);
    +      do_work(heap, &mark_cl, worker_id);
    +    }
    +  }
    +
    +private:
    +  void do_work(ShenandoahHeap* heap, OopClosure* oops, uint worker_id) {
    +    // The rationale for selecting the roots to scan is as follows:
    +    //   a. With unload_classes = true, we only want to scan the actual strong roots from the
    +    //      code cache. This will allow us to identify the dead classes, unload them, *and*
    +    //      invalidate the relevant code cache blobs. This could be only done together with
    +    //      class unloading.
    +    //   b. With unload_classes = false, we have to nominally retain all the references from code
    +    //      cache, because there could be the case of embedded class/oop in the generated code,
    +    //      which we will never visit during mark. Without code cache invalidation, as in (a),
    +    //      we risk executing that code cache blob, and crashing.
    +    //   c. With ShenandoahConcurrentScanCodeRoots, we avoid scanning the entire code cache here,
    +    //      and instead do that in concurrent phase under the relevant lock. This saves init mark
    +    //      pause time.
    +
    +    CLDToOopClosure clds_cl(oops, ClassLoaderData::_claim_strong);
    +    MarkingCodeBlobClosure blobs_cl(oops, ! CodeBlobToOopClosure::FixRelocations);
    +    OopClosure* weak_oops = _process_refs ? NULL : oops;
    +
    +    ResourceMark m;
    +    if (heap->unload_classes()) {
    +      _rp->process_strong_roots(oops, weak_oops, &clds_cl, NULL, &blobs_cl, NULL, worker_id);
    +    } else {
    +      if (ShenandoahConcurrentScanCodeRoots) {
    +        CodeBlobClosure* code_blobs = NULL;
    +#ifdef ASSERT
    +        ShenandoahAssertToSpaceClosure assert_to_space_oops;
    +        CodeBlobToOopClosure assert_to_space(&assert_to_space_oops, !CodeBlobToOopClosure::FixRelocations);
    +        // If conc code cache evac is disabled, code cache should have only to-space ptrs.
    +        // Otherwise, it should have to-space ptrs only if mark does not update refs.
    +        if (!heap->has_forwarded_objects()) {
    +          code_blobs = &assert_to_space;
    +        }
    +#endif
    +        _rp->process_all_roots(oops, weak_oops, &clds_cl, code_blobs, NULL, worker_id);
    +      } else {
    +        _rp->process_all_roots(oops, weak_oops, &clds_cl, &blobs_cl, NULL, worker_id);
    +      }
    +    }
    +  }
    +};
    +
    +class ShenandoahUpdateRootsTask : public AbstractGangTask {
    +private:
    +  ShenandoahRootProcessor* _rp;
    +  const bool _update_code_cache;
    +public:
    +  ShenandoahUpdateRootsTask(ShenandoahRootProcessor* rp, bool update_code_cache) :
    +    AbstractGangTask("Shenandoah update roots task"),
    +    _rp(rp),
    +    _update_code_cache(update_code_cache) {
    +  }
    +
    +  void work(uint worker_id) {
    +    assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +    ShenandoahParallelWorkerSession worker_session(worker_id);
    +
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +    ShenandoahUpdateRefsClosure cl;
    +    CLDToOopClosure cldCl(&cl, ClassLoaderData::_claim_strong);
    +
    +    CodeBlobClosure* code_blobs;
    +    CodeBlobToOopClosure update_blobs(&cl, CodeBlobToOopClosure::FixRelocations);
    +#ifdef ASSERT
    +    ShenandoahAssertToSpaceClosure assert_to_space_oops;
    +    CodeBlobToOopClosure assert_to_space(&assert_to_space_oops, !CodeBlobToOopClosure::FixRelocations);
    +#endif
    +    if (_update_code_cache) {
    +      code_blobs = &update_blobs;
    +    } else {
    +      code_blobs =
    +        DEBUG_ONLY(&assert_to_space)
    +        NOT_DEBUG(NULL);
    +    }
    +    _rp->process_all_roots(&cl, &cl, &cldCl, code_blobs, NULL, worker_id);
    +  }
    +};
    +
    +class ShenandoahConcurrentMarkingTask : public AbstractGangTask {
    +private:
    +  ShenandoahConcurrentMark* _cm;
    +  ShenandoahTaskTerminator* _terminator;
    +
    +public:
    +  ShenandoahConcurrentMarkingTask(ShenandoahConcurrentMark* cm, ShenandoahTaskTerminator* terminator) :
    +    AbstractGangTask("Root Region Scan"), _cm(cm), _terminator(terminator) {
    +  }
    +
    +  void work(uint worker_id) {
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +    ShenandoahConcurrentWorkerSession worker_session(worker_id);
    +    ShenandoahSuspendibleThreadSetJoiner stsj(ShenandoahSuspendibleWorkers);
    +    ShenandoahObjToScanQueue* q = _cm->get_queue(worker_id);
    +    ReferenceProcessor* rp;
    +    if (heap->process_references()) {
    +      rp = heap->ref_processor();
    +      shenandoah_assert_rp_isalive_installed();
    +    } else {
    +      rp = NULL;
    +    }
    +
    +    _cm->concurrent_scan_code_roots(worker_id, rp);
    +    _cm->mark_loop(worker_id, _terminator, rp,
    +                   true, // cancellable
    +                   ShenandoahStringDedup::is_enabled()); // perform string dedup
    +  }
    +};
    +
    +class ShenandoahSATBThreadsClosure : public ThreadClosure {
    +private:
    +  ShenandoahSATBBufferClosure* _satb_cl;
    +  int _thread_parity;
    +
    +public:
    +  ShenandoahSATBThreadsClosure(ShenandoahSATBBufferClosure* satb_cl) :
    +    _satb_cl(satb_cl),
    +    _thread_parity(Threads::thread_claim_parity()) {}
    +
    +  void do_thread(Thread* thread) {
    +    if (thread->is_Java_thread()) {
    +      if (thread->claim_oops_do(true, _thread_parity)) {
    +        JavaThread* jt = (JavaThread*)thread;
    +        ShenandoahThreadLocalData::satb_mark_queue(jt).apply_closure_and_empty(_satb_cl);
    +      }
    +    } else if (thread->is_VM_thread()) {
    +      if (thread->claim_oops_do(true, _thread_parity)) {
    +        ShenandoahBarrierSet::satb_mark_queue_set().shared_satb_queue()->apply_closure_and_empty(_satb_cl);
    +      }
    +    }
    +  }
    +};
    +
    +class ShenandoahFinalMarkingTask : public AbstractGangTask {
    +private:
    +  ShenandoahConcurrentMark* _cm;
    +  ShenandoahTaskTerminator* _terminator;
    +  bool _dedup_string;
    +
    +public:
    +  ShenandoahFinalMarkingTask(ShenandoahConcurrentMark* cm, ShenandoahTaskTerminator* terminator, bool dedup_string) :
    +    AbstractGangTask("Shenandoah Final Marking"), _cm(cm), _terminator(terminator), _dedup_string(dedup_string) {
    +  }
    +
    +  void work(uint worker_id) {
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +    ShenandoahParallelWorkerSession worker_session(worker_id);
    +    // First drain remaining SATB buffers.
    +    // Notice that this is not strictly necessary for mark-compact. But since
    +    // it requires a StrongRootsScope around the task, we need to claim the
    +    // threads, and performance-wise it doesn't really matter. Adds about 1ms to
    +    // full-gc.
    +    {
    +      ShenandoahObjToScanQueue* q = _cm->get_queue(worker_id);
    +      ShenandoahSATBBufferClosure cl(q);
    +      SATBMarkQueueSet& satb_mq_set = ShenandoahBarrierSet::satb_mark_queue_set();
    +      while (satb_mq_set.apply_closure_to_completed_buffer(&cl));
    +      ShenandoahSATBThreadsClosure tc(&cl);
    +      Threads::threads_do(&tc);
    +    }
    +
    +    ReferenceProcessor* rp;
    +    if (heap->process_references()) {
    +      rp = heap->ref_processor();
    +      shenandoah_assert_rp_isalive_installed();
    +    } else {
    +      rp = NULL;
    +    }
    +
    +    // Degenerated cycle may bypass concurrent cycle, so code roots might not be scanned,
    +    // let's check here.
    +    _cm->concurrent_scan_code_roots(worker_id, rp);
    +    _cm->mark_loop(worker_id, _terminator, rp,
    +                   false, // not cancellable
    +                   _dedup_string);
    +
    +    assert(_cm->task_queues()->is_empty(), "Should be empty");
    +  }
    +};
    +
    +void ShenandoahConcurrentMark::mark_roots(ShenandoahPhaseTimings::Phase root_phase) {
    +  assert(Thread::current()->is_VM_thread(), "can only do this in VMThread");
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  ShenandoahGCPhase phase(root_phase);
    +
    +  WorkGang* workers = heap->workers();
    +  uint nworkers = workers->active_workers();
    +
    +  assert(nworkers <= task_queues()->size(), "Just check");
    +
    +  ShenandoahRootProcessor root_proc(heap, nworkers, root_phase);
    +  TASKQUEUE_STATS_ONLY(task_queues()->reset_taskqueue_stats());
    +  task_queues()->reserve(nworkers);
    +
    +  if (heap->has_forwarded_objects()) {
    +    ShenandoahInitMarkRootsTask mark_roots(&root_proc, _heap->process_references());
    +    workers->run_task(&mark_roots);
    +  } else {
    +    // No need to update references, which means the heap is stable.
    +    // Can save time not walking through forwarding pointers.
    +    ShenandoahInitMarkRootsTask mark_roots(&root_proc, _heap->process_references());
    +    workers->run_task(&mark_roots);
    +  }
    +
    +  if (ShenandoahConcurrentScanCodeRoots) {
    +    clear_claim_codecache();
    +  }
    +}
    +
    +void ShenandoahConcurrentMark::update_roots(ShenandoahPhaseTimings::Phase root_phase) {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +
    +  bool update_code_cache = true; // initialize to safer value
    +  switch (root_phase) {
    +    case ShenandoahPhaseTimings::update_roots:
    +    case ShenandoahPhaseTimings::final_update_refs_roots:
    +      update_code_cache = false;
    +      break;
    +    case ShenandoahPhaseTimings::full_gc_roots:
    +    case ShenandoahPhaseTimings::degen_gc_update_roots:
    +      update_code_cache = true;
    +      break;
    +    default:
    +      ShouldNotReachHere();
    +  }
    +
    +  ShenandoahGCPhase phase(root_phase);
    +
    +#if defined(COMPILER2) || INCLUDE_JVMCI
    +  DerivedPointerTable::clear();
    +#endif
    +
    +  uint nworkers = _heap->workers()->active_workers();
    +
    +  ShenandoahRootProcessor root_proc(_heap, nworkers, root_phase);
    +  ShenandoahUpdateRootsTask update_roots(&root_proc, update_code_cache);
    +  _heap->workers()->run_task(&update_roots);
    +
    +#if defined(COMPILER2) || INCLUDE_JVMCI
    +  DerivedPointerTable::update_pointers();
    +#endif
    +}
    +
    +void ShenandoahConcurrentMark::initialize(uint workers) {
    +  _heap = ShenandoahHeap::heap();
    +
    +  uint num_queues = MAX2(workers, 1U);
    +
    +  _task_queues = new ShenandoahObjToScanQueueSet((int) num_queues);
    +
    +  for (uint i = 0; i < num_queues; ++i) {
    +    ShenandoahObjToScanQueue* task_queue = new ShenandoahObjToScanQueue();
    +    task_queue->initialize();
    +    _task_queues->register_queue(i, task_queue);
    +  }
    +}
    +
    +void ShenandoahConcurrentMark::concurrent_scan_code_roots(uint worker_id, ReferenceProcessor* rp) {
    +  if (ShenandoahConcurrentScanCodeRoots && claim_codecache()) {
    +    ShenandoahObjToScanQueue* q = task_queues()->queue(worker_id);
    +    if (!_heap->unload_classes()) {
    +      MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
    +      // TODO: We can not honor StringDeduplication here, due to lock ranking
    +      // inversion. So, we may miss some deduplication candidates.
    +      if (_heap->has_forwarded_objects()) {
    +        ShenandoahMarkResolveRefsClosure cl(q, rp);
    +        CodeBlobToOopClosure blobs(&cl, !CodeBlobToOopClosure::FixRelocations);
    +        CodeCache::blobs_do(&blobs);
    +      } else {
    +        ShenandoahMarkRefsClosure cl(q, rp);
    +        CodeBlobToOopClosure blobs(&cl, !CodeBlobToOopClosure::FixRelocations);
    +        CodeCache::blobs_do(&blobs);
    +      }
    +    }
    +  }
    +}
    +
    +void ShenandoahConcurrentMark::mark_from_roots() {
    +  WorkGang* workers = _heap->workers();
    +  uint nworkers = workers->active_workers();
    +
    +  ShenandoahGCPhase conc_mark_phase(ShenandoahPhaseTimings::conc_mark);
    +
    +  if (_heap->process_references()) {
    +    ReferenceProcessor* rp = _heap->ref_processor();
    +    rp->set_active_mt_degree(nworkers);
    +
    +    // enable ("weak") refs discovery
    +    rp->enable_discovery(true /*verify_no_refs*/);
    +    rp->setup_policy(_heap->soft_ref_policy()->should_clear_all_soft_refs());
    +  }
    +
    +  shenandoah_assert_rp_isalive_not_installed();
    +  ShenandoahIsAliveSelector is_alive;
    +  ReferenceProcessorIsAliveMutator fix_isalive(_heap->ref_processor(), is_alive.is_alive_closure());
    +
    +  task_queues()->reserve(nworkers);
    +
    +  {
    +    ShenandoahTerminationTracker term(ShenandoahPhaseTimings::conc_termination);
    +    ShenandoahTaskTerminator terminator(nworkers, task_queues());
    +    ShenandoahConcurrentMarkingTask task(this, &terminator);
    +    workers->run_task(&task);
    +  }
    +
    +  assert(task_queues()->is_empty() || _heap->cancelled_gc(), "Should be empty when not cancelled");
    +}
    +
    +void ShenandoahConcurrentMark::finish_mark_from_roots(bool full_gc) {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +
    +  uint nworkers = _heap->workers()->active_workers();
    +
    +  // Finally mark everything else we've got in our queues during the previous steps.
    +  // It does two different things for concurrent vs. mark-compact GC:
    +  // - For concurrent GC, it starts with empty task queues, drains the remaining
    +  //   SATB buffers, and then completes the marking closure.
    +  // - For mark-compact GC, it starts out with the task queues seeded by initial
    +  //   root scan, and completes the closure, thus marking through all live objects
    +  // The implementation is the same, so it's shared here.
    +  {
    +    ShenandoahGCPhase phase(full_gc ?
    +                            ShenandoahPhaseTimings::full_gc_mark_finish_queues :
    +                            ShenandoahPhaseTimings::finish_queues);
    +    task_queues()->reserve(nworkers);
    +
    +    shenandoah_assert_rp_isalive_not_installed();
    +    ShenandoahIsAliveSelector is_alive;
    +    ReferenceProcessorIsAliveMutator fix_isalive(_heap->ref_processor(), is_alive.is_alive_closure());
    +
    +    ShenandoahTerminationTracker termination_tracker(full_gc ?
    +                                                     ShenandoahPhaseTimings::full_gc_mark_termination :
    +                                                     ShenandoahPhaseTimings::termination);
    +
    +    StrongRootsScope scope(nworkers);
    +    ShenandoahTaskTerminator terminator(nworkers, task_queues());
    +    ShenandoahFinalMarkingTask task(this, &terminator, ShenandoahStringDedup::is_enabled());
    +    _heap->workers()->run_task(&task);
    +  }
    +
    +  assert(task_queues()->is_empty(), "Should be empty");
    +
    +  // When we're done marking everything, we process weak references.
    +  if (_heap->process_references()) {
    +    weak_refs_work(full_gc);
    +  }
    +
    +  // And finally finish class unloading
    +  if (_heap->unload_classes()) {
    +    _heap->unload_classes_and_cleanup_tables(full_gc);
    +  }
    +
    +  assert(task_queues()->is_empty(), "Should be empty");
    +  TASKQUEUE_STATS_ONLY(task_queues()->print_taskqueue_stats());
    +  TASKQUEUE_STATS_ONLY(task_queues()->reset_taskqueue_stats());
    +
    +  // Resize Metaspace
    +  MetaspaceGC::compute_new_size();
    +}
    +
    +// Weak Reference Closures
    +class ShenandoahCMDrainMarkingStackClosure: public VoidClosure {
    +  uint _worker_id;
    +  ShenandoahTaskTerminator* _terminator;
    +  bool _reset_terminator;
    +
    +public:
    +  ShenandoahCMDrainMarkingStackClosure(uint worker_id, ShenandoahTaskTerminator* t, bool reset_terminator = false):
    +    _worker_id(worker_id),
    +    _terminator(t),
    +    _reset_terminator(reset_terminator) {
    +  }
    +
    +  void do_void() {
    +    assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +
    +    ShenandoahHeap* sh = ShenandoahHeap::heap();
    +    ShenandoahConcurrentMark* scm = sh->concurrent_mark();
    +    assert(sh->process_references(), "why else would we be here?");
    +    ReferenceProcessor* rp = sh->ref_processor();
    +
    +    shenandoah_assert_rp_isalive_installed();
    +
    +    scm->mark_loop(_worker_id, _terminator, rp,
    +                   false,   // not cancellable
    +                   false);  // do not do strdedup
    +
    +    if (_reset_terminator) {
    +      _terminator->reset_for_reuse();
    +    }
    +  }
    +};
    +
    +class ShenandoahCMKeepAliveClosure : public OopClosure {
    +private:
    +  ShenandoahObjToScanQueue* _queue;
    +  ShenandoahHeap* _heap;
    +  ShenandoahMarkingContext* const _mark_context;
    +
    +  template 
    +  inline void do_oop_work(T* p) {
    +    ShenandoahConcurrentMark::mark_through_ref(p, _heap, _queue, _mark_context);
    +  }
    +
    +public:
    +  ShenandoahCMKeepAliveClosure(ShenandoahObjToScanQueue* q) :
    +    _queue(q),
    +    _heap(ShenandoahHeap::heap()),
    +    _mark_context(_heap->marking_context()) {}
    +
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +class ShenandoahCMKeepAliveUpdateClosure : public OopClosure {
    +private:
    +  ShenandoahObjToScanQueue* _queue;
    +  ShenandoahHeap* _heap;
    +  ShenandoahMarkingContext* const _mark_context;
    +
    +  template 
    +  inline void do_oop_work(T* p) {
    +    ShenandoahConcurrentMark::mark_through_ref(p, _heap, _queue, _mark_context);
    +  }
    +
    +public:
    +  ShenandoahCMKeepAliveUpdateClosure(ShenandoahObjToScanQueue* q) :
    +    _queue(q),
    +    _heap(ShenandoahHeap::heap()),
    +    _mark_context(_heap->marking_context()) {}
    +
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +class ShenandoahWeakUpdateClosure : public OopClosure {
    +private:
    +  ShenandoahHeap* const _heap;
    +
    +  template 
    +  inline void do_oop_work(T* p) {
    +    oop o = _heap->maybe_update_with_forwarded(p);
    +    shenandoah_assert_marked_except(p, o, o == NULL);
    +  }
    +
    +public:
    +  ShenandoahWeakUpdateClosure() : _heap(ShenandoahHeap::heap()) {}
    +
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +class ShenandoahWeakAssertNotForwardedClosure : public OopClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p) {
    +    T o = RawAccess<>::oop_load(p);
    +    if (!CompressedOops::is_null(o)) {
    +      oop obj = CompressedOops::decode_not_null(o);
    +      shenandoah_assert_not_forwarded(p, obj);
    +    }
    +  }
    +
    +public:
    +  ShenandoahWeakAssertNotForwardedClosure() {}
    +
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +class ShenandoahRefProcTaskProxy : public AbstractGangTask {
    +private:
    +  AbstractRefProcTaskExecutor::ProcessTask& _proc_task;
    +  ShenandoahTaskTerminator* _terminator;
    +
    +public:
    +  ShenandoahRefProcTaskProxy(AbstractRefProcTaskExecutor::ProcessTask& proc_task,
    +                             ShenandoahTaskTerminator* t) :
    +    AbstractGangTask("Process reference objects in parallel"),
    +    _proc_task(proc_task),
    +    _terminator(t) {
    +  }
    +
    +  void work(uint worker_id) {
    +    ResourceMark rm;
    +    HandleMark hm;
    +    assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +    ShenandoahCMDrainMarkingStackClosure complete_gc(worker_id, _terminator);
    +    if (heap->has_forwarded_objects()) {
    +      ShenandoahForwardedIsAliveClosure is_alive;
    +      ShenandoahCMKeepAliveUpdateClosure keep_alive(heap->concurrent_mark()->get_queue(worker_id));
    +      _proc_task.work(worker_id, is_alive, keep_alive, complete_gc);
    +    } else {
    +      ShenandoahIsAliveClosure is_alive;
    +      ShenandoahCMKeepAliveClosure keep_alive(heap->concurrent_mark()->get_queue(worker_id));
    +      _proc_task.work(worker_id, is_alive, keep_alive, complete_gc);
    +    }
    +  }
    +};
    +
    +class ShenandoahRefProcTaskExecutor : public AbstractRefProcTaskExecutor {
    +private:
    +  WorkGang* _workers;
    +
    +public:
    +  ShenandoahRefProcTaskExecutor(WorkGang* workers) :
    +    _workers(workers) {
    +  }
    +
    +  // Executes a task using worker threads.
    +  void execute(ProcessTask& task, uint ergo_workers) {
    +    assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +    ShenandoahConcurrentMark* cm = heap->concurrent_mark();
    +    ShenandoahPushWorkerQueuesScope scope(_workers, cm->task_queues(),
    +                                          ergo_workers,
    +                                          /* do_check = */ false);
    +    uint nworkers = _workers->active_workers();
    +    cm->task_queues()->reserve(nworkers);
    +    ShenandoahTaskTerminator terminator(nworkers, cm->task_queues());
    +    ShenandoahRefProcTaskProxy proc_task_proxy(task, &terminator);
    +    _workers->run_task(&proc_task_proxy);
    +  }
    +};
    +
    +void ShenandoahConcurrentMark::weak_refs_work(bool full_gc) {
    +  assert(_heap->process_references(), "sanity");
    +
    +  ShenandoahPhaseTimings::Phase phase_root =
    +          full_gc ?
    +          ShenandoahPhaseTimings::full_gc_weakrefs :
    +          ShenandoahPhaseTimings::weakrefs;
    +
    +  ShenandoahGCPhase phase(phase_root);
    +
    +  ReferenceProcessor* rp = _heap->ref_processor();
    +
    +  // NOTE: We cannot shortcut on has_discovered_references() here, because
    +  // we will miss marking JNI Weak refs then, see implementation in
    +  // ReferenceProcessor::process_discovered_references.
    +  weak_refs_work_doit(full_gc);
    +
    +  rp->verify_no_references_recorded();
    +  assert(!rp->discovery_enabled(), "Post condition");
    +
    +}
    +
    +void ShenandoahConcurrentMark::weak_refs_work_doit(bool full_gc) {
    +  ReferenceProcessor* rp = _heap->ref_processor();
    +
    +  ShenandoahPhaseTimings::Phase phase_process =
    +          full_gc ?
    +          ShenandoahPhaseTimings::full_gc_weakrefs_process :
    +          ShenandoahPhaseTimings::weakrefs_process;
    +
    +  ShenandoahPhaseTimings::Phase phase_process_termination =
    +          full_gc ?
    +          ShenandoahPhaseTimings::full_gc_weakrefs_termination :
    +          ShenandoahPhaseTimings::weakrefs_termination;
    +
    +  shenandoah_assert_rp_isalive_not_installed();
    +  ShenandoahIsAliveSelector is_alive;
    +  ReferenceProcessorIsAliveMutator fix_isalive(rp, is_alive.is_alive_closure());
    +
    +  WorkGang* workers = _heap->workers();
    +  uint nworkers = workers->active_workers();
    +
    +  rp->setup_policy(_heap->soft_ref_policy()->should_clear_all_soft_refs());
    +  rp->set_active_mt_degree(nworkers);
    +
    +  assert(task_queues()->is_empty(), "Should be empty");
    +
    +  // complete_gc and keep_alive closures instantiated here are only needed for
    +  // single-threaded path in RP. They share the queue 0 for tracking work, which
    +  // simplifies implementation. Since RP may decide to call complete_gc several
    +  // times, we need to be able to reuse the terminator.
    +  uint serial_worker_id = 0;
    +  ShenandoahTaskTerminator terminator(1, task_queues());
    +  ShenandoahCMDrainMarkingStackClosure complete_gc(serial_worker_id, &terminator, /* reset_terminator = */ true);
    +
    +  ShenandoahRefProcTaskExecutor executor(workers);
    +
    +  ReferenceProcessorPhaseTimes pt(_heap->gc_timer(), rp->num_queues());
    +
    +  {
    +    ShenandoahGCPhase phase(phase_process);
    +    ShenandoahTerminationTracker phase_term(phase_process_termination);
    +
    +    // Process leftover weak oops: update them, if needed (using parallel version),
    +    // or assert they do not need updating (using serial version) otherwise.
    +    // Weak processor API requires us to visit the oops, even if we are not doing
    +    // anything to them.
    +    if (_heap->has_forwarded_objects()) {
    +      ShenandoahCMKeepAliveUpdateClosure keep_alive(get_queue(serial_worker_id));
    +      rp->process_discovered_references(is_alive.is_alive_closure(), &keep_alive,
    +                                        &complete_gc, &executor,
    +                                        &pt);
    +
    +      ShenandoahWeakUpdateClosure cl;
    +      WeakProcessor::weak_oops_do(workers, is_alive.is_alive_closure(), &cl, 1);
    +    } else {
    +      ShenandoahCMKeepAliveClosure keep_alive(get_queue(serial_worker_id));
    +      rp->process_discovered_references(is_alive.is_alive_closure(), &keep_alive,
    +                                        &complete_gc, &executor,
    +                                        &pt);
    +
    +      ShenandoahWeakAssertNotForwardedClosure cl;
    +      WeakProcessor::weak_oops_do(is_alive.is_alive_closure(), &cl);
    +    }
    +
    +    pt.print_all_references();
    +
    +    assert(task_queues()->is_empty(), "Should be empty");
    +  }
    +}
    +
    +class ShenandoahCancelledGCYieldClosure : public YieldClosure {
    +private:
    +  ShenandoahHeap* const _heap;
    +public:
    +  ShenandoahCancelledGCYieldClosure() : _heap(ShenandoahHeap::heap()) {};
    +  virtual bool should_return() { return _heap->cancelled_gc(); }
    +};
    +
    +class ShenandoahPrecleanCompleteGCClosure : public VoidClosure {
    +public:
    +  void do_void() {
    +    ShenandoahHeap* sh = ShenandoahHeap::heap();
    +    ShenandoahConcurrentMark* scm = sh->concurrent_mark();
    +    assert(sh->process_references(), "why else would we be here?");
    +    ShenandoahTaskTerminator terminator(1, scm->task_queues());
    +
    +    ReferenceProcessor* rp = sh->ref_processor();
    +    shenandoah_assert_rp_isalive_installed();
    +
    +    scm->mark_loop(0, &terminator, rp,
    +                   false, // not cancellable
    +                   false); // do not do strdedup
    +  }
    +};
    +
    +class ShenandoahPrecleanKeepAliveUpdateClosure : public OopClosure {
    +private:
    +  ShenandoahObjToScanQueue* _queue;
    +  ShenandoahHeap* _heap;
    +  ShenandoahMarkingContext* const _mark_context;
    +
    +  template 
    +  inline void do_oop_work(T* p) {
    +    ShenandoahConcurrentMark::mark_through_ref(p, _heap, _queue, _mark_context);
    +  }
    +
    +public:
    +  ShenandoahPrecleanKeepAliveUpdateClosure(ShenandoahObjToScanQueue* q) :
    +    _queue(q),
    +    _heap(ShenandoahHeap::heap()),
    +    _mark_context(_heap->marking_context()) {}
    +
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +class ShenandoahPrecleanTask : public AbstractGangTask {
    +private:
    +  ReferenceProcessor* _rp;
    +
    +public:
    +  ShenandoahPrecleanTask(ReferenceProcessor* rp) :
    +          AbstractGangTask("Precleaning task"),
    +          _rp(rp) {}
    +
    +  void work(uint worker_id) {
    +    assert(worker_id == 0, "The code below is single-threaded, only one worker is expected");
    +    ShenandoahParallelWorkerSession worker_session(worker_id);
    +
    +    ShenandoahHeap* sh = ShenandoahHeap::heap();
    +
    +    ShenandoahObjToScanQueue* q = sh->concurrent_mark()->get_queue(worker_id);
    +
    +    ShenandoahCancelledGCYieldClosure yield;
    +    ShenandoahPrecleanCompleteGCClosure complete_gc;
    +
    +    if (sh->has_forwarded_objects()) {
    +      ShenandoahForwardedIsAliveClosure is_alive;
    +      ShenandoahPrecleanKeepAliveUpdateClosure keep_alive(q);
    +      ResourceMark rm;
    +      _rp->preclean_discovered_references(&is_alive, &keep_alive,
    +                                          &complete_gc, &yield,
    +                                          NULL);
    +    } else {
    +      ShenandoahIsAliveClosure is_alive;
    +      ShenandoahCMKeepAliveClosure keep_alive(q);
    +      ResourceMark rm;
    +      _rp->preclean_discovered_references(&is_alive, &keep_alive,
    +                                          &complete_gc, &yield,
    +                                          NULL);
    +    }
    +  }
    +};
    +
    +void ShenandoahConcurrentMark::preclean_weak_refs() {
    +  // Pre-cleaning weak references before diving into STW makes sense at the
    +  // end of concurrent mark. This will filter out the references which referents
    +  // are alive. Note that ReferenceProcessor already filters out these on reference
    +  // discovery, and the bulk of work is done here. This phase processes leftovers
    +  // that missed the initial filtering, i.e. when referent was marked alive after
    +  // reference was discovered by RP.
    +
    +  assert(_heap->process_references(), "sanity");
    +
    +  // Shortcut if no references were discovered to avoid winding up threads.
    +  ReferenceProcessor* rp = _heap->ref_processor();
    +  if (!rp->has_discovered_references()) {
    +    return;
    +  }
    +
    +  assert(task_queues()->is_empty(), "Should be empty");
    +
    +  ReferenceProcessorMTDiscoveryMutator fix_mt_discovery(rp, false);
    +
    +  shenandoah_assert_rp_isalive_not_installed();
    +  ShenandoahIsAliveSelector is_alive;
    +  ReferenceProcessorIsAliveMutator fix_isalive(rp, is_alive.is_alive_closure());
    +
    +  // Execute precleaning in the worker thread: it will give us GCLABs, String dedup
    +  // queues and other goodies. When upstream ReferenceProcessor starts supporting
    +  // parallel precleans, we can extend this to more threads.
    +  WorkGang* workers = _heap->workers();
    +  uint nworkers = workers->active_workers();
    +  assert(nworkers == 1, "This code uses only a single worker");
    +  task_queues()->reserve(nworkers);
    +
    +  ShenandoahPrecleanTask task(rp);
    +  workers->run_task(&task);
    +
    +  assert(task_queues()->is_empty(), "Should be empty");
    +}
    +
    +void ShenandoahConcurrentMark::cancel() {
    +  // Clean up marking stacks.
    +  ShenandoahObjToScanQueueSet* queues = task_queues();
    +  queues->clear();
    +
    +  // Cancel SATB buffers.
    +  ShenandoahBarrierSet::satb_mark_queue_set().abandon_partial_marking();
    +}
    +
    +ShenandoahObjToScanQueue* ShenandoahConcurrentMark::get_queue(uint worker_id) {
    +  assert(task_queues()->get_reserved() > worker_id, "No reserved queue for worker id: %d", worker_id);
    +  return _task_queues->queue(worker_id);
    +}
    +
    +template 
    +void ShenandoahConcurrentMark::mark_loop_prework(uint w, ShenandoahTaskTerminator *t, ReferenceProcessor *rp,
    +                                                 bool strdedup) {
    +  ShenandoahObjToScanQueue* q = get_queue(w);
    +
    +  jushort* ld = _heap->get_liveness_cache(w);
    +
    +  // TODO: We can clean up this if we figure out how to do templated oop closures that
    +  // play nice with specialized_oop_iterators.
    +  if (_heap->unload_classes()) {
    +    if (_heap->has_forwarded_objects()) {
    +      if (strdedup) {
    +        ShenandoahMarkUpdateRefsMetadataDedupClosure cl(q, rp);
    +        mark_loop_work(&cl, ld, w, t);
    +      } else {
    +        ShenandoahMarkUpdateRefsMetadataClosure cl(q, rp);
    +        mark_loop_work(&cl, ld, w, t);
    +      }
    +    } else {
    +      if (strdedup) {
    +        ShenandoahMarkRefsMetadataDedupClosure cl(q, rp);
    +        mark_loop_work(&cl, ld, w, t);
    +      } else {
    +        ShenandoahMarkRefsMetadataClosure cl(q, rp);
    +        mark_loop_work(&cl, ld, w, t);
    +      }
    +    }
    +  } else {
    +    if (_heap->has_forwarded_objects()) {
    +      if (strdedup) {
    +        ShenandoahMarkUpdateRefsDedupClosure cl(q, rp);
    +        mark_loop_work(&cl, ld, w, t);
    +      } else {
    +        ShenandoahMarkUpdateRefsClosure cl(q, rp);
    +        mark_loop_work(&cl, ld, w, t);
    +      }
    +    } else {
    +      if (strdedup) {
    +        ShenandoahMarkRefsDedupClosure cl(q, rp);
    +        mark_loop_work(&cl, ld, w, t);
    +      } else {
    +        ShenandoahMarkRefsClosure cl(q, rp);
    +        mark_loop_work(&cl, ld, w, t);
    +      }
    +    }
    +  }
    +
    +  _heap->flush_liveness_cache(w);
    +}
    +
    +template 
    +void ShenandoahConcurrentMark::mark_loop_work(T* cl, jushort* live_data, uint worker_id, ShenandoahTaskTerminator *terminator) {
    +  uintx stride = ShenandoahMarkLoopStride;
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  ShenandoahObjToScanQueueSet* queues = task_queues();
    +  ShenandoahObjToScanQueue* q;
    +  ShenandoahMarkTask t;
    +
    +  /*
    +   * Process outstanding queues, if any.
    +   *
    +   * There can be more queues than workers. To deal with the imbalance, we claim
    +   * extra queues first. Since marking can push new tasks into the queue associated
    +   * with this worker id, we come back to process this queue in the normal loop.
    +   */
    +  assert(queues->get_reserved() == heap->workers()->active_workers(),
    +         "Need to reserve proper number of queues: reserved: %u, active: %u", queues->get_reserved(), heap->workers()->active_workers());
    +
    +  q = queues->claim_next();
    +  while (q != NULL) {
    +    if (CANCELLABLE && heap->check_cancelled_gc_and_yield()) {
    +      ShenandoahCancelledTerminatorTerminator tt;
    +      ShenandoahSuspendibleThreadSetLeaver stsl(ShenandoahSuspendibleWorkers);
    +      while (!terminator->offer_termination(&tt));
    +      return;
    +    }
    +
    +    for (uint i = 0; i < stride; i++) {
    +      if (q->pop(t)) {
    +        do_task(q, cl, live_data, &t);
    +      } else {
    +        assert(q->is_empty(), "Must be empty");
    +        q = queues->claim_next();
    +        break;
    +      }
    +    }
    +  }
    +  q = get_queue(worker_id);
    +
    +  ShenandoahSATBBufferClosure drain_satb(q);
    +  SATBMarkQueueSet& satb_mq_set = ShenandoahBarrierSet::satb_mark_queue_set();
    +
    +  /*
    +   * Normal marking loop:
    +   */
    +  while (true) {
    +    if (CANCELLABLE && heap->check_cancelled_gc_and_yield()) {
    +      ShenandoahCancelledTerminatorTerminator tt;
    +      ShenandoahSuspendibleThreadSetLeaver stsl(ShenandoahSuspendibleWorkers);
    +      while (!terminator->offer_termination(&tt));
    +      return;
    +    }
    +
    +    while (satb_mq_set.completed_buffers_num() > 0) {
    +      satb_mq_set.apply_closure_to_completed_buffer(&drain_satb);
    +    }
    +
    +    uint work = 0;
    +    for (uint i = 0; i < stride; i++) {
    +      if (q->pop(t) ||
    +          queues->steal(worker_id, t)) {
    +        do_task(q, cl, live_data, &t);
    +        work++;
    +      } else {
    +        break;
    +      }
    +    }
    +
    +    if (work == 0) {
    +      // No work encountered in current stride, try to terminate.
    +      // Need to leave the STS here otherwise it might block safepoints.
    +      ShenandoahSuspendibleThreadSetLeaver stsl(CANCELLABLE && ShenandoahSuspendibleWorkers);
    +      ShenandoahTerminationTimingsTracker term_tracker(worker_id);
    +      if (terminator->offer_termination()) return;
    +    }
    +  }
    +}
    +
    +bool ShenandoahConcurrentMark::claim_codecache() {
    +  assert(ShenandoahConcurrentScanCodeRoots, "must not be called otherwise");
    +  return _claimed_codecache.try_set();
    +}
    +
    +void ShenandoahConcurrentMark::clear_claim_codecache() {
    +  assert(ShenandoahConcurrentScanCodeRoots, "must not be called otherwise");
    +  _claimed_codecache.unset();
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.hpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.hpp
    new file mode 100644
    index 00000000000..1539d6eb6f6
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.hpp
    @@ -0,0 +1,111 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHCONCURRENTMARK_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHCONCURRENTMARK_HPP
    +
    +#include "gc/shared/taskqueue.hpp"
    +#include "gc/shenandoah/shenandoahOopClosures.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +
    +class ShenandoahStrDedupQueue;
    +
    +class ShenandoahConcurrentMark: public CHeapObj {
    +  friend class ShenandoahTraversalGC;
    +private:
    +  ShenandoahHeap* _heap;
    +  ShenandoahObjToScanQueueSet* _task_queues;
    +
    +public:
    +  void initialize(uint workers);
    +  void cancel();
    +
    +// ---------- Marking loop and tasks
    +//
    +private:
    +  template 
    +  inline void do_task(ShenandoahObjToScanQueue* q, T* cl, jushort* live_data, ShenandoahMarkTask* task);
    +
    +  template 
    +  inline void do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop array);
    +
    +  template 
    +  inline void do_chunked_array(ShenandoahObjToScanQueue* q, T* cl, oop array, int chunk, int pow);
    +
    +  inline void count_liveness(jushort* live_data, oop obj);
    +
    +  template 
    +  void mark_loop_work(T* cl, jushort* live_data, uint worker_id, ShenandoahTaskTerminator *t);
    +
    +  template 
    +  void mark_loop_prework(uint worker_id, ShenandoahTaskTerminator *terminator, ReferenceProcessor *rp, bool strdedup);
    +
    +public:
    +  void mark_loop(uint worker_id, ShenandoahTaskTerminator* terminator, ReferenceProcessor *rp,
    +                 bool cancellable, bool strdedup) {
    +    if (cancellable) {
    +      mark_loop_prework(worker_id, terminator, rp, strdedup);
    +    } else {
    +      mark_loop_prework(worker_id, terminator, rp, strdedup);
    +    }
    +  }
    +
    +  template
    +  static inline void mark_through_ref(T* p, ShenandoahHeap* heap, ShenandoahObjToScanQueue* q, ShenandoahMarkingContext* const mark_context);
    +
    +  void mark_from_roots();
    +  void finish_mark_from_roots(bool full_gc);
    +
    +  void mark_roots(ShenandoahPhaseTimings::Phase root_phase);
    +  void update_roots(ShenandoahPhaseTimings::Phase root_phase);
    +
    +// ---------- Weak references
    +//
    +private:
    +  void weak_refs_work(bool full_gc);
    +  void weak_refs_work_doit(bool full_gc);
    +
    +public:
    +  void preclean_weak_refs();
    +
    +// ---------- Concurrent code cache
    +//
    +private:
    +  ShenandoahSharedFlag _claimed_codecache;
    +
    +public:
    +  void concurrent_scan_code_roots(uint worker_id, ReferenceProcessor* rp);
    +  bool claim_codecache();
    +  void clear_claim_codecache();
    +
    +// ---------- Helpers
    +// Used from closures, need to be public
    +//
    +public:
    +  ShenandoahObjToScanQueue* get_queue(uint worker_id);
    +  ShenandoahObjToScanQueueSet* task_queues() { return _task_queues; }
    +
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHCONCURRENTMARK_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp
    new file mode 100644
    index 00000000000..41db1b0e742
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.inline.hpp
    @@ -0,0 +1,278 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHCONCURRENTMARK_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHCONCURRENTMARK_INLINE_HPP
    +
    +#include "gc/shenandoah/shenandoahAsserts.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahConcurrentMark.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
    +#include "gc/shenandoah/shenandoahStringDedup.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.inline.hpp"
    +#include "memory/iterator.inline.hpp"
    +#include "oops/oop.inline.hpp"
    +#include "runtime/prefetch.inline.hpp"
    +
    +template 
    +void ShenandoahConcurrentMark::do_task(ShenandoahObjToScanQueue* q, T* cl, jushort* live_data, ShenandoahMarkTask* task) {
    +  oop obj = task->obj();
    +
    +  shenandoah_assert_not_forwarded_except(NULL, obj, _heap->is_concurrent_traversal_in_progress() && _heap->cancelled_gc());
    +  shenandoah_assert_marked(NULL, obj);
    +  shenandoah_assert_not_in_cset_except(NULL, obj, _heap->cancelled_gc());
    +
    +  if (task->is_not_chunked()) {
    +    if (obj->is_instance()) {
    +      // Case 1: Normal oop, process as usual.
    +      obj->oop_iterate(cl);
    +    } else if (obj->is_objArray()) {
    +      // Case 2: Object array instance and no chunk is set. Must be the first
    +      // time we visit it, start the chunked processing.
    +      do_chunked_array_start(q, cl, obj);
    +    } else {
    +      // Case 3: Primitive array. Do nothing, no oops there. We use the same
    +      // performance tweak TypeArrayKlass::oop_oop_iterate_impl is using:
    +      // We skip iterating over the klass pointer since we know that
    +      // Universe::TypeArrayKlass never moves.
    +      assert (obj->is_typeArray(), "should be type array");
    +    }
    +    // Count liveness the last: push the outstanding work to the queues first
    +    count_liveness(live_data, obj);
    +  } else {
    +    // Case 4: Array chunk, has sensible chunk id. Process it.
    +    do_chunked_array(q, cl, obj, task->chunk(), task->pow());
    +  }
    +}
    +
    +inline void ShenandoahConcurrentMark::count_liveness(jushort* live_data, oop obj) {
    +  size_t region_idx = _heap->heap_region_index_containing(obj);
    +  ShenandoahHeapRegion* region = _heap->get_region(region_idx);
    +  size_t size = obj->size() + ShenandoahBrooksPointer::word_size();
    +
    +  if (!region->is_humongous_start()) {
    +    assert(!region->is_humongous(), "Cannot have continuations here");
    +    size_t max = (1 << (sizeof(jushort) * 8)) - 1;
    +    if (size >= max) {
    +      // too big, add to region data directly
    +      region->increase_live_data_gc_words(size);
    +    } else {
    +      jushort cur = live_data[region_idx];
    +      size_t new_val = cur + size;
    +      if (new_val >= max) {
    +        // overflow, flush to region data
    +        region->increase_live_data_gc_words(new_val);
    +        live_data[region_idx] = 0;
    +      } else {
    +        // still good, remember in locals
    +        live_data[region_idx] = (jushort) new_val;
    +      }
    +    }
    +  } else {
    +    shenandoah_assert_in_correct_region(NULL, obj);
    +    size_t num_regions = ShenandoahHeapRegion::required_regions(size * HeapWordSize);
    +
    +    for (size_t i = region_idx; i < region_idx + num_regions; i++) {
    +      ShenandoahHeapRegion* chain_reg = _heap->get_region(i);
    +      assert(chain_reg->is_humongous(), "Expecting a humongous region");
    +      chain_reg->increase_live_data_gc_words(chain_reg->used() >> LogHeapWordSize);
    +    }
    +  }
    +}
    +
    +template 
    +inline void ShenandoahConcurrentMark::do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop obj) {
    +  assert(obj->is_objArray(), "expect object array");
    +  objArrayOop array = objArrayOop(obj);
    +  int len = array->length();
    +
    +  if (len <= (int) ObjArrayMarkingStride*2) {
    +    // A few slices only, process directly
    +    array->oop_iterate_range(cl, 0, len);
    +  } else {
    +    int bits = log2_long((size_t) len);
    +    // Compensate for non-power-of-two arrays, cover the array in excess:
    +    if (len != (1 << bits)) bits++;
    +
    +    // Only allow full chunks on the queue. This frees do_chunked_array() from checking from/to
    +    // boundaries against array->length(), touching the array header on every chunk.
    +    //
    +    // To do this, we cut the prefix in full-sized chunks, and submit them on the queue.
    +    // If the array is not divided in chunk sizes, then there would be an irregular tail,
    +    // which we will process separately.
    +
    +    int last_idx = 0;
    +
    +    int chunk = 1;
    +    int pow = bits;
    +
    +    // Handle overflow
    +    if (pow >= 31) {
    +      assert (pow == 31, "sanity");
    +      pow--;
    +      chunk = 2;
    +      last_idx = (1 << pow);
    +      bool pushed = q->push(ShenandoahMarkTask(array, 1, pow));
    +      assert(pushed, "overflow queue should always succeed pushing");
    +    }
    +
    +    // Split out tasks, as suggested in ObjArrayChunkedTask docs. Record the last
    +    // successful right boundary to figure out the irregular tail.
    +    while ((1 << pow) > (int)ObjArrayMarkingStride &&
    +           (chunk*2 < ShenandoahMarkTask::chunk_size())) {
    +      pow--;
    +      int left_chunk = chunk*2 - 1;
    +      int right_chunk = chunk*2;
    +      int left_chunk_end = left_chunk * (1 << pow);
    +      if (left_chunk_end < len) {
    +        bool pushed = q->push(ShenandoahMarkTask(array, left_chunk, pow));
    +        assert(pushed, "overflow queue should always succeed pushing");
    +        chunk = right_chunk;
    +        last_idx = left_chunk_end;
    +      } else {
    +        chunk = left_chunk;
    +      }
    +    }
    +
    +    // Process the irregular tail, if present
    +    int from = last_idx;
    +    if (from < len) {
    +      array->oop_iterate_range(cl, from, len);
    +    }
    +  }
    +}
    +
    +template 
    +inline void ShenandoahConcurrentMark::do_chunked_array(ShenandoahObjToScanQueue* q, T* cl, oop obj, int chunk, int pow) {
    +  assert(obj->is_objArray(), "expect object array");
    +  objArrayOop array = objArrayOop(obj);
    +
    +  assert (ObjArrayMarkingStride > 0, "sanity");
    +
    +  // Split out tasks, as suggested in ObjArrayChunkedTask docs. Avoid pushing tasks that
    +  // are known to start beyond the array.
    +  while ((1 << pow) > (int)ObjArrayMarkingStride && (chunk*2 < ShenandoahMarkTask::chunk_size())) {
    +    pow--;
    +    chunk *= 2;
    +    bool pushed = q->push(ShenandoahMarkTask(array, chunk - 1, pow));
    +    assert(pushed, "overflow queue should always succeed pushing");
    +  }
    +
    +  int chunk_size = 1 << pow;
    +
    +  int from = (chunk - 1) * chunk_size;
    +  int to = chunk * chunk_size;
    +
    +#ifdef ASSERT
    +  int len = array->length();
    +  assert (0 <= from && from < len, "from is sane: %d/%d", from, len);
    +  assert (0 < to && to <= len, "to is sane: %d/%d", to, len);
    +#endif
    +
    +  array->oop_iterate_range(cl, from, to);
    +}
    +
    +class ShenandoahSATBBufferClosure : public SATBBufferClosure {
    +private:
    +  ShenandoahObjToScanQueue* _queue;
    +  ShenandoahHeap* _heap;
    +  ShenandoahMarkingContext* const _mark_context;
    +public:
    +  ShenandoahSATBBufferClosure(ShenandoahObjToScanQueue* q) :
    +    _queue(q),
    +    _heap(ShenandoahHeap::heap()),
    +    _mark_context(_heap->marking_context())
    +  {
    +  }
    +
    +  void do_buffer(void **buffer, size_t size) {
    +    if (_heap->has_forwarded_objects()) {
    +      if (ShenandoahStringDedup::is_enabled()) {
    +        do_buffer_impl(buffer, size);
    +      } else {
    +        do_buffer_impl(buffer, size);
    +      }
    +    } else {
    +      if (ShenandoahStringDedup::is_enabled()) {
    +        do_buffer_impl(buffer, size);
    +      } else {
    +        do_buffer_impl(buffer, size);
    +      }
    +    }
    +  }
    +
    +  template
    +  void do_buffer_impl(void **buffer, size_t size) {
    +    for (size_t i = 0; i < size; ++i) {
    +      oop *p = (oop *) &buffer[i];
    +      ShenandoahConcurrentMark::mark_through_ref(p, _heap, _queue, _mark_context);
    +    }
    +  }
    +};
    +
    +template
    +inline void ShenandoahConcurrentMark::mark_through_ref(T *p, ShenandoahHeap* heap, ShenandoahObjToScanQueue* q, ShenandoahMarkingContext* const mark_context) {
    +  T o = RawAccess<>::oop_load(p);
    +  if (!CompressedOops::is_null(o)) {
    +    oop obj = CompressedOops::decode_not_null(o);
    +    switch (UPDATE_REFS) {
    +    case NONE:
    +      break;
    +    case RESOLVE:
    +      obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    +      break;
    +    case SIMPLE:
    +      // We piggy-back reference updating to the marking tasks.
    +      obj = heap->update_with_forwarded_not_null(p, obj);
    +      break;
    +    case CONCURRENT:
    +      obj = heap->maybe_update_with_forwarded_not_null(p, obj);
    +      break;
    +    default:
    +      ShouldNotReachHere();
    +    }
    +
    +    // Note: Only when concurrently updating references can obj become NULL here.
    +    // It happens when a mutator thread beats us by writing another value. In that
    +    // case we don't need to do anything else.
    +    if (UPDATE_REFS != CONCURRENT || !CompressedOops::is_null(obj)) {
    +      shenandoah_assert_not_forwarded(p, obj);
    +      shenandoah_assert_not_in_cset_except(p, obj, heap->cancelled_gc());
    +
    +      if (mark_context->mark(obj)) {
    +        bool pushed = q->push(ShenandoahMarkTask(obj));
    +        assert(pushed, "overflow queue should always succeed pushing");
    +
    +        if ((STRING_DEDUP == ENQUEUE_DEDUP) && ShenandoahStringDedup::is_candidate(obj)) {
    +          assert(ShenandoahStringDedup::is_enabled(), "Must be enabled");
    +          ShenandoahStringDedup::enqueue_candidate(obj);
    +        }
    +      }
    +
    +      shenandoah_assert_marked(p, obj);
    +    }
    +  }
    +}
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHCONCURRENTMARK_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp
    new file mode 100644
    index 00000000000..b83e73bc3c0
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp
    @@ -0,0 +1,624 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahConcurrentMark.inline.hpp"
    +#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
    +#include "gc/shenandoah/shenandoahFreeSet.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahMonitoringSupport.hpp"
    +#include "gc/shenandoah/shenandoahControlThread.hpp"
    +#include "gc/shenandoah/shenandoahTraversalGC.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "gc/shenandoah/shenandoahVMOperations.hpp"
    +#include "gc/shenandoah/shenandoahWorkerPolicy.hpp"
    +#include "memory/iterator.hpp"
    +#include "memory/universe.hpp"
    +
    +ShenandoahControlThread::ShenandoahControlThread() :
    +  ConcurrentGCThread(),
    +  _alloc_failure_waiters_lock(Mutex::leaf, "ShenandoahAllocFailureGC_lock", true, Monitor::_safepoint_check_always),
    +  _gc_waiters_lock(Mutex::leaf, "ShenandoahRequestedGC_lock", true, Monitor::_safepoint_check_always),
    +  _periodic_task(this),
    +  _requested_gc_cause(GCCause::_no_cause_specified),
    +  _degen_point(ShenandoahHeap::_degenerated_outside_cycle),
    +  _allocs_seen(0) {
    +
    +  create_and_start();
    +  _periodic_task.enroll();
    +  _periodic_satb_flush_task.enroll();
    +}
    +
    +ShenandoahControlThread::~ShenandoahControlThread() {
    +  // This is here so that super is called.
    +}
    +
    +void ShenandoahPeriodicTask::task() {
    +  _thread->handle_force_counters_update();
    +  _thread->handle_counters_update();
    +}
    +
    +void ShenandoahPeriodicSATBFlushTask::task() {
    +  ShenandoahHeap::heap()->force_satb_flush_all_threads();
    +}
    +
    +void ShenandoahControlThread::run_service() {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  int sleep = ShenandoahControlIntervalMin;
    +
    +  double last_shrink_time = os::elapsedTime();
    +  double last_sleep_adjust_time = os::elapsedTime();
    +
    +  // Shrink period avoids constantly polling regions for shrinking.
    +  // Having a period 10x lower than the delay would mean we hit the
    +  // shrinking with lag of less than 1/10-th of true delay.
    +  // ShenandoahUncommitDelay is in msecs, but shrink_period is in seconds.
    +  double shrink_period = (double)ShenandoahUncommitDelay / 1000 / 10;
    +
    +  ShenandoahCollectorPolicy* policy = heap->shenandoah_policy();
    +  ShenandoahHeuristics* heuristics = heap->heuristics();
    +  while (!in_graceful_shutdown() && !should_terminate()) {
    +    // Figure out if we have pending requests.
    +    bool alloc_failure_pending = _alloc_failure_gc.is_set();
    +    bool explicit_gc_requested = _gc_requested.is_set() &&  is_explicit_gc(_requested_gc_cause);
    +    bool implicit_gc_requested = _gc_requested.is_set() && !is_explicit_gc(_requested_gc_cause);
    +
    +    // This control loop iteration have seen this much allocations.
    +    size_t allocs_seen = Atomic::xchg(0, &_allocs_seen);
    +
    +    // Choose which GC mode to run in. The block below should select a single mode.
    +    GCMode mode = none;
    +    GCCause::Cause cause = GCCause::_last_gc_cause;
    +    ShenandoahHeap::ShenandoahDegenPoint degen_point = ShenandoahHeap::_degenerated_unset;
    +
    +    if (alloc_failure_pending) {
    +      // Allocation failure takes precedence: we have to deal with it first thing
    +      log_info(gc)("Trigger: Handle Allocation Failure");
    +
    +      cause = GCCause::_allocation_failure;
    +
    +      // Consume the degen point, and seed it with default value
    +      degen_point = _degen_point;
    +      _degen_point = ShenandoahHeap::_degenerated_outside_cycle;
    +
    +      if (ShenandoahDegeneratedGC && heuristics->should_degenerate_cycle()) {
    +        heuristics->record_allocation_failure_gc();
    +        policy->record_alloc_failure_to_degenerated(degen_point);
    +        mode = stw_degenerated;
    +      } else {
    +        heuristics->record_allocation_failure_gc();
    +        policy->record_alloc_failure_to_full();
    +        mode = stw_full;
    +      }
    +
    +    } else if (explicit_gc_requested) {
    +      cause = _requested_gc_cause;
    +      log_info(gc)("Trigger: Explicit GC request (%s)", GCCause::to_string(cause));
    +
    +      heuristics->record_requested_gc();
    +
    +      if (ExplicitGCInvokesConcurrent) {
    +        policy->record_explicit_to_concurrent();
    +        if (heuristics->can_do_traversal_gc()) {
    +          mode = concurrent_traversal;
    +        } else {
    +          mode = concurrent_normal;
    +        }
    +        // Unload and clean up everything
    +        heap->set_process_references(heuristics->can_process_references());
    +        heap->set_unload_classes(heuristics->can_unload_classes());
    +      } else {
    +        policy->record_explicit_to_full();
    +        mode = stw_full;
    +      }
    +    } else if (implicit_gc_requested) {
    +      cause = _requested_gc_cause;
    +      log_info(gc)("Trigger: Implicit GC request (%s)", GCCause::to_string(cause));
    +
    +      heuristics->record_requested_gc();
    +
    +      if (ShenandoahImplicitGCInvokesConcurrent) {
    +        policy->record_implicit_to_concurrent();
    +        if (heuristics->can_do_traversal_gc()) {
    +          mode = concurrent_traversal;
    +        } else {
    +          mode = concurrent_normal;
    +        }
    +
    +        // Unload and clean up everything
    +        heap->set_process_references(heuristics->can_process_references());
    +        heap->set_unload_classes(heuristics->can_unload_classes());
    +      } else {
    +        policy->record_implicit_to_full();
    +        mode = stw_full;
    +      }
    +    } else {
    +      // Potential normal cycle: ask heuristics if it wants to act
    +      if (heuristics->should_start_traversal_gc()) {
    +        mode = concurrent_traversal;
    +        cause = GCCause::_shenandoah_traversal_gc;
    +      } else if (heuristics->should_start_normal_gc()) {
    +        mode = concurrent_normal;
    +        cause = GCCause::_shenandoah_concurrent_gc;
    +      }
    +
    +      // Ask policy if this cycle wants to process references or unload classes
    +      heap->set_process_references(heuristics->should_process_references());
    +      heap->set_unload_classes(heuristics->should_unload_classes());
    +    }
    +
    +    // Blow all soft references on this cycle, if handling allocation failure,
    +    // or we are requested to do so unconditionally.
    +    if (alloc_failure_pending || ShenandoahAlwaysClearSoftRefs) {
    +      heap->soft_ref_policy()->set_should_clear_all_soft_refs(true);
    +    }
    +
    +    bool gc_requested = (mode != none);
    +    assert (!gc_requested || cause != GCCause::_last_gc_cause, "GC cause should be set");
    +
    +    if (gc_requested) {
    +      heap->reset_bytes_allocated_since_gc_start();
    +
    +      // If GC was requested, we are sampling the counters even without actual triggers
    +      // from allocation machinery. This captures GC phases more accurately.
    +      set_forced_counters_update(true);
    +
    +      // If GC was requested, we better dump freeset data for performance debugging
    +      {
    +        ShenandoahHeapLocker locker(heap->lock());
    +        heap->free_set()->log_status();
    +      }
    +    }
    +
    +    switch (mode) {
    +      case none:
    +        break;
    +      case concurrent_traversal:
    +        service_concurrent_traversal_cycle(cause);
    +        break;
    +      case concurrent_normal:
    +        service_concurrent_normal_cycle(cause);
    +        break;
    +      case stw_degenerated:
    +        service_stw_degenerated_cycle(cause, degen_point);
    +        break;
    +      case stw_full:
    +        service_stw_full_cycle(cause);
    +        break;
    +      default:
    +        ShouldNotReachHere();
    +    }
    +
    +    if (gc_requested) {
    +      // If this was the requested GC cycle, notify waiters about it
    +      if (explicit_gc_requested || implicit_gc_requested) {
    +        notify_gc_waiters();
    +      }
    +
    +      // If this was the allocation failure GC cycle, notify waiters about it
    +      if (alloc_failure_pending) {
    +        notify_alloc_failure_waiters();
    +      }
    +
    +      // Report current free set state at the end of cycle, whether
    +      // it is a normal completion, or the abort.
    +      {
    +        ShenandoahHeapLocker locker(heap->lock());
    +        heap->free_set()->log_status();
    +
    +        // Notify Universe about new heap usage. This has implications for
    +        // global soft refs policy, and we better report it every time heap
    +        // usage goes down.
    +        Universe::update_heap_info_at_gc();
    +      }
    +
    +      // Disable forced counters update, and update counters one more time
    +      // to capture the state at the end of GC session.
    +      handle_force_counters_update();
    +      set_forced_counters_update(false);
    +
    +      // Retract forceful part of soft refs policy
    +      heap->soft_ref_policy()->set_should_clear_all_soft_refs(false);
    +
    +      // Clear metaspace oom flag, if current cycle unloaded classes
    +      if (heap->unload_classes()) {
    +        heuristics->clear_metaspace_oom();
    +      }
    +
    +      // GC is over, we are at idle now
    +      if (ShenandoahPacing) {
    +        heap->pacer()->setup_for_idle();
    +      }
    +    } else {
    +      // Allow allocators to know we have seen this much regions
    +      if (ShenandoahPacing && (allocs_seen > 0)) {
    +        heap->pacer()->report_alloc(allocs_seen);
    +      }
    +    }
    +
    +    double current = os::elapsedTime();
    +
    +    if (ShenandoahUncommit && (explicit_gc_requested || (current - last_shrink_time > shrink_period))) {
    +      // Try to uncommit enough stale regions. Explicit GC tries to uncommit everything.
    +      // Regular paths uncommit only occasionally.
    +      double shrink_before = explicit_gc_requested ?
    +                             current :
    +                             current - (ShenandoahUncommitDelay / 1000.0);
    +      service_uncommit(shrink_before);
    +      last_shrink_time = current;
    +    }
    +
    +    // Wait before performing the next action. If allocation happened during this wait,
    +    // we exit sooner, to let heuristics re-evaluate new conditions. If we are at idle,
    +    // back off exponentially.
    +    if (_heap_changed.try_unset()) {
    +      sleep = ShenandoahControlIntervalMin;
    +    } else if ((current - last_sleep_adjust_time) * 1000 > ShenandoahControlIntervalAdjustPeriod){
    +      sleep = MIN2(ShenandoahControlIntervalMax, MAX2(1, sleep * 2));
    +      last_sleep_adjust_time = current;
    +    }
    +    os::naked_short_sleep(sleep);
    +  }
    +
    +  // Wait for the actual stop(), can't leave run_service() earlier.
    +  while (!should_terminate()) {
    +    os::naked_short_sleep(ShenandoahControlIntervalMin);
    +  }
    +}
    +
    +void ShenandoahControlThread::service_concurrent_traversal_cycle(GCCause::Cause cause) {
    +  GCIdMark gc_id_mark;
    +  ShenandoahGCSession session(cause);
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  TraceCollectorStats tcs(heap->monitoring_support()->concurrent_collection_counters());
    +
    +  // Reset for upcoming cycle
    +  heap->entry_reset();
    +
    +  heap->vmop_entry_init_traversal();
    +
    +  if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_traversal)) return;
    +
    +  heap->entry_traversal();
    +  if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_traversal)) return;
    +
    +  heap->vmop_entry_final_traversal();
    +
    +  heap->entry_cleanup();
    +
    +  heap->heuristics()->record_success_concurrent();
    +  heap->shenandoah_policy()->record_success_concurrent();
    +}
    +
    +void ShenandoahControlThread::service_concurrent_normal_cycle(GCCause::Cause cause) {
    +  // Normal cycle goes via all concurrent phases. If allocation failure (af) happens during
    +  // any of the concurrent phases, it first degrades to Degenerated GC and completes GC there.
    +  // If second allocation failure happens during Degenerated GC cycle (for example, when GC
    +  // tries to evac something and no memory is available), cycle degrades to Full GC.
    +  //
    +  // There are also two shortcuts through the normal cycle: a) immediate garbage shortcut, when
    +  // heuristics says there are no regions to compact, and all the collection comes from immediately
    +  // reclaimable regions; b) coalesced UR shortcut, when heuristics decides to coalesce UR with the
    +  // mark from the next cycle.
    +  //
    +  // ................................................................................................
    +  //
    +  //                                    (immediate garbage shortcut)                Concurrent GC
    +  //                             /-------------------------------------------\
    +  //                             |                       (coalesced UR)      v
    +  //                             |                  /----------------------->o
    +  //                             |                  |                        |
    +  //                             |                  |                        v
    +  // [START] ----> Conc Mark ----o----> Conc Evac --o--> Conc Update-Refs ---o----> [END]
    +  //                   |                    |                 |              ^
    +  //                   | (af)               | (af)            | (af)         |
    +  // ..................|....................|.................|..............|.......................
    +  //                   |                    |                 |              |
    +  //                   |                    |                 |              |      Degenerated GC
    +  //                   v                    v                 v              |
    +  //               STW Mark ----------> STW Evac ----> STW Update-Refs ----->o
    +  //                   |                    |                 |              ^
    +  //                   | (af)               | (af)            | (af)         |
    +  // ..................|....................|.................|..............|.......................
    +  //                   |                    |                 |              |
    +  //                   |                    v                 |              |      Full GC
    +  //                   \------------------->o<----------------/              |
    +  //                                        |                                |
    +  //                                        v                                |
    +  //                                      Full GC  --------------------------/
    +  //
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_outside_cycle)) return;
    +
    +  GCIdMark gc_id_mark;
    +  ShenandoahGCSession session(cause);
    +
    +  TraceCollectorStats tcs(heap->monitoring_support()->concurrent_collection_counters());
    +
    +  // Reset for upcoming marking
    +  heap->entry_reset();
    +
    +  // Start initial mark under STW
    +  heap->vmop_entry_init_mark();
    +
    +  // Continue concurrent mark
    +  heap->entry_mark();
    +  if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_mark)) return;
    +
    +  // If not cancelled, can try to concurrently pre-clean
    +  heap->entry_preclean();
    +
    +  // Complete marking under STW, and start evacuation
    +  heap->vmop_entry_final_mark();
    +
    +  // Continue the cycle with evacuation and optional update-refs.
    +  // This may be skipped if there is nothing to evacuate.
    +  // If so, evac_in_progress would be unset by collection set preparation code.
    +  if (heap->is_evacuation_in_progress()) {
    +    // Final mark had reclaimed some immediate garbage, kick cleanup to reclaim the space
    +    // for the rest of the cycle, and report current state of free set.
    +    heap->entry_cleanup();
    +
    +    {
    +      ShenandoahHeapLocker locker(heap->lock());
    +      heap->free_set()->log_status();
    +    }
    +
    +    // Concurrently evacuate
    +    heap->entry_evac();
    +    if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_evac)) return;
    +
    +    // Perform update-refs phase, if required. This phase can be skipped if heuristics
    +    // decides to piggy-back the update-refs on the next marking cycle. On either path,
    +    // we need to turn off evacuation: either in init-update-refs, or in final-evac.
    +    if (heap->heuristics()->should_start_update_refs()) {
    +      heap->vmop_entry_init_updaterefs();
    +      heap->entry_updaterefs();
    +      if (check_cancellation_or_degen(ShenandoahHeap::_degenerated_updaterefs)) return;
    +
    +      heap->vmop_entry_final_updaterefs();
    +    } else {
    +      heap->vmop_entry_final_evac();
    +    }
    +  }
    +
    +  // Reclaim space after cycle
    +  heap->entry_cleanup();
    +
    +  // Cycle is complete
    +  heap->heuristics()->record_success_concurrent();
    +  heap->shenandoah_policy()->record_success_concurrent();
    +}
    +
    +bool ShenandoahControlThread::check_cancellation_or_degen(ShenandoahHeap::ShenandoahDegenPoint point) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  if (heap->cancelled_gc()) {
    +    assert (is_alloc_failure_gc() || in_graceful_shutdown(), "Cancel GC either for alloc failure GC, or gracefully exiting");
    +    if (!in_graceful_shutdown()) {
    +      assert (_degen_point == ShenandoahHeap::_degenerated_outside_cycle,
    +              "Should not be set yet: %s", ShenandoahHeap::degen_point_to_string(_degen_point));
    +      _degen_point = point;
    +    }
    +    return true;
    +  }
    +  return false;
    +}
    +
    +void ShenandoahControlThread::stop_service() {
    +  // Nothing to do here.
    +}
    +
    +void ShenandoahControlThread::service_stw_full_cycle(GCCause::Cause cause) {
    +  GCIdMark gc_id_mark;
    +  ShenandoahGCSession session(cause);
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  heap->vmop_entry_full(cause);
    +
    +  heap->heuristics()->record_success_full();
    +  heap->shenandoah_policy()->record_success_full();
    +}
    +
    +void ShenandoahControlThread::service_stw_degenerated_cycle(GCCause::Cause cause, ShenandoahHeap::ShenandoahDegenPoint point) {
    +  assert (point != ShenandoahHeap::_degenerated_unset, "Degenerated point should be set");
    +
    +  GCIdMark gc_id_mark;
    +  ShenandoahGCSession session(cause);
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  heap->vmop_degenerated(point);
    +
    +  heap->heuristics()->record_success_degenerated();
    +  heap->shenandoah_policy()->record_success_degenerated();
    +}
    +
    +void ShenandoahControlThread::service_uncommit(double shrink_before) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  // Scan through the heap and determine if there is work to do. This avoids taking
    +  // heap lock if there is no work available, avoids spamming logs with superfluous
    +  // logging messages, and minimises the amount of work while locks are taken.
    +
    +  bool has_work = false;
    +  for (size_t i = 0; i < heap->num_regions(); i++) {
    +    ShenandoahHeapRegion *r = heap->get_region(i);
    +    if (r->is_empty_committed() && (r->empty_time() < shrink_before)) {
    +      has_work = true;
    +      break;
    +    }
    +  }
    +
    +  if (has_work) {
    +    heap->entry_uncommit(shrink_before);
    +  }
    +}
    +
    +bool ShenandoahControlThread::is_explicit_gc(GCCause::Cause cause) const {
    +  return GCCause::is_user_requested_gc(cause) ||
    +         GCCause::is_serviceability_requested_gc(cause);
    +}
    +
    +void ShenandoahControlThread::request_gc(GCCause::Cause cause) {
    +  assert(GCCause::is_user_requested_gc(cause) ||
    +         GCCause::is_serviceability_requested_gc(cause) ||
    +         cause == GCCause::_metadata_GC_clear_soft_refs ||
    +         cause == GCCause::_full_gc_alot ||
    +         cause == GCCause::_wb_full_gc ||
    +         cause == GCCause::_scavenge_alot,
    +         "only requested GCs here");
    +
    +  if (is_explicit_gc(cause)) {
    +    if (!DisableExplicitGC) {
    +      handle_requested_gc(cause);
    +    }
    +  } else {
    +    handle_requested_gc(cause);
    +  }
    +}
    +
    +void ShenandoahControlThread::handle_requested_gc(GCCause::Cause cause) {
    +  _requested_gc_cause = cause;
    +  _gc_requested.set();
    +  MonitorLockerEx ml(&_gc_waiters_lock);
    +  while (_gc_requested.is_set()) {
    +    ml.wait();
    +  }
    +}
    +
    +void ShenandoahControlThread::handle_alloc_failure(size_t words) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  assert(current()->is_Java_thread(), "expect Java thread here");
    +
    +  if (try_set_alloc_failure_gc()) {
    +    // Only report the first allocation failure
    +    log_info(gc)("Failed to allocate " SIZE_FORMAT "%s",
    +                 byte_size_in_proper_unit(words * HeapWordSize), proper_unit_for_byte_size(words * HeapWordSize));
    +
    +    // Now that alloc failure GC is scheduled, we can abort everything else
    +    heap->cancel_gc(GCCause::_allocation_failure);
    +  }
    +
    +  MonitorLockerEx ml(&_alloc_failure_waiters_lock);
    +  while (is_alloc_failure_gc()) {
    +    ml.wait();
    +  }
    +}
    +
    +void ShenandoahControlThread::handle_alloc_failure_evac(size_t words) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  if (try_set_alloc_failure_gc()) {
    +    // Only report the first allocation failure
    +    log_info(gc)("Failed to allocate " SIZE_FORMAT "%s for evacuation",
    +                 byte_size_in_proper_unit(words * HeapWordSize), proper_unit_for_byte_size(words * HeapWordSize));
    +  }
    +
    +  // Forcefully report allocation failure
    +  heap->cancel_gc(GCCause::_shenandoah_allocation_failure_evac);
    +}
    +
    +void ShenandoahControlThread::notify_alloc_failure_waiters() {
    +  _alloc_failure_gc.unset();
    +  MonitorLockerEx ml(&_alloc_failure_waiters_lock);
    +  ml.notify_all();
    +}
    +
    +bool ShenandoahControlThread::try_set_alloc_failure_gc() {
    +  return _alloc_failure_gc.try_set();
    +}
    +
    +bool ShenandoahControlThread::is_alloc_failure_gc() {
    +  return _alloc_failure_gc.is_set();
    +}
    +
    +void ShenandoahControlThread::notify_gc_waiters() {
    +  _gc_requested.unset();
    +  MonitorLockerEx ml(&_gc_waiters_lock);
    +  ml.notify_all();
    +}
    +
    +void ShenandoahControlThread::handle_counters_update() {
    +  if (_do_counters_update.is_set()) {
    +    _do_counters_update.unset();
    +    ShenandoahHeap::heap()->monitoring_support()->update_counters();
    +  }
    +}
    +
    +void ShenandoahControlThread::handle_force_counters_update() {
    +  if (_force_counters_update.is_set()) {
    +    _do_counters_update.unset(); // reset these too, we do update now!
    +    ShenandoahHeap::heap()->monitoring_support()->update_counters();
    +  }
    +}
    +
    +void ShenandoahControlThread::notify_heap_changed() {
    +  // This is called from allocation path, and thus should be fast.
    +
    +  // Update monitoring counters when we took a new region. This amortizes the
    +  // update costs on slow path.
    +  if (_do_counters_update.is_unset()) {
    +    _do_counters_update.set();
    +  }
    +  // Notify that something had changed.
    +  if (_heap_changed.is_unset()) {
    +    _heap_changed.set();
    +  }
    +}
    +
    +void ShenandoahControlThread::pacing_notify_alloc(size_t words) {
    +  assert(ShenandoahPacing, "should only call when pacing is enabled");
    +  Atomic::add(words, &_allocs_seen);
    +}
    +
    +void ShenandoahControlThread::set_forced_counters_update(bool value) {
    +  _force_counters_update.set_cond(value);
    +}
    +
    +void ShenandoahControlThread::print() const {
    +  print_on(tty);
    +}
    +
    +void ShenandoahControlThread::print_on(outputStream* st) const {
    +  st->print("Shenandoah Concurrent Thread");
    +  Thread::print_on(st);
    +  st->cr();
    +}
    +
    +void ShenandoahControlThread::start() {
    +  create_and_start();
    +}
    +
    +void ShenandoahControlThread::prepare_for_graceful_shutdown() {
    +  _graceful_shutdown.set();
    +}
    +
    +bool ShenandoahControlThread::in_graceful_shutdown() {
    +  return _graceful_shutdown.is_set();
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.hpp b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.hpp
    new file mode 100644
    index 00000000000..38f79bfc6b5
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.hpp
    @@ -0,0 +1,143 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHSCHEDULERTHREAD_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHSCHEDULERTHREAD_HPP
    +
    +#include "gc/shared/gcCause.hpp"
    +#include "gc/shared/concurrentGCThread.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahSharedVariables.hpp"
    +#include "runtime/task.hpp"
    +#include "utilities/ostream.hpp"
    +
    +// Periodic task is useful for doing asynchronous things that do not require (heap) locks,
    +// or synchronization with other parts of collector. These could run even when ShenandoahConcurrentThread
    +// is busy driving the GC cycle.
    +class ShenandoahPeriodicTask : public PeriodicTask {
    +private:
    +  ShenandoahControlThread* _thread;
    +public:
    +  ShenandoahPeriodicTask(ShenandoahControlThread* thread) :
    +          PeriodicTask(100), _thread(thread) {}
    +  virtual void task();
    +};
    +
    +// Periodic task to flush SATB buffers periodically.
    +class ShenandoahPeriodicSATBFlushTask : public PeriodicTask {
    +public:
    +  ShenandoahPeriodicSATBFlushTask() : PeriodicTask(ShenandoahSATBBufferFlushInterval) {}
    +  virtual void task();
    +};
    +
    +class ShenandoahControlThread: public ConcurrentGCThread {
    +  friend class VMStructs;
    +
    +private:
    +  typedef enum {
    +    none,
    +    concurrent_traversal,
    +    concurrent_normal,
    +    stw_degenerated,
    +    stw_full,
    +  } GCMode;
    +
    +  // While we could have a single lock for these, it may risk unblocking
    +  // GC waiters when alloc failure GC cycle finishes. We want instead
    +  // to make complete explicit cycle for for demanding customers.
    +  Monitor _alloc_failure_waiters_lock;
    +  Monitor _gc_waiters_lock;
    +  ShenandoahPeriodicTask _periodic_task;
    +  ShenandoahPeriodicSATBFlushTask _periodic_satb_flush_task;
    +
    +public:
    +  void run_service();
    +  void stop_service();
    +
    +private:
    +  ShenandoahSharedFlag _gc_requested;
    +  ShenandoahSharedFlag _alloc_failure_gc;
    +  ShenandoahSharedFlag _graceful_shutdown;
    +  ShenandoahSharedFlag _heap_changed;
    +  ShenandoahSharedFlag _do_counters_update;
    +  ShenandoahSharedFlag _force_counters_update;
    +  GCCause::Cause       _requested_gc_cause;
    +  ShenandoahHeap::ShenandoahDegenPoint _degen_point;
    +
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile size_t));
    +  volatile size_t _allocs_seen;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +  bool check_cancellation_or_degen(ShenandoahHeap::ShenandoahDegenPoint point);
    +  void service_concurrent_normal_cycle(GCCause::Cause cause);
    +  void service_stw_full_cycle(GCCause::Cause cause);
    +  void service_stw_degenerated_cycle(GCCause::Cause cause, ShenandoahHeap::ShenandoahDegenPoint point);
    +  void service_concurrent_traversal_cycle(GCCause::Cause cause);
    +  void service_uncommit(double shrink_before);
    +
    +  bool try_set_alloc_failure_gc();
    +  void notify_alloc_failure_waiters();
    +  bool is_alloc_failure_gc();
    +
    +  void notify_gc_waiters();
    +
    +  // Handle GC request.
    +  // Blocks until GC is over.
    +  void handle_requested_gc(GCCause::Cause cause);
    +
    +  bool is_explicit_gc(GCCause::Cause cause) const;
    +public:
    +  // Constructor
    +  ShenandoahControlThread();
    +  ~ShenandoahControlThread();
    +
    +  // Handle allocation failure from normal allocation.
    +  // Blocks until memory is available.
    +  void handle_alloc_failure(size_t words);
    +
    +  // Handle allocation failure from evacuation path.
    +  // Optionally blocks while collector is handling the failure.
    +  void handle_alloc_failure_evac(size_t words);
    +
    +  void request_gc(GCCause::Cause cause);
    +
    +  void handle_counters_update();
    +  void handle_force_counters_update();
    +  void set_forced_counters_update(bool value);
    +
    +  void notify_heap_changed();
    +
    +  void pacing_notify_alloc(size_t words);
    +
    +  void start();
    +  void prepare_for_graceful_shutdown();
    +  bool in_graceful_shutdown();
    +
    +  char* name() const { return (char*)"ShenandoahControlThread";}
    +
    +  // Printing
    +  void print_on(outputStream* st) const;
    +  void print() const;
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHSCHEDULERTHREAD_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahEvacOOMHandler.cpp b/src/hotspot/share/gc/shenandoah/shenandoahEvacOOMHandler.cpp
    new file mode 100644
    index 00000000000..b4051c8105c
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahEvacOOMHandler.cpp
    @@ -0,0 +1,134 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "gc/shenandoah/shenandoahEvacOOMHandler.hpp"
    +#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
    +#include "runtime/orderAccess.hpp"
    +#include "runtime/os.hpp"
    +#include "runtime/thread.hpp"
    +
    +const jint ShenandoahEvacOOMHandler::OOM_MARKER_MASK = 0x80000000;
    +
    +ShenandoahEvacOOMHandler::ShenandoahEvacOOMHandler() :
    +  _threads_in_evac(0) {
    +}
    +
    +void ShenandoahEvacOOMHandler::wait_for_no_evac_threads() {
    +  while ((OrderAccess::load_acquire(&_threads_in_evac) & ~OOM_MARKER_MASK) != 0) {
    +    os::naked_short_sleep(1);
    +  }
    +  // At this point we are sure that no threads can evacuate anything. Raise
    +  // the thread-local oom_during_evac flag to indicate that any attempt
    +  // to evacuate should simply return the forwarding pointer instead (which is safe now).
    +  ShenandoahThreadLocalData::set_oom_during_evac(Thread::current(), true);
    +}
    +
    +void ShenandoahEvacOOMHandler::enter_evacuation() {
    +  jint threads_in_evac = OrderAccess::load_acquire(&_threads_in_evac);
    +
    +  assert(!ShenandoahThreadLocalData::is_evac_allowed(Thread::current()), "sanity");
    +  assert(!ShenandoahThreadLocalData::is_oom_during_evac(Thread::current()), "TL oom-during-evac must not be set");
    +
    +  if ((threads_in_evac & OOM_MARKER_MASK) != 0) {
    +    wait_for_no_evac_threads();
    +    return;
    +  }
    +
    +  while (true) {
    +    jint other = Atomic::cmpxchg(threads_in_evac + 1, &_threads_in_evac, threads_in_evac);
    +    if (other == threads_in_evac) {
    +      // Success: caller may safely enter evacuation
    +      DEBUG_ONLY(ShenandoahThreadLocalData::set_evac_allowed(Thread::current(), true));
    +      return;
    +    } else {
    +      // Failure:
    +      //  - if offender has OOM_MARKER_MASK, then loop until no more threads in evac
    +      //  - otherwise re-try CAS
    +      if ((other & OOM_MARKER_MASK) != 0) {
    +        wait_for_no_evac_threads();
    +        return;
    +      }
    +      threads_in_evac = other;
    +    }
    +  }
    +}
    +
    +void ShenandoahEvacOOMHandler::leave_evacuation() {
    +  if (!ShenandoahThreadLocalData::is_oom_during_evac(Thread::current())) {
    +    assert((OrderAccess::load_acquire(&_threads_in_evac) & ~OOM_MARKER_MASK) > 0, "sanity");
    +    // NOTE: It's ok to simply decrement, even with mask set, because unmasked value is positive.
    +    Atomic::dec(&_threads_in_evac);
    +  } else {
    +    // If we get here, the current thread has already gone through the
    +    // OOM-during-evac protocol and has thus either never entered or successfully left
    +    // the evacuation region. Simply flip its TL oom-during-evac flag back off.
    +    ShenandoahThreadLocalData::set_oom_during_evac(Thread::current(), false);
    +  }
    +  DEBUG_ONLY(ShenandoahThreadLocalData::set_evac_allowed(Thread::current(), false));
    +  assert(!ShenandoahThreadLocalData::is_oom_during_evac(Thread::current()), "TL oom-during-evac must be turned off");
    +}
    +
    +void ShenandoahEvacOOMHandler::handle_out_of_memory_during_evacuation() {
    +  assert(ShenandoahThreadLocalData::is_evac_allowed(Thread::current()), "sanity");
    +  assert(!ShenandoahThreadLocalData::is_oom_during_evac(Thread::current()), "TL oom-during-evac must not be set");
    +
    +  jint threads_in_evac = OrderAccess::load_acquire(&_threads_in_evac);
    +  while (true) {
    +    jint other = Atomic::cmpxchg((threads_in_evac - 1) | OOM_MARKER_MASK,
    +                                  &_threads_in_evac, threads_in_evac);
    +    if (other == threads_in_evac) {
    +      // Success: wait for other threads to get out of the protocol and return.
    +      wait_for_no_evac_threads();
    +      return;
    +    } else {
    +      // Failure: try again with updated new value.
    +      threads_in_evac = other;
    +    }
    +  }
    +}
    +
    +void ShenandoahEvacOOMHandler::clear() {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "must be at a safepoint");
    +  assert((OrderAccess::load_acquire(&_threads_in_evac) & ~OOM_MARKER_MASK) == 0, "sanity");
    +  OrderAccess::release_store_fence(&_threads_in_evac, 0);
    +}
    +
    +ShenandoahEvacOOMScope::ShenandoahEvacOOMScope() {
    +  ShenandoahHeap::heap()->enter_evacuation();
    +}
    +
    +ShenandoahEvacOOMScope::~ShenandoahEvacOOMScope() {
    +  ShenandoahHeap::heap()->leave_evacuation();
    +}
    +
    +ShenandoahEvacOOMScopeLeaver::ShenandoahEvacOOMScopeLeaver() {
    +  ShenandoahHeap::heap()->leave_evacuation();
    +}
    +
    +ShenandoahEvacOOMScopeLeaver::~ShenandoahEvacOOMScopeLeaver() {
    +  ShenandoahHeap::heap()->enter_evacuation();
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahEvacOOMHandler.hpp b/src/hotspot/share/gc/shenandoah/shenandoahEvacOOMHandler.hpp
    new file mode 100644
    index 00000000000..230ca46ec7d
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahEvacOOMHandler.hpp
    @@ -0,0 +1,128 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHEVACOOMHANDLER_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHEVACOOMHANDLER_HPP
    +
    +#include "memory/allocation.hpp"
    +#include "utilities/globalDefinitions.hpp"
    +
    +/**
    + * Provides safe handling of out-of-memory situations during evacuation.
    + *
    + * When a Java thread encounters out-of-memory while evacuating an object in a
    + * write-barrier (i.e. it cannot copy the object to to-space), it does not necessarily
    + * follow we can return immediately from the WB (and store to from-space).
    + *
    + * In very basic case, on such failure we may wait until the the evacuation is over,
    + * and then resolve the forwarded copy, and to the store there. This is possible
    + * because other threads might still have space in their GCLABs, and successfully
    + * evacuate the object.
    + *
    + * But, there is a race due to non-atomic evac_in_progress transition. Consider
    + * thread A is stuck waiting for the evacuation to be over -- it cannot leave with
    + * from-space copy yet. Control thread drops evacuation_in_progress preparing for
    + * next STW phase that has to recover from OOME. Thread B misses that update, and
    + * successfully evacuates the object, does the write to to-copy. But, before
    + * Thread B is able to install the fwdptr, thread A discovers evac_in_progress is
    + * down, exits from here, reads the fwdptr, discovers old from-copy, and stores there.
    + * Thread B then wakes up and installs to-copy. This breaks to-space invariant, and
    + * silently corrupts the heap: we accepted two writes to separate copies of the object.
    + *
    + * The way it is solved here is to maintain a counter of threads inside the
    + * 'evacuation path'. The 'evacuation path' is the part of evacuation that does the actual
    + * allocation, copying and CASing of the copy object, and is protected by this
    + * OOM-during-evac-handler. The handler allows multiple threads to enter and exit
    + * evacuation path, but on OOME it requires all threads that experienced OOME to wait
    + * for current threads to leave, and blocks other threads from entering.
    + *
    + * Detailed state change:
    + *
    + * Upon entry of the evac-path, entering thread will attempt to increase the counter,
    + * using a CAS. Depending on the result of the CAS:
    + * - success: carry on with evac
    + * - failure:
    + *   - if offending value is a valid counter, then try again
    + *   - if offending value is OOM-during-evac special value: loop until
    + *     counter drops to 0, then exit with read-barrier
    + *
    + * Upon exit, exiting thread will decrease the counter using atomic dec.
    + *
    + * Upon OOM-during-evac, any thread will attempt to CAS OOM-during-evac
    + * special value into the counter. Depending on result:
    + *   - success: busy-loop until counter drops to zero, then exit with RB
    + *   - failure:
    + *     - offender is valid counter update: try again
    + *     - offender is OOM-during-evac: busy loop until counter drops to
    + *       zero, then exit with RB
    + */
    +class ShenandoahEvacOOMHandler {
    +private:
    +  static const jint OOM_MARKER_MASK;
    +
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile jint));
    +  volatile jint _threads_in_evac;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +  void wait_for_no_evac_threads();
    +
    +public:
    +  ShenandoahEvacOOMHandler();
    +
    +  /**
    +   * Attempt to enter the protected evacuation path.
    +   *
    +   * When this returns true, it is safe to continue with normal evacuation.
    +   * When this method returns false, evacuation must not be entered, and caller
    +   * may safely continue with a read-barrier (if Java thread).
    +   */
    +  void enter_evacuation();
    +
    +  /**
    +   * Leave evacuation path.
    +   */
    +  void leave_evacuation();
    +
    +  /**
    +   * Signal out-of-memory during evacuation. It will prevent any other threads
    +   * from entering the evacuation path, then wait until all threads have left the
    +   * evacuation path, and then return. It is then safe to continue with a read-barrier.
    +   */
    +  void handle_out_of_memory_during_evacuation();
    +
    +  void clear();
    +};
    +
    +class ShenandoahEvacOOMScope : public StackObj {
    +public:
    +  ShenandoahEvacOOMScope();
    +  ~ShenandoahEvacOOMScope();
    +};
    +
    +class ShenandoahEvacOOMScopeLeaver : public StackObj {
    +public:
    +  ShenandoahEvacOOMScopeLeaver();
    +  ~ShenandoahEvacOOMScopeLeaver();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHEVACOOMHANDLER_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp
    new file mode 100644
    index 00000000000..e059f09b212
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp
    @@ -0,0 +1,624 @@
    +/*
    + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahFreeSet.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
    +#include "gc/shenandoah/shenandoahTraversalGC.hpp"
    +#include "logging/logStream.hpp"
    +
    +ShenandoahFreeSet::ShenandoahFreeSet(ShenandoahHeap* heap, size_t max_regions) :
    +  _heap(heap),
    +  _mutator_free_bitmap(max_regions, mtGC),
    +  _collector_free_bitmap(max_regions, mtGC),
    +  _max(max_regions)
    +{
    +  clear_internal();
    +}
    +
    +void ShenandoahFreeSet::increase_used(size_t num_bytes) {
    +  assert_heaplock_owned_by_current_thread();
    +  _used += num_bytes;
    +
    +  assert(_used <= _capacity, "must not use more than we have: used: " SIZE_FORMAT
    +         ", capacity: " SIZE_FORMAT ", num_bytes: " SIZE_FORMAT, _used, _capacity, num_bytes);
    +}
    +
    +bool ShenandoahFreeSet::is_mutator_free(size_t idx) const {
    +  assert (idx < _max, "index is sane: " SIZE_FORMAT " < " SIZE_FORMAT " (left: " SIZE_FORMAT ", right: " SIZE_FORMAT ")",
    +          idx, _max, _mutator_leftmost, _mutator_rightmost);
    +  return _mutator_free_bitmap.at(idx);
    +}
    +
    +bool ShenandoahFreeSet::is_collector_free(size_t idx) const {
    +  assert (idx < _max, "index is sane: " SIZE_FORMAT " < " SIZE_FORMAT " (left: " SIZE_FORMAT ", right: " SIZE_FORMAT ")",
    +          idx, _max, _collector_leftmost, _collector_rightmost);
    +  return _collector_free_bitmap.at(idx);
    +}
    +
    +HeapWord* ShenandoahFreeSet::allocate_single(ShenandoahAllocRequest& req, bool& in_new_region) {
    +  // Scan the bitmap looking for a first fit.
    +  //
    +  // Leftmost and rightmost bounds provide enough caching to walk bitmap efficiently. Normally,
    +  // we would find the region to allocate at right away.
    +  //
    +  // Allocations are biased: new application allocs go to beginning of the heap, and GC allocs
    +  // go to the end. This makes application allocation faster, because we would clear lots
    +  // of regions from the beginning most of the time.
    +  //
    +  // Free set maintains mutator and collector views, and normally they allocate in their views only,
    +  // unless we special cases for stealing and mixed allocations.
    +
    +  switch (req.type()) {
    +    case ShenandoahAllocRequest::_alloc_tlab:
    +    case ShenandoahAllocRequest::_alloc_shared: {
    +
    +      // Try to allocate in the mutator view
    +      for (size_t idx = _mutator_leftmost; idx <= _mutator_rightmost; idx++) {
    +        if (is_mutator_free(idx)) {
    +          HeapWord* result = try_allocate_in(_heap->get_region(idx), req, in_new_region);
    +          if (result != NULL) {
    +            return result;
    +          }
    +        }
    +      }
    +
    +      // There is no recovery. Mutator does not touch collector view at all.
    +      break;
    +    }
    +    case ShenandoahAllocRequest::_alloc_gclab:
    +    case ShenandoahAllocRequest::_alloc_shared_gc: {
    +      // size_t is unsigned, need to dodge underflow when _leftmost = 0
    +
    +      // Fast-path: try to allocate in the collector view first
    +      for (size_t c = _collector_rightmost + 1; c > _collector_leftmost; c--) {
    +        size_t idx = c - 1;
    +        if (is_collector_free(idx)) {
    +          HeapWord* result = try_allocate_in(_heap->get_region(idx), req, in_new_region);
    +          if (result != NULL) {
    +            return result;
    +          }
    +        }
    +      }
    +
    +      // No dice. Can we borrow space from mutator view?
    +      if (!ShenandoahEvacReserveOverflow) {
    +        return NULL;
    +      }
    +
    +      // Try to steal the empty region from the mutator view
    +      for (size_t c = _mutator_rightmost + 1; c > _mutator_leftmost; c--) {
    +        size_t idx = c - 1;
    +        if (is_mutator_free(idx)) {
    +          ShenandoahHeapRegion* r = _heap->get_region(idx);
    +          if (is_empty_or_trash(r)) {
    +            flip_to_gc(r);
    +            HeapWord *result = try_allocate_in(r, req, in_new_region);
    +            if (result != NULL) {
    +              return result;
    +            }
    +          }
    +        }
    +      }
    +
    +      // Try to mix the allocation into the mutator view:
    +      if (ShenandoahAllowMixedAllocs) {
    +        for (size_t c = _mutator_rightmost + 1; c > _mutator_leftmost; c--) {
    +          size_t idx = c - 1;
    +          if (is_mutator_free(idx)) {
    +            HeapWord* result = try_allocate_in(_heap->get_region(idx), req, in_new_region);
    +            if (result != NULL) {
    +              return result;
    +            }
    +          }
    +        }
    +      }
    +      break;
    +    }
    +    default:
    +      ShouldNotReachHere();
    +  }
    +
    +  return NULL;
    +}
    +
    +HeapWord* ShenandoahFreeSet::try_allocate_in(ShenandoahHeapRegion* r, ShenandoahAllocRequest& req, bool& in_new_region) {
    +  assert (!has_no_alloc_capacity(r), "Performance: should avoid full regions on this path: " SIZE_FORMAT, r->region_number());
    +
    +  try_recycle_trashed(r);
    +
    +  in_new_region = r->is_empty();
    +
    +  HeapWord* result = NULL;
    +  size_t size = req.size();
    +
    +  if (ShenandoahElasticTLAB && req.is_lab_alloc()) {
    +    size_t free = align_down(r->free() >> LogHeapWordSize, MinObjAlignment);
    +    if (size > free) {
    +      size = free;
    +    }
    +    if (size >= req.min_size()) {
    +      result = r->allocate(size, req.type());
    +      assert (result != NULL, "Allocation must succeed: free " SIZE_FORMAT ", actual " SIZE_FORMAT, free, size);
    +    }
    +  } else {
    +    result = r->allocate(size, req.type());
    +  }
    +
    +  if (result != NULL) {
    +    // Allocation successful, bump stats:
    +    if (req.is_mutator_alloc()) {
    +      increase_used(size * HeapWordSize);
    +    }
    +
    +    // Record actual allocation size
    +    req.set_actual_size(size);
    +
    +    if (req.is_gc_alloc() && _heap->is_concurrent_traversal_in_progress()) {
    +      // Traversal needs to traverse through GC allocs. Adjust TAMS to the new top
    +      // so that these allocations appear below TAMS, and thus get traversed.
    +      // See top of shenandoahTraversal.cpp for an explanation.
    +      _heap->marking_context()->capture_top_at_mark_start(r);
    +      _heap->traversal_gc()->traversal_set()->add_region_check_for_duplicates(r);
    +      OrderAccess::fence();
    +    }
    +  }
    +
    +  if (result == NULL || has_no_alloc_capacity(r)) {
    +    // Region cannot afford this or future allocations. Retire it.
    +    //
    +    // While this seems a bit harsh, especially in the case when this large allocation does not
    +    // fit, but the next small one would, we are risking to inflate scan times when lots of
    +    // almost-full regions precede the fully-empty region where we want allocate the entire TLAB.
    +    // TODO: Record first fully-empty region, and use that for large allocations
    +
    +    // Record the remainder as allocation waste
    +    if (req.is_mutator_alloc()) {
    +      size_t waste = r->free();
    +      if (waste > 0) {
    +        increase_used(waste);
    +        _heap->notify_mutator_alloc_words(waste >> LogHeapWordSize, true);
    +      }
    +    }
    +
    +    size_t num = r->region_number();
    +    _collector_free_bitmap.clear_bit(num);
    +    _mutator_free_bitmap.clear_bit(num);
    +    // Touched the bounds? Need to update:
    +    if (touches_bounds(num)) {
    +      adjust_bounds();
    +    }
    +    assert_bounds();
    +  }
    +  return result;
    +}
    +
    +bool ShenandoahFreeSet::touches_bounds(size_t num) const {
    +  return num == _collector_leftmost || num == _collector_rightmost || num == _mutator_leftmost || num == _mutator_rightmost;
    +}
    +
    +void ShenandoahFreeSet::recompute_bounds() {
    +  // Reset to the most pessimistic case:
    +  _mutator_rightmost = _max - 1;
    +  _mutator_leftmost = 0;
    +  _collector_rightmost = _max - 1;
    +  _collector_leftmost = 0;
    +
    +  // ...and adjust from there
    +  adjust_bounds();
    +}
    +
    +void ShenandoahFreeSet::adjust_bounds() {
    +  // Rewind both mutator bounds until the next bit.
    +  while (_mutator_leftmost < _max && !is_mutator_free(_mutator_leftmost)) {
    +    _mutator_leftmost++;
    +  }
    +  while (_mutator_rightmost > 0 && !is_mutator_free(_mutator_rightmost)) {
    +    _mutator_rightmost--;
    +  }
    +  // Rewind both collector bounds until the next bit.
    +  while (_collector_leftmost < _max && !is_collector_free(_collector_leftmost)) {
    +    _collector_leftmost++;
    +  }
    +  while (_collector_rightmost > 0 && !is_collector_free(_collector_rightmost)) {
    +    _collector_rightmost--;
    +  }
    +}
    +
    +HeapWord* ShenandoahFreeSet::allocate_contiguous(ShenandoahAllocRequest& req) {
    +  assert_heaplock_owned_by_current_thread();
    +
    +  size_t words_size = req.size();
    +  size_t num = ShenandoahHeapRegion::required_regions(words_size * HeapWordSize);
    +
    +  // No regions left to satisfy allocation, bye.
    +  if (num > mutator_count()) {
    +    return NULL;
    +  }
    +
    +  // Find the continuous interval of $num regions, starting from $beg and ending in $end,
    +  // inclusive. Contiguous allocations are biased to the beginning.
    +
    +  size_t beg = _mutator_leftmost;
    +  size_t end = beg;
    +
    +  while (true) {
    +    if (end >= _max) {
    +      // Hit the end, goodbye
    +      return NULL;
    +    }
    +
    +    // If regions are not adjacent, then current [beg; end] is useless, and we may fast-forward.
    +    // If region is not completely free, the current [beg; end] is useless, and we may fast-forward.
    +    if (!is_mutator_free(end) || !is_empty_or_trash(_heap->get_region(end))) {
    +      end++;
    +      beg = end;
    +      continue;
    +    }
    +
    +    if ((end - beg + 1) == num) {
    +      // found the match
    +      break;
    +    }
    +
    +    end++;
    +  };
    +
    +  size_t remainder = words_size & ShenandoahHeapRegion::region_size_words_mask();
    +
    +  // Initialize regions:
    +  for (size_t i = beg; i <= end; i++) {
    +    ShenandoahHeapRegion* r = _heap->get_region(i);
    +    try_recycle_trashed(r);
    +
    +    assert(i == beg || _heap->get_region(i-1)->region_number() + 1 == r->region_number(), "Should be contiguous");
    +    assert(r->is_empty(), "Should be empty");
    +
    +    if (i == beg) {
    +      r->make_humongous_start();
    +    } else {
    +      r->make_humongous_cont();
    +    }
    +
    +    // Trailing region may be non-full, record the remainder there
    +    size_t used_words;
    +    if ((i == end) && (remainder != 0)) {
    +      used_words = remainder;
    +    } else {
    +      used_words = ShenandoahHeapRegion::region_size_words();
    +    }
    +
    +    r->set_top(r->bottom() + used_words);
    +    r->reset_alloc_metadata_to_shared();
    +
    +    _mutator_free_bitmap.clear_bit(r->region_number());
    +  }
    +
    +  // While individual regions report their true use, all humongous regions are
    +  // marked used in the free set.
    +  increase_used(ShenandoahHeapRegion::region_size_bytes() * num);
    +
    +  if (remainder != 0) {
    +    // Record this remainder as allocation waste
    +    _heap->notify_mutator_alloc_words(ShenandoahHeapRegion::region_size_words() - remainder, true);
    +  }
    +
    +  // Allocated at left/rightmost? Move the bounds appropriately.
    +  if (beg == _mutator_leftmost || end == _mutator_rightmost) {
    +    adjust_bounds();
    +  }
    +  assert_bounds();
    +
    +  req.set_actual_size(words_size);
    +  return _heap->get_region(beg)->bottom();
    +}
    +
    +bool ShenandoahFreeSet::is_empty_or_trash(ShenandoahHeapRegion *r) {
    +  return r->is_empty() || r->is_trash();
    +}
    +
    +size_t ShenandoahFreeSet::alloc_capacity(ShenandoahHeapRegion *r) {
    +  if (r->is_trash()) {
    +    // This would be recycled on allocation path
    +    return ShenandoahHeapRegion::region_size_bytes();
    +  } else {
    +    return r->free();
    +  }
    +}
    +
    +bool ShenandoahFreeSet::has_no_alloc_capacity(ShenandoahHeapRegion *r) {
    +  return alloc_capacity(r) == 0;
    +}
    +
    +void ShenandoahFreeSet::try_recycle_trashed(ShenandoahHeapRegion *r) {
    +  if (r->is_trash()) {
    +    _heap->decrease_used(r->used());
    +    r->recycle();
    +  }
    +}
    +
    +void ShenandoahFreeSet::recycle_trash() {
    +  // lock is not reentrable, check we don't have it
    +  assert_heaplock_not_owned_by_current_thread();
    +
    +  for (size_t i = 0; i < _heap->num_regions(); i++) {
    +    ShenandoahHeapRegion* r = _heap->get_region(i);
    +    if (r->is_trash()) {
    +      ShenandoahHeapLocker locker(_heap->lock());
    +      try_recycle_trashed(r);
    +    }
    +    SpinPause(); // allow allocators to take the lock
    +  }
    +}
    +
    +void ShenandoahFreeSet::flip_to_gc(ShenandoahHeapRegion* r) {
    +  size_t idx = r->region_number();
    +
    +  assert(_mutator_free_bitmap.at(idx), "Should be in mutator view");
    +  assert(is_empty_or_trash(r), "Should not be allocated");
    +
    +  _mutator_free_bitmap.clear_bit(idx);
    +  _collector_free_bitmap.set_bit(idx);
    +  _collector_leftmost = MIN2(idx, _collector_leftmost);
    +  _collector_rightmost = MAX2(idx, _collector_rightmost);
    +
    +  _capacity -= alloc_capacity(r);
    +
    +  if (touches_bounds(idx)) {
    +    adjust_bounds();
    +  }
    +  assert_bounds();
    +}
    +
    +void ShenandoahFreeSet::clear() {
    +  assert_heaplock_owned_by_current_thread();
    +  clear_internal();
    +}
    +
    +void ShenandoahFreeSet::clear_internal() {
    +  _mutator_free_bitmap.clear();
    +  _collector_free_bitmap.clear();
    +  _mutator_leftmost = _max;
    +  _mutator_rightmost = 0;
    +  _collector_leftmost = _max;
    +  _collector_rightmost = 0;
    +  _capacity = 0;
    +  _used = 0;
    +}
    +
    +void ShenandoahFreeSet::rebuild() {
    +  assert_heaplock_owned_by_current_thread();
    +  clear();
    +
    +  for (size_t idx = 0; idx < _heap->num_regions(); idx++) {
    +    ShenandoahHeapRegion* region = _heap->get_region(idx);
    +    if (region->is_alloc_allowed() || region->is_trash()) {
    +      assert(!region->is_cset(), "Shouldn't be adding those to the free set");
    +
    +      // Do not add regions that would surely fail allocation
    +      if (has_no_alloc_capacity(region)) continue;
    +
    +      _capacity += alloc_capacity(region);
    +      assert(_used <= _capacity, "must not use more than we have");
    +
    +      assert(!is_mutator_free(idx), "We are about to add it, it shouldn't be there already");
    +      _mutator_free_bitmap.set_bit(idx);
    +    }
    +  }
    +
    +  // Evac reserve: reserve trailing space for evacuations
    +  size_t to_reserve = ShenandoahEvacReserve * _heap->capacity() / 100;
    +  size_t reserved = 0;
    +
    +  for (size_t idx = _heap->num_regions() - 1; idx > 0; idx--) {
    +    if (reserved >= to_reserve) break;
    +
    +    ShenandoahHeapRegion* region = _heap->get_region(idx);
    +    if (_mutator_free_bitmap.at(idx) && is_empty_or_trash(region)) {
    +      _mutator_free_bitmap.clear_bit(idx);
    +      _collector_free_bitmap.set_bit(idx);
    +      size_t ac = alloc_capacity(region);
    +      _capacity -= ac;
    +      reserved += ac;
    +    }
    +  }
    +
    +  recompute_bounds();
    +  assert_bounds();
    +}
    +
    +void ShenandoahFreeSet::log_status() {
    +  assert_heaplock_owned_by_current_thread();
    +
    +  LogTarget(Info, gc, ergo) lt;
    +  if (lt.is_enabled()) {
    +    ResourceMark rm;
    +    LogStream ls(lt);
    +
    +    {
    +      size_t last_idx = 0;
    +      size_t max = 0;
    +      size_t max_contig = 0;
    +      size_t empty_contig = 0;
    +
    +      size_t total_used = 0;
    +      size_t total_free = 0;
    +
    +      for (size_t idx = _mutator_leftmost; idx <= _mutator_rightmost; idx++) {
    +        if (is_mutator_free(idx)) {
    +          ShenandoahHeapRegion *r = _heap->get_region(idx);
    +          size_t free = alloc_capacity(r);
    +
    +          max = MAX2(max, free);
    +
    +          if (r->is_empty() && (last_idx + 1 == idx)) {
    +            empty_contig++;
    +          } else {
    +            empty_contig = 0;
    +          }
    +
    +          total_used += r->used();
    +          total_free += free;
    +
    +          max_contig = MAX2(max_contig, empty_contig);
    +          last_idx = idx;
    +        }
    +      }
    +
    +      size_t max_humongous = max_contig * ShenandoahHeapRegion::region_size_bytes();
    +      size_t free = capacity() - used();
    +
    +      ls.print("Free: " SIZE_FORMAT "M (" SIZE_FORMAT " regions), Max regular: " SIZE_FORMAT "K, Max humongous: " SIZE_FORMAT "K, ",
    +               total_free / M, mutator_count(), max / K, max_humongous / K);
    +
    +      size_t frag_ext;
    +      if (free > 0) {
    +        frag_ext = 100 - (100 * max_humongous / free);
    +      } else {
    +        frag_ext = 0;
    +      }
    +      ls.print("External frag: " SIZE_FORMAT "%%, ", frag_ext);
    +
    +      size_t frag_int;
    +      if (mutator_count() > 0) {
    +        frag_int = (100 * (total_used / mutator_count()) / ShenandoahHeapRegion::region_size_bytes());
    +      } else {
    +        frag_int = 0;
    +      }
    +      ls.print("Internal frag: " SIZE_FORMAT "%%", frag_int);
    +      ls.cr();
    +    }
    +
    +    {
    +      size_t max = 0;
    +      size_t total_free = 0;
    +
    +      for (size_t idx = _collector_leftmost; idx <= _collector_rightmost; idx++) {
    +        if (is_collector_free(idx)) {
    +          ShenandoahHeapRegion *r = _heap->get_region(idx);
    +          size_t free = alloc_capacity(r);
    +          max = MAX2(max, free);
    +          total_free += free;
    +        }
    +      }
    +
    +      ls.print_cr("Evacuation Reserve: " SIZE_FORMAT "M (" SIZE_FORMAT " regions), Max regular: " SIZE_FORMAT "K",
    +                  total_free / M, collector_count(), max / K);
    +    }
    +  }
    +}
    +
    +HeapWord* ShenandoahFreeSet::allocate(ShenandoahAllocRequest& req, bool& in_new_region) {
    +  assert_heaplock_owned_by_current_thread();
    +  assert_bounds();
    +
    +  if (req.size() > ShenandoahHeapRegion::humongous_threshold_words()) {
    +    switch (req.type()) {
    +      case ShenandoahAllocRequest::_alloc_shared:
    +      case ShenandoahAllocRequest::_alloc_shared_gc:
    +        in_new_region = true;
    +        return allocate_contiguous(req);
    +      case ShenandoahAllocRequest::_alloc_gclab:
    +      case ShenandoahAllocRequest::_alloc_tlab:
    +        in_new_region = false;
    +        assert(false, "Trying to allocate TLAB larger than the humongous threshold: " SIZE_FORMAT " > " SIZE_FORMAT,
    +               req.size(), ShenandoahHeapRegion::humongous_threshold_words());
    +        return NULL;
    +      default:
    +        ShouldNotReachHere();
    +        return NULL;
    +    }
    +  } else {
    +    return allocate_single(req, in_new_region);
    +  }
    +}
    +
    +size_t ShenandoahFreeSet::unsafe_peek_free() const {
    +  // Deliberately not locked, this method is unsafe when free set is modified.
    +
    +  for (size_t index = _mutator_leftmost; index <= _mutator_rightmost; index++) {
    +    if (index < _max && is_mutator_free(index)) {
    +      ShenandoahHeapRegion* r = _heap->get_region(index);
    +      if (r->free() >= MinTLABSize) {
    +        return r->free();
    +      }
    +    }
    +  }
    +
    +  // It appears that no regions left
    +  return 0;
    +}
    +
    +void ShenandoahFreeSet::print_on(outputStream* out) const {
    +  out->print_cr("Mutator Free Set: " SIZE_FORMAT "", mutator_count());
    +  for (size_t index = _mutator_leftmost; index <= _mutator_rightmost; index++) {
    +    if (is_mutator_free(index)) {
    +      _heap->get_region(index)->print_on(out);
    +    }
    +  }
    +  out->print_cr("Collector Free Set: " SIZE_FORMAT "", collector_count());
    +  for (size_t index = _collector_leftmost; index <= _collector_rightmost; index++) {
    +    if (is_collector_free(index)) {
    +      _heap->get_region(index)->print_on(out);
    +    }
    +  }
    +}
    +
    +#ifdef ASSERT
    +void ShenandoahFreeSet::assert_heaplock_owned_by_current_thread() const {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +}
    +
    +void ShenandoahFreeSet::assert_heaplock_not_owned_by_current_thread() const {
    +  _heap->assert_heaplock_not_owned_by_current_thread();
    +}
    +
    +void ShenandoahFreeSet::assert_bounds() const {
    +  // Performance invariants. Failing these would not break the free set, but performance
    +  // would suffer.
    +  assert (_mutator_leftmost <= _max, "leftmost in bounds: "  SIZE_FORMAT " < " SIZE_FORMAT, _mutator_leftmost,  _max);
    +  assert (_mutator_rightmost < _max, "rightmost in bounds: " SIZE_FORMAT " < " SIZE_FORMAT, _mutator_rightmost, _max);
    +
    +  assert (_mutator_leftmost == _max || is_mutator_free(_mutator_leftmost),  "leftmost region should be free: " SIZE_FORMAT,  _mutator_leftmost);
    +  assert (_mutator_rightmost == 0   || is_mutator_free(_mutator_rightmost), "rightmost region should be free: " SIZE_FORMAT, _mutator_rightmost);
    +
    +  size_t beg_off = _mutator_free_bitmap.get_next_one_offset(0);
    +  size_t end_off = _mutator_free_bitmap.get_next_one_offset(_mutator_rightmost + 1);
    +  assert (beg_off >= _mutator_leftmost, "free regions before the leftmost: " SIZE_FORMAT ", bound " SIZE_FORMAT, beg_off, _mutator_leftmost);
    +  assert (end_off == _max,      "free regions past the rightmost: " SIZE_FORMAT ", bound " SIZE_FORMAT,  end_off, _mutator_rightmost);
    +
    +  assert (_collector_leftmost <= _max, "leftmost in bounds: "  SIZE_FORMAT " < " SIZE_FORMAT, _collector_leftmost,  _max);
    +  assert (_collector_rightmost < _max, "rightmost in bounds: " SIZE_FORMAT " < " SIZE_FORMAT, _collector_rightmost, _max);
    +
    +  assert (_collector_leftmost == _max || is_collector_free(_collector_leftmost),  "leftmost region should be free: " SIZE_FORMAT,  _collector_leftmost);
    +  assert (_collector_rightmost == 0   || is_collector_free(_collector_rightmost), "rightmost region should be free: " SIZE_FORMAT, _collector_rightmost);
    +
    +  beg_off = _collector_free_bitmap.get_next_one_offset(0);
    +  end_off = _collector_free_bitmap.get_next_one_offset(_collector_rightmost + 1);
    +  assert (beg_off >= _collector_leftmost, "free regions before the leftmost: " SIZE_FORMAT ", bound " SIZE_FORMAT, beg_off, _collector_leftmost);
    +  assert (end_off == _max,      "free regions past the rightmost: " SIZE_FORMAT ", bound " SIZE_FORMAT,  end_off, _collector_rightmost);
    +}
    +#endif
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp
    new file mode 100644
    index 00000000000..823e07c10b6
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp
    @@ -0,0 +1,97 @@
    +/*
    + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHFREESET_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHFREESET_HPP
    +
    +#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +
    +class ShenandoahFreeSet : public CHeapObj {
    +private:
    +  ShenandoahHeap* const _heap;
    +  CHeapBitMap _mutator_free_bitmap;
    +  CHeapBitMap _collector_free_bitmap;
    +  size_t _max;
    +
    +  // Left-most and right-most region indexes. There are no free regions outside
    +  // of [left-most; right-most] index intervals
    +  size_t _mutator_leftmost, _mutator_rightmost;
    +  size_t _collector_leftmost, _collector_rightmost;
    +
    +  size_t _capacity;
    +  size_t _used;
    +
    +  void assert_bounds() const PRODUCT_RETURN;
    +  void assert_heaplock_owned_by_current_thread() const PRODUCT_RETURN;
    +  void assert_heaplock_not_owned_by_current_thread() const PRODUCT_RETURN;
    +
    +  bool is_mutator_free(size_t idx) const;
    +  bool is_collector_free(size_t idx) const;
    +
    +  HeapWord* try_allocate_in(ShenandoahHeapRegion* region, ShenandoahAllocRequest& req, bool& in_new_region);
    +  HeapWord* allocate_single(ShenandoahAllocRequest& req, bool& in_new_region);
    +  HeapWord* allocate_contiguous(ShenandoahAllocRequest& req);
    +
    +  void flip_to_gc(ShenandoahHeapRegion* r);
    +
    +  void recompute_bounds();
    +  void adjust_bounds();
    +  bool touches_bounds(size_t num) const;
    +
    +  void increase_used(size_t amount);
    +  void clear_internal();
    +
    +  size_t collector_count() const { return _collector_free_bitmap.count_one_bits(); }
    +  size_t mutator_count()   const { return _mutator_free_bitmap.count_one_bits();   }
    +
    +  void try_recycle_trashed(ShenandoahHeapRegion *r);
    +
    +  bool is_empty_or_trash(ShenandoahHeapRegion *r);
    +  size_t alloc_capacity(ShenandoahHeapRegion *r);
    +  bool has_no_alloc_capacity(ShenandoahHeapRegion *r);
    +
    +public:
    +  ShenandoahFreeSet(ShenandoahHeap* heap, size_t max_regions);
    +
    +  void clear();
    +  void rebuild();
    +
    +  void recycle_trash();
    +
    +  void log_status();
    +
    +  size_t capacity()  const { return _capacity; }
    +  size_t used()      const { return _used;     }
    +  size_t available() const {
    +    assert(_used <= _capacity, "must use less than capacity");
    +    return _capacity - _used;
    +  }
    +
    +  HeapWord* allocate(ShenandoahAllocRequest& req, bool& in_new_region);
    +  size_t unsafe_peek_free() const;
    +
    +  void print_on(outputStream* out) const;
    +};
    +
    +#endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHFREESET_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp
    new file mode 100644
    index 00000000000..d6980ab9f5a
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp
    @@ -0,0 +1,2796 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "memory/allocation.hpp"
    +
    +#include "gc/shared/gcTimer.hpp"
    +#include "gc/shared/gcTraceTime.inline.hpp"
    +#include "gc/shared/memAllocator.hpp"
    +#include "gc/shared/parallelCleaning.hpp"
    +#include "gc/shared/plab.hpp"
    +
    +#include "gc/shenandoah/shenandoahAllocTracker.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSet.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
    +#include "gc/shenandoah/shenandoahConcurrentMark.hpp"
    +#include "gc/shenandoah/shenandoahConcurrentMark.inline.hpp"
    +#include "gc/shenandoah/shenandoahControlThread.hpp"
    +#include "gc/shenandoah/shenandoahFreeSet.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
    +#include "gc/shenandoah/shenandoahMarkCompact.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
    +#include "gc/shenandoah/shenandoahMemoryPool.hpp"
    +#include "gc/shenandoah/shenandoahMetrics.hpp"
    +#include "gc/shenandoah/shenandoahMonitoringSupport.hpp"
    +#include "gc/shenandoah/shenandoahOopClosures.inline.hpp"
    +#include "gc/shenandoah/shenandoahPacer.hpp"
    +#include "gc/shenandoah/shenandoahPacer.inline.hpp"
    +#include "gc/shenandoah/shenandoahRootProcessor.hpp"
    +#include "gc/shenandoah/shenandoahStringDedup.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "gc/shenandoah/shenandoahVerifier.hpp"
    +#include "gc/shenandoah/shenandoahCodeRoots.hpp"
    +#include "gc/shenandoah/shenandoahVMOperations.hpp"
    +#include "gc/shenandoah/shenandoahWorkGroup.hpp"
    +#include "gc/shenandoah/shenandoahWorkerPolicy.hpp"
    +#include "gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.hpp"
    +#include "gc/shenandoah/heuristics/shenandoahAggressiveHeuristics.hpp"
    +#include "gc/shenandoah/heuristics/shenandoahCompactHeuristics.hpp"
    +#include "gc/shenandoah/heuristics/shenandoahPassiveHeuristics.hpp"
    +#include "gc/shenandoah/heuristics/shenandoahStaticHeuristics.hpp"
    +#include "gc/shenandoah/heuristics/shenandoahTraversalHeuristics.hpp"
    +
    +#include "memory/metaspace.hpp"
    +#include "runtime/vmThread.hpp"
    +#include "services/mallocTracker.hpp"
    +
    +ShenandoahUpdateRefsClosure::ShenandoahUpdateRefsClosure() : _heap(ShenandoahHeap::heap()) {}
    +
    +#ifdef ASSERT
    +template 
    +void ShenandoahAssertToSpaceClosure::do_oop_work(T* p) {
    +  T o = RawAccess<>::oop_load(p);
    +  if (! CompressedOops::is_null(o)) {
    +    oop obj = CompressedOops::decode_not_null(o);
    +    shenandoah_assert_not_forwarded(p, obj);
    +  }
    +}
    +
    +void ShenandoahAssertToSpaceClosure::do_oop(narrowOop* p) { do_oop_work(p); }
    +void ShenandoahAssertToSpaceClosure::do_oop(oop* p)       { do_oop_work(p); }
    +#endif
    +
    +class ShenandoahPretouchTask : public AbstractGangTask {
    +private:
    +  ShenandoahRegionIterator _regions;
    +  const size_t _bitmap_size;
    +  const size_t _page_size;
    +  char* _bitmap_base;
    +public:
    +  ShenandoahPretouchTask(char* bitmap_base, size_t bitmap_size, size_t page_size) :
    +    AbstractGangTask("Shenandoah PreTouch"),
    +    _bitmap_size(bitmap_size),
    +    _page_size(page_size),
    +    _bitmap_base(bitmap_base) {
    +  }
    +
    +  virtual void work(uint worker_id) {
    +    ShenandoahHeapRegion* r = _regions.next();
    +    while (r != NULL) {
    +      os::pretouch_memory(r->bottom(), r->end(), _page_size);
    +
    +      size_t start = r->region_number()       * ShenandoahHeapRegion::region_size_bytes() / MarkBitMap::heap_map_factor();
    +      size_t end   = (r->region_number() + 1) * ShenandoahHeapRegion::region_size_bytes() / MarkBitMap::heap_map_factor();
    +      assert (end <= _bitmap_size, "end is sane: " SIZE_FORMAT " < " SIZE_FORMAT, end, _bitmap_size);
    +
    +      os::pretouch_memory(_bitmap_base + start, _bitmap_base + end, _page_size);
    +
    +      r = _regions.next();
    +    }
    +  }
    +};
    +
    +jint ShenandoahHeap::initialize() {
    +  ShenandoahBrooksPointer::initial_checks();
    +
    +  initialize_heuristics();
    +
    +  size_t init_byte_size = collector_policy()->initial_heap_byte_size();
    +  size_t max_byte_size = collector_policy()->max_heap_byte_size();
    +  size_t heap_alignment = collector_policy()->heap_alignment();
    +
    +  if (ShenandoahAlwaysPreTouch) {
    +    // Enabled pre-touch means the entire heap is committed right away.
    +    init_byte_size = max_byte_size;
    +  }
    +
    +  Universe::check_alignment(max_byte_size,
    +                            ShenandoahHeapRegion::region_size_bytes(),
    +                            "shenandoah heap");
    +  Universe::check_alignment(init_byte_size,
    +                            ShenandoahHeapRegion::region_size_bytes(),
    +                            "shenandoah heap");
    +
    +  ReservedSpace heap_rs = Universe::reserve_heap(max_byte_size,
    +                                                 heap_alignment);
    +  initialize_reserved_region((HeapWord*)heap_rs.base(), (HeapWord*) (heap_rs.base() + heap_rs.size()));
    +
    +  ReservedSpace pgc_rs = heap_rs.first_part(max_byte_size);
    +
    +  _num_regions = ShenandoahHeapRegion::region_count();
    +
    +  size_t num_committed_regions = init_byte_size / ShenandoahHeapRegion::region_size_bytes();
    +  num_committed_regions = MIN2(num_committed_regions, _num_regions);
    +  assert(num_committed_regions <= _num_regions, "sanity");
    +
    +  _initial_size = num_committed_regions * ShenandoahHeapRegion::region_size_bytes();
    +  _committed = _initial_size;
    +
    +  log_info(gc, heap)("Initialize Shenandoah heap with initial size " SIZE_FORMAT "%s",
    +          byte_size_in_proper_unit(_initial_size), proper_unit_for_byte_size(_initial_size));
    +  if (!os::commit_memory(pgc_rs.base(), _initial_size, false)) {
    +    vm_exit_out_of_memory(_initial_size, OOM_MMAP_ERROR, "Shenandoah failed to initialize heap");
    +  }
    +
    +  size_t reg_size_words = ShenandoahHeapRegion::region_size_words();
    +  size_t reg_size_bytes = ShenandoahHeapRegion::region_size_bytes();
    +
    +  _regions = NEW_C_HEAP_ARRAY(ShenandoahHeapRegion*, _num_regions, mtGC);
    +  _free_set = new ShenandoahFreeSet(this, _num_regions);
    +
    +  _collection_set = new ShenandoahCollectionSet(this, (HeapWord*)pgc_rs.base());
    +
    +  if (ShenandoahPacing) {
    +    _pacer = new ShenandoahPacer(this);
    +    _pacer->setup_for_idle();
    +  } else {
    +    _pacer = NULL;
    +  }
    +
    +  assert((((size_t) base()) & ShenandoahHeapRegion::region_size_bytes_mask()) == 0,
    +         "misaligned heap: " PTR_FORMAT, p2i(base()));
    +
    +  // The call below uses stuff (the SATB* things) that are in G1, but probably
    +  // belong into a shared location.
    +  ShenandoahBarrierSet::satb_mark_queue_set().initialize(this,
    +                                               SATB_Q_CBL_mon,
    +                                               20 /*G1SATBProcessCompletedThreshold */,
    +                                               60 /* G1SATBBufferEnqueueingThresholdPercent */,
    +                                               Shared_SATB_Q_lock);
    +
    +  // Reserve space for prev and next bitmap.
    +  size_t bitmap_page_size = UseLargePages ? (size_t)os::large_page_size() : (size_t)os::vm_page_size();
    +  _bitmap_size = MarkBitMap::compute_size(heap_rs.size());
    +  _bitmap_size = align_up(_bitmap_size, bitmap_page_size);
    +  _heap_region = MemRegion((HeapWord*) heap_rs.base(), heap_rs.size() / HeapWordSize);
    +
    +  size_t bitmap_bytes_per_region = reg_size_bytes / MarkBitMap::heap_map_factor();
    +
    +  guarantee(bitmap_bytes_per_region != 0,
    +            "Bitmap bytes per region should not be zero");
    +  guarantee(is_power_of_2(bitmap_bytes_per_region),
    +            "Bitmap bytes per region should be power of two: " SIZE_FORMAT, bitmap_bytes_per_region);
    +
    +  if (bitmap_page_size > bitmap_bytes_per_region) {
    +    _bitmap_regions_per_slice = bitmap_page_size / bitmap_bytes_per_region;
    +    _bitmap_bytes_per_slice = bitmap_page_size;
    +  } else {
    +    _bitmap_regions_per_slice = 1;
    +    _bitmap_bytes_per_slice = bitmap_bytes_per_region;
    +  }
    +
    +  guarantee(_bitmap_regions_per_slice >= 1,
    +            "Should have at least one region per slice: " SIZE_FORMAT,
    +            _bitmap_regions_per_slice);
    +
    +  guarantee(((_bitmap_bytes_per_slice) % bitmap_page_size) == 0,
    +            "Bitmap slices should be page-granular: bps = " SIZE_FORMAT ", page size = " SIZE_FORMAT,
    +            _bitmap_bytes_per_slice, bitmap_page_size);
    +
    +  ReservedSpace bitmap0(_bitmap_size, bitmap_page_size);
    +  MemTracker::record_virtual_memory_type(bitmap0.base(), mtGC);
    +  _bitmap_region = MemRegion((HeapWord*) bitmap0.base(), bitmap0.size() / HeapWordSize);
    +
    +  size_t bitmap_init_commit = _bitmap_bytes_per_slice *
    +                              align_up(num_committed_regions, _bitmap_regions_per_slice) / _bitmap_regions_per_slice;
    +  bitmap_init_commit = MIN2(_bitmap_size, bitmap_init_commit);
    +  os::commit_memory_or_exit((char *) (_bitmap_region.start()), bitmap_init_commit, false,
    +                            "couldn't allocate initial bitmap");
    +
    +  size_t page_size = UseLargePages ? (size_t)os::large_page_size() : (size_t)os::vm_page_size();
    +
    +  if (ShenandoahVerify) {
    +    ReservedSpace verify_bitmap(_bitmap_size, page_size);
    +    os::commit_memory_or_exit(verify_bitmap.base(), verify_bitmap.size(), false,
    +                              "couldn't allocate verification bitmap");
    +    MemTracker::record_virtual_memory_type(verify_bitmap.base(), mtGC);
    +    MemRegion verify_bitmap_region = MemRegion((HeapWord *) verify_bitmap.base(), verify_bitmap.size() / HeapWordSize);
    +    _verification_bit_map.initialize(_heap_region, verify_bitmap_region);
    +    _verifier = new ShenandoahVerifier(this, &_verification_bit_map);
    +  }
    +
    +  _marking_context = new ShenandoahMarkingContext(_heap_region, _bitmap_region, _num_regions);
    +
    +  {
    +    ShenandoahHeapLocker locker(lock());
    +    for (size_t i = 0; i < _num_regions; i++) {
    +      ShenandoahHeapRegion* r = new ShenandoahHeapRegion(this,
    +                                                         (HeapWord*) pgc_rs.base() + reg_size_words * i,
    +                                                         reg_size_words,
    +                                                         i,
    +                                                         i < num_committed_regions);
    +
    +      _marking_context->initialize_top_at_mark_start(r);
    +      _regions[i] = r;
    +      assert(!collection_set()->is_in(i), "New region should not be in collection set");
    +    }
    +
    +    // Initialize to complete
    +    _marking_context->mark_complete();
    +
    +    _free_set->rebuild();
    +  }
    +
    +  if (ShenandoahAlwaysPreTouch) {
    +    assert (!AlwaysPreTouch, "Should have been overridden");
    +
    +    // For NUMA, it is important to pre-touch the storage under bitmaps with worker threads,
    +    // before initialize() below zeroes it with initializing thread. For any given region,
    +    // we touch the region and the corresponding bitmaps from the same thread.
    +    ShenandoahPushWorkerScope scope(workers(), _max_workers, false);
    +
    +    log_info(gc, heap)("Parallel pretouch " SIZE_FORMAT " regions with " SIZE_FORMAT " byte pages",
    +                       _num_regions, page_size);
    +    ShenandoahPretouchTask cl(bitmap0.base(), _bitmap_size, page_size);
    +    _workers->run_task(&cl);
    +  }
    +
    +  // Reserve aux bitmap for use in object_iterate(). We don't commit it here.
    +  ReservedSpace aux_bitmap(_bitmap_size, bitmap_page_size);
    +  MemTracker::record_virtual_memory_type(aux_bitmap.base(), mtGC);
    +  _aux_bitmap_region = MemRegion((HeapWord*) aux_bitmap.base(), aux_bitmap.size() / HeapWordSize);
    +  _aux_bit_map.initialize(_heap_region, _aux_bitmap_region);
    +
    +  _traversal_gc = heuristics()->can_do_traversal_gc() ?
    +                new ShenandoahTraversalGC(this, _num_regions) :
    +                NULL;
    +
    +  _monitoring_support = new ShenandoahMonitoringSupport(this);
    +
    +  _phase_timings = new ShenandoahPhaseTimings();
    +
    +  if (ShenandoahAllocationTrace) {
    +    _alloc_tracker = new ShenandoahAllocTracker();
    +  }
    +
    +  ShenandoahStringDedup::initialize();
    +
    +  _control_thread = new ShenandoahControlThread();
    +
    +  ShenandoahCodeRoots::initialize();
    +
    +  log_info(gc, init)("Safepointing mechanism: %s",
    +                     SafepointMechanism::uses_thread_local_poll() ? "thread-local poll" :
    +                     (SafepointMechanism::uses_global_page_poll() ? "global-page poll" : "unknown"));
    +
    +  _liveness_cache = NEW_C_HEAP_ARRAY(jushort*, _max_workers, mtGC);
    +  for (uint worker = 0; worker < _max_workers; worker++) {
    +    _liveness_cache[worker] = NEW_C_HEAP_ARRAY(jushort, _num_regions, mtGC);
    +    Copy::fill_to_bytes(_liveness_cache[worker], _num_regions * sizeof(jushort));
    +  }
    +
    +  return JNI_OK;
    +}
    +
    +void ShenandoahHeap::initialize_heuristics() {
    +  if (ShenandoahGCHeuristics != NULL) {
    +    if (strcmp(ShenandoahGCHeuristics, "aggressive") == 0) {
    +      _heuristics = new ShenandoahAggressiveHeuristics();
    +    } else if (strcmp(ShenandoahGCHeuristics, "static") == 0) {
    +      _heuristics = new ShenandoahStaticHeuristics();
    +    } else if (strcmp(ShenandoahGCHeuristics, "adaptive") == 0) {
    +      _heuristics = new ShenandoahAdaptiveHeuristics();
    +    } else if (strcmp(ShenandoahGCHeuristics, "passive") == 0) {
    +      _heuristics = new ShenandoahPassiveHeuristics();
    +    } else if (strcmp(ShenandoahGCHeuristics, "compact") == 0) {
    +      _heuristics = new ShenandoahCompactHeuristics();
    +    } else if (strcmp(ShenandoahGCHeuristics, "traversal") == 0) {
    +      _heuristics = new ShenandoahTraversalHeuristics();
    +    } else {
    +      vm_exit_during_initialization("Unknown -XX:ShenandoahGCHeuristics option");
    +    }
    +
    +    if (_heuristics->is_diagnostic() && !UnlockDiagnosticVMOptions) {
    +      vm_exit_during_initialization(
    +              err_msg("Heuristics \"%s\" is diagnostic, and must be enabled via -XX:+UnlockDiagnosticVMOptions.",
    +                      _heuristics->name()));
    +    }
    +    if (_heuristics->is_experimental() && !UnlockExperimentalVMOptions) {
    +      vm_exit_during_initialization(
    +              err_msg("Heuristics \"%s\" is experimental, and must be enabled via -XX:+UnlockExperimentalVMOptions.",
    +                      _heuristics->name()));
    +    }
    +
    +    if (ShenandoahStoreValEnqueueBarrier && ShenandoahStoreValReadBarrier) {
    +      vm_exit_during_initialization("Cannot use both ShenandoahStoreValEnqueueBarrier and ShenandoahStoreValReadBarrier");
    +    }
    +    log_info(gc, init)("Shenandoah heuristics: %s",
    +                       _heuristics->name());
    +  } else {
    +      ShouldNotReachHere();
    +  }
    +
    +}
    +
    +#ifdef _MSC_VER
    +#pragma warning( push )
    +#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
    +#endif
    +
    +ShenandoahHeap::ShenandoahHeap(ShenandoahCollectorPolicy* policy) :
    +  CollectedHeap(),
    +  _initial_size(0),
    +  _used(0),
    +  _committed(0),
    +  _bytes_allocated_since_gc_start(0),
    +  _max_workers(MAX2(ConcGCThreads, ParallelGCThreads)),
    +  _workers(NULL),
    +  _safepoint_workers(NULL),
    +  _num_regions(0),
    +  _regions(NULL),
    +  _update_refs_iterator(this),
    +  _control_thread(NULL),
    +  _shenandoah_policy(policy),
    +  _heuristics(NULL),
    +  _free_set(NULL),
    +  _scm(new ShenandoahConcurrentMark()),
    +  _traversal_gc(NULL),
    +  _full_gc(new ShenandoahMarkCompact()),
    +  _pacer(NULL),
    +  _verifier(NULL),
    +  _alloc_tracker(NULL),
    +  _phase_timings(NULL),
    +  _monitoring_support(NULL),
    +  _memory_pool(NULL),
    +  _stw_memory_manager("Shenandoah Pauses", "end of GC pause"),
    +  _cycle_memory_manager("Shenandoah Cycles", "end of GC cycle"),
    +  _gc_timer(new (ResourceObj::C_HEAP, mtGC) ConcurrentGCTimer()),
    +  _soft_ref_policy(),
    +  _ref_processor(NULL),
    +  _marking_context(NULL),
    +  _collection_set(NULL)
    +{
    +  log_info(gc, init)("GC threads: " UINT32_FORMAT " parallel, " UINT32_FORMAT " concurrent", ParallelGCThreads, ConcGCThreads);
    +  log_info(gc, init)("Reference processing: %s", ParallelRefProcEnabled ? "parallel" : "serial");
    +
    +  BarrierSet::set_barrier_set(new ShenandoahBarrierSet(this));
    +
    +  _max_workers = MAX2(_max_workers, 1U);
    +  _workers = new ShenandoahWorkGang("Shenandoah GC Threads", _max_workers,
    +                            /* are_GC_task_threads */true,
    +                            /* are_ConcurrentGC_threads */false);
    +  if (_workers == NULL) {
    +    vm_exit_during_initialization("Failed necessary allocation.");
    +  } else {
    +    _workers->initialize_workers();
    +  }
    +
    +  if (ShenandoahParallelSafepointThreads > 1) {
    +    _safepoint_workers = new ShenandoahWorkGang("Safepoint Cleanup Thread",
    +                                                ShenandoahParallelSafepointThreads,
    +                                                false, false);
    +    _safepoint_workers->initialize_workers();
    +  }
    +}
    +
    +#ifdef _MSC_VER
    +#pragma warning( pop )
    +#endif
    +
    +class ShenandoahResetBitmapTask : public AbstractGangTask {
    +private:
    +  ShenandoahRegionIterator _regions;
    +
    +public:
    +  ShenandoahResetBitmapTask() :
    +    AbstractGangTask("Parallel Reset Bitmap Task") {}
    +
    +  void work(uint worker_id) {
    +    ShenandoahHeapRegion* region = _regions.next();
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +    ShenandoahMarkingContext* const ctx = heap->marking_context();
    +    while (region != NULL) {
    +      if (heap->is_bitmap_slice_committed(region)) {
    +        ctx->clear_bitmap(region);
    +      }
    +      region = _regions.next();
    +    }
    +  }
    +};
    +
    +void ShenandoahHeap::reset_mark_bitmap() {
    +  assert_gc_workers(_workers->active_workers());
    +  mark_incomplete_marking_context();
    +
    +  ShenandoahResetBitmapTask task;
    +  _workers->run_task(&task);
    +}
    +
    +void ShenandoahHeap::print_on(outputStream* st) const {
    +  st->print_cr("Shenandoah Heap");
    +  st->print_cr(" " SIZE_FORMAT "K total, " SIZE_FORMAT "K committed, " SIZE_FORMAT "K used",
    +               capacity() / K, committed() / K, used() / K);
    +  st->print_cr(" " SIZE_FORMAT " x " SIZE_FORMAT"K regions",
    +               num_regions(), ShenandoahHeapRegion::region_size_bytes() / K);
    +
    +  st->print("Status: ");
    +  if (has_forwarded_objects())               st->print("has forwarded objects, ");
    +  if (is_concurrent_mark_in_progress())      st->print("marking, ");
    +  if (is_evacuation_in_progress())           st->print("evacuating, ");
    +  if (is_update_refs_in_progress())          st->print("updating refs, ");
    +  if (is_concurrent_traversal_in_progress()) st->print("traversal, ");
    +  if (is_degenerated_gc_in_progress())       st->print("degenerated gc, ");
    +  if (is_full_gc_in_progress())              st->print("full gc, ");
    +  if (is_full_gc_move_in_progress())         st->print("full gc move, ");
    +
    +  if (cancelled_gc()) {
    +    st->print("cancelled");
    +  } else {
    +    st->print("not cancelled");
    +  }
    +  st->cr();
    +
    +  st->print_cr("Reserved region:");
    +  st->print_cr(" - [" PTR_FORMAT ", " PTR_FORMAT ") ",
    +               p2i(reserved_region().start()),
    +               p2i(reserved_region().end()));
    +
    +  st->cr();
    +  MetaspaceUtils::print_on(st);
    +
    +  if (Verbose) {
    +    print_heap_regions_on(st);
    +  }
    +}
    +
    +class ShenandoahInitGCLABClosure : public ThreadClosure {
    +public:
    +  void do_thread(Thread* thread) {
    +    if (thread != NULL && (thread->is_Java_thread() || thread->is_Worker_thread())) {
    +      ShenandoahThreadLocalData::initialize_gclab(thread);
    +    }
    +  }
    +};
    +
    +void ShenandoahHeap::post_initialize() {
    +  CollectedHeap::post_initialize();
    +  MutexLocker ml(Threads_lock);
    +
    +  ShenandoahInitGCLABClosure init_gclabs;
    +  Threads::threads_do(&init_gclabs);
    +  _workers->threads_do(&init_gclabs);
    +  _safepoint_workers->threads_do(&init_gclabs);
    +
    +  // gclab can not be initialized early during VM startup, as it can not determinate its max_size.
    +  // Now, we will let WorkGang to initialize gclab when new worker is created.
    +  _workers->set_initialize_gclab();
    +
    +  _scm->initialize(_max_workers);
    +  _full_gc->initialize(_gc_timer);
    +
    +  ref_processing_init();
    +
    +  _heuristics->initialize();
    +}
    +
    +size_t ShenandoahHeap::used() const {
    +  return OrderAccess::load_acquire(&_used);
    +}
    +
    +size_t ShenandoahHeap::committed() const {
    +  OrderAccess::acquire();
    +  return _committed;
    +}
    +
    +void ShenandoahHeap::increase_committed(size_t bytes) {
    +  assert_heaplock_or_safepoint();
    +  _committed += bytes;
    +}
    +
    +void ShenandoahHeap::decrease_committed(size_t bytes) {
    +  assert_heaplock_or_safepoint();
    +  _committed -= bytes;
    +}
    +
    +void ShenandoahHeap::increase_used(size_t bytes) {
    +  Atomic::add(bytes, &_used);
    +}
    +
    +void ShenandoahHeap::set_used(size_t bytes) {
    +  OrderAccess::release_store_fence(&_used, bytes);
    +}
    +
    +void ShenandoahHeap::decrease_used(size_t bytes) {
    +  assert(used() >= bytes, "never decrease heap size by more than we've left");
    +  Atomic::sub(bytes, &_used);
    +}
    +
    +void ShenandoahHeap::increase_allocated(size_t bytes) {
    +  Atomic::add(bytes, &_bytes_allocated_since_gc_start);
    +}
    +
    +void ShenandoahHeap::notify_mutator_alloc_words(size_t words, bool waste) {
    +  size_t bytes = words * HeapWordSize;
    +  if (!waste) {
    +    increase_used(bytes);
    +  }
    +  increase_allocated(bytes);
    +  if (ShenandoahPacing) {
    +    control_thread()->pacing_notify_alloc(words);
    +    if (waste) {
    +      pacer()->claim_for_alloc(words, true);
    +    }
    +  }
    +}
    +
    +size_t ShenandoahHeap::capacity() const {
    +  return num_regions() * ShenandoahHeapRegion::region_size_bytes();
    +}
    +
    +size_t ShenandoahHeap::max_capacity() const {
    +  return _num_regions * ShenandoahHeapRegion::region_size_bytes();
    +}
    +
    +size_t ShenandoahHeap::initial_capacity() const {
    +  return _initial_size;
    +}
    +
    +bool ShenandoahHeap::is_in(const void* p) const {
    +  HeapWord* heap_base = (HeapWord*) base();
    +  HeapWord* last_region_end = heap_base + ShenandoahHeapRegion::region_size_words() * num_regions();
    +  return p >= heap_base && p < last_region_end;
    +}
    +
    +void ShenandoahHeap::op_uncommit(double shrink_before) {
    +  assert (ShenandoahUncommit, "should be enabled");
    +
    +  size_t count = 0;
    +  for (size_t i = 0; i < num_regions(); i++) {
    +    ShenandoahHeapRegion* r = get_region(i);
    +    if (r->is_empty_committed() && (r->empty_time() < shrink_before)) {
    +      ShenandoahHeapLocker locker(lock());
    +      if (r->is_empty_committed()) {
    +        r->make_uncommitted();
    +        count++;
    +      }
    +    }
    +    SpinPause(); // allow allocators to take the lock
    +  }
    +
    +  if (count > 0) {
    +    log_info(gc)("Uncommitted " SIZE_FORMAT "M. Heap: " SIZE_FORMAT "M reserved, " SIZE_FORMAT "M committed, " SIZE_FORMAT "M used",
    +                 count * ShenandoahHeapRegion::region_size_bytes() / M, capacity() / M, committed() / M, used() / M);
    +    control_thread()->notify_heap_changed();
    +  }
    +}
    +
    +HeapWord* ShenandoahHeap::allocate_from_gclab_slow(Thread* thread, size_t size) {
    +  // New object should fit the GCLAB size
    +  size_t min_size = MAX2(size, PLAB::min_size());
    +
    +  // Figure out size of new GCLAB, looking back at heuristics. Expand aggressively.
    +  size_t new_size = ShenandoahThreadLocalData::gclab_size(thread) * 2;
    +  new_size = MIN2(new_size, PLAB::max_size());
    +  new_size = MAX2(new_size, PLAB::min_size());
    +
    +  // Record new heuristic value even if we take any shortcut. This captures
    +  // the case when moderately-sized objects always take a shortcut. At some point,
    +  // heuristics should catch up with them.
    +  ShenandoahThreadLocalData::set_gclab_size(thread, new_size);
    +
    +  if (new_size < size) {
    +    // New size still does not fit the object. Fall back to shared allocation.
    +    // This avoids retiring perfectly good GCLABs, when we encounter a large object.
    +    return NULL;
    +  }
    +
    +  // Retire current GCLAB, and allocate a new one.
    +  PLAB* gclab = ShenandoahThreadLocalData::gclab(thread);
    +  gclab->retire();
    +
    +  size_t actual_size = 0;
    +  HeapWord* gclab_buf = allocate_new_gclab(min_size, new_size, &actual_size);
    +  if (gclab_buf == NULL) {
    +    return NULL;
    +  }
    +
    +  assert (size <= actual_size, "allocation should fit");
    +
    +  if (ZeroTLAB) {
    +    // ..and clear it.
    +    Copy::zero_to_words(gclab_buf, actual_size);
    +  } else {
    +    // ...and zap just allocated object.
    +#ifdef ASSERT
    +    // Skip mangling the space corresponding to the object header to
    +    // ensure that the returned space is not considered parsable by
    +    // any concurrent GC thread.
    +    size_t hdr_size = oopDesc::header_size();
    +    Copy::fill_to_words(gclab_buf + hdr_size, actual_size - hdr_size, badHeapWordVal);
    +#endif // ASSERT
    +  }
    +  gclab->set_buf(gclab_buf, actual_size);
    +  return gclab->allocate(size);
    +}
    +
    +HeapWord* ShenandoahHeap::allocate_new_tlab(size_t min_size,
    +                                            size_t requested_size,
    +                                            size_t* actual_size) {
    +  ShenandoahAllocRequest req = ShenandoahAllocRequest::for_tlab(min_size, requested_size);
    +  HeapWord* res = allocate_memory(req);
    +  if (res != NULL) {
    +    *actual_size = req.actual_size();
    +  } else {
    +    *actual_size = 0;
    +  }
    +  return res;
    +}
    +
    +HeapWord* ShenandoahHeap::allocate_new_gclab(size_t min_size,
    +                                             size_t word_size,
    +                                             size_t* actual_size) {
    +  ShenandoahAllocRequest req = ShenandoahAllocRequest::for_gclab(min_size, word_size);
    +  HeapWord* res = allocate_memory(req);
    +  if (res != NULL) {
    +    *actual_size = req.actual_size();
    +  } else {
    +    *actual_size = 0;
    +  }
    +  return res;
    +}
    +
    +ShenandoahHeap* ShenandoahHeap::heap() {
    +  CollectedHeap* heap = Universe::heap();
    +  assert(heap != NULL, "Unitialized access to ShenandoahHeap::heap()");
    +  assert(heap->kind() == CollectedHeap::Shenandoah, "not a shenandoah heap");
    +  return (ShenandoahHeap*) heap;
    +}
    +
    +ShenandoahHeap* ShenandoahHeap::heap_no_check() {
    +  CollectedHeap* heap = Universe::heap();
    +  return (ShenandoahHeap*) heap;
    +}
    +
    +HeapWord* ShenandoahHeap::allocate_memory(ShenandoahAllocRequest& req) {
    +  ShenandoahAllocTrace trace_alloc(req.size(), req.type());
    +
    +  intptr_t pacer_epoch = 0;
    +  bool in_new_region = false;
    +  HeapWord* result = NULL;
    +
    +  if (req.is_mutator_alloc()) {
    +    if (ShenandoahPacing) {
    +      pacer()->pace_for_alloc(req.size());
    +      pacer_epoch = pacer()->epoch();
    +    }
    +
    +    if (!ShenandoahAllocFailureALot || !should_inject_alloc_failure()) {
    +      result = allocate_memory_under_lock(req, in_new_region);
    +    }
    +
    +    // Allocation failed, block until control thread reacted, then retry allocation.
    +    //
    +    // It might happen that one of the threads requesting allocation would unblock
    +    // way later after GC happened, only to fail the second allocation, because
    +    // other threads have already depleted the free storage. In this case, a better
    +    // strategy is to try again, as long as GC makes progress.
    +    //
    +    // Then, we need to make sure the allocation was retried after at least one
    +    // Full GC, which means we want to try more than ShenandoahFullGCThreshold times.
    +
    +    size_t tries = 0;
    +
    +    while (result == NULL && _progress_last_gc.is_set()) {
    +      tries++;
    +      control_thread()->handle_alloc_failure(req.size());
    +      result = allocate_memory_under_lock(req, in_new_region);
    +    }
    +
    +    while (result == NULL && tries <= ShenandoahFullGCThreshold) {
    +      tries++;
    +      control_thread()->handle_alloc_failure(req.size());
    +      result = allocate_memory_under_lock(req, in_new_region);
    +    }
    +
    +  } else {
    +    assert(req.is_gc_alloc(), "Can only accept GC allocs here");
    +    result = allocate_memory_under_lock(req, in_new_region);
    +    // Do not call handle_alloc_failure() here, because we cannot block.
    +    // The allocation failure would be handled by the WB slowpath with handle_alloc_failure_evac().
    +  }
    +
    +  if (in_new_region) {
    +    control_thread()->notify_heap_changed();
    +  }
    +
    +  if (result != NULL) {
    +    size_t requested = req.size();
    +    size_t actual = req.actual_size();
    +
    +    assert (req.is_lab_alloc() || (requested == actual),
    +            "Only LAB allocations are elastic: %s, requested = " SIZE_FORMAT ", actual = " SIZE_FORMAT,
    +            ShenandoahAllocRequest::alloc_type_to_string(req.type()), requested, actual);
    +
    +    if (req.is_mutator_alloc()) {
    +      notify_mutator_alloc_words(actual, false);
    +
    +      // If we requested more than we were granted, give the rest back to pacer.
    +      // This only matters if we are in the same pacing epoch: do not try to unpace
    +      // over the budget for the other phase.
    +      if (ShenandoahPacing && (pacer_epoch > 0) && (requested > actual)) {
    +        pacer()->unpace_for_alloc(pacer_epoch, requested - actual);
    +      }
    +    } else {
    +      increase_used(actual*HeapWordSize);
    +    }
    +  }
    +
    +  return result;
    +}
    +
    +HeapWord* ShenandoahHeap::allocate_memory_under_lock(ShenandoahAllocRequest& req, bool& in_new_region) {
    +  ShenandoahHeapLocker locker(lock());
    +  return _free_set->allocate(req, in_new_region);
    +}
    +
    +class ShenandoahMemAllocator : public MemAllocator {
    +private:
    +  MemAllocator& _initializer;
    +public:
    +  ShenandoahMemAllocator(MemAllocator& initializer, Klass* klass, size_t word_size, Thread* thread) :
    +  MemAllocator(klass, word_size + ShenandoahBrooksPointer::word_size(), thread),
    +    _initializer(initializer) {}
    +
    +protected:
    +  virtual HeapWord* mem_allocate(Allocation& allocation) const {
    +    HeapWord* result = MemAllocator::mem_allocate(allocation);
    +    // Initialize brooks-pointer
    +    if (result != NULL) {
    +      result += ShenandoahBrooksPointer::word_size();
    +      ShenandoahBrooksPointer::initialize(oop(result));
    +      assert(! ShenandoahHeap::heap()->in_collection_set(result), "never allocate in targetted region");
    +    }
    +    return result;
    +  }
    +
    +  virtual oop initialize(HeapWord* mem) const {
    +     return _initializer.initialize(mem);
    +  }
    +};
    +
    +oop ShenandoahHeap::obj_allocate(Klass* klass, int size, TRAPS) {
    +  ObjAllocator initializer(klass, size, THREAD);
    +  ShenandoahMemAllocator allocator(initializer, klass, size, THREAD);
    +  return allocator.allocate();
    +}
    +
    +oop ShenandoahHeap::array_allocate(Klass* klass, int size, int length, bool do_zero, TRAPS) {
    +  ObjArrayAllocator initializer(klass, size, length, do_zero, THREAD);
    +  ShenandoahMemAllocator allocator(initializer, klass, size, THREAD);
    +  return allocator.allocate();
    +}
    +
    +oop ShenandoahHeap::class_allocate(Klass* klass, int size, TRAPS) {
    +  ClassAllocator initializer(klass, size, THREAD);
    +  ShenandoahMemAllocator allocator(initializer, klass, size, THREAD);
    +  return allocator.allocate();
    +}
    +
    +HeapWord* ShenandoahHeap::mem_allocate(size_t size,
    +                                        bool*  gc_overhead_limit_was_exceeded) {
    +  ShenandoahAllocRequest req = ShenandoahAllocRequest::for_shared(size);
    +  return allocate_memory(req);
    +}
    +
    +MetaWord* ShenandoahHeap::satisfy_failed_metadata_allocation(ClassLoaderData* loader_data,
    +                                                             size_t size,
    +                                                             Metaspace::MetadataType mdtype) {
    +  MetaWord* result;
    +
    +  // Inform metaspace OOM to GC heuristics if class unloading is possible.
    +  if (heuristics()->can_unload_classes()) {
    +    ShenandoahHeuristics* h = heuristics();
    +    h->record_metaspace_oom();
    +  }
    +
    +  // Expand and retry allocation
    +  result = loader_data->metaspace_non_null()->expand_and_allocate(size, mdtype);
    +  if (result != NULL) {
    +    return result;
    +  }
    +
    +  // Start full GC
    +  collect(GCCause::_metadata_GC_clear_soft_refs);
    +
    +  // Retry allocation
    +  result = loader_data->metaspace_non_null()->allocate(size, mdtype);
    +  if (result != NULL) {
    +    return result;
    +  }
    +
    +  // Expand and retry allocation
    +  result = loader_data->metaspace_non_null()->expand_and_allocate(size, mdtype);
    +  if (result != NULL) {
    +    return result;
    +  }
    +
    +  // Out of memory
    +  return NULL;
    +}
    +
    +void ShenandoahHeap::fill_with_dummy_object(HeapWord* start, HeapWord* end, bool zap) {
    +  HeapWord* obj = tlab_post_allocation_setup(start);
    +  CollectedHeap::fill_with_object(obj, end);
    +}
    +
    +size_t ShenandoahHeap::min_dummy_object_size() const {
    +  return CollectedHeap::min_dummy_object_size() + ShenandoahBrooksPointer::word_size();
    +}
    +
    +class ShenandoahEvacuateUpdateRootsClosure: public BasicOopIterateClosure {
    +private:
    +  ShenandoahHeap* _heap;
    +  Thread* _thread;
    +public:
    +  ShenandoahEvacuateUpdateRootsClosure() :
    +    _heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
    +  }
    +
    +private:
    +  template 
    +  void do_oop_work(T* p) {
    +    assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
    +
    +    T o = RawAccess<>::oop_load(p);
    +    if (! CompressedOops::is_null(o)) {
    +      oop obj = CompressedOops::decode_not_null(o);
    +      if (_heap->in_collection_set(obj)) {
    +        shenandoah_assert_marked(p, obj);
    +        oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    +        if (oopDesc::equals_raw(resolved, obj)) {
    +          resolved = _heap->evacuate_object(obj, _thread);
    +        }
    +        RawAccess::oop_store(p, resolved);
    +      }
    +    }
    +  }
    +
    +public:
    +  void do_oop(oop* p) {
    +    do_oop_work(p);
    +  }
    +  void do_oop(narrowOop* p) {
    +    do_oop_work(p);
    +  }
    +};
    +
    +class ShenandoahConcurrentEvacuateRegionObjectClosure : public ObjectClosure {
    +private:
    +  ShenandoahHeap* const _heap;
    +  Thread* const _thread;
    +public:
    +  ShenandoahConcurrentEvacuateRegionObjectClosure(ShenandoahHeap* heap) :
    +    _heap(heap), _thread(Thread::current()) {}
    +
    +  void do_object(oop p) {
    +    shenandoah_assert_marked(NULL, p);
    +    if (oopDesc::equals_raw(p, ShenandoahBarrierSet::resolve_forwarded_not_null(p))) {
    +      _heap->evacuate_object(p, _thread);
    +    }
    +  }
    +};
    +
    +class ShenandoahEvacuationTask : public AbstractGangTask {
    +private:
    +  ShenandoahHeap* const _sh;
    +  ShenandoahCollectionSet* const _cs;
    +  bool _concurrent;
    +public:
    +  ShenandoahEvacuationTask(ShenandoahHeap* sh,
    +                           ShenandoahCollectionSet* cs,
    +                           bool concurrent) :
    +    AbstractGangTask("Parallel Evacuation Task"),
    +    _sh(sh),
    +    _cs(cs),
    +    _concurrent(concurrent)
    +  {}
    +
    +  void work(uint worker_id) {
    +    if (_concurrent) {
    +      ShenandoahConcurrentWorkerSession worker_session(worker_id);
    +      ShenandoahSuspendibleThreadSetJoiner stsj(ShenandoahSuspendibleWorkers);
    +      ShenandoahEvacOOMScope oom_evac_scope;
    +      do_work();
    +    } else {
    +      ShenandoahParallelWorkerSession worker_session(worker_id);
    +      ShenandoahEvacOOMScope oom_evac_scope;
    +      do_work();
    +    }
    +  }
    +
    +private:
    +  void do_work() {
    +    ShenandoahConcurrentEvacuateRegionObjectClosure cl(_sh);
    +    ShenandoahHeapRegion* r;
    +    while ((r =_cs->claim_next()) != NULL) {
    +      assert(r->has_live(), "all-garbage regions are reclaimed early");
    +      _sh->marked_object_iterate(r, &cl);
    +
    +      if (ShenandoahPacing) {
    +        _sh->pacer()->report_evac(r->used() >> LogHeapWordSize);
    +      }
    +
    +      if (_sh->check_cancelled_gc_and_yield(_concurrent)) {
    +        break;
    +      }
    +    }
    +  }
    +};
    +
    +void ShenandoahHeap::trash_cset_regions() {
    +  ShenandoahHeapLocker locker(lock());
    +
    +  ShenandoahCollectionSet* set = collection_set();
    +  ShenandoahHeapRegion* r;
    +  set->clear_current_index();
    +  while ((r = set->next()) != NULL) {
    +    r->make_trash();
    +  }
    +  collection_set()->clear();
    +}
    +
    +void ShenandoahHeap::print_heap_regions_on(outputStream* st) const {
    +  st->print_cr("Heap Regions:");
    +  st->print_cr("EU=empty-uncommitted, EC=empty-committed, R=regular, H=humongous start, HC=humongous continuation, CS=collection set, T=trash, P=pinned");
    +  st->print_cr("BTE=bottom/top/end, U=used, T=TLAB allocs, G=GCLAB allocs, S=shared allocs, L=live data");
    +  st->print_cr("R=root, CP=critical pins, TAMS=top-at-mark-start (previous, next)");
    +  st->print_cr("SN=alloc sequence numbers (first mutator, last mutator, first gc, last gc)");
    +
    +  for (size_t i = 0; i < num_regions(); i++) {
    +    get_region(i)->print_on(st);
    +  }
    +}
    +
    +void ShenandoahHeap::trash_humongous_region_at(ShenandoahHeapRegion* start) {
    +  assert(start->is_humongous_start(), "reclaim regions starting with the first one");
    +
    +  oop humongous_obj = oop(start->bottom() + ShenandoahBrooksPointer::word_size());
    +  size_t size = humongous_obj->size() + ShenandoahBrooksPointer::word_size();
    +  size_t required_regions = ShenandoahHeapRegion::required_regions(size * HeapWordSize);
    +  size_t index = start->region_number() + required_regions - 1;
    +
    +  assert(!start->has_live(), "liveness must be zero");
    +
    +  for(size_t i = 0; i < required_regions; i++) {
    +    // Reclaim from tail. Otherwise, assertion fails when printing region to trace log,
    +    // as it expects that every region belongs to a humongous region starting with a humongous start region.
    +    ShenandoahHeapRegion* region = get_region(index --);
    +
    +    assert(region->is_humongous(), "expect correct humongous start or continuation");
    +    assert(!region->is_cset(), "Humongous region should not be in collection set");
    +
    +    region->make_trash_immediate();
    +  }
    +}
    +
    +class ShenandoahRetireGCLABClosure : public ThreadClosure {
    +public:
    +  void do_thread(Thread* thread) {
    +    PLAB* gclab = ShenandoahThreadLocalData::gclab(thread);
    +    assert(gclab != NULL, "GCLAB should be initialized for %s", thread->name());
    +    gclab->retire();
    +  }
    +};
    +
    +void ShenandoahHeap::make_parsable(bool retire_tlabs) {
    +  if (UseTLAB) {
    +    CollectedHeap::ensure_parsability(retire_tlabs);
    +  }
    +  ShenandoahRetireGCLABClosure cl;
    +  for (JavaThreadIteratorWithHandle jtiwh; JavaThread *t = jtiwh.next(); ) {
    +    cl.do_thread(t);
    +  }
    +  workers()->threads_do(&cl);
    +  _safepoint_workers->threads_do(&cl);
    +}
    +
    +void ShenandoahHeap::resize_tlabs() {
    +  CollectedHeap::resize_all_tlabs();
    +}
    +
    +class ShenandoahEvacuateUpdateRootsTask : public AbstractGangTask {
    +private:
    +  ShenandoahRootEvacuator* _rp;
    +
    +public:
    +  ShenandoahEvacuateUpdateRootsTask(ShenandoahRootEvacuator* rp) :
    +    AbstractGangTask("Shenandoah evacuate and update roots"),
    +    _rp(rp) {}
    +
    +  void work(uint worker_id) {
    +    ShenandoahParallelWorkerSession worker_session(worker_id);
    +    ShenandoahEvacOOMScope oom_evac_scope;
    +    ShenandoahEvacuateUpdateRootsClosure cl;
    +
    +    MarkingCodeBlobClosure blobsCl(&cl, CodeBlobToOopClosure::FixRelocations);
    +    _rp->process_evacuate_roots(&cl, &blobsCl, worker_id);
    +  }
    +};
    +
    +void ShenandoahHeap::evacuate_and_update_roots() {
    +#if defined(COMPILER2) || INCLUDE_JVMCI
    +  DerivedPointerTable::clear();
    +#endif
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Only iterate roots while world is stopped");
    +
    +  {
    +    ShenandoahRootEvacuator rp(this, workers()->active_workers(), ShenandoahPhaseTimings::init_evac);
    +    ShenandoahEvacuateUpdateRootsTask roots_task(&rp);
    +    workers()->run_task(&roots_task);
    +  }
    +
    +#if defined(COMPILER2) || INCLUDE_JVMCI
    +  DerivedPointerTable::update_pointers();
    +#endif
    +}
    +
    +void ShenandoahHeap::roots_iterate(OopClosure* cl) {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Only iterate roots while world is stopped");
    +
    +  CodeBlobToOopClosure blobsCl(cl, false);
    +  CLDToOopClosure cldCl(cl, ClassLoaderData::_claim_strong);
    +
    +  ShenandoahRootProcessor rp(this, 1, ShenandoahPhaseTimings::_num_phases);
    +  rp.process_all_roots(cl, NULL, &cldCl, &blobsCl, NULL, 0);
    +}
    +
    +// Returns size in bytes
    +size_t ShenandoahHeap::unsafe_max_tlab_alloc(Thread *thread) const {
    +  if (ShenandoahElasticTLAB) {
    +    // With Elastic TLABs, return the max allowed size, and let the allocation path
    +    // figure out the safe size for current allocation.
    +    return ShenandoahHeapRegion::max_tlab_size_bytes();
    +  } else {
    +    return MIN2(_free_set->unsafe_peek_free(), ShenandoahHeapRegion::max_tlab_size_bytes());
    +  }
    +}
    +
    +size_t ShenandoahHeap::max_tlab_size() const {
    +  // Returns size in words
    +  return ShenandoahHeapRegion::max_tlab_size_words();
    +}
    +
    +class ShenandoahRetireAndResetGCLABClosure : public ThreadClosure {
    +public:
    +  void do_thread(Thread* thread) {
    +    PLAB* gclab = ShenandoahThreadLocalData::gclab(thread);
    +    gclab->retire();
    +    if (ShenandoahThreadLocalData::gclab_size(thread) > 0) {
    +      ShenandoahThreadLocalData::set_gclab_size(thread, 0);
    +    }
    +  }
    +};
    +
    +void ShenandoahHeap::retire_and_reset_gclabs() {
    +  ShenandoahRetireAndResetGCLABClosure cl;
    +  for (JavaThreadIteratorWithHandle jtiwh; JavaThread *t = jtiwh.next(); ) {
    +    cl.do_thread(t);
    +  }
    +  workers()->threads_do(&cl);
    +  _safepoint_workers->threads_do(&cl);
    +}
    +
    +void ShenandoahHeap::collect(GCCause::Cause cause) {
    +  control_thread()->request_gc(cause);
    +}
    +
    +void ShenandoahHeap::do_full_collection(bool clear_all_soft_refs) {
    +  //assert(false, "Shouldn't need to do full collections");
    +}
    +
    +CollectorPolicy* ShenandoahHeap::collector_policy() const {
    +  return _shenandoah_policy;
    +}
    +
    +HeapWord* ShenandoahHeap::block_start(const void* addr) const {
    +  Space* sp = heap_region_containing(addr);
    +  if (sp != NULL) {
    +    return sp->block_start(addr);
    +  }
    +  return NULL;
    +}
    +
    +size_t ShenandoahHeap::block_size(const HeapWord* addr) const {
    +  Space* sp = heap_region_containing(addr);
    +  assert(sp != NULL, "block_size of address outside of heap");
    +  return sp->block_size(addr);
    +}
    +
    +bool ShenandoahHeap::block_is_obj(const HeapWord* addr) const {
    +  Space* sp = heap_region_containing(addr);
    +  return sp->block_is_obj(addr);
    +}
    +
    +jlong ShenandoahHeap::millis_since_last_gc() {
    +  double v = heuristics()->time_since_last_gc() * 1000;
    +  assert(0 <= v && v <= max_jlong, "value should fit: %f", v);
    +  return (jlong)v;
    +}
    +
    +void ShenandoahHeap::prepare_for_verify() {
    +  if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
    +    make_parsable(false);
    +  }
    +}
    +
    +void ShenandoahHeap::print_gc_threads_on(outputStream* st) const {
    +  workers()->print_worker_threads_on(st);
    +  if (ShenandoahStringDedup::is_enabled()) {
    +    ShenandoahStringDedup::print_worker_threads_on(st);
    +  }
    +}
    +
    +void ShenandoahHeap::gc_threads_do(ThreadClosure* tcl) const {
    +  workers()->threads_do(tcl);
    +  _safepoint_workers->threads_do(tcl);
    +  if (ShenandoahStringDedup::is_enabled()) {
    +    ShenandoahStringDedup::threads_do(tcl);
    +  }
    +}
    +
    +void ShenandoahHeap::print_tracing_info() const {
    +  LogTarget(Info, gc, stats) lt;
    +  if (lt.is_enabled()) {
    +    ResourceMark rm;
    +    LogStream ls(lt);
    +
    +    phase_timings()->print_on(&ls);
    +
    +    ls.cr();
    +    ls.cr();
    +
    +    shenandoah_policy()->print_gc_stats(&ls);
    +
    +    ls.cr();
    +    ls.cr();
    +
    +    if (ShenandoahPacing) {
    +      pacer()->print_on(&ls);
    +    }
    +
    +    ls.cr();
    +    ls.cr();
    +
    +    if (ShenandoahAllocationTrace) {
    +      assert(alloc_tracker() != NULL, "Must be");
    +      alloc_tracker()->print_on(&ls);
    +    } else {
    +      ls.print_cr("  Allocation tracing is disabled, use -XX:+ShenandoahAllocationTrace to enable.");
    +    }
    +  }
    +}
    +
    +void ShenandoahHeap::verify(VerifyOption vo) {
    +  if (ShenandoahSafepoint::is_at_shenandoah_safepoint()) {
    +    if (ShenandoahVerify) {
    +      verifier()->verify_generic(vo);
    +    } else {
    +      // TODO: Consider allocating verification bitmaps on demand,
    +      // and turn this on unconditionally.
    +    }
    +  }
    +}
    +size_t ShenandoahHeap::tlab_capacity(Thread *thr) const {
    +  return _free_set->capacity();
    +}
    +
    +class ObjectIterateScanRootClosure : public BasicOopIterateClosure {
    +private:
    +  MarkBitMap* _bitmap;
    +  Stack* _oop_stack;
    +
    +  template 
    +  void do_oop_work(T* p) {
    +    T o = RawAccess<>::oop_load(p);
    +    if (!CompressedOops::is_null(o)) {
    +      oop obj = CompressedOops::decode_not_null(o);
    +      obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    +      assert(oopDesc::is_oop(obj), "must be a valid oop");
    +      if (!_bitmap->is_marked((HeapWord*) obj)) {
    +        _bitmap->mark((HeapWord*) obj);
    +        _oop_stack->push(obj);
    +      }
    +    }
    +  }
    +public:
    +  ObjectIterateScanRootClosure(MarkBitMap* bitmap, Stack* oop_stack) :
    +    _bitmap(bitmap), _oop_stack(oop_stack) {}
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +};
    +
    +/*
    + * This is public API, used in preparation of object_iterate().
    + * Since we don't do linear scan of heap in object_iterate() (see comment below), we don't
    + * need to make the heap parsable. For Shenandoah-internal linear heap scans that we can
    + * control, we call SH::make_tlabs_parsable().
    + */
    +void ShenandoahHeap::ensure_parsability(bool retire_tlabs) {
    +  // No-op.
    +}
    +
    +/*
    + * Iterates objects in the heap. This is public API, used for, e.g., heap dumping.
    + *
    + * We cannot safely iterate objects by doing a linear scan at random points in time. Linear
    + * scanning needs to deal with dead objects, which may have dead Klass* pointers (e.g.
    + * calling oopDesc::size() would crash) or dangling reference fields (crashes) etc. Linear
    + * scanning therefore depends on having a valid marking bitmap to support it. However, we only
    + * have a valid marking bitmap after successful marking. In particular, we *don't* have a valid
    + * marking bitmap during marking, after aborted marking or during/after cleanup (when we just
    + * wiped the bitmap in preparation for next marking).
    + *
    + * For all those reasons, we implement object iteration as a single marking traversal, reporting
    + * objects as we mark+traverse through the heap, starting from GC roots. JVMTI IterateThroughHeap
    + * is allowed to report dead objects, but is not required to do so.
    + */
    +void ShenandoahHeap::object_iterate(ObjectClosure* cl) {
    +  assert(SafepointSynchronize::is_at_safepoint(), "safe iteration is only available during safepoints");
    +  if (!os::commit_memory((char*)_aux_bitmap_region.start(), _aux_bitmap_region.byte_size(), false)) {
    +    log_warning(gc)("Could not commit native memory for auxiliary marking bitmap for heap iteration");
    +    return;
    +  }
    +
    +  // Reset bitmap
    +  _aux_bit_map.clear();
    +
    +  Stack oop_stack;
    +
    +  // First, we process all GC roots. This populates the work stack with initial objects.
    +  ShenandoahRootProcessor rp(this, 1, ShenandoahPhaseTimings::_num_phases);
    +  ObjectIterateScanRootClosure oops(&_aux_bit_map, &oop_stack);
    +  CLDToOopClosure clds(&oops, ClassLoaderData::_claim_none);
    +  CodeBlobToOopClosure blobs(&oops, false);
    +  rp.process_all_roots(&oops, &oops, &clds, &blobs, NULL, 0);
    +
    +  // Work through the oop stack to traverse heap.
    +  while (! oop_stack.is_empty()) {
    +    oop obj = oop_stack.pop();
    +    assert(oopDesc::is_oop(obj), "must be a valid oop");
    +    cl->do_object(obj);
    +    obj->oop_iterate(&oops);
    +  }
    +
    +  assert(oop_stack.is_empty(), "should be empty");
    +
    +  if (!os::uncommit_memory((char*)_aux_bitmap_region.start(), _aux_bitmap_region.byte_size())) {
    +    log_warning(gc)("Could not uncommit native memory for auxiliary marking bitmap for heap iteration");
    +  }
    +}
    +
    +void ShenandoahHeap::safe_object_iterate(ObjectClosure* cl) {
    +  assert(SafepointSynchronize::is_at_safepoint(), "safe iteration is only available during safepoints");
    +  object_iterate(cl);
    +}
    +
    +void ShenandoahHeap::heap_region_iterate(ShenandoahHeapRegionClosure* blk) const {
    +  for (size_t i = 0; i < num_regions(); i++) {
    +    ShenandoahHeapRegion* current = get_region(i);
    +    blk->heap_region_do(current);
    +  }
    +}
    +
    +class ShenandoahParallelHeapRegionTask : public AbstractGangTask {
    +private:
    +  ShenandoahHeap* const _heap;
    +  ShenandoahHeapRegionClosure* const _blk;
    +
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile size_t));
    +  volatile size_t _index;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +public:
    +  ShenandoahParallelHeapRegionTask(ShenandoahHeapRegionClosure* blk) :
    +          AbstractGangTask("Parallel Region Task"),
    +          _heap(ShenandoahHeap::heap()), _blk(blk), _index(0) {}
    +
    +  void work(uint worker_id) {
    +    size_t stride = ShenandoahParallelRegionStride;
    +
    +    size_t max = _heap->num_regions();
    +    while (_index < max) {
    +      size_t cur = Atomic::add(stride, &_index) - stride;
    +      size_t start = cur;
    +      size_t end = MIN2(cur + stride, max);
    +      if (start >= max) break;
    +
    +      for (size_t i = cur; i < end; i++) {
    +        ShenandoahHeapRegion* current = _heap->get_region(i);
    +        _blk->heap_region_do(current);
    +      }
    +    }
    +  }
    +};
    +
    +void ShenandoahHeap::parallel_heap_region_iterate(ShenandoahHeapRegionClosure* blk) const {
    +  assert(blk->is_thread_safe(), "Only thread-safe closures here");
    +  if (num_regions() > ShenandoahParallelRegionStride) {
    +    ShenandoahParallelHeapRegionTask task(blk);
    +    workers()->run_task(&task);
    +  } else {
    +    heap_region_iterate(blk);
    +  }
    +}
    +
    +class ShenandoahClearLivenessClosure : public ShenandoahHeapRegionClosure {
    +private:
    +  ShenandoahMarkingContext* const _ctx;
    +public:
    +  ShenandoahClearLivenessClosure() : _ctx(ShenandoahHeap::heap()->marking_context()) {}
    +
    +  void heap_region_do(ShenandoahHeapRegion* r) {
    +    if (r->is_active()) {
    +      r->clear_live_data();
    +      _ctx->capture_top_at_mark_start(r);
    +    } else {
    +      assert(!r->has_live(), "Region " SIZE_FORMAT " should have no live data", r->region_number());
    +      assert(_ctx->top_at_mark_start(r) == r->top(),
    +             "Region " SIZE_FORMAT " should already have correct TAMS", r->region_number());
    +    }
    +  }
    +
    +  bool is_thread_safe() { return true; }
    +};
    +
    +void ShenandoahHeap::op_init_mark() {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Should be at safepoint");
    +  assert(Thread::current()->is_VM_thread(), "can only do this in VMThread");
    +
    +  assert(marking_context()->is_bitmap_clear(), "need clear marking bitmap");
    +  assert(!marking_context()->is_complete(), "should not be complete");
    +
    +  if (ShenandoahVerify) {
    +    verifier()->verify_before_concmark();
    +  }
    +
    +  if (VerifyBeforeGC) {
    +    Universe::verify();
    +  }
    +
    +  set_concurrent_mark_in_progress(true);
    +  // We need to reset all TLABs because we'd lose marks on all objects allocated in them.
    +  {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::make_parsable);
    +    make_parsable(true);
    +  }
    +
    +  {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::clear_liveness);
    +    ShenandoahClearLivenessClosure clc;
    +    parallel_heap_region_iterate(&clc);
    +  }
    +
    +  // Make above changes visible to worker threads
    +  OrderAccess::fence();
    +
    +  concurrent_mark()->mark_roots(ShenandoahPhaseTimings::scan_roots);
    +
    +  if (UseTLAB) {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::resize_tlabs);
    +    resize_tlabs();
    +  }
    +
    +  if (ShenandoahPacing) {
    +    pacer()->setup_for_mark();
    +  }
    +}
    +
    +void ShenandoahHeap::op_mark() {
    +  concurrent_mark()->mark_from_roots();
    +}
    +
    +class ShenandoahCompleteLivenessClosure : public ShenandoahHeapRegionClosure {
    +private:
    +  ShenandoahMarkingContext* const _ctx;
    +public:
    +  ShenandoahCompleteLivenessClosure() : _ctx(ShenandoahHeap::heap()->complete_marking_context()) {}
    +
    +  void heap_region_do(ShenandoahHeapRegion* r) {
    +    if (r->is_active()) {
    +      HeapWord *tams = _ctx->top_at_mark_start(r);
    +      HeapWord *top = r->top();
    +      if (top > tams) {
    +        r->increase_live_data_alloc_words(pointer_delta(top, tams));
    +      }
    +    } else {
    +      assert(!r->has_live(), "Region " SIZE_FORMAT " should have no live data", r->region_number());
    +      assert(_ctx->top_at_mark_start(r) == r->top(),
    +             "Region " SIZE_FORMAT " should have correct TAMS", r->region_number());
    +    }
    +  }
    +
    +  bool is_thread_safe() { return true; }
    +};
    +
    +void ShenandoahHeap::op_final_mark() {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Should be at safepoint");
    +
    +  // It is critical that we
    +  // evacuate roots right after finishing marking, so that we don't
    +  // get unmarked objects in the roots.
    +
    +  if (!cancelled_gc()) {
    +    concurrent_mark()->finish_mark_from_roots(/* full_gc = */ false);
    +
    +    if (has_forwarded_objects()) {
    +      concurrent_mark()->update_roots(ShenandoahPhaseTimings::update_roots);
    +    }
    +
    +    stop_concurrent_marking();
    +
    +    {
    +      ShenandoahGCPhase phase(ShenandoahPhaseTimings::complete_liveness);
    +
    +      // All allocations past TAMS are implicitly live, adjust the region data.
    +      // Bitmaps/TAMS are swapped at this point, so we need to poll complete bitmap.
    +      ShenandoahCompleteLivenessClosure cl;
    +      parallel_heap_region_iterate(&cl);
    +    }
    +
    +    {
    +      ShenandoahGCPhase prepare_evac(ShenandoahPhaseTimings::prepare_evac);
    +
    +      make_parsable(true);
    +
    +      trash_cset_regions();
    +
    +      {
    +        ShenandoahHeapLocker locker(lock());
    +        _collection_set->clear();
    +        _free_set->clear();
    +
    +        heuristics()->choose_collection_set(_collection_set);
    +
    +        _free_set->rebuild();
    +      }
    +    }
    +
    +    // If collection set has candidates, start evacuation.
    +    // Otherwise, bypass the rest of the cycle.
    +    if (!collection_set()->is_empty()) {
    +      ShenandoahGCPhase init_evac(ShenandoahPhaseTimings::init_evac);
    +
    +      if (ShenandoahVerify) {
    +        verifier()->verify_before_evacuation();
    +      }
    +
    +      set_evacuation_in_progress(true);
    +      // From here on, we need to update references.
    +      set_has_forwarded_objects(true);
    +
    +      evacuate_and_update_roots();
    +
    +      if (ShenandoahPacing) {
    +        pacer()->setup_for_evac();
    +      }
    +    } else {
    +      if (ShenandoahVerify) {
    +        verifier()->verify_after_concmark();
    +      }
    +
    +      if (VerifyAfterGC) {
    +        Universe::verify();
    +      }
    +    }
    +
    +  } else {
    +    concurrent_mark()->cancel();
    +    stop_concurrent_marking();
    +
    +    if (process_references()) {
    +      // Abandon reference processing right away: pre-cleaning must have failed.
    +      ReferenceProcessor *rp = ref_processor();
    +      rp->disable_discovery();
    +      rp->abandon_partial_discovery();
    +      rp->verify_no_references_recorded();
    +    }
    +  }
    +}
    +
    +void ShenandoahHeap::op_final_evac() {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Should be at safepoint");
    +
    +  set_evacuation_in_progress(false);
    +
    +  retire_and_reset_gclabs();
    +
    +  if (ShenandoahVerify) {
    +    verifier()->verify_after_evacuation();
    +  }
    +
    +  if (VerifyAfterGC) {
    +    Universe::verify();
    +  }
    +}
    +
    +void ShenandoahHeap::op_conc_evac() {
    +  ShenandoahEvacuationTask task(this, _collection_set, true);
    +  workers()->run_task(&task);
    +}
    +
    +void ShenandoahHeap::op_stw_evac() {
    +  ShenandoahEvacuationTask task(this, _collection_set, false);
    +  workers()->run_task(&task);
    +}
    +
    +void ShenandoahHeap::op_updaterefs() {
    +  update_heap_references(true);
    +}
    +
    +void ShenandoahHeap::op_cleanup() {
    +  free_set()->recycle_trash();
    +}
    +
    +void ShenandoahHeap::op_reset() {
    +  reset_mark_bitmap();
    +}
    +
    +void ShenandoahHeap::op_preclean() {
    +  concurrent_mark()->preclean_weak_refs();
    +}
    +
    +void ShenandoahHeap::op_init_traversal() {
    +  traversal_gc()->init_traversal_collection();
    +}
    +
    +void ShenandoahHeap::op_traversal() {
    +  traversal_gc()->concurrent_traversal_collection();
    +}
    +
    +void ShenandoahHeap::op_final_traversal() {
    +  traversal_gc()->final_traversal_collection();
    +}
    +
    +void ShenandoahHeap::op_full(GCCause::Cause cause) {
    +  ShenandoahMetricsSnapshot metrics;
    +  metrics.snap_before();
    +
    +  full_gc()->do_it(cause);
    +  if (UseTLAB) {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_resize_tlabs);
    +    resize_all_tlabs();
    +  }
    +
    +  metrics.snap_after();
    +  metrics.print();
    +
    +  if (metrics.is_good_progress("Full GC")) {
    +    _progress_last_gc.set();
    +  } else {
    +    // Nothing to do. Tell the allocation path that we have failed to make
    +    // progress, and it can finally fail.
    +    _progress_last_gc.unset();
    +  }
    +}
    +
    +void ShenandoahHeap::op_degenerated(ShenandoahDegenPoint point) {
    +  // Degenerated GC is STW, but it can also fail. Current mechanics communicates
    +  // GC failure via cancelled_concgc() flag. So, if we detect the failure after
    +  // some phase, we have to upgrade the Degenerate GC to Full GC.
    +
    +  clear_cancelled_gc();
    +
    +  ShenandoahMetricsSnapshot metrics;
    +  metrics.snap_before();
    +
    +  switch (point) {
    +    case _degenerated_traversal:
    +      {
    +        // Drop the collection set. Note: this leaves some already forwarded objects
    +        // behind, which may be problematic, see comments for ShenandoahEvacAssist
    +        // workarounds in ShenandoahTraversalHeuristics.
    +
    +        ShenandoahHeapLocker locker(lock());
    +        collection_set()->clear_current_index();
    +        for (size_t i = 0; i < collection_set()->count(); i++) {
    +          ShenandoahHeapRegion* r = collection_set()->next();
    +          r->make_regular_bypass();
    +        }
    +        collection_set()->clear();
    +      }
    +      op_final_traversal();
    +      op_cleanup();
    +      return;
    +
    +    // The cases below form the Duff's-like device: it describes the actual GC cycle,
    +    // but enters it at different points, depending on which concurrent phase had
    +    // degenerated.
    +
    +    case _degenerated_outside_cycle:
    +      // We have degenerated from outside the cycle, which means something is bad with
    +      // the heap, most probably heavy humongous fragmentation, or we are very low on free
    +      // space. It makes little sense to wait for Full GC to reclaim as much as it can, when
    +      // we can do the most aggressive degen cycle, which includes processing references and
    +      // class unloading, unless those features are explicitly disabled.
    +      //
    +      // Note that we can only do this for "outside-cycle" degens, otherwise we would risk
    +      // changing the cycle parameters mid-cycle during concurrent -> degenerated handover.
    +      set_process_references(heuristics()->can_process_references());
    +      set_unload_classes(heuristics()->can_unload_classes());
    +
    +      if (heuristics()->can_do_traversal_gc()) {
    +        // Not possible to degenerate from here, upgrade to Full GC right away.
    +        cancel_gc(GCCause::_shenandoah_upgrade_to_full_gc);
    +        op_degenerated_fail();
    +        return;
    +      }
    +
    +      op_reset();
    +
    +      op_init_mark();
    +      if (cancelled_gc()) {
    +        op_degenerated_fail();
    +        return;
    +      }
    +
    +    case _degenerated_mark:
    +      op_final_mark();
    +      if (cancelled_gc()) {
    +        op_degenerated_fail();
    +        return;
    +      }
    +
    +      op_cleanup();
    +
    +    case _degenerated_evac:
    +      // If heuristics thinks we should do the cycle, this flag would be set,
    +      // and we can do evacuation. Otherwise, it would be the shortcut cycle.
    +      if (is_evacuation_in_progress()) {
    +
    +        // Degeneration under oom-evac protocol might have left some objects in
    +        // collection set un-evacuated. Restart evacuation from the beginning to
    +        // capture all objects. For all the objects that are already evacuated,
    +        // it would be a simple check, which is supposed to be fast. This is also
    +        // safe to do even without degeneration, as CSet iterator is at beginning
    +        // in preparation for evacuation anyway.
    +        collection_set()->clear_current_index();
    +
    +        op_stw_evac();
    +        if (cancelled_gc()) {
    +          op_degenerated_fail();
    +          return;
    +        }
    +      }
    +
    +      // If heuristics thinks we should do the cycle, this flag would be set,
    +      // and we need to do update-refs. Otherwise, it would be the shortcut cycle.
    +      if (has_forwarded_objects()) {
    +        op_init_updaterefs();
    +        if (cancelled_gc()) {
    +          op_degenerated_fail();
    +          return;
    +        }
    +      }
    +
    +    case _degenerated_updaterefs:
    +      if (has_forwarded_objects()) {
    +        op_final_updaterefs();
    +        if (cancelled_gc()) {
    +          op_degenerated_fail();
    +          return;
    +        }
    +      }
    +
    +      op_cleanup();
    +      break;
    +
    +    default:
    +      ShouldNotReachHere();
    +  }
    +
    +  if (ShenandoahVerify) {
    +    verifier()->verify_after_degenerated();
    +  }
    +
    +  if (VerifyAfterGC) {
    +    Universe::verify();
    +  }
    +
    +  metrics.snap_after();
    +  metrics.print();
    +
    +  // Check for futility and fail. There is no reason to do several back-to-back Degenerated cycles,
    +  // because that probably means the heap is overloaded and/or fragmented.
    +  if (!metrics.is_good_progress("Degenerated GC")) {
    +    _progress_last_gc.unset();
    +    cancel_gc(GCCause::_shenandoah_upgrade_to_full_gc);
    +    op_degenerated_futile();
    +  } else {
    +    _progress_last_gc.set();
    +  }
    +}
    +
    +void ShenandoahHeap::op_degenerated_fail() {
    +  log_info(gc)("Cannot finish degeneration, upgrading to Full GC");
    +  shenandoah_policy()->record_degenerated_upgrade_to_full();
    +  op_full(GCCause::_shenandoah_upgrade_to_full_gc);
    +}
    +
    +void ShenandoahHeap::op_degenerated_futile() {
    +  shenandoah_policy()->record_degenerated_upgrade_to_full();
    +  op_full(GCCause::_shenandoah_upgrade_to_full_gc);
    +}
    +
    +void ShenandoahHeap::stop_concurrent_marking() {
    +  assert(is_concurrent_mark_in_progress(), "How else could we get here?");
    +  if (!cancelled_gc()) {
    +    // If we needed to update refs, and concurrent marking has been cancelled,
    +    // we need to finish updating references.
    +    set_has_forwarded_objects(false);
    +    mark_complete_marking_context();
    +  }
    +  set_concurrent_mark_in_progress(false);
    +}
    +
    +void ShenandoahHeap::force_satb_flush_all_threads() {
    +  if (!is_concurrent_mark_in_progress() && !is_concurrent_traversal_in_progress()) {
    +    // No need to flush SATBs
    +    return;
    +  }
    +
    +  for (JavaThreadIteratorWithHandle jtiwh; JavaThread *t = jtiwh.next(); ) {
    +    ShenandoahThreadLocalData::set_force_satb_flush(t, true);
    +  }
    +  // The threads are not "acquiring" their thread-local data, but it does not
    +  // hurt to "release" the updates here anyway.
    +  OrderAccess::fence();
    +}
    +
    +void ShenandoahHeap::set_gc_state_all_threads(char state) {
    +  for (JavaThreadIteratorWithHandle jtiwh; JavaThread *t = jtiwh.next(); ) {
    +    ShenandoahThreadLocalData::set_gc_state(t, state);
    +  }
    +}
    +
    +void ShenandoahHeap::set_gc_state_mask(uint mask, bool value) {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Should really be Shenandoah safepoint");
    +  _gc_state.set_cond(mask, value);
    +  set_gc_state_all_threads(_gc_state.raw_value());
    +}
    +
    +void ShenandoahHeap::set_concurrent_mark_in_progress(bool in_progress) {
    +  set_gc_state_mask(MARKING, in_progress);
    +  ShenandoahBarrierSet::satb_mark_queue_set().set_active_all_threads(in_progress, !in_progress);
    +}
    +
    +void ShenandoahHeap::set_concurrent_traversal_in_progress(bool in_progress) {
    +   set_gc_state_mask(TRAVERSAL | HAS_FORWARDED, in_progress);
    +   ShenandoahBarrierSet::satb_mark_queue_set().set_active_all_threads(in_progress, !in_progress);
    +}
    +
    +void ShenandoahHeap::set_evacuation_in_progress(bool in_progress) {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Only call this at safepoint");
    +  set_gc_state_mask(EVACUATION, in_progress);
    +}
    +
    +HeapWord* ShenandoahHeap::tlab_post_allocation_setup(HeapWord* obj) {
    +  // Initialize Brooks pointer for the next object
    +  HeapWord* result = obj + ShenandoahBrooksPointer::word_size();
    +  ShenandoahBrooksPointer::initialize(oop(result));
    +  return result;
    +}
    +
    +ShenandoahForwardedIsAliveClosure::ShenandoahForwardedIsAliveClosure() :
    +  _mark_context(ShenandoahHeap::heap()->marking_context()) {
    +}
    +
    +ShenandoahIsAliveClosure::ShenandoahIsAliveClosure() :
    +  _mark_context(ShenandoahHeap::heap()->marking_context()) {
    +}
    +
    +bool ShenandoahForwardedIsAliveClosure::do_object_b(oop obj) {
    +  if (CompressedOops::is_null(obj)) {
    +    return false;
    +  }
    +  obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    +  shenandoah_assert_not_forwarded_if(NULL, obj, ShenandoahHeap::heap()->is_concurrent_mark_in_progress() || ShenandoahHeap::heap()->is_concurrent_traversal_in_progress());
    +  return _mark_context->is_marked(obj);
    +}
    +
    +bool ShenandoahIsAliveClosure::do_object_b(oop obj) {
    +  if (CompressedOops::is_null(obj)) {
    +    return false;
    +  }
    +  shenandoah_assert_not_forwarded(NULL, obj);
    +  return _mark_context->is_marked(obj);
    +}
    +
    +void ShenandoahHeap::ref_processing_init() {
    +  assert(_max_workers > 0, "Sanity");
    +
    +  _ref_processor =
    +    new ReferenceProcessor(&_subject_to_discovery,  // is_subject_to_discovery
    +                           ParallelRefProcEnabled,  // MT processing
    +                           _max_workers,            // Degree of MT processing
    +                           true,                    // MT discovery
    +                           _max_workers,            // Degree of MT discovery
    +                           false,                   // Reference discovery is not atomic
    +                           NULL,                    // No closure, should be installed before use
    +                           true);                   // Scale worker threads
    +
    +  shenandoah_assert_rp_isalive_not_installed();
    +}
    +
    +GCTracer* ShenandoahHeap::tracer() {
    +  return shenandoah_policy()->tracer();
    +}
    +
    +size_t ShenandoahHeap::tlab_used(Thread* thread) const {
    +  return _free_set->used();
    +}
    +
    +void ShenandoahHeap::cancel_gc(GCCause::Cause cause) {
    +  if (try_cancel_gc()) {
    +    FormatBuffer<> msg("Cancelling GC: %s", GCCause::to_string(cause));
    +    log_info(gc)("%s", msg.buffer());
    +    Events::log(Thread::current(), "%s", msg.buffer());
    +  }
    +}
    +
    +uint ShenandoahHeap::max_workers() {
    +  return _max_workers;
    +}
    +
    +void ShenandoahHeap::stop() {
    +  // The shutdown sequence should be able to terminate when GC is running.
    +
    +  // Step 0. Notify policy to disable event recording.
    +  _shenandoah_policy->record_shutdown();
    +
    +  // Step 1. Notify control thread that we are in shutdown.
    +  // Note that we cannot do that with stop(), because stop() is blocking and waits for the actual shutdown.
    +  // Doing stop() here would wait for the normal GC cycle to complete, never falling through to cancel below.
    +  control_thread()->prepare_for_graceful_shutdown();
    +
    +  // Step 2. Notify GC workers that we are cancelling GC.
    +  cancel_gc(GCCause::_shenandoah_stop_vm);
    +
    +  // Step 3. Wait until GC worker exits normally.
    +  control_thread()->stop();
    +
    +  // Step 4. Stop String Dedup thread if it is active
    +  if (ShenandoahStringDedup::is_enabled()) {
    +    ShenandoahStringDedup::stop();
    +  }
    +}
    +
    +void ShenandoahHeap::unload_classes_and_cleanup_tables(bool full_gc) {
    +  assert(heuristics()->can_unload_classes(), "Class unloading should be enabled");
    +
    +  ShenandoahGCPhase root_phase(full_gc ?
    +                               ShenandoahPhaseTimings::full_gc_purge :
    +                               ShenandoahPhaseTimings::purge);
    +
    +  ShenandoahIsAliveSelector alive;
    +  BoolObjectClosure* is_alive = alive.is_alive_closure();
    +
    +  bool purged_class;
    +
    +  // Unload classes and purge SystemDictionary.
    +  {
    +    ShenandoahGCPhase phase(full_gc ?
    +                            ShenandoahPhaseTimings::full_gc_purge_class_unload :
    +                            ShenandoahPhaseTimings::purge_class_unload);
    +    purged_class = SystemDictionary::do_unloading(gc_timer());
    +  }
    +
    +  {
    +    ShenandoahGCPhase phase(full_gc ?
    +                            ShenandoahPhaseTimings::full_gc_purge_par :
    +                            ShenandoahPhaseTimings::purge_par);
    +    uint active = _workers->active_workers();
    +    StringDedupUnlinkOrOopsDoClosure dedup_cl(is_alive, NULL);
    +    ParallelCleaningTask unlink_task(is_alive, &dedup_cl, active, purged_class);
    +    _workers->run_task(&unlink_task);
    +  }
    +
    +  if (ShenandoahStringDedup::is_enabled()) {
    +    ShenandoahGCPhase phase(full_gc ?
    +                            ShenandoahPhaseTimings::full_gc_purge_string_dedup :
    +                            ShenandoahPhaseTimings::purge_string_dedup);
    +    ShenandoahStringDedup::parallel_cleanup();
    +  }
    +
    +  {
    +    ShenandoahGCPhase phase(full_gc ?
    +                      ShenandoahPhaseTimings::full_gc_purge_cldg :
    +                      ShenandoahPhaseTimings::purge_cldg);
    +    ClassLoaderDataGraph::purge();
    +  }
    +}
    +
    +void ShenandoahHeap::set_has_forwarded_objects(bool cond) {
    +  set_gc_state_mask(HAS_FORWARDED, cond);
    +}
    +
    +void ShenandoahHeap::set_process_references(bool pr) {
    +  _process_references.set_cond(pr);
    +}
    +
    +void ShenandoahHeap::set_unload_classes(bool uc) {
    +  _unload_classes.set_cond(uc);
    +}
    +
    +bool ShenandoahHeap::process_references() const {
    +  return _process_references.is_set();
    +}
    +
    +bool ShenandoahHeap::unload_classes() const {
    +  return _unload_classes.is_set();
    +}
    +
    +address ShenandoahHeap::in_cset_fast_test_addr() {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  assert(heap->collection_set() != NULL, "Sanity");
    +  return (address) heap->collection_set()->biased_map_address();
    +}
    +
    +address ShenandoahHeap::cancelled_gc_addr() {
    +  return (address) ShenandoahHeap::heap()->_cancelled_gc.addr_of();
    +}
    +
    +address ShenandoahHeap::gc_state_addr() {
    +  return (address) ShenandoahHeap::heap()->_gc_state.addr_of();
    +}
    +
    +size_t ShenandoahHeap::bytes_allocated_since_gc_start() {
    +  return OrderAccess::load_acquire(&_bytes_allocated_since_gc_start);
    +}
    +
    +void ShenandoahHeap::reset_bytes_allocated_since_gc_start() {
    +  OrderAccess::release_store_fence(&_bytes_allocated_since_gc_start, (size_t)0);
    +}
    +
    +void ShenandoahHeap::set_degenerated_gc_in_progress(bool in_progress) {
    +  _degenerated_gc_in_progress.set_cond(in_progress);
    +}
    +
    +void ShenandoahHeap::set_full_gc_in_progress(bool in_progress) {
    +  _full_gc_in_progress.set_cond(in_progress);
    +}
    +
    +void ShenandoahHeap::set_full_gc_move_in_progress(bool in_progress) {
    +  assert (is_full_gc_in_progress(), "should be");
    +  _full_gc_move_in_progress.set_cond(in_progress);
    +}
    +
    +void ShenandoahHeap::set_update_refs_in_progress(bool in_progress) {
    +  set_gc_state_mask(UPDATEREFS, in_progress);
    +}
    +
    +void ShenandoahHeap::register_nmethod(nmethod* nm) {
    +  ShenandoahCodeRoots::add_nmethod(nm);
    +}
    +
    +void ShenandoahHeap::unregister_nmethod(nmethod* nm) {
    +  ShenandoahCodeRoots::remove_nmethod(nm);
    +}
    +
    +oop ShenandoahHeap::pin_object(JavaThread* thr, oop o) {
    +  o = ShenandoahBarrierSet::barrier_set()->write_barrier(o);
    +  ShenandoahHeapLocker locker(lock());
    +  heap_region_containing(o)->make_pinned();
    +  return o;
    +}
    +
    +void ShenandoahHeap::unpin_object(JavaThread* thr, oop o) {
    +  o = ShenandoahBarrierSet::barrier_set()->read_barrier(o);
    +  ShenandoahHeapLocker locker(lock());
    +  heap_region_containing(o)->make_unpinned();
    +}
    +
    +GCTimer* ShenandoahHeap::gc_timer() const {
    +  return _gc_timer;
    +}
    +
    +#ifdef ASSERT
    +void ShenandoahHeap::assert_gc_workers(uint nworkers) {
    +  assert(nworkers > 0 && nworkers <= max_workers(), "Sanity");
    +
    +  if (ShenandoahSafepoint::is_at_shenandoah_safepoint()) {
    +    if (UseDynamicNumberOfGCThreads ||
    +        (FLAG_IS_DEFAULT(ParallelGCThreads) && ForceDynamicNumberOfGCThreads)) {
    +      assert(nworkers <= ParallelGCThreads, "Cannot use more than it has");
    +    } else {
    +      // Use ParallelGCThreads inside safepoints
    +      assert(nworkers == ParallelGCThreads, "Use ParalleGCThreads within safepoints");
    +    }
    +  } else {
    +    if (UseDynamicNumberOfGCThreads ||
    +        (FLAG_IS_DEFAULT(ConcGCThreads) && ForceDynamicNumberOfGCThreads)) {
    +      assert(nworkers <= ConcGCThreads, "Cannot use more than it has");
    +    } else {
    +      // Use ConcGCThreads outside safepoints
    +      assert(nworkers == ConcGCThreads, "Use ConcGCThreads outside safepoints");
    +    }
    +  }
    +}
    +#endif
    +
    +ShenandoahVerifier* ShenandoahHeap::verifier() {
    +  guarantee(ShenandoahVerify, "Should be enabled");
    +  assert (_verifier != NULL, "sanity");
    +  return _verifier;
    +}
    +
    +template
    +class ShenandoahUpdateHeapRefsTask : public AbstractGangTask {
    +private:
    +  T cl;
    +  ShenandoahHeap* _heap;
    +  ShenandoahRegionIterator* _regions;
    +  bool _concurrent;
    +public:
    +  ShenandoahUpdateHeapRefsTask(ShenandoahRegionIterator* regions, bool concurrent) :
    +    AbstractGangTask("Concurrent Update References Task"),
    +    cl(T()),
    +    _heap(ShenandoahHeap::heap()),
    +    _regions(regions),
    +    _concurrent(concurrent) {
    +  }
    +
    +  void work(uint worker_id) {
    +    if (_concurrent) {
    +      ShenandoahConcurrentWorkerSession worker_session(worker_id);
    +      ShenandoahSuspendibleThreadSetJoiner stsj(ShenandoahSuspendibleWorkers);
    +      do_work();
    +    } else {
    +      ShenandoahParallelWorkerSession worker_session(worker_id);
    +      do_work();
    +    }
    +  }
    +
    +private:
    +  void do_work() {
    +    ShenandoahHeapRegion* r = _regions->next();
    +    ShenandoahMarkingContext* const ctx = _heap->complete_marking_context();
    +    while (r != NULL) {
    +      HeapWord* top_at_start_ur = r->concurrent_iteration_safe_limit();
    +      assert (top_at_start_ur >= r->bottom(), "sanity");
    +      if (r->is_active() && !r->is_cset()) {
    +        _heap->marked_object_oop_iterate(r, &cl, top_at_start_ur);
    +      }
    +      if (ShenandoahPacing) {
    +        _heap->pacer()->report_updaterefs(pointer_delta(top_at_start_ur, r->bottom()));
    +      }
    +      if (_heap->check_cancelled_gc_and_yield(_concurrent)) {
    +        return;
    +      }
    +      r = _regions->next();
    +    }
    +  }
    +};
    +
    +void ShenandoahHeap::update_heap_references(bool concurrent) {
    +  ShenandoahUpdateHeapRefsTask task(&_update_refs_iterator, concurrent);
    +  workers()->run_task(&task);
    +}
    +
    +void ShenandoahHeap::op_init_updaterefs() {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "must be at safepoint");
    +
    +  set_evacuation_in_progress(false);
    +
    +  retire_and_reset_gclabs();
    +
    +  if (ShenandoahVerify) {
    +    verifier()->verify_before_updaterefs();
    +  }
    +
    +  set_update_refs_in_progress(true);
    +  make_parsable(true);
    +  for (uint i = 0; i < num_regions(); i++) {
    +    ShenandoahHeapRegion* r = get_region(i);
    +    r->set_concurrent_iteration_safe_limit(r->top());
    +  }
    +
    +  // Reset iterator.
    +  _update_refs_iterator.reset();
    +
    +  if (ShenandoahPacing) {
    +    pacer()->setup_for_updaterefs();
    +  }
    +}
    +
    +void ShenandoahHeap::op_final_updaterefs() {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "must be at safepoint");
    +
    +  // Check if there is left-over work, and finish it
    +  if (_update_refs_iterator.has_next()) {
    +    ShenandoahGCPhase final_work(ShenandoahPhaseTimings::final_update_refs_finish_work);
    +
    +    // Finish updating references where we left off.
    +    clear_cancelled_gc();
    +    update_heap_references(false);
    +  }
    +
    +  // Clear cancelled GC, if set. On cancellation path, the block before would handle
    +  // everything. On degenerated paths, cancelled gc would not be set anyway.
    +  if (cancelled_gc()) {
    +    clear_cancelled_gc();
    +  }
    +  assert(!cancelled_gc(), "Should have been done right before");
    +
    +  concurrent_mark()->update_roots(is_degenerated_gc_in_progress() ?
    +                                 ShenandoahPhaseTimings::degen_gc_update_roots:
    +                                 ShenandoahPhaseTimings::final_update_refs_roots);
    +
    +  ShenandoahGCPhase final_update_refs(ShenandoahPhaseTimings::final_update_refs_recycle);
    +
    +  trash_cset_regions();
    +  set_has_forwarded_objects(false);
    +  set_update_refs_in_progress(false);
    +
    +  if (ShenandoahVerify) {
    +    verifier()->verify_after_updaterefs();
    +  }
    +
    +  if (VerifyAfterGC) {
    +    Universe::verify();
    +  }
    +
    +  {
    +    ShenandoahHeapLocker locker(lock());
    +    _free_set->rebuild();
    +  }
    +}
    +
    +#ifdef ASSERT
    +void ShenandoahHeap::assert_heaplock_owned_by_current_thread() {
    +  _lock.assert_owned_by_current_thread();
    +}
    +
    +void ShenandoahHeap::assert_heaplock_not_owned_by_current_thread() {
    +  _lock.assert_not_owned_by_current_thread();
    +}
    +
    +void ShenandoahHeap::assert_heaplock_or_safepoint() {
    +  _lock.assert_owned_by_current_thread_or_safepoint();
    +}
    +#endif
    +
    +void ShenandoahHeap::print_extended_on(outputStream *st) const {
    +  print_on(st);
    +  print_heap_regions_on(st);
    +}
    +
    +bool ShenandoahHeap::is_bitmap_slice_committed(ShenandoahHeapRegion* r, bool skip_self) {
    +  size_t slice = r->region_number() / _bitmap_regions_per_slice;
    +
    +  size_t regions_from = _bitmap_regions_per_slice * slice;
    +  size_t regions_to   = MIN2(num_regions(), _bitmap_regions_per_slice * (slice + 1));
    +  for (size_t g = regions_from; g < regions_to; g++) {
    +    assert (g / _bitmap_regions_per_slice == slice, "same slice");
    +    if (skip_self && g == r->region_number()) continue;
    +    if (get_region(g)->is_committed()) {
    +      return true;
    +    }
    +  }
    +  return false;
    +}
    +
    +bool ShenandoahHeap::commit_bitmap_slice(ShenandoahHeapRegion* r) {
    +  assert_heaplock_owned_by_current_thread();
    +
    +  if (is_bitmap_slice_committed(r, true)) {
    +    // Some other region from the group is already committed, meaning the bitmap
    +    // slice is already committed, we exit right away.
    +    return true;
    +  }
    +
    +  // Commit the bitmap slice:
    +  size_t slice = r->region_number() / _bitmap_regions_per_slice;
    +  size_t off = _bitmap_bytes_per_slice * slice;
    +  size_t len = _bitmap_bytes_per_slice;
    +  if (!os::commit_memory((char*)_bitmap_region.start() + off, len, false)) {
    +    return false;
    +  }
    +  return true;
    +}
    +
    +bool ShenandoahHeap::uncommit_bitmap_slice(ShenandoahHeapRegion *r) {
    +  assert_heaplock_owned_by_current_thread();
    +
    +  if (is_bitmap_slice_committed(r, true)) {
    +    // Some other region from the group is still committed, meaning the bitmap
    +    // slice is should stay committed, exit right away.
    +    return true;
    +  }
    +
    +  // Uncommit the bitmap slice:
    +  size_t slice = r->region_number() / _bitmap_regions_per_slice;
    +  size_t off = _bitmap_bytes_per_slice * slice;
    +  size_t len = _bitmap_bytes_per_slice;
    +  if (!os::uncommit_memory((char*)_bitmap_region.start() + off, len)) {
    +    return false;
    +  }
    +  return true;
    +}
    +
    +void ShenandoahHeap::safepoint_synchronize_begin() {
    +  if (ShenandoahSuspendibleWorkers || UseStringDeduplication) {
    +    SuspendibleThreadSet::synchronize();
    +  }
    +}
    +
    +void ShenandoahHeap::safepoint_synchronize_end() {
    +  if (ShenandoahSuspendibleWorkers || UseStringDeduplication) {
    +    SuspendibleThreadSet::desynchronize();
    +  }
    +}
    +
    +void ShenandoahHeap::vmop_entry_init_mark() {
    +  TraceCollectorStats tcs(monitoring_support()->stw_collection_counters());
    +  ShenandoahGCPhase total(ShenandoahPhaseTimings::total_pause_gross);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::init_mark_gross);
    +
    +  try_inject_alloc_failure();
    +  VM_ShenandoahInitMark op;
    +  VMThread::execute(&op); // jump to entry_init_mark() under safepoint
    +}
    +
    +void ShenandoahHeap::vmop_entry_final_mark() {
    +  TraceCollectorStats tcs(monitoring_support()->stw_collection_counters());
    +  ShenandoahGCPhase total(ShenandoahPhaseTimings::total_pause_gross);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_mark_gross);
    +
    +  try_inject_alloc_failure();
    +  VM_ShenandoahFinalMarkStartEvac op;
    +  VMThread::execute(&op); // jump to entry_final_mark under safepoint
    +}
    +
    +void ShenandoahHeap::vmop_entry_final_evac() {
    +  TraceCollectorStats tcs(monitoring_support()->stw_collection_counters());
    +  ShenandoahGCPhase total(ShenandoahPhaseTimings::total_pause_gross);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_evac_gross);
    +
    +  VM_ShenandoahFinalEvac op;
    +  VMThread::execute(&op); // jump to entry_final_evac under safepoint
    +}
    +
    +void ShenandoahHeap::vmop_entry_init_updaterefs() {
    +  TraceCollectorStats tcs(monitoring_support()->stw_collection_counters());
    +  ShenandoahGCPhase total(ShenandoahPhaseTimings::total_pause_gross);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::init_update_refs_gross);
    +
    +  try_inject_alloc_failure();
    +  VM_ShenandoahInitUpdateRefs op;
    +  VMThread::execute(&op);
    +}
    +
    +void ShenandoahHeap::vmop_entry_final_updaterefs() {
    +  TraceCollectorStats tcs(monitoring_support()->stw_collection_counters());
    +  ShenandoahGCPhase total(ShenandoahPhaseTimings::total_pause_gross);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_update_refs_gross);
    +
    +  try_inject_alloc_failure();
    +  VM_ShenandoahFinalUpdateRefs op;
    +  VMThread::execute(&op);
    +}
    +
    +void ShenandoahHeap::vmop_entry_init_traversal() {
    +  TraceCollectorStats tcs(monitoring_support()->stw_collection_counters());
    +  ShenandoahGCPhase total(ShenandoahPhaseTimings::total_pause_gross);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::init_traversal_gc_gross);
    +
    +  try_inject_alloc_failure();
    +  VM_ShenandoahInitTraversalGC op;
    +  VMThread::execute(&op);
    +}
    +
    +void ShenandoahHeap::vmop_entry_final_traversal() {
    +  TraceCollectorStats tcs(monitoring_support()->stw_collection_counters());
    +  ShenandoahGCPhase total(ShenandoahPhaseTimings::total_pause_gross);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_traversal_gc_gross);
    +
    +  try_inject_alloc_failure();
    +  VM_ShenandoahFinalTraversalGC op;
    +  VMThread::execute(&op);
    +}
    +
    +void ShenandoahHeap::vmop_entry_full(GCCause::Cause cause) {
    +  TraceCollectorStats tcs(monitoring_support()->full_stw_collection_counters());
    +  ShenandoahGCPhase total(ShenandoahPhaseTimings::total_pause_gross);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_gross);
    +
    +  try_inject_alloc_failure();
    +  VM_ShenandoahFullGC op(cause);
    +  VMThread::execute(&op);
    +}
    +
    +void ShenandoahHeap::vmop_degenerated(ShenandoahDegenPoint point) {
    +  TraceCollectorStats tcs(monitoring_support()->full_stw_collection_counters());
    +  ShenandoahGCPhase total(ShenandoahPhaseTimings::total_pause_gross);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::degen_gc_gross);
    +
    +  VM_ShenandoahDegeneratedGC degenerated_gc((int)point);
    +  VMThread::execute(°enerated_gc);
    +}
    +
    +void ShenandoahHeap::entry_init_mark() {
    +  ShenandoahGCPhase total_phase(ShenandoahPhaseTimings::total_pause);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::init_mark);
    +  const char* msg = init_mark_event_message();
    +  GCTraceTime(Info, gc) time(msg, gc_timer());
    +  EventMark em("%s", msg);
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_init_marking(),
    +                              "init marking");
    +
    +  op_init_mark();
    +}
    +
    +void ShenandoahHeap::entry_final_mark() {
    +  ShenandoahGCPhase total_phase(ShenandoahPhaseTimings::total_pause);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_mark);
    +  const char* msg = final_mark_event_message();
    +  GCTraceTime(Info, gc) time(msg, gc_timer());
    +  EventMark em("%s", msg);
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_final_marking(),
    +                              "final marking");
    +
    +  op_final_mark();
    +}
    +
    +void ShenandoahHeap::entry_final_evac() {
    +  ShenandoahGCPhase total_phase(ShenandoahPhaseTimings::total_pause);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_evac);
    +  static const char* msg = "Pause Final Evac";
    +  GCTraceTime(Info, gc) time(msg, gc_timer());
    +  EventMark em("%s", msg);
    +
    +  op_final_evac();
    +}
    +
    +void ShenandoahHeap::entry_init_updaterefs() {
    +  ShenandoahGCPhase total_phase(ShenandoahPhaseTimings::total_pause);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::init_update_refs);
    +
    +  static const char* msg = "Pause Init Update Refs";
    +  GCTraceTime(Info, gc) time(msg, gc_timer());
    +  EventMark em("%s", msg);
    +
    +  // No workers used in this phase, no setup required
    +
    +  op_init_updaterefs();
    +}
    +
    +void ShenandoahHeap::entry_final_updaterefs() {
    +  ShenandoahGCPhase total_phase(ShenandoahPhaseTimings::total_pause);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_update_refs);
    +
    +  static const char* msg = "Pause Final Update Refs";
    +  GCTraceTime(Info, gc) time(msg, gc_timer());
    +  EventMark em("%s", msg);
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_final_update_ref(),
    +                              "final reference update");
    +
    +  op_final_updaterefs();
    +}
    +
    +void ShenandoahHeap::entry_init_traversal() {
    +  ShenandoahGCPhase total_phase(ShenandoahPhaseTimings::total_pause);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::init_traversal_gc);
    +
    +  static const char* msg = "Pause Init Traversal";
    +  GCTraceTime(Info, gc) time(msg, gc_timer());
    +  EventMark em("%s", msg);
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_stw_traversal(),
    +                              "init traversal");
    +
    +  op_init_traversal();
    +}
    +
    +void ShenandoahHeap::entry_final_traversal() {
    +  ShenandoahGCPhase total_phase(ShenandoahPhaseTimings::total_pause);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_traversal_gc);
    +
    +  static const char* msg = "Pause Final Traversal";
    +  GCTraceTime(Info, gc) time(msg, gc_timer());
    +  EventMark em("%s", msg);
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_stw_traversal(),
    +                              "final traversal");
    +
    +  op_final_traversal();
    +}
    +
    +void ShenandoahHeap::entry_full(GCCause::Cause cause) {
    +  ShenandoahGCPhase total_phase(ShenandoahPhaseTimings::total_pause);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc);
    +
    +  static const char* msg = "Pause Full";
    +  GCTraceTime(Info, gc) time(msg, gc_timer(), cause, true);
    +  EventMark em("%s", msg);
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_fullgc(),
    +                              "full gc");
    +
    +  op_full(cause);
    +}
    +
    +void ShenandoahHeap::entry_degenerated(int point) {
    +  ShenandoahGCPhase total_phase(ShenandoahPhaseTimings::total_pause);
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::degen_gc);
    +
    +  ShenandoahDegenPoint dpoint = (ShenandoahDegenPoint)point;
    +  const char* msg = degen_event_message(dpoint);
    +  GCTraceTime(Info, gc) time(msg, NULL, GCCause::_no_gc, true);
    +  EventMark em("%s", msg);
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_stw_degenerated(),
    +                              "stw degenerated gc");
    +
    +  set_degenerated_gc_in_progress(true);
    +  op_degenerated(dpoint);
    +  set_degenerated_gc_in_progress(false);
    +}
    +
    +void ShenandoahHeap::entry_mark() {
    +  TraceCollectorStats tcs(monitoring_support()->concurrent_collection_counters());
    +
    +  const char* msg = conc_mark_event_message();
    +  GCTraceTime(Info, gc) time(msg, NULL, GCCause::_no_gc, true);
    +  EventMark em("%s", msg);
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_conc_marking(),
    +                              "concurrent marking");
    +
    +  try_inject_alloc_failure();
    +  op_mark();
    +}
    +
    +void ShenandoahHeap::entry_evac() {
    +  ShenandoahGCPhase conc_evac_phase(ShenandoahPhaseTimings::conc_evac);
    +  TraceCollectorStats tcs(monitoring_support()->concurrent_collection_counters());
    +
    +  static const char* msg = "Concurrent evacuation";
    +  GCTraceTime(Info, gc) time(msg, NULL, GCCause::_no_gc, true);
    +  EventMark em("%s", msg);
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_conc_evac(),
    +                              "concurrent evacuation");
    +
    +  try_inject_alloc_failure();
    +  op_conc_evac();
    +}
    +
    +void ShenandoahHeap::entry_updaterefs() {
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::conc_update_refs);
    +
    +  static const char* msg = "Concurrent update references";
    +  GCTraceTime(Info, gc) time(msg, NULL, GCCause::_no_gc, true);
    +  EventMark em("%s", msg);
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_conc_update_ref(),
    +                              "concurrent reference update");
    +
    +  try_inject_alloc_failure();
    +  op_updaterefs();
    +}
    +void ShenandoahHeap::entry_cleanup() {
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::conc_cleanup);
    +
    +  static const char* msg = "Concurrent cleanup";
    +  GCTraceTime(Info, gc) time(msg, NULL, GCCause::_no_gc, true);
    +  EventMark em("%s", msg);
    +
    +  // This phase does not use workers, no need for setup
    +
    +  try_inject_alloc_failure();
    +  op_cleanup();
    +}
    +
    +void ShenandoahHeap::entry_reset() {
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::conc_reset);
    +
    +  static const char* msg = "Concurrent reset";
    +  GCTraceTime(Info, gc) time(msg, NULL, GCCause::_no_gc, true);
    +  EventMark em("%s", msg);
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_conc_reset(),
    +                              "concurrent reset");
    +
    +  try_inject_alloc_failure();
    +  op_reset();
    +}
    +
    +void ShenandoahHeap::entry_preclean() {
    +  if (ShenandoahPreclean && process_references()) {
    +    static const char* msg = "Concurrent precleaning";
    +    GCTraceTime(Info, gc) time(msg, NULL, GCCause::_no_gc, true);
    +    EventMark em("%s", msg);
    +
    +    ShenandoahGCPhase conc_preclean(ShenandoahPhaseTimings::conc_preclean);
    +
    +    ShenandoahWorkerScope scope(workers(),
    +                                ShenandoahWorkerPolicy::calc_workers_for_conc_preclean(),
    +                                "concurrent preclean",
    +                                /* check_workers = */ false);
    +
    +    try_inject_alloc_failure();
    +    op_preclean();
    +  }
    +}
    +
    +void ShenandoahHeap::entry_traversal() {
    +  static const char* msg = "Concurrent traversal";
    +  GCTraceTime(Info, gc) time(msg, NULL, GCCause::_no_gc, true);
    +  EventMark em("%s", msg);
    +
    +  TraceCollectorStats tcs(monitoring_support()->concurrent_collection_counters());
    +
    +  ShenandoahWorkerScope scope(workers(),
    +                              ShenandoahWorkerPolicy::calc_workers_for_conc_traversal(),
    +                              "concurrent traversal");
    +
    +  try_inject_alloc_failure();
    +  op_traversal();
    +}
    +
    +void ShenandoahHeap::entry_uncommit(double shrink_before) {
    +  static const char *msg = "Concurrent uncommit";
    +  GCTraceTime(Info, gc) time(msg, NULL, GCCause::_no_gc, true);
    +  EventMark em("%s", msg);
    +
    +  ShenandoahGCPhase phase(ShenandoahPhaseTimings::conc_uncommit);
    +
    +  op_uncommit(shrink_before);
    +}
    +
    +void ShenandoahHeap::try_inject_alloc_failure() {
    +  if (ShenandoahAllocFailureALot && !cancelled_gc() && ((os::random() % 1000) > 950)) {
    +    _inject_alloc_failure.set();
    +    os::naked_short_sleep(1);
    +    if (cancelled_gc()) {
    +      log_info(gc)("Allocation failure was successfully injected");
    +    }
    +  }
    +}
    +
    +bool ShenandoahHeap::should_inject_alloc_failure() {
    +  return _inject_alloc_failure.is_set() && _inject_alloc_failure.try_unset();
    +}
    +
    +void ShenandoahHeap::initialize_serviceability() {
    +  _memory_pool = new ShenandoahMemoryPool(this);
    +  _cycle_memory_manager.add_pool(_memory_pool);
    +  _stw_memory_manager.add_pool(_memory_pool);
    +}
    +
    +GrowableArray ShenandoahHeap::memory_managers() {
    +  GrowableArray memory_managers(2);
    +  memory_managers.append(&_cycle_memory_manager);
    +  memory_managers.append(&_stw_memory_manager);
    +  return memory_managers;
    +}
    +
    +GrowableArray ShenandoahHeap::memory_pools() {
    +  GrowableArray memory_pools(1);
    +  memory_pools.append(_memory_pool);
    +  return memory_pools;
    +}
    +
    +void ShenandoahHeap::enter_evacuation() {
    +  _oom_evac_handler.enter_evacuation();
    +}
    +
    +void ShenandoahHeap::leave_evacuation() {
    +  _oom_evac_handler.leave_evacuation();
    +}
    +
    +ShenandoahRegionIterator::ShenandoahRegionIterator() :
    +  _heap(ShenandoahHeap::heap()),
    +  _index(0) {}
    +
    +ShenandoahRegionIterator::ShenandoahRegionIterator(ShenandoahHeap* heap) :
    +  _heap(heap),
    +  _index(0) {}
    +
    +void ShenandoahRegionIterator::reset() {
    +  _index = 0;
    +}
    +
    +bool ShenandoahRegionIterator::has_next() const {
    +  return _index < _heap->num_regions();
    +}
    +
    +char ShenandoahHeap::gc_state() const {
    +  return _gc_state.raw_value();
    +}
    +
    +void ShenandoahHeap::deduplicate_string(oop str) {
    +  assert(java_lang_String::is_instance(str), "invariant");
    +
    +  if (ShenandoahStringDedup::is_enabled()) {
    +    ShenandoahStringDedup::deduplicate(str);
    +  }
    +}
    +
    +const char* ShenandoahHeap::init_mark_event_message() const {
    +  bool update_refs = has_forwarded_objects();
    +  bool proc_refs = process_references();
    +  bool unload_cls = unload_classes();
    +
    +  if (update_refs && proc_refs && unload_cls) {
    +    return "Pause Init Mark (update refs) (process weakrefs) (unload classes)";
    +  } else if (update_refs && proc_refs) {
    +    return "Pause Init Mark (update refs) (process weakrefs)";
    +  } else if (update_refs && unload_cls) {
    +    return "Pause Init Mark (update refs) (unload classes)";
    +  } else if (proc_refs && unload_cls) {
    +    return "Pause Init Mark (process weakrefs) (unload classes)";
    +  } else if (update_refs) {
    +    return "Pause Init Mark (update refs)";
    +  } else if (proc_refs) {
    +    return "Pause Init Mark (process weakrefs)";
    +  } else if (unload_cls) {
    +    return "Pause Init Mark (unload classes)";
    +  } else {
    +    return "Pause Init Mark";
    +  }
    +}
    +
    +const char* ShenandoahHeap::final_mark_event_message() const {
    +  bool update_refs = has_forwarded_objects();
    +  bool proc_refs = process_references();
    +  bool unload_cls = unload_classes();
    +
    +  if (update_refs && proc_refs && unload_cls) {
    +    return "Pause Final Mark (update refs) (process weakrefs) (unload classes)";
    +  } else if (update_refs && proc_refs) {
    +    return "Pause Final Mark (update refs) (process weakrefs)";
    +  } else if (update_refs && unload_cls) {
    +    return "Pause Final Mark (update refs) (unload classes)";
    +  } else if (proc_refs && unload_cls) {
    +    return "Pause Final Mark (process weakrefs) (unload classes)";
    +  } else if (update_refs) {
    +    return "Pause Final Mark (update refs)";
    +  } else if (proc_refs) {
    +    return "Pause Final Mark (process weakrefs)";
    +  } else if (unload_cls) {
    +    return "Pause Final Mark (unload classes)";
    +  } else {
    +    return "Pause Final Mark";
    +  }
    +}
    +
    +const char* ShenandoahHeap::conc_mark_event_message() const {
    +  bool update_refs = has_forwarded_objects();
    +  bool proc_refs = process_references();
    +  bool unload_cls = unload_classes();
    +
    +  if (update_refs && proc_refs && unload_cls) {
    +    return "Concurrent marking (update refs) (process weakrefs) (unload classes)";
    +  } else if (update_refs && proc_refs) {
    +    return "Concurrent marking (update refs) (process weakrefs)";
    +  } else if (update_refs && unload_cls) {
    +    return "Concurrent marking (update refs) (unload classes)";
    +  } else if (proc_refs && unload_cls) {
    +    return "Concurrent marking (process weakrefs) (unload classes)";
    +  } else if (update_refs) {
    +    return "Concurrent marking (update refs)";
    +  } else if (proc_refs) {
    +    return "Concurrent marking (process weakrefs)";
    +  } else if (unload_cls) {
    +    return "Concurrent marking (unload classes)";
    +  } else {
    +    return "Concurrent marking";
    +  }
    +}
    +
    +const char* ShenandoahHeap::degen_event_message(ShenandoahDegenPoint point) const {
    +  switch (point) {
    +    case _degenerated_unset:
    +      return "Pause Degenerated GC ()";
    +    case _degenerated_traversal:
    +      return "Pause Degenerated GC (Traversal)";
    +    case _degenerated_outside_cycle:
    +      return "Pause Degenerated GC (Outside of Cycle)";
    +    case _degenerated_mark:
    +      return "Pause Degenerated GC (Mark)";
    +    case _degenerated_evac:
    +      return "Pause Degenerated GC (Evacuation)";
    +    case _degenerated_updaterefs:
    +      return "Pause Degenerated GC (Update Refs)";
    +    default:
    +      ShouldNotReachHere();
    +      return "ERROR";
    +  }
    +}
    +
    +jushort* ShenandoahHeap::get_liveness_cache(uint worker_id) {
    +#ifdef ASSERT
    +  assert(worker_id < _max_workers, "sanity");
    +  for (uint i = 0; i < num_regions(); i++) {
    +    assert(_liveness_cache[worker_id][i] == 0, "liveness cache should be empty");
    +  }
    +#endif
    +  return _liveness_cache[worker_id];
    +}
    +
    +void ShenandoahHeap::flush_liveness_cache(uint worker_id) {
    +  assert(worker_id < _max_workers, "sanity");
    +  jushort* ld = _liveness_cache[worker_id];
    +  for (uint i = 0; i < num_regions(); i++) {
    +    ShenandoahHeapRegion* r = get_region(i);
    +    jushort live = ld[i];
    +    if (live > 0) {
    +      r->increase_live_data_gc_words(live);
    +      ld[i] = 0;
    +    }
    +  }
    +}
    +
    +size_t ShenandoahHeap::obj_size(oop obj) const {
    +  return CollectedHeap::obj_size(obj) + ShenandoahBrooksPointer::word_size();
    +}
    +
    +ptrdiff_t ShenandoahHeap::cell_header_size() const {
    +  return ShenandoahBrooksPointer::byte_size();
    +}
    +
    +BoolObjectClosure* ShenandoahIsAliveSelector::is_alive_closure() {
    +  return ShenandoahHeap::heap()->has_forwarded_objects() ? reinterpret_cast(&_fwd_alive_cl)
    +                                                         : reinterpret_cast(&_alive_cl);
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp
    new file mode 100644
    index 00000000000..feef98f4834
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp
    @@ -0,0 +1,757 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_HPP
    +
    +#include "gc/shared/markBitMap.hpp"
    +#include "gc/shared/softRefPolicy.hpp"
    +#include "gc/shared/collectedHeap.hpp"
    +#include "gc/shenandoah/shenandoahAsserts.hpp"
    +#include "gc/shenandoah/shenandoahAllocRequest.hpp"
    +#include "gc/shenandoah/shenandoahHeapLock.hpp"
    +#include "gc/shenandoah/shenandoahEvacOOMHandler.hpp"
    +#include "gc/shenandoah/shenandoahSharedVariables.hpp"
    +#include "services/memoryManager.hpp"
    +
    +class ConcurrentGCTimer;
    +class ReferenceProcessor;
    +class ShenandoahAllocTracker;
    +class ShenandoahCollectorPolicy;
    +class ShenandoahControlThread;
    +class ShenandoahGCSession;
    +class ShenandoahHeuristics;
    +class ShenandoahMarkingContext;
    +class ShenandoahPhaseTimings;
    +class ShenandoahHeap;
    +class ShenandoahHeapRegion;
    +class ShenandoahHeapRegionClosure;
    +class ShenandoahCollectionSet;
    +class ShenandoahFreeSet;
    +class ShenandoahConcurrentMark;
    +class ShenandoahMarkCompact;
    +class ShenandoahMonitoringSupport;
    +class ShenandoahPacer;
    +class ShenandoahTraversalGC;
    +class ShenandoahVerifier;
    +class ShenandoahWorkGang;
    +class VMStructs;
    +
    +class ShenandoahRegionIterator : public StackObj {
    +private:
    +  ShenandoahHeap* _heap;
    +
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile size_t));
    +  volatile size_t _index;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +  // No implicit copying: iterators should be passed by reference to capture the state
    +  ShenandoahRegionIterator(const ShenandoahRegionIterator& that);
    +  ShenandoahRegionIterator& operator=(const ShenandoahRegionIterator& o);
    +
    +public:
    +  ShenandoahRegionIterator();
    +  ShenandoahRegionIterator(ShenandoahHeap* heap);
    +
    +  // Reset iterator to default state
    +  void reset();
    +
    +  // Returns next region, or NULL if there are no more regions.
    +  // This is multi-thread-safe.
    +  inline ShenandoahHeapRegion* next();
    +
    +  // This is *not* MT safe. However, in the absence of multithreaded access, it
    +  // can be used to determine if there is more work to do.
    +  bool has_next() const;
    +};
    +
    +class ShenandoahHeapRegionClosure : public StackObj {
    +public:
    +  virtual void heap_region_do(ShenandoahHeapRegion* r) = 0;
    +  virtual bool is_thread_safe() { return false; }
    +};
    +
    +class ShenandoahUpdateRefsClosure: public OopClosure {
    +private:
    +  ShenandoahHeap* _heap;
    +
    +  template 
    +  inline void do_oop_work(T* p);
    +
    +public:
    +  ShenandoahUpdateRefsClosure();
    +  inline void do_oop(oop* p);
    +  inline void do_oop(narrowOop* p);
    +};
    +
    +#ifdef ASSERT
    +class ShenandoahAssertToSpaceClosure : public OopClosure {
    +private:
    +  template 
    +  void do_oop_work(T* p);
    +public:
    +  void do_oop(narrowOop* p);
    +  void do_oop(oop* p);
    +};
    +#endif
    +
    +class ShenandoahAlwaysTrueClosure : public BoolObjectClosure {
    +public:
    +  bool do_object_b(oop p) { return true; }
    +};
    +
    +class ShenandoahForwardedIsAliveClosure: public BoolObjectClosure {
    +private:
    +  ShenandoahMarkingContext* const _mark_context;
    +public:
    +  ShenandoahForwardedIsAliveClosure();
    +  bool do_object_b(oop obj);
    +};
    +
    +class ShenandoahIsAliveClosure: public BoolObjectClosure {
    +private:
    +  ShenandoahMarkingContext* const _mark_context;
    +public:
    +  ShenandoahIsAliveClosure();
    +  bool do_object_b(oop obj);
    +};
    +
    +class ShenandoahIsAliveSelector : public StackObj {
    +private:
    +  ShenandoahIsAliveClosure _alive_cl;
    +  ShenandoahForwardedIsAliveClosure _fwd_alive_cl;
    +public:
    +  BoolObjectClosure* is_alive_closure();
    +};
    +
    +// Shenandoah GC is low-pause concurrent GC that uses Brooks forwarding pointers
    +// to encode forwarding data. See BrooksPointer for details on forwarding data encoding.
    +// See ShenandoahControlThread for GC cycle structure.
    +//
    +class ShenandoahHeap : public CollectedHeap {
    +  friend class ShenandoahAsserts;
    +  friend class VMStructs;
    +  friend class ShenandoahGCSession;
    +
    +// ---------- Locks that guard important data structures in Heap
    +//
    +private:
    +  ShenandoahHeapLock _lock;
    +
    +public:
    +  ShenandoahHeapLock* lock() {
    +    return &_lock;
    +  }
    +
    +  void assert_heaplock_owned_by_current_thread()     PRODUCT_RETURN;
    +  void assert_heaplock_not_owned_by_current_thread() PRODUCT_RETURN;
    +  void assert_heaplock_or_safepoint()                PRODUCT_RETURN;
    +
    +// ---------- Initialization, termination, identification, printing routines
    +//
    +public:
    +  static ShenandoahHeap* heap();
    +  static ShenandoahHeap* heap_no_check();
    +
    +  const char* name()          const { return "Shenandoah"; }
    +  ShenandoahHeap::Name kind() const { return CollectedHeap::Shenandoah; }
    +
    +  ShenandoahHeap(ShenandoahCollectorPolicy* policy);
    +  jint initialize();
    +  void post_initialize();
    +  void initialize_heuristics();
    +
    +  void initialize_serviceability();
    +
    +  void print_on(outputStream* st)              const;
    +  void print_extended_on(outputStream *st)     const;
    +  void print_tracing_info()                    const;
    +  void print_gc_threads_on(outputStream* st)   const;
    +  void print_heap_regions_on(outputStream* st) const;
    +
    +  void stop();
    +
    +  void prepare_for_verify();
    +  void verify(VerifyOption vo);
    +
    +// ---------- Heap counters and metrics
    +//
    +private:
    +           size_t _initial_size;
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile size_t));
    +  volatile size_t _used;
    +  volatile size_t _committed;
    +  volatile size_t _bytes_allocated_since_gc_start;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +public:
    +  void increase_used(size_t bytes);
    +  void decrease_used(size_t bytes);
    +  void set_used(size_t bytes);
    +
    +  void increase_committed(size_t bytes);
    +  void decrease_committed(size_t bytes);
    +  void increase_allocated(size_t bytes);
    +
    +  size_t bytes_allocated_since_gc_start();
    +  void reset_bytes_allocated_since_gc_start();
    +
    +  size_t max_capacity()     const;
    +  size_t initial_capacity() const;
    +  size_t capacity()         const;
    +  size_t used()             const;
    +  size_t committed()        const;
    +
    +// ---------- Workers handling
    +//
    +private:
    +  uint _max_workers;
    +  ShenandoahWorkGang* _workers;
    +  ShenandoahWorkGang* _safepoint_workers;
    +
    +public:
    +  uint max_workers();
    +  void assert_gc_workers(uint nworker) PRODUCT_RETURN;
    +
    +  WorkGang* workers() const;
    +  WorkGang* get_safepoint_workers();
    +
    +  void gc_threads_do(ThreadClosure* tcl) const;
    +
    +// ---------- Heap regions handling machinery
    +//
    +private:
    +  MemRegion _heap_region;
    +  size_t    _num_regions;
    +  ShenandoahHeapRegion** _regions;
    +  ShenandoahRegionIterator _update_refs_iterator;
    +
    +public:
    +  inline size_t num_regions() const { return _num_regions; }
    +
    +  inline ShenandoahHeapRegion* const heap_region_containing(const void* addr) const;
    +  inline size_t heap_region_index_containing(const void* addr) const;
    +
    +  inline ShenandoahHeapRegion* const get_region(size_t region_idx) const;
    +
    +  void heap_region_iterate(ShenandoahHeapRegionClosure* blk) const;
    +  void parallel_heap_region_iterate(ShenandoahHeapRegionClosure* blk) const;
    +
    +// ---------- GC state machinery
    +//
    +// GC state describes the important parts of collector state, that may be
    +// used to make barrier selection decisions in the native and generated code.
    +// Multiple bits can be set at once.
    +//
    +// Important invariant: when GC state is zero, the heap is stable, and no barriers
    +// are required.
    +//
    +public:
    +  enum GCStateBitPos {
    +    // Heap has forwarded objects: need RB, ACMP, CAS barriers.
    +    HAS_FORWARDED_BITPOS   = 0,
    +
    +    // Heap is under marking: needs SATB barriers.
    +    MARKING_BITPOS    = 1,
    +
    +    // Heap is under evacuation: needs WB barriers. (Set together with UNSTABLE)
    +    EVACUATION_BITPOS = 2,
    +
    +    // Heap is under updating: needs SVRB/SVWB barriers.
    +    UPDATEREFS_BITPOS = 3,
    +
    +    // Heap is under traversal collection
    +    TRAVERSAL_BITPOS  = 4,
    +  };
    +
    +  enum GCState {
    +    STABLE        = 0,
    +    HAS_FORWARDED = 1 << HAS_FORWARDED_BITPOS,
    +    MARKING       = 1 << MARKING_BITPOS,
    +    EVACUATION    = 1 << EVACUATION_BITPOS,
    +    UPDATEREFS    = 1 << UPDATEREFS_BITPOS,
    +    TRAVERSAL     = 1 << TRAVERSAL_BITPOS,
    +  };
    +
    +private:
    +  ShenandoahSharedBitmap _gc_state;
    +  ShenandoahSharedFlag   _degenerated_gc_in_progress;
    +  ShenandoahSharedFlag   _full_gc_in_progress;
    +  ShenandoahSharedFlag   _full_gc_move_in_progress;
    +  ShenandoahSharedFlag   _progress_last_gc;
    +
    +  void set_gc_state_all_threads(char state);
    +  void set_gc_state_mask(uint mask, bool value);
    +
    +public:
    +  char gc_state() const;
    +  static address gc_state_addr();
    +
    +  void set_concurrent_mark_in_progress(bool in_progress);
    +  void set_evacuation_in_progress(bool in_progress);
    +  void set_update_refs_in_progress(bool in_progress);
    +  void set_degenerated_gc_in_progress(bool in_progress);
    +  void set_full_gc_in_progress(bool in_progress);
    +  void set_full_gc_move_in_progress(bool in_progress);
    +  void set_concurrent_traversal_in_progress(bool in_progress);
    +  void set_has_forwarded_objects(bool cond);
    +
    +  inline bool is_stable() const;
    +  inline bool is_idle() const;
    +  inline bool is_concurrent_mark_in_progress() const;
    +  inline bool is_update_refs_in_progress() const;
    +  inline bool is_evacuation_in_progress() const;
    +  inline bool is_degenerated_gc_in_progress() const;
    +  inline bool is_full_gc_in_progress() const;
    +  inline bool is_full_gc_move_in_progress() const;
    +  inline bool is_concurrent_traversal_in_progress() const;
    +  inline bool has_forwarded_objects() const;
    +  inline bool is_gc_in_progress_mask(uint mask) const;
    +
    +// ---------- GC cancellation and degeneration machinery
    +//
    +// Cancelled GC flag is used to notify concurrent phases that they should terminate.
    +//
    +public:
    +  enum ShenandoahDegenPoint {
    +    _degenerated_unset,
    +    _degenerated_traversal,
    +    _degenerated_outside_cycle,
    +    _degenerated_mark,
    +    _degenerated_evac,
    +    _degenerated_updaterefs,
    +    _DEGENERATED_LIMIT,
    +  };
    +
    +  static const char* degen_point_to_string(ShenandoahDegenPoint point) {
    +    switch (point) {
    +      case _degenerated_unset:
    +        return "";
    +      case _degenerated_traversal:
    +        return "Traversal";
    +      case _degenerated_outside_cycle:
    +        return "Outside of Cycle";
    +      case _degenerated_mark:
    +        return "Mark";
    +      case _degenerated_evac:
    +        return "Evacuation";
    +      case _degenerated_updaterefs:
    +        return "Update Refs";
    +      default:
    +        ShouldNotReachHere();
    +        return "ERROR";
    +    }
    +  };
    +
    +private:
    +  enum CancelState {
    +    // Normal state. GC has not been cancelled and is open for cancellation.
    +    // Worker threads can suspend for safepoint.
    +    CANCELLABLE,
    +
    +    // GC has been cancelled. Worker threads can not suspend for
    +    // safepoint but must finish their work as soon as possible.
    +    CANCELLED,
    +
    +    // GC has not been cancelled and must not be cancelled. At least
    +    // one worker thread checks for pending safepoint and may suspend
    +    // if a safepoint is pending.
    +    NOT_CANCELLED
    +  };
    +
    +  ShenandoahSharedEnumFlag _cancelled_gc;
    +  inline bool try_cancel_gc();
    +
    +public:
    +  static address cancelled_gc_addr();
    +
    +  inline bool cancelled_gc() const;
    +  inline bool check_cancelled_gc_and_yield(bool sts_active = true);
    +
    +  inline void clear_cancelled_gc();
    +
    +  void cancel_gc(GCCause::Cause cause);
    +
    +// ---------- GC operations entry points
    +//
    +public:
    +  // Entry points to STW GC operations, these cause a related safepoint, that then
    +  // call the entry method below
    +  void vmop_entry_init_mark();
    +  void vmop_entry_final_mark();
    +  void vmop_entry_final_evac();
    +  void vmop_entry_init_updaterefs();
    +  void vmop_entry_final_updaterefs();
    +  void vmop_entry_init_traversal();
    +  void vmop_entry_final_traversal();
    +  void vmop_entry_full(GCCause::Cause cause);
    +  void vmop_degenerated(ShenandoahDegenPoint point);
    +
    +  // Entry methods to normally STW GC operations. These set up logging, monitoring
    +  // and workers for net VM operation
    +  void entry_init_mark();
    +  void entry_final_mark();
    +  void entry_final_evac();
    +  void entry_init_updaterefs();
    +  void entry_final_updaterefs();
    +  void entry_init_traversal();
    +  void entry_final_traversal();
    +  void entry_full(GCCause::Cause cause);
    +  void entry_degenerated(int point);
    +
    +  // Entry methods to normally concurrent GC operations. These set up logging, monitoring
    +  // for concurrent operation.
    +  void entry_reset();
    +  void entry_mark();
    +  void entry_preclean();
    +  void entry_cleanup();
    +  void entry_evac();
    +  void entry_updaterefs();
    +  void entry_traversal();
    +  void entry_uncommit(double shrink_before);
    +
    +private:
    +  // Actual work for the phases
    +  void op_init_mark();
    +  void op_final_mark();
    +  void op_final_evac();
    +  void op_init_updaterefs();
    +  void op_final_updaterefs();
    +  void op_init_traversal();
    +  void op_final_traversal();
    +  void op_full(GCCause::Cause cause);
    +  void op_degenerated(ShenandoahDegenPoint point);
    +  void op_degenerated_fail();
    +  void op_degenerated_futile();
    +
    +  void op_reset();
    +  void op_mark();
    +  void op_preclean();
    +  void op_cleanup();
    +  void op_conc_evac();
    +  void op_stw_evac();
    +  void op_updaterefs();
    +  void op_traversal();
    +  void op_uncommit(double shrink_before);
    +
    +  // Messages for GC trace events, they have to be immortal for
    +  // passing around the logging/tracing systems
    +  const char* init_mark_event_message() const;
    +  const char* final_mark_event_message() const;
    +  const char* conc_mark_event_message() const;
    +  const char* degen_event_message(ShenandoahDegenPoint point) const;
    +
    +// ---------- GC subsystems
    +//
    +private:
    +  ShenandoahControlThread*   _control_thread;
    +  ShenandoahCollectorPolicy* _shenandoah_policy;
    +  ShenandoahHeuristics*      _heuristics;
    +  ShenandoahFreeSet*         _free_set;
    +  ShenandoahConcurrentMark*  _scm;
    +  ShenandoahTraversalGC*     _traversal_gc;
    +  ShenandoahMarkCompact*     _full_gc;
    +  ShenandoahPacer*           _pacer;
    +  ShenandoahVerifier*        _verifier;
    +
    +  ShenandoahAllocTracker*    _alloc_tracker;
    +  ShenandoahPhaseTimings*    _phase_timings;
    +
    +  ShenandoahControlThread*   control_thread()          { return _control_thread;    }
    +  ShenandoahMarkCompact*     full_gc()                 { return _full_gc;           }
    +
    +public:
    +  ShenandoahCollectorPolicy* shenandoah_policy() const { return _shenandoah_policy; }
    +  ShenandoahHeuristics*      heuristics()        const { return _heuristics;        }
    +  ShenandoahFreeSet*         free_set()          const { return _free_set;          }
    +  ShenandoahConcurrentMark*  concurrent_mark()         { return _scm;               }
    +  ShenandoahTraversalGC*     traversal_gc()            { return _traversal_gc;      }
    +  ShenandoahPacer*           pacer() const             { return _pacer;             }
    +
    +  ShenandoahPhaseTimings*    phase_timings()     const { return _phase_timings;     }
    +  ShenandoahAllocTracker*    alloc_tracker()     const { return _alloc_tracker;     }
    +
    +  ShenandoahVerifier*        verifier();
    +
    +// ---------- VM subsystem bindings
    +//
    +private:
    +  ShenandoahMonitoringSupport* _monitoring_support;
    +  MemoryPool*                  _memory_pool;
    +  GCMemoryManager              _stw_memory_manager;
    +  GCMemoryManager              _cycle_memory_manager;
    +  ConcurrentGCTimer*           _gc_timer;
    +  SoftRefPolicy                _soft_ref_policy;
    +
    +public:
    +  ShenandoahMonitoringSupport* monitoring_support() { return _monitoring_support;    }
    +  GCMemoryManager* cycle_memory_manager()           { return &_cycle_memory_manager; }
    +  GCMemoryManager* stw_memory_manager()             { return &_stw_memory_manager;   }
    +  SoftRefPolicy* soft_ref_policy()                  { return &_soft_ref_policy;      }
    +
    +  GrowableArray memory_managers();
    +  GrowableArray memory_pools();
    +  GCTracer* tracer();
    +  GCTimer* gc_timer() const;
    +  CollectorPolicy* collector_policy() const;
    +
    +// ---------- Reference processing
    +//
    +private:
    +  AlwaysTrueClosure    _subject_to_discovery;
    +  ReferenceProcessor*  _ref_processor;
    +  ShenandoahSharedFlag _process_references;
    +
    +  void ref_processing_init();
    +
    +public:
    +  ReferenceProcessor* ref_processor() { return _ref_processor; }
    +  void set_process_references(bool pr);
    +  bool process_references() const;
    +
    +// ---------- Class Unloading
    +//
    +private:
    +  ShenandoahSharedFlag _unload_classes;
    +
    +public:
    +  void set_unload_classes(bool uc);
    +  bool unload_classes() const;
    +
    +  // Delete entries for dead interned string and clean up unreferenced symbols
    +  // in symbol table, possibly in parallel.
    +  void unload_classes_and_cleanup_tables(bool full_gc);
    +
    +// ---------- Generic interface hooks
    +// Minor things that super-interface expects us to implement to play nice with
    +// the rest of runtime. Some of the things here are not required to be implemented,
    +// and can be stubbed out.
    +//
    +public:
    +  AdaptiveSizePolicy* size_policy() shenandoah_not_implemented_return(NULL);
    +  bool is_maximal_no_gc() const shenandoah_not_implemented_return(false);
    +
    +  bool is_in(const void* p) const;
    +
    +  size_t obj_size(oop obj) const;
    +  virtual ptrdiff_t cell_header_size() const;
    +
    +  // All objects can potentially move
    +  bool is_scavengable(oop obj) { return true; };
    +
    +  void collect(GCCause::Cause cause);
    +  void do_full_collection(bool clear_all_soft_refs);
    +
    +  // Used for parsing heap during error printing
    +  HeapWord* block_start(const void* addr) const;
    +  size_t block_size(const HeapWord* addr) const;
    +  bool block_is_obj(const HeapWord* addr) const;
    +
    +  // Used for native heap walkers: heap dumpers, mostly
    +  void object_iterate(ObjectClosure* cl);
    +  void safe_object_iterate(ObjectClosure* cl);
    +
    +  // Used by RMI
    +  jlong millis_since_last_gc();
    +
    +// ---------- Safepoint interface hooks
    +//
    +public:
    +  void safepoint_synchronize_begin();
    +  void safepoint_synchronize_end();
    +
    +// ---------- Code roots handling hooks
    +//
    +public:
    +  void register_nmethod(nmethod* nm);
    +  void unregister_nmethod(nmethod* nm);
    +
    +// ---------- Pinning hooks
    +//
    +public:
    +  // Shenandoah supports per-object (per-region) pinning
    +  bool supports_object_pinning() const { return true; }
    +
    +  oop pin_object(JavaThread* thread, oop obj);
    +  void unpin_object(JavaThread* thread, oop obj);
    +
    +// ---------- Allocation support
    +//
    +private:
    +  HeapWord* allocate_memory_under_lock(ShenandoahAllocRequest& request, bool& in_new_region);
    +  inline HeapWord* allocate_from_gclab(Thread* thread, size_t size);
    +  HeapWord* allocate_from_gclab_slow(Thread* thread, size_t size);
    +  HeapWord* allocate_new_gclab(size_t min_size, size_t word_size, size_t* actual_size);
    +  void retire_and_reset_gclabs();
    +
    +public:
    +  HeapWord* allocate_memory(ShenandoahAllocRequest& request);
    +  HeapWord* mem_allocate(size_t size, bool* what);
    +  MetaWord* satisfy_failed_metadata_allocation(ClassLoaderData* loader_data,
    +                                               size_t size,
    +                                               Metaspace::MetadataType mdtype);
    +
    +  oop obj_allocate(Klass* klass, int size, TRAPS);
    +  oop array_allocate(Klass* klass, int size, int length, bool do_zero, TRAPS);
    +  oop class_allocate(Klass* klass, int size, TRAPS);
    +
    +  void notify_mutator_alloc_words(size_t words, bool waste);
    +
    +  // Shenandoah supports TLAB allocation
    +  bool supports_tlab_allocation() const { return true; }
    +
    +  HeapWord* allocate_new_tlab(size_t min_size, size_t requested_size, size_t* actual_size);
    +  size_t tlab_capacity(Thread *thr) const;
    +  size_t unsafe_max_tlab_alloc(Thread *thread) const;
    +  size_t max_tlab_size() const;
    +  size_t tlab_used(Thread* ignored) const;
    +
    +  HeapWord* tlab_post_allocation_setup(HeapWord* obj);
    +  void fill_with_dummy_object(HeapWord* start, HeapWord* end, bool zap);
    +  size_t min_dummy_object_size() const;
    +
    +  void resize_tlabs();
    +
    +  void ensure_parsability(bool retire_tlabs);
    +  void make_parsable(bool retire_tlabs);
    +
    +// ---------- Marking support
    +//
    +private:
    +  ShenandoahMarkingContext* _marking_context;
    +  MemRegion  _bitmap_region;
    +  MemRegion  _aux_bitmap_region;
    +  MarkBitMap _verification_bit_map;
    +  MarkBitMap _aux_bit_map;
    +
    +  size_t _bitmap_size;
    +  size_t _bitmap_regions_per_slice;
    +  size_t _bitmap_bytes_per_slice;
    +
    +  // Used for buffering per-region liveness data.
    +  // Needed since ShenandoahHeapRegion uses atomics to update liveness.
    +  //
    +  // The array has max-workers elements, each of which is an array of
    +  // jushort * max_regions. The choice of jushort is not accidental:
    +  // there is a tradeoff between static/dynamic footprint that translates
    +  // into cache pressure (which is already high during marking), and
    +  // too many atomic updates. size_t/jint is too large, jbyte is too small.
    +  jushort** _liveness_cache;
    +
    +public:
    +  inline ShenandoahMarkingContext* complete_marking_context() const;
    +  inline ShenandoahMarkingContext* marking_context() const;
    +  inline void mark_complete_marking_context();
    +  inline void mark_incomplete_marking_context();
    +
    +  template
    +  inline void marked_object_iterate(ShenandoahHeapRegion* region, T* cl);
    +
    +  template
    +  inline void marked_object_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit);
    +
    +  template
    +  inline void marked_object_oop_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit);
    +
    +  void reset_mark_bitmap();
    +
    +  // SATB barriers hooks
    +  inline bool requires_marking(const void* entry) const;
    +  void force_satb_flush_all_threads();
    +
    +  // Support for bitmap uncommits
    +  bool commit_bitmap_slice(ShenandoahHeapRegion *r);
    +  bool uncommit_bitmap_slice(ShenandoahHeapRegion *r);
    +  bool is_bitmap_slice_committed(ShenandoahHeapRegion* r, bool skip_self = false);
    +
    +  // Liveness caching support
    +  jushort* get_liveness_cache(uint worker_id);
    +  void flush_liveness_cache(uint worker_id);
    +
    +// ---------- Evacuation support
    +//
    +private:
    +  ShenandoahCollectionSet* _collection_set;
    +  ShenandoahEvacOOMHandler _oom_evac_handler;
    +
    +  void evacuate_and_update_roots();
    +
    +public:
    +  static address in_cset_fast_test_addr();
    +
    +  ShenandoahCollectionSet* collection_set() const { return _collection_set; }
    +
    +  template 
    +  inline bool in_collection_set(T obj) const;
    +
    +  // Avoid accidentally calling the method above with ShenandoahHeapRegion*, which would be *wrong*.
    +  inline bool in_collection_set(ShenandoahHeapRegion* r) shenandoah_not_implemented_return(false);
    +
    +  // Evacuates object src. Returns the evacuated object, either evacuated
    +  // by this thread, or by some other thread.
    +  inline oop evacuate_object(oop src, Thread* thread);
    +
    +  // Call before/after evacuation.
    +  void enter_evacuation();
    +  void leave_evacuation();
    +
    +// ---------- Helper functions
    +//
    +public:
    +  template 
    +  inline oop evac_update_with_forwarded(T* p);
    +
    +  template 
    +  inline oop maybe_update_with_forwarded(T* p);
    +
    +  template 
    +  inline oop maybe_update_with_forwarded_not_null(T* p, oop obj);
    +
    +  template 
    +  inline oop update_with_forwarded_not_null(T* p, oop obj);
    +
    +  inline oop atomic_compare_exchange_oop(oop n, narrowOop* addr, oop c);
    +  inline oop atomic_compare_exchange_oop(oop n, oop* addr, oop c);
    +
    +  void trash_humongous_region_at(ShenandoahHeapRegion *r);
    +
    +  void deduplicate_string(oop str);
    +
    +  void stop_concurrent_marking();
    +
    +  void roots_iterate(OopClosure* cl);
    +
    +private:
    +  void trash_cset_regions();
    +  void update_heap_references(bool concurrent);
    +
    +// ---------- Testing helpers functions
    +//
    +private:
    +  ShenandoahSharedFlag _inject_alloc_failure;
    +
    +  void try_inject_alloc_failure();
    +  bool should_inject_alloc_failure();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.inline.hpp
    new file mode 100644
    index 00000000000..9b87f073483
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.inline.hpp
    @@ -0,0 +1,552 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_INLINE_HPP
    +
    +#include "classfile/javaClasses.inline.hpp"
    +#include "gc/shared/markBitMap.inline.hpp"
    +#include "gc/shared/threadLocalAllocBuffer.inline.hpp"
    +#include "gc/shared/suspendibleThreadSet.hpp"
    +#include "gc/shenandoah/shenandoahAsserts.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.inline.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahWorkGroup.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.inline.hpp"
    +#include "gc/shenandoah/shenandoahControlThread.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
    +#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
    +#include "oops/oop.inline.hpp"
    +#include "runtime/atomic.hpp"
    +#include "runtime/interfaceSupport.inline.hpp"
    +#include "runtime/prefetch.hpp"
    +#include "runtime/prefetch.inline.hpp"
    +#include "runtime/thread.hpp"
    +#include "utilities/copy.hpp"
    +#include "utilities/globalDefinitions.hpp"
    +
    +template 
    +void ShenandoahUpdateRefsClosure::do_oop_work(T* p) {
    +  T o = RawAccess<>::oop_load(p);
    +  if (!CompressedOops::is_null(o)) {
    +    oop obj = CompressedOops::decode_not_null(o);
    +    _heap->update_with_forwarded_not_null(p, obj);
    +  }
    +}
    +
    +void ShenandoahUpdateRefsClosure::do_oop(oop* p)       { do_oop_work(p); }
    +void ShenandoahUpdateRefsClosure::do_oop(narrowOop* p) { do_oop_work(p); }
    +
    +inline ShenandoahHeapRegion* ShenandoahRegionIterator::next() {
    +  size_t new_index = Atomic::add((size_t) 1, &_index);
    +  // get_region() provides the bounds-check and returns NULL on OOB.
    +  return _heap->get_region(new_index - 1);
    +}
    +
    +inline bool ShenandoahHeap::has_forwarded_objects() const {
    +  return _gc_state.is_set(HAS_FORWARDED);
    +}
    +
    +inline WorkGang* ShenandoahHeap::workers() const {
    +  return _workers;
    +}
    +
    +inline WorkGang* ShenandoahHeap::get_safepoint_workers() {
    +  return _safepoint_workers;
    +}
    +
    +inline size_t ShenandoahHeap::heap_region_index_containing(const void* addr) const {
    +  uintptr_t region_start = ((uintptr_t) addr);
    +  uintptr_t index = (region_start - (uintptr_t) base()) >> ShenandoahHeapRegion::region_size_bytes_shift();
    +  assert(index < num_regions(), "Region index is in bounds: " PTR_FORMAT, p2i(addr));
    +  return index;
    +}
    +
    +inline ShenandoahHeapRegion* const ShenandoahHeap::heap_region_containing(const void* addr) const {
    +  size_t index = heap_region_index_containing(addr);
    +  ShenandoahHeapRegion* const result = get_region(index);
    +  assert(addr >= result->bottom() && addr < result->end(), "Heap region contains the address: " PTR_FORMAT, p2i(addr));
    +  return result;
    +}
    +
    +template 
    +inline oop ShenandoahHeap::update_with_forwarded_not_null(T* p, oop obj) {
    +  if (in_collection_set(obj)) {
    +    shenandoah_assert_forwarded_except(p, obj, is_full_gc_in_progress() || cancelled_gc() || is_degenerated_gc_in_progress());
    +    obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    +    RawAccess::oop_store(p, obj);
    +  }
    +#ifdef ASSERT
    +  else {
    +    shenandoah_assert_not_forwarded(p, obj);
    +  }
    +#endif
    +  return obj;
    +}
    +
    +template 
    +inline oop ShenandoahHeap::maybe_update_with_forwarded(T* p) {
    +  T o = RawAccess<>::oop_load(p);
    +  if (!CompressedOops::is_null(o)) {
    +    oop obj = CompressedOops::decode_not_null(o);
    +    return maybe_update_with_forwarded_not_null(p, obj);
    +  } else {
    +    return NULL;
    +  }
    +}
    +
    +template 
    +inline oop ShenandoahHeap::evac_update_with_forwarded(T* p) {
    +  T o = RawAccess<>::oop_load(p);
    +  if (!CompressedOops::is_null(o)) {
    +    oop heap_oop = CompressedOops::decode_not_null(o);
    +    if (in_collection_set(heap_oop)) {
    +      oop forwarded_oop = ShenandoahBarrierSet::resolve_forwarded_not_null(heap_oop);
    +      if (oopDesc::equals_raw(forwarded_oop, heap_oop)) {
    +        forwarded_oop = evacuate_object(heap_oop, Thread::current());
    +      }
    +      oop prev = atomic_compare_exchange_oop(forwarded_oop, p, heap_oop);
    +      if (oopDesc::equals_raw(prev, heap_oop)) {
    +        return forwarded_oop;
    +      } else {
    +        return NULL;
    +      }
    +    }
    +    return heap_oop;
    +  } else {
    +    return NULL;
    +  }
    +}
    +
    +inline oop ShenandoahHeap::atomic_compare_exchange_oop(oop n, oop* addr, oop c) {
    +  return (oop) Atomic::cmpxchg(n, addr, c);
    +}
    +
    +inline oop ShenandoahHeap::atomic_compare_exchange_oop(oop n, narrowOop* addr, oop c) {
    +  narrowOop cmp = CompressedOops::encode(c);
    +  narrowOop val = CompressedOops::encode(n);
    +  return CompressedOops::decode((narrowOop) Atomic::cmpxchg(val, addr, cmp));
    +}
    +
    +template 
    +inline oop ShenandoahHeap::maybe_update_with_forwarded_not_null(T* p, oop heap_oop) {
    +  shenandoah_assert_not_in_cset_loc_except(p, !is_in(p) || is_full_gc_in_progress() || is_degenerated_gc_in_progress());
    +  shenandoah_assert_correct(p, heap_oop);
    +
    +  if (in_collection_set(heap_oop)) {
    +    oop forwarded_oop = ShenandoahBarrierSet::resolve_forwarded_not_null(heap_oop);
    +    if (oopDesc::equals_raw(forwarded_oop, heap_oop)) {
    +      // E.g. during evacuation.
    +      return forwarded_oop;
    +    }
    +
    +    shenandoah_assert_forwarded_except(p, heap_oop, is_full_gc_in_progress() || is_degenerated_gc_in_progress());
    +    shenandoah_assert_not_in_cset_except(p, forwarded_oop, cancelled_gc());
    +
    +    // If this fails, another thread wrote to p before us, it will be logged in SATB and the
    +    // reference be updated later.
    +    oop result = atomic_compare_exchange_oop(forwarded_oop, p, heap_oop);
    +
    +    if (oopDesc::equals_raw(result, heap_oop)) { // CAS successful.
    +      return forwarded_oop;
    +    } else {
    +      // Note: we used to assert the following here. This doesn't work because sometimes, during
    +      // marking/updating-refs, it can happen that a Java thread beats us with an arraycopy,
    +      // which first copies the array, which potentially contains from-space refs, and only afterwards
    +      // updates all from-space refs to to-space refs, which leaves a short window where the new array
    +      // elements can be from-space.
    +      // assert(CompressedOops::is_null(result) ||
    +      //        oopDesc::equals_raw(result, ShenandoahBarrierSet::resolve_oop_static_not_null(result)),
    +      //       "expect not forwarded");
    +      return NULL;
    +    }
    +  } else {
    +    shenandoah_assert_not_forwarded(p, heap_oop);
    +    return heap_oop;
    +  }
    +}
    +
    +inline bool ShenandoahHeap::cancelled_gc() const {
    +  return _cancelled_gc.get() == CANCELLED;
    +}
    +
    +inline bool ShenandoahHeap::check_cancelled_gc_and_yield(bool sts_active) {
    +  if (! (sts_active && ShenandoahSuspendibleWorkers)) {
    +    return cancelled_gc();
    +  }
    +
    +  jbyte prev = _cancelled_gc.cmpxchg(NOT_CANCELLED, CANCELLABLE);
    +  if (prev == CANCELLABLE || prev == NOT_CANCELLED) {
    +    if (SuspendibleThreadSet::should_yield()) {
    +      SuspendibleThreadSet::yield();
    +    }
    +
    +    // Back to CANCELLABLE. The thread that poked NOT_CANCELLED first gets
    +    // to restore to CANCELLABLE.
    +    if (prev == CANCELLABLE) {
    +      _cancelled_gc.set(CANCELLABLE);
    +    }
    +    return false;
    +  } else {
    +    return true;
    +  }
    +}
    +
    +inline bool ShenandoahHeap::try_cancel_gc() {
    +  while (true) {
    +    jbyte prev = _cancelled_gc.cmpxchg(CANCELLED, CANCELLABLE);
    +    if (prev == CANCELLABLE) return true;
    +    else if (prev == CANCELLED) return false;
    +    assert(ShenandoahSuspendibleWorkers, "should not get here when not using suspendible workers");
    +    assert(prev == NOT_CANCELLED, "must be NOT_CANCELLED");
    +    {
    +      // We need to provide a safepoint here, otherwise we might
    +      // spin forever if a SP is pending.
    +      ThreadBlockInVM sp(JavaThread::current());
    +      SpinPause();
    +    }
    +  }
    +}
    +
    +inline void ShenandoahHeap::clear_cancelled_gc() {
    +  _cancelled_gc.set(CANCELLABLE);
    +  _oom_evac_handler.clear();
    +}
    +
    +inline HeapWord* ShenandoahHeap::allocate_from_gclab(Thread* thread, size_t size) {
    +  assert(UseTLAB, "TLABs should be enabled");
    +
    +  PLAB* gclab = ShenandoahThreadLocalData::gclab(thread);
    +  if (gclab == NULL) {
    +    assert(!thread->is_Java_thread() && !thread->is_Worker_thread(),
    +           "Performance: thread should have GCLAB: %s", thread->name());
    +    // No GCLABs in this thread, fallback to shared allocation
    +    return NULL;
    +  }
    +  HeapWord* obj = gclab->allocate(size);
    +  if (obj != NULL) {
    +    return obj;
    +  }
    +  // Otherwise...
    +  return allocate_from_gclab_slow(thread, size);
    +}
    +
    +inline oop ShenandoahHeap::evacuate_object(oop p, Thread* thread) {
    +  if (ShenandoahThreadLocalData::is_oom_during_evac(Thread::current())) {
    +    // This thread went through the OOM during evac protocol and it is safe to return
    +    // the forward pointer. It must not attempt to evacuate any more.
    +    return ShenandoahBarrierSet::resolve_forwarded(p);
    +  }
    +
    +  assert(ShenandoahThreadLocalData::is_evac_allowed(thread), "must be enclosed in oom-evac scope");
    +
    +  size_t size_no_fwdptr = (size_t) p->size();
    +  size_t size_with_fwdptr = size_no_fwdptr + ShenandoahBrooksPointer::word_size();
    +
    +  assert(!heap_region_containing(p)->is_humongous(), "never evacuate humongous objects");
    +
    +  bool alloc_from_gclab = true;
    +  HeapWord* filler = NULL;
    +
    +#ifdef ASSERT
    +  if (ShenandoahOOMDuringEvacALot &&
    +      (os::random() & 1) == 0) { // Simulate OOM every ~2nd slow-path call
    +        filler = NULL;
    +  } else {
    +#endif
    +    if (UseTLAB) {
    +      filler = allocate_from_gclab(thread, size_with_fwdptr);
    +    }
    +    if (filler == NULL) {
    +      ShenandoahAllocRequest req = ShenandoahAllocRequest::for_shared_gc(size_with_fwdptr);
    +      filler = allocate_memory(req);
    +      alloc_from_gclab = false;
    +    }
    +#ifdef ASSERT
    +  }
    +#endif
    +
    +  if (filler == NULL) {
    +    control_thread()->handle_alloc_failure_evac(size_with_fwdptr);
    +
    +    _oom_evac_handler.handle_out_of_memory_during_evacuation();
    +
    +    return ShenandoahBarrierSet::resolve_forwarded(p);
    +  }
    +
    +  // Copy the object and initialize its forwarding ptr:
    +  HeapWord* copy = filler + ShenandoahBrooksPointer::word_size();
    +  oop copy_val = oop(copy);
    +
    +  Copy::aligned_disjoint_words((HeapWord*) p, copy, size_no_fwdptr);
    +  ShenandoahBrooksPointer::initialize(oop(copy));
    +
    +  // Try to install the new forwarding pointer.
    +  oop result = ShenandoahBrooksPointer::try_update_forwardee(p, copy_val);
    +
    +  if (oopDesc::equals_raw(result, p)) {
    +    // Successfully evacuated. Our copy is now the public one!
    +    shenandoah_assert_correct(NULL, copy_val);
    +    return copy_val;
    +  }  else {
    +    // Failed to evacuate. We need to deal with the object that is left behind. Since this
    +    // new allocation is certainly after TAMS, it will be considered live in the next cycle.
    +    // But if it happens to contain references to evacuated regions, those references would
    +    // not get updated for this stale copy during this cycle, and we will crash while scanning
    +    // it the next cycle.
    +    //
    +    // For GCLAB allocations, it is enough to rollback the allocation ptr. Either the next
    +    // object will overwrite this stale copy, or the filler object on LAB retirement will
    +    // do this. For non-GCLAB allocations, we have no way to retract the allocation, and
    +    // have to explicitly overwrite the copy with the filler object. With that overwrite,
    +    // we have to keep the fwdptr initialized and pointing to our (stale) copy.
    +    if (alloc_from_gclab) {
    +      ShenandoahThreadLocalData::gclab(thread)->undo_allocation(filler, size_with_fwdptr);
    +    } else {
    +      fill_with_object(copy, size_no_fwdptr);
    +    }
    +    shenandoah_assert_correct(NULL, copy_val);
    +    shenandoah_assert_correct(NULL, result);
    +    return result;
    +  }
    +}
    +
    +inline bool ShenandoahHeap::requires_marking(const void* entry) const {
    +  return !_marking_context->is_marked(oop(entry));
    +}
    +
    +template 
    +inline bool ShenandoahHeap::in_collection_set(T p) const {
    +  HeapWord* obj = (HeapWord*) p;
    +  assert(collection_set() != NULL, "Sanity");
    +  assert(is_in(obj), "should be in heap");
    +
    +  return collection_set()->is_in(obj);
    +}
    +
    +inline bool ShenandoahHeap::is_stable() const {
    +  return _gc_state.is_clear();
    +}
    +
    +inline bool ShenandoahHeap::is_idle() const {
    +  return _gc_state.is_unset(MARKING | EVACUATION | UPDATEREFS | TRAVERSAL);
    +}
    +
    +inline bool ShenandoahHeap::is_concurrent_mark_in_progress() const {
    +  return _gc_state.is_set(MARKING);
    +}
    +
    +inline bool ShenandoahHeap::is_concurrent_traversal_in_progress() const {
    +  return _gc_state.is_set(TRAVERSAL);
    +}
    +
    +inline bool ShenandoahHeap::is_evacuation_in_progress() const {
    +  return _gc_state.is_set(EVACUATION);
    +}
    +
    +inline bool ShenandoahHeap::is_gc_in_progress_mask(uint mask) const {
    +  return _gc_state.is_set(mask);
    +}
    +
    +inline bool ShenandoahHeap::is_degenerated_gc_in_progress() const {
    +  return _degenerated_gc_in_progress.is_set();
    +}
    +
    +inline bool ShenandoahHeap::is_full_gc_in_progress() const {
    +  return _full_gc_in_progress.is_set();
    +}
    +
    +inline bool ShenandoahHeap::is_full_gc_move_in_progress() const {
    +  return _full_gc_move_in_progress.is_set();
    +}
    +
    +inline bool ShenandoahHeap::is_update_refs_in_progress() const {
    +  return _gc_state.is_set(UPDATEREFS);
    +}
    +
    +template
    +inline void ShenandoahHeap::marked_object_iterate(ShenandoahHeapRegion* region, T* cl) {
    +  marked_object_iterate(region, cl, region->top());
    +}
    +
    +template
    +inline void ShenandoahHeap::marked_object_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit) {
    +  assert(ShenandoahBrooksPointer::word_offset() < 0, "skip_delta calculation below assumes the forwarding ptr is before obj");
    +  assert(! region->is_humongous_continuation(), "no humongous continuation regions here");
    +
    +  ShenandoahMarkingContext* const ctx = complete_marking_context();
    +  assert(ctx->is_complete(), "sanity");
    +
    +  MarkBitMap* mark_bit_map = ctx->mark_bit_map();
    +  HeapWord* tams = ctx->top_at_mark_start(region);
    +
    +  size_t skip_bitmap_delta = ShenandoahBrooksPointer::word_size() + 1;
    +  size_t skip_objsize_delta = ShenandoahBrooksPointer::word_size() /* + actual obj.size() below */;
    +  HeapWord* start = region->bottom() + ShenandoahBrooksPointer::word_size();
    +  HeapWord* end = MIN2(tams + ShenandoahBrooksPointer::word_size(), region->end());
    +
    +  // Step 1. Scan below the TAMS based on bitmap data.
    +  HeapWord* limit_bitmap = MIN2(limit, tams);
    +
    +  // Try to scan the initial candidate. If the candidate is above the TAMS, it would
    +  // fail the subsequent "< limit_bitmap" checks, and fall through to Step 2.
    +  HeapWord* cb = mark_bit_map->get_next_marked_addr(start, end);
    +
    +  intx dist = ShenandoahMarkScanPrefetch;
    +  if (dist > 0) {
    +    // Batched scan that prefetches the oop data, anticipating the access to
    +    // either header, oop field, or forwarding pointer. Not that we cannot
    +    // touch anything in oop, while it still being prefetched to get enough
    +    // time for prefetch to work. This is why we try to scan the bitmap linearly,
    +    // disregarding the object size. However, since we know forwarding pointer
    +    // preceeds the object, we can skip over it. Once we cannot trust the bitmap,
    +    // there is no point for prefetching the oop contents, as oop->size() will
    +    // touch it prematurely.
    +
    +    // No variable-length arrays in standard C++, have enough slots to fit
    +    // the prefetch distance.
    +    static const int SLOT_COUNT = 256;
    +    guarantee(dist <= SLOT_COUNT, "adjust slot count");
    +    HeapWord* slots[SLOT_COUNT];
    +
    +    int avail;
    +    do {
    +      avail = 0;
    +      for (int c = 0; (c < dist) && (cb < limit_bitmap); c++) {
    +        Prefetch::read(cb, ShenandoahBrooksPointer::byte_offset());
    +        slots[avail++] = cb;
    +        cb += skip_bitmap_delta;
    +        if (cb < limit_bitmap) {
    +          cb = mark_bit_map->get_next_marked_addr(cb, limit_bitmap);
    +        }
    +      }
    +
    +      for (int c = 0; c < avail; c++) {
    +        assert (slots[c] < tams,  "only objects below TAMS here: "  PTR_FORMAT " (" PTR_FORMAT ")", p2i(slots[c]), p2i(tams));
    +        assert (slots[c] < limit, "only objects below limit here: " PTR_FORMAT " (" PTR_FORMAT ")", p2i(slots[c]), p2i(limit));
    +        oop obj = oop(slots[c]);
    +        assert(oopDesc::is_oop(obj), "sanity");
    +        assert(ctx->is_marked(obj), "object expected to be marked");
    +        cl->do_object(obj);
    +      }
    +    } while (avail > 0);
    +  } else {
    +    while (cb < limit_bitmap) {
    +      assert (cb < tams,  "only objects below TAMS here: "  PTR_FORMAT " (" PTR_FORMAT ")", p2i(cb), p2i(tams));
    +      assert (cb < limit, "only objects below limit here: " PTR_FORMAT " (" PTR_FORMAT ")", p2i(cb), p2i(limit));
    +      oop obj = oop(cb);
    +      assert(oopDesc::is_oop(obj), "sanity");
    +      assert(ctx->is_marked(obj), "object expected to be marked");
    +      cl->do_object(obj);
    +      cb += skip_bitmap_delta;
    +      if (cb < limit_bitmap) {
    +        cb = mark_bit_map->get_next_marked_addr(cb, limit_bitmap);
    +      }
    +    }
    +  }
    +
    +  // Step 2. Accurate size-based traversal, happens past the TAMS.
    +  // This restarts the scan at TAMS, which makes sure we traverse all objects,
    +  // regardless of what happened at Step 1.
    +  HeapWord* cs = tams + ShenandoahBrooksPointer::word_size();
    +  while (cs < limit) {
    +    assert (cs > tams,  "only objects past TAMS here: "   PTR_FORMAT " (" PTR_FORMAT ")", p2i(cs), p2i(tams));
    +    assert (cs < limit, "only objects below limit here: " PTR_FORMAT " (" PTR_FORMAT ")", p2i(cs), p2i(limit));
    +    oop obj = oop(cs);
    +    assert(oopDesc::is_oop(obj), "sanity");
    +    assert(ctx->is_marked(obj), "object expected to be marked");
    +    int size = obj->size();
    +    cl->do_object(obj);
    +    cs += size + skip_objsize_delta;
    +  }
    +}
    +
    +template 
    +class ShenandoahObjectToOopClosure : public ObjectClosure {
    +  T* _cl;
    +public:
    +  ShenandoahObjectToOopClosure(T* cl) : _cl(cl) {}
    +
    +  void do_object(oop obj) {
    +    obj->oop_iterate(_cl);
    +  }
    +};
    +
    +template 
    +class ShenandoahObjectToOopBoundedClosure : public ObjectClosure {
    +  T* _cl;
    +  MemRegion _bounds;
    +public:
    +  ShenandoahObjectToOopBoundedClosure(T* cl, HeapWord* bottom, HeapWord* top) :
    +    _cl(cl), _bounds(bottom, top) {}
    +
    +  void do_object(oop obj) {
    +    obj->oop_iterate(_cl, _bounds);
    +  }
    +};
    +
    +template
    +inline void ShenandoahHeap::marked_object_oop_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* top) {
    +  if (region->is_humongous()) {
    +    HeapWord* bottom = region->bottom();
    +    if (top > bottom) {
    +      region = region->humongous_start_region();
    +      ShenandoahObjectToOopBoundedClosure objs(cl, bottom, top);
    +      marked_object_iterate(region, &objs);
    +    }
    +  } else {
    +    ShenandoahObjectToOopClosure objs(cl);
    +    marked_object_iterate(region, &objs, top);
    +  }
    +}
    +
    +inline ShenandoahHeapRegion* const ShenandoahHeap::get_region(size_t region_idx) const {
    +  if (region_idx < _num_regions) {
    +    return _regions[region_idx];
    +  } else {
    +    return NULL;
    +  }
    +}
    +
    +inline void ShenandoahHeap::mark_complete_marking_context() {
    +  _marking_context->mark_complete();
    +}
    +
    +inline void ShenandoahHeap::mark_incomplete_marking_context() {
    +  _marking_context->mark_incomplete();
    +}
    +
    +inline ShenandoahMarkingContext* ShenandoahHeap::complete_marking_context() const {
    +  assert (_marking_context->is_complete()," sanity");
    +  return _marking_context;
    +}
    +
    +inline ShenandoahMarkingContext* ShenandoahHeap::marking_context() const {
    +  return _marking_context;
    +}
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAP_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapLock.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapLock.hpp
    new file mode 100644
    index 00000000000..1cfec76626a
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapLock.hpp
    @@ -0,0 +1,93 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPLOCK_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPLOCK_HPP
    +
    +#include "memory/allocation.hpp"
    +#include "runtime/thread.hpp"
    +
    +class ShenandoahHeapLock  {
    +private:
    +  enum LockState { unlocked = 0, locked = 1 };
    +
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile int));
    +  volatile int _state;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile Thread*));
    +  volatile Thread* _owner;
    +  DEFINE_PAD_MINUS_SIZE(2, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +public:
    +  ShenandoahHeapLock() : _state(unlocked), _owner(NULL) {};
    +
    +  void lock() {
    +    Thread::SpinAcquire(&_state, "Shenandoah Heap Lock");
    +#ifdef ASSERT
    +    assert(_state == locked, "must be locked");
    +    assert(_owner == NULL, "must not be owned");
    +    _owner = Thread::current();
    +#endif
    +  }
    +
    +  void unlock() {
    +#ifdef ASSERT
    +    assert (_owner == Thread::current(), "sanity");
    +    _owner = NULL;
    +#endif
    +    Thread::SpinRelease(&_state);
    +  }
    +
    +#ifdef ASSERT
    +  void assert_owned_by_current_thread() {
    +    assert(_state == locked, "must be locked");
    +    assert(_owner == Thread::current(), "must be owned by current thread");
    +  }
    +
    +  void assert_not_owned_by_current_thread() {
    +    assert(_owner != Thread::current(), "must be not owned by current thread");
    +  }
    +
    +  void assert_owned_by_current_thread_or_safepoint() {
    +    Thread* thr = Thread::current();
    +    assert((_state == locked && _owner == thr) ||
    +           (SafepointSynchronize::is_at_safepoint() && thr->is_VM_thread()),
    +           "must own heap lock or by VM thread at safepoint");
    +  }
    +#endif
    +};
    +
    +class ShenandoahHeapLocker : public StackObj {
    +private:
    +  ShenandoahHeapLock* _lock;
    +public:
    +  ShenandoahHeapLocker(ShenandoahHeapLock* lock) {
    +    _lock = lock;
    +    _lock->lock();
    +  }
    +
    +  ~ShenandoahHeapLocker() {
    +    _lock->unlock();
    +  }
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPLOCK_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp
    new file mode 100644
    index 00000000000..10102ba349f
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp
    @@ -0,0 +1,681 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "memory/allocation.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
    +#include "gc/shenandoah/shenandoahTraversalGC.hpp"
    +#include "gc/shared/space.inline.hpp"
    +#include "memory/iterator.inline.hpp"
    +#include "memory/resourceArea.hpp"
    +#include "memory/universe.hpp"
    +#include "oops/oop.inline.hpp"
    +#include "runtime/java.hpp"
    +#include "runtime/mutexLocker.hpp"
    +#include "runtime/os.hpp"
    +#include "runtime/safepoint.hpp"
    +
    +size_t ShenandoahHeapRegion::RegionCount = 0;
    +size_t ShenandoahHeapRegion::RegionSizeBytes = 0;
    +size_t ShenandoahHeapRegion::RegionSizeWords = 0;
    +size_t ShenandoahHeapRegion::RegionSizeBytesShift = 0;
    +size_t ShenandoahHeapRegion::RegionSizeWordsShift = 0;
    +size_t ShenandoahHeapRegion::RegionSizeBytesMask = 0;
    +size_t ShenandoahHeapRegion::RegionSizeWordsMask = 0;
    +size_t ShenandoahHeapRegion::HumongousThresholdBytes = 0;
    +size_t ShenandoahHeapRegion::HumongousThresholdWords = 0;
    +size_t ShenandoahHeapRegion::MaxTLABSizeBytes = 0;
    +size_t ShenandoahHeapRegion::MaxTLABSizeWords = 0;
    +
    +ShenandoahHeapRegion::PaddedAllocSeqNum ShenandoahHeapRegion::_alloc_seq_num;
    +
    +ShenandoahHeapRegion::ShenandoahHeapRegion(ShenandoahHeap* heap, HeapWord* start,
    +                                           size_t size_words, size_t index, bool committed) :
    +  _heap(heap),
    +  _pacer(ShenandoahPacing ? heap->pacer() : NULL),
    +  _reserved(MemRegion(start, size_words)),
    +  _region_number(index),
    +  _new_top(NULL),
    +  _critical_pins(0),
    +  _empty_time(os::elapsedTime()),
    +  _state(committed ? _empty_committed : _empty_uncommitted),
    +  _tlab_allocs(0),
    +  _gclab_allocs(0),
    +  _shared_allocs(0),
    +  _seqnum_first_alloc_mutator(0),
    +  _seqnum_first_alloc_gc(0),
    +  _seqnum_last_alloc_mutator(0),
    +  _seqnum_last_alloc_gc(0),
    +  _live_data(0) {
    +
    +  ContiguousSpace::initialize(_reserved, true, committed);
    +}
    +
    +size_t ShenandoahHeapRegion::region_number() const {
    +  return _region_number;
    +}
    +
    +void ShenandoahHeapRegion::report_illegal_transition(const char *method) {
    +  ResourceMark rm;
    +  stringStream ss;
    +  ss.print("Illegal region state transition from \"%s\", at %s\n  ", region_state_to_string(_state), method);
    +  print_on(&ss);
    +  fatal("%s", ss.as_string());
    +}
    +
    +void ShenandoahHeapRegion::make_regular_allocation() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +
    +  switch (_state) {
    +    case _empty_uncommitted:
    +      do_commit();
    +    case _empty_committed:
    +      _state = _regular;
    +    case _regular:
    +    case _pinned:
    +      return;
    +    default:
    +      report_illegal_transition("regular allocation");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_regular_bypass() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  assert (_heap->is_full_gc_in_progress() || _heap->is_degenerated_gc_in_progress(),
    +          "only for full or degen GC");
    +
    +  switch (_state) {
    +    case _empty_uncommitted:
    +      do_commit();
    +    case _empty_committed:
    +    case _cset:
    +    case _humongous_start:
    +    case _humongous_cont:
    +      _state = _regular;
    +      return;
    +    case _pinned_cset:
    +      _state = _pinned;
    +      return;
    +    case _regular:
    +    case _pinned:
    +      return;
    +    default:
    +      report_illegal_transition("regular bypass");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_humongous_start() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  switch (_state) {
    +    case _empty_uncommitted:
    +      do_commit();
    +    case _empty_committed:
    +      _state = _humongous_start;
    +      return;
    +    default:
    +      report_illegal_transition("humongous start allocation");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_humongous_start_bypass() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  assert (_heap->is_full_gc_in_progress(), "only for full GC");
    +
    +  switch (_state) {
    +    case _empty_committed:
    +    case _regular:
    +    case _humongous_start:
    +    case _humongous_cont:
    +      _state = _humongous_start;
    +      return;
    +    default:
    +      report_illegal_transition("humongous start bypass");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_humongous_cont() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  switch (_state) {
    +    case _empty_uncommitted:
    +      do_commit();
    +    case _empty_committed:
    +      _state = _humongous_cont;
    +      return;
    +    default:
    +      report_illegal_transition("humongous continuation allocation");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_humongous_cont_bypass() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  assert (_heap->is_full_gc_in_progress(), "only for full GC");
    +
    +  switch (_state) {
    +    case _empty_committed:
    +    case _regular:
    +    case _humongous_start:
    +    case _humongous_cont:
    +      _state = _humongous_cont;
    +      return;
    +    default:
    +      report_illegal_transition("humongous continuation bypass");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_pinned() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  switch (_state) {
    +    case _regular:
    +      assert (_critical_pins == 0, "sanity");
    +      _state = _pinned;
    +    case _pinned_cset:
    +    case _pinned:
    +      _critical_pins++;
    +      return;
    +    case _humongous_start:
    +      assert (_critical_pins == 0, "sanity");
    +      _state = _pinned_humongous_start;
    +    case _pinned_humongous_start:
    +      _critical_pins++;
    +      return;
    +    case _cset:
    +      guarantee(_heap->cancelled_gc(), "only valid when evac has been cancelled");
    +      assert (_critical_pins == 0, "sanity");
    +      _state = _pinned_cset;
    +      _critical_pins++;
    +      return;
    +    default:
    +      report_illegal_transition("pinning");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_unpinned() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  switch (_state) {
    +    case _pinned:
    +      assert (_critical_pins > 0, "sanity");
    +      _critical_pins--;
    +      if (_critical_pins == 0) {
    +        _state = _regular;
    +      }
    +      return;
    +    case _regular:
    +    case _humongous_start:
    +      assert (_critical_pins == 0, "sanity");
    +      return;
    +    case _pinned_cset:
    +      guarantee(_heap->cancelled_gc(), "only valid when evac has been cancelled");
    +      assert (_critical_pins > 0, "sanity");
    +      _critical_pins--;
    +      if (_critical_pins == 0) {
    +        _state = _cset;
    +      }
    +      return;
    +    case _pinned_humongous_start:
    +      assert (_critical_pins > 0, "sanity");
    +      _critical_pins--;
    +      if (_critical_pins == 0) {
    +        _state = _humongous_start;
    +      }
    +      return;
    +    default:
    +      report_illegal_transition("unpinning");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_cset() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  switch (_state) {
    +    case _regular:
    +      _state = _cset;
    +    case _cset:
    +      return;
    +    default:
    +      report_illegal_transition("cset");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_trash() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  switch (_state) {
    +    case _cset:
    +      // Reclaiming cset regions
    +    case _humongous_start:
    +    case _humongous_cont:
    +      // Reclaiming humongous regions
    +    case _regular:
    +      // Immediate region reclaim
    +      _state = _trash;
    +      return;
    +    default:
    +      report_illegal_transition("trashing");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_trash_immediate() {
    +  make_trash();
    +
    +  // On this path, we know there are no marked objects in the region,
    +  // tell marking context about it to bypass bitmap resets.
    +  _heap->complete_marking_context()->reset_top_bitmap(this);
    +}
    +
    +void ShenandoahHeapRegion::make_empty() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  switch (_state) {
    +    case _trash:
    +      _state = _empty_committed;
    +      _empty_time = os::elapsedTime();
    +      return;
    +    default:
    +      report_illegal_transition("emptying");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_uncommitted() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  switch (_state) {
    +    case _empty_committed:
    +      do_uncommit();
    +      _state = _empty_uncommitted;
    +      return;
    +    default:
    +      report_illegal_transition("uncommiting");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::make_committed_bypass() {
    +  _heap->assert_heaplock_owned_by_current_thread();
    +  assert (_heap->is_full_gc_in_progress(), "only for full GC");
    +
    +  switch (_state) {
    +    case _empty_uncommitted:
    +      do_commit();
    +      _state = _empty_committed;
    +      return;
    +    default:
    +      report_illegal_transition("commit bypass");
    +  }
    +}
    +
    +void ShenandoahHeapRegion::clear_live_data() {
    +  OrderAccess::release_store_fence(&_live_data, 0);
    +}
    +
    +void ShenandoahHeapRegion::reset_alloc_metadata() {
    +  _tlab_allocs = 0;
    +  _gclab_allocs = 0;
    +  _shared_allocs = 0;
    +  _seqnum_first_alloc_mutator = 0;
    +  _seqnum_last_alloc_mutator = 0;
    +  _seqnum_first_alloc_gc = 0;
    +  _seqnum_last_alloc_gc = 0;
    +}
    +
    +void ShenandoahHeapRegion::reset_alloc_metadata_to_shared() {
    +  if (used() > 0) {
    +    _tlab_allocs = 0;
    +    _gclab_allocs = 0;
    +    _shared_allocs = used() >> LogHeapWordSize;
    +    uint64_t next = _alloc_seq_num.value++;
    +    _seqnum_first_alloc_mutator = next;
    +    _seqnum_last_alloc_mutator = next;
    +    _seqnum_first_alloc_gc = 0;
    +    _seqnum_last_alloc_gc = 0;
    +  } else {
    +    reset_alloc_metadata();
    +  }
    +}
    +
    +size_t ShenandoahHeapRegion::get_shared_allocs() const {
    +  return _shared_allocs * HeapWordSize;
    +}
    +
    +size_t ShenandoahHeapRegion::get_tlab_allocs() const {
    +  return _tlab_allocs * HeapWordSize;
    +}
    +
    +size_t ShenandoahHeapRegion::get_gclab_allocs() const {
    +  return _gclab_allocs * HeapWordSize;
    +}
    +
    +void ShenandoahHeapRegion::set_live_data(size_t s) {
    +  assert(Thread::current()->is_VM_thread(), "by VM thread");
    +  _live_data = (s >> LogHeapWordSize);
    +}
    +
    +size_t ShenandoahHeapRegion::get_live_data_words() const {
    +  return OrderAccess::load_acquire(&_live_data);
    +}
    +
    +size_t ShenandoahHeapRegion::get_live_data_bytes() const {
    +  return get_live_data_words() * HeapWordSize;
    +}
    +
    +bool ShenandoahHeapRegion::has_live() const {
    +  return get_live_data_words() != 0;
    +}
    +
    +size_t ShenandoahHeapRegion::garbage() const {
    +  assert(used() >= get_live_data_bytes(), "Live Data must be a subset of used() live: " SIZE_FORMAT " used: " SIZE_FORMAT,
    +         get_live_data_bytes(), used());
    +
    +  size_t result = used() - get_live_data_bytes();
    +  return result;
    +}
    +
    +void ShenandoahHeapRegion::print_on(outputStream* st) const {
    +  st->print("|");
    +  st->print(SIZE_FORMAT_W(5), this->_region_number);
    +
    +  switch (_state) {
    +    case _empty_uncommitted:
    +      st->print("|EU ");
    +      break;
    +    case _empty_committed:
    +      st->print("|EC ");
    +      break;
    +    case _regular:
    +      st->print("|R  ");
    +      break;
    +    case _humongous_start:
    +      st->print("|H  ");
    +      break;
    +    case _pinned_humongous_start:
    +      st->print("|HP ");
    +      break;
    +    case _humongous_cont:
    +      st->print("|HC ");
    +      break;
    +    case _cset:
    +      st->print("|CS ");
    +      break;
    +    case _trash:
    +      st->print("|T  ");
    +      break;
    +    case _pinned:
    +      st->print("|P  ");
    +      break;
    +    case _pinned_cset:
    +      st->print("|CSP");
    +      break;
    +    default:
    +      ShouldNotReachHere();
    +  }
    +  st->print("|BTE " INTPTR_FORMAT_W(12) ", " INTPTR_FORMAT_W(12) ", " INTPTR_FORMAT_W(12),
    +            p2i(bottom()), p2i(top()), p2i(end()));
    +  st->print("|TAMS " INTPTR_FORMAT_W(12),
    +            p2i(_heap->marking_context()->top_at_mark_start(const_cast(this))));
    +  st->print("|U " SIZE_FORMAT_W(5) "%1s", byte_size_in_proper_unit(used()),                proper_unit_for_byte_size(used()));
    +  st->print("|T " SIZE_FORMAT_W(5) "%1s", byte_size_in_proper_unit(get_tlab_allocs()),     proper_unit_for_byte_size(get_tlab_allocs()));
    +  st->print("|G " SIZE_FORMAT_W(5) "%1s", byte_size_in_proper_unit(get_gclab_allocs()),    proper_unit_for_byte_size(get_gclab_allocs()));
    +  st->print("|S " SIZE_FORMAT_W(5) "%1s", byte_size_in_proper_unit(get_shared_allocs()),   proper_unit_for_byte_size(get_shared_allocs()));
    +  st->print("|L " SIZE_FORMAT_W(5) "%1s", byte_size_in_proper_unit(get_live_data_bytes()), proper_unit_for_byte_size(get_live_data_bytes()));
    +  st->print("|CP " SIZE_FORMAT_W(3), _critical_pins);
    +  st->print("|SN " UINT64_FORMAT_X_W(12) ", " UINT64_FORMAT_X_W(8) ", " UINT64_FORMAT_X_W(8) ", " UINT64_FORMAT_X_W(8),
    +            seqnum_first_alloc_mutator(), seqnum_last_alloc_mutator(),
    +            seqnum_first_alloc_gc(), seqnum_last_alloc_gc());
    +  st->cr();
    +}
    +
    +void ShenandoahHeapRegion::oop_iterate(OopIterateClosure* blk) {
    +  if (!is_active()) return;
    +  if (is_humongous()) {
    +    oop_iterate_humongous(blk);
    +  } else {
    +    oop_iterate_objects(blk);
    +  }
    +}
    +
    +void ShenandoahHeapRegion::oop_iterate_objects(OopIterateClosure* blk) {
    +  assert(! is_humongous(), "no humongous region here");
    +  HeapWord* obj_addr = bottom() + ShenandoahBrooksPointer::word_size();
    +  HeapWord* t = top();
    +  // Could call objects iterate, but this is easier.
    +  while (obj_addr < t) {
    +    oop obj = oop(obj_addr);
    +    obj_addr += obj->oop_iterate_size(blk) + ShenandoahBrooksPointer::word_size();
    +  }
    +}
    +
    +void ShenandoahHeapRegion::oop_iterate_humongous(OopIterateClosure* blk) {
    +  assert(is_humongous(), "only humongous region here");
    +  // Find head.
    +  ShenandoahHeapRegion* r = humongous_start_region();
    +  assert(r->is_humongous_start(), "need humongous head here");
    +  oop obj = oop(r->bottom() + ShenandoahBrooksPointer::word_size());
    +  obj->oop_iterate(blk, MemRegion(bottom(), top()));
    +}
    +
    +ShenandoahHeapRegion* ShenandoahHeapRegion::humongous_start_region() const {
    +  assert(is_humongous(), "Must be a part of the humongous region");
    +  size_t reg_num = region_number();
    +  ShenandoahHeapRegion* r = const_cast(this);
    +  while (!r->is_humongous_start()) {
    +    assert(reg_num > 0, "Sanity");
    +    reg_num --;
    +    r = _heap->get_region(reg_num);
    +    assert(r->is_humongous(), "Must be a part of the humongous region");
    +  }
    +  assert(r->is_humongous_start(), "Must be");
    +  return r;
    +}
    +
    +void ShenandoahHeapRegion::recycle() {
    +  ContiguousSpace::clear(false);
    +  if (ZapUnusedHeapArea) {
    +    ContiguousSpace::mangle_unused_area_complete();
    +  }
    +  clear_live_data();
    +
    +  reset_alloc_metadata();
    +
    +  _heap->marking_context()->reset_top_at_mark_start(this);
    +
    +  make_empty();
    +}
    +
    +HeapWord* ShenandoahHeapRegion::block_start_const(const void* p) const {
    +  assert(MemRegion(bottom(), end()).contains(p),
    +         "p (" PTR_FORMAT ") not in space [" PTR_FORMAT ", " PTR_FORMAT ")",
    +         p2i(p), p2i(bottom()), p2i(end()));
    +  if (p >= top()) {
    +    return top();
    +  } else {
    +    HeapWord* last = bottom() + ShenandoahBrooksPointer::word_size();
    +    HeapWord* cur = last;
    +    while (cur <= p) {
    +      last = cur;
    +      cur += oop(cur)->size() + ShenandoahBrooksPointer::word_size();
    +    }
    +    shenandoah_assert_correct(NULL, oop(last));
    +    return last;
    +  }
    +}
    +
    +void ShenandoahHeapRegion::setup_sizes(size_t initial_heap_size, size_t max_heap_size) {
    +  // Absolute minimums we should not ever break.
    +  static const size_t MIN_REGION_SIZE = 256*K;
    +
    +  if (FLAG_IS_DEFAULT(ShenandoahMinRegionSize)) {
    +    FLAG_SET_DEFAULT(ShenandoahMinRegionSize, MIN_REGION_SIZE);
    +  }
    +
    +  size_t region_size;
    +  if (FLAG_IS_DEFAULT(ShenandoahHeapRegionSize)) {
    +    if (ShenandoahMinRegionSize > initial_heap_size / MIN_NUM_REGIONS) {
    +      err_msg message("Initial heap size (" SIZE_FORMAT "K) is too low to afford the minimum number "
    +                      "of regions (" SIZE_FORMAT ") of minimum region size (" SIZE_FORMAT "K).",
    +                      initial_heap_size/K, MIN_NUM_REGIONS, ShenandoahMinRegionSize/K);
    +      vm_exit_during_initialization("Invalid -XX:ShenandoahMinRegionSize option", message);
    +    }
    +    if (ShenandoahMinRegionSize < MIN_REGION_SIZE) {
    +      err_msg message("" SIZE_FORMAT "K should not be lower than minimum region size (" SIZE_FORMAT "K).",
    +                      ShenandoahMinRegionSize/K,  MIN_REGION_SIZE/K);
    +      vm_exit_during_initialization("Invalid -XX:ShenandoahMinRegionSize option", message);
    +    }
    +    if (ShenandoahMinRegionSize < MinTLABSize) {
    +      err_msg message("" SIZE_FORMAT "K should not be lower than TLAB size size (" SIZE_FORMAT "K).",
    +                      ShenandoahMinRegionSize/K,  MinTLABSize/K);
    +      vm_exit_during_initialization("Invalid -XX:ShenandoahMinRegionSize option", message);
    +    }
    +    if (ShenandoahMaxRegionSize < MIN_REGION_SIZE) {
    +      err_msg message("" SIZE_FORMAT "K should not be lower than min region size (" SIZE_FORMAT "K).",
    +                      ShenandoahMaxRegionSize/K,  MIN_REGION_SIZE/K);
    +      vm_exit_during_initialization("Invalid -XX:ShenandoahMaxRegionSize option", message);
    +    }
    +    if (ShenandoahMinRegionSize > ShenandoahMaxRegionSize) {
    +      err_msg message("Minimum (" SIZE_FORMAT "K) should be larger than maximum (" SIZE_FORMAT "K).",
    +                      ShenandoahMinRegionSize/K, ShenandoahMaxRegionSize/K);
    +      vm_exit_during_initialization("Invalid -XX:ShenandoahMinRegionSize or -XX:ShenandoahMaxRegionSize", message);
    +    }
    +
    +    // We rapidly expand to max_heap_size in most scenarios, so that is the measure
    +    // for usual heap sizes. Do not depend on initial_heap_size here.
    +    region_size = max_heap_size / ShenandoahTargetNumRegions;
    +
    +    // Now make sure that we don't go over or under our limits.
    +    region_size = MAX2(ShenandoahMinRegionSize, region_size);
    +    region_size = MIN2(ShenandoahMaxRegionSize, region_size);
    +
    +  } else {
    +    if (ShenandoahHeapRegionSize > initial_heap_size / MIN_NUM_REGIONS) {
    +      err_msg message("Initial heap size (" SIZE_FORMAT "K) is too low to afford the minimum number "
    +                              "of regions (" SIZE_FORMAT ") of requested size (" SIZE_FORMAT "K).",
    +                      initial_heap_size/K, MIN_NUM_REGIONS, ShenandoahHeapRegionSize/K);
    +      vm_exit_during_initialization("Invalid -XX:ShenandoahHeapRegionSize option", message);
    +    }
    +    if (ShenandoahHeapRegionSize < ShenandoahMinRegionSize) {
    +      err_msg message("Heap region size (" SIZE_FORMAT "K) should be larger than min region size (" SIZE_FORMAT "K).",
    +                      ShenandoahHeapRegionSize/K, ShenandoahMinRegionSize/K);
    +      vm_exit_during_initialization("Invalid -XX:ShenandoahHeapRegionSize option", message);
    +    }
    +    if (ShenandoahHeapRegionSize > ShenandoahMaxRegionSize) {
    +      err_msg message("Heap region size (" SIZE_FORMAT "K) should be lower than max region size (" SIZE_FORMAT "K).",
    +                      ShenandoahHeapRegionSize/K, ShenandoahMaxRegionSize/K);
    +      vm_exit_during_initialization("Invalid -XX:ShenandoahHeapRegionSize option", message);
    +    }
    +    region_size = ShenandoahHeapRegionSize;
    +  }
    +
    +  // Make sure region size is at least one large page, if enabled.
    +  // Otherwise, uncommitting one region may falsely uncommit the adjacent
    +  // regions too.
    +  // Also see shenandoahArguments.cpp, where it handles UseLargePages.
    +  if (UseLargePages && ShenandoahUncommit) {
    +    region_size = MAX2(region_size, os::large_page_size());
    +  }
    +
    +  int region_size_log = log2_long((jlong) region_size);
    +  // Recalculate the region size to make sure it's a power of
    +  // 2. This means that region_size is the largest power of 2 that's
    +  // <= what we've calculated so far.
    +  region_size = size_t(1) << region_size_log;
    +
    +  // Now, set up the globals.
    +  guarantee(RegionSizeBytesShift == 0, "we should only set it once");
    +  RegionSizeBytesShift = (size_t)region_size_log;
    +
    +  guarantee(RegionSizeWordsShift == 0, "we should only set it once");
    +  RegionSizeWordsShift = RegionSizeBytesShift - LogHeapWordSize;
    +
    +  guarantee(RegionSizeBytes == 0, "we should only set it once");
    +  RegionSizeBytes = region_size;
    +  RegionSizeWords = RegionSizeBytes >> LogHeapWordSize;
    +  assert (RegionSizeWords*HeapWordSize == RegionSizeBytes, "sanity");
    +
    +  guarantee(RegionSizeWordsMask == 0, "we should only set it once");
    +  RegionSizeWordsMask = RegionSizeWords - 1;
    +
    +  guarantee(RegionSizeBytesMask == 0, "we should only set it once");
    +  RegionSizeBytesMask = RegionSizeBytes - 1;
    +
    +  guarantee(RegionCount == 0, "we should only set it once");
    +  RegionCount = max_heap_size / RegionSizeBytes;
    +  guarantee(RegionCount >= MIN_NUM_REGIONS, "Should have at least minimum regions");
    +
    +  guarantee(HumongousThresholdWords == 0, "we should only set it once");
    +  HumongousThresholdWords = RegionSizeWords * ShenandoahHumongousThreshold / 100;
    +  assert (HumongousThresholdWords <= RegionSizeWords, "sanity");
    +
    +  guarantee(HumongousThresholdBytes == 0, "we should only set it once");
    +  HumongousThresholdBytes = HumongousThresholdWords * HeapWordSize;
    +  assert (HumongousThresholdBytes <= RegionSizeBytes, "sanity");
    +
    +  // The rationale for trimming the TLAB sizes has to do with the raciness in
    +  // TLAB allocation machinery. It may happen that TLAB sizing policy polls Shenandoah
    +  // about next free size, gets the answer for region #N, goes away for a while, then
    +  // tries to allocate in region #N, and fail because some other thread have claimed part
    +  // of the region #N, and then the freeset allocation code has to retire the region #N,
    +  // before moving the allocation to region #N+1.
    +  //
    +  // The worst case realizes when "answer" is "region size", which means it could
    +  // prematurely retire an entire region. Having smaller TLABs does not fix that
    +  // completely, but reduces the probability of too wasteful region retirement.
    +  // With current divisor, we will waste no more than 1/8 of region size in the worst
    +  // case. This also has a secondary effect on collection set selection: even under
    +  // the race, the regions would be at least 7/8 used, which allows relying on
    +  // "used" - "live" for cset selection. Otherwise, we can get the fragmented region
    +  // below the garbage threshold that would never be considered for collection.
    +  //
    +  // The whole thing is mitigated if Elastic TLABs are enabled.
    +  //
    +  guarantee(MaxTLABSizeBytes == 0, "we should only set it once");
    +  MaxTLABSizeBytes = MIN2(ShenandoahElasticTLAB ? RegionSizeBytes : (RegionSizeBytes / 8), HumongousThresholdBytes);
    +  assert (MaxTLABSizeBytes > MinTLABSize, "should be larger");
    +
    +  guarantee(MaxTLABSizeWords == 0, "we should only set it once");
    +  MaxTLABSizeWords = MaxTLABSizeBytes / HeapWordSize;
    +
    +  log_info(gc, init)("Regions: " SIZE_FORMAT " x " SIZE_FORMAT "%s",
    +                     RegionCount, byte_size_in_proper_unit(RegionSizeBytes), proper_unit_for_byte_size(RegionSizeBytes));
    +  log_info(gc, init)("Humongous object threshold: " SIZE_FORMAT "%s",
    +                     byte_size_in_proper_unit(HumongousThresholdBytes), proper_unit_for_byte_size(HumongousThresholdBytes));
    +  log_info(gc, init)("Max TLAB size: " SIZE_FORMAT "%s",
    +                     byte_size_in_proper_unit(MaxTLABSizeBytes), proper_unit_for_byte_size(MaxTLABSizeBytes));
    +}
    +
    +void ShenandoahHeapRegion::do_commit() {
    +  if (!os::commit_memory((char *) _reserved.start(), _reserved.byte_size(), false)) {
    +    report_java_out_of_memory("Unable to commit region");
    +  }
    +  if (!_heap->commit_bitmap_slice(this)) {
    +    report_java_out_of_memory("Unable to commit bitmaps for region");
    +  }
    +  _heap->increase_committed(ShenandoahHeapRegion::region_size_bytes());
    +}
    +
    +void ShenandoahHeapRegion::do_uncommit() {
    +  if (!os::uncommit_memory((char *) _reserved.start(), _reserved.byte_size())) {
    +    report_java_out_of_memory("Unable to uncommit region");
    +  }
    +  if (!_heap->uncommit_bitmap_slice(this)) {
    +    report_java_out_of_memory("Unable to uncommit bitmaps for region");
    +  }
    +  _heap->decrease_committed(ShenandoahHeapRegion::region_size_bytes());
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.hpp
    new file mode 100644
    index 00000000000..72ac1a14337
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.hpp
    @@ -0,0 +1,431 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGION_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGION_HPP
    +
    +#include "gc/shared/space.hpp"
    +#include "gc/shenandoah/shenandoahAllocRequest.hpp"
    +#include "gc/shenandoah/shenandoahAsserts.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahPacer.hpp"
    +#include "memory/universe.hpp"
    +#include "utilities/sizes.hpp"
    +
    +class VMStructs;
    +
    +class ShenandoahHeapRegion : public ContiguousSpace {
    +  friend class VMStructs;
    +private:
    +  /*
    +    Region state is described by a state machine. Transitions are guarded by
    +    heap lock, which allows changing the state of several regions atomically.
    +    Region states can be logically aggregated in groups.
    +
    +      "Empty":
    +      .................................................................
    +      .                                                               .
    +      .                                                               .
    +      .         Uncommitted  <-------  Committed <------------------------\
    +      .              |                     |                          .   |
    +      .              \---------v-----------/                          .   |
    +      .                        |                                      .   |
    +      .........................|.......................................   |
    +                               |                                          |
    +      "Active":                |                                          |
    +      .........................|.......................................   |
    +      .                        |                                      .   |
    +      .      /-----------------^-------------------\                  .   |
    +      .      |                                     |                  .   |
    +      .      v                                     v    "Humongous":  .   |
    +      .   Regular ---\-----\     ..................O................  .   |
    +      .     |  ^     |     |     .                 |               .  .   |
    +      .     |  |     |     |     .                 *---------\     .  .   |
    +      .     v  |     |     |     .                 v         v     .  .   |
    +      .    Pinned  Cset    |     .  HStart <--> H/Start   H/Cont   .  .   |
    +      .       ^    / |     |     .  Pinned         v         |     .  .   |
    +      .       |   /  |     |     .                 *<--------/     .  .   |
    +      .       |  v   |     |     .                 |               .  .   |
    +      .  CsetPinned  |     |     ..................O................  .   |
    +      .              |     |                       |                  .   |
    +      .              \-----\---v-------------------/                  .   |
    +      .                        |                                      .   |
    +      .........................|.......................................   |
    +                               |                                          |
    +      "Trash":                 |                                          |
    +      .........................|.......................................   |
    +      .                        |                                      .   |
    +      .                        v                                      .   |
    +      .                      Trash ---------------------------------------/
    +      .                                                               .
    +      .                                                               .
    +      .................................................................
    +
    +    Transition from "Empty" to "Active" is first allocation. It can go from {Uncommitted, Committed}
    +    to {Regular, "Humongous"}. The allocation may happen in Regular regions too, but not in Humongous.
    +
    +    Transition from "Active" to "Trash" is reclamation. It can go from CSet during the normal cycle,
    +    and from {Regular, "Humongous"} for immediate reclamation. The existence of Trash state allows
    +    quick reclamation without actual cleaning up.
    +
    +    Transition from "Trash" to "Empty" is recycling. It cleans up the regions and corresponding metadata.
    +    Can be done asynchronously and in bulk.
    +
    +    Note how internal transitions disallow logic bugs:
    +      a) No region can go Empty, unless properly reclaimed/recycled;
    +      b) No region can go Uncommitted, unless reclaimed/recycled first;
    +      c) Only Regular regions can go to CSet;
    +      d) Pinned cannot go Trash, thus it could never be reclaimed until unpinned;
    +      e) Pinned cannot go CSet, thus it never moves;
    +      f) Humongous cannot be used for regular allocations;
    +      g) Humongous cannot go CSet, thus it never moves;
    +      h) Humongous start can go pinned, and thus can be protected from moves (humongous continuations should
    +         follow associated humongous starts, not pinnable/movable by themselves);
    +      i) Empty cannot go Trash, avoiding useless work;
    +      j) ...
    +   */
    +
    +  enum RegionState {
    +    _empty_uncommitted,       // region is empty and has memory uncommitted
    +    _empty_committed,         // region is empty and has memory committed
    +    _regular,                 // region is for regular allocations
    +    _humongous_start,         // region is the humongous start
    +    _humongous_cont,          // region is the humongous continuation
    +    _pinned_humongous_start,  // region is both humongous start and pinned
    +    _cset,                    // region is in collection set
    +    _pinned,                  // region is pinned
    +    _pinned_cset,             // region is pinned and in cset (evac failure path)
    +    _trash,                   // region contains only trash
    +  };
    +
    +  const char* region_state_to_string(RegionState s) const {
    +    switch (s) {
    +      case _empty_uncommitted:       return "Empty Uncommitted";
    +      case _empty_committed:         return "Empty Committed";
    +      case _regular:                 return "Regular";
    +      case _humongous_start:         return "Humongous Start";
    +      case _humongous_cont:          return "Humongous Continuation";
    +      case _pinned_humongous_start:  return "Humongous Start, Pinned";
    +      case _cset:                    return "Collection Set";
    +      case _pinned:                  return "Pinned";
    +      case _pinned_cset:             return "Collection Set, Pinned";
    +      case _trash:                   return "Trash";
    +      default:
    +        ShouldNotReachHere();
    +        return "";
    +    }
    +  }
    +
    +  // This method protects from accidental changes in enum order:
    +  int region_state_to_ordinal(RegionState s) const {
    +    switch (s) {
    +      case _empty_uncommitted:      return 0;
    +      case _empty_committed:        return 1;
    +      case _regular:                return 2;
    +      case _humongous_start:        return 3;
    +      case _humongous_cont:         return 4;
    +      case _cset:                   return 5;
    +      case _pinned:                 return 6;
    +      case _trash:                  return 7;
    +      case _pinned_cset:            return 8;
    +      case _pinned_humongous_start: return 9;
    +      default:
    +        ShouldNotReachHere();
    +        return -1;
    +    }
    +  }
    +
    +  void report_illegal_transition(const char* method);
    +
    +public:
    +  // Allowed transitions from the outside code:
    +  void make_regular_allocation();
    +  void make_regular_bypass();
    +  void make_humongous_start();
    +  void make_humongous_cont();
    +  void make_humongous_start_bypass();
    +  void make_humongous_cont_bypass();
    +  void make_pinned();
    +  void make_unpinned();
    +  void make_cset();
    +  void make_trash();
    +  void make_trash_immediate();
    +  void make_empty();
    +  void make_uncommitted();
    +  void make_committed_bypass();
    +
    +  // Individual states:
    +  bool is_empty_uncommitted()      const { return _state == _empty_uncommitted; }
    +  bool is_empty_committed()        const { return _state == _empty_committed; }
    +  bool is_regular()                const { return _state == _regular; }
    +  bool is_humongous_continuation() const { return _state == _humongous_cont; }
    +
    +  // Participation in logical groups:
    +  bool is_empty()                  const { return is_empty_committed() || is_empty_uncommitted(); }
    +  bool is_active()                 const { return !is_empty() && !is_trash(); }
    +  bool is_trash()                  const { return _state == _trash; }
    +  bool is_humongous_start()        const { return _state == _humongous_start || _state == _pinned_humongous_start; }
    +  bool is_humongous()              const { return is_humongous_start() || is_humongous_continuation(); }
    +  bool is_committed()              const { return !is_empty_uncommitted(); }
    +  bool is_cset()                   const { return _state == _cset   || _state == _pinned_cset; }
    +  bool is_pinned()                 const { return _state == _pinned || _state == _pinned_cset || _state == _pinned_humongous_start; }
    +
    +  // Macro-properties:
    +  bool is_alloc_allowed()          const { return is_empty() || is_regular() || _state == _pinned; }
    +  bool is_move_allowed()           const { return is_regular() || _state == _cset || (ShenandoahHumongousMoves && _state == _humongous_start); }
    +
    +  RegionState state()              const { return _state; }
    +  int  state_ordinal()             const { return region_state_to_ordinal(_state); }
    +
    +private:
    +  static size_t RegionCount;
    +  static size_t RegionSizeBytes;
    +  static size_t RegionSizeWords;
    +  static size_t RegionSizeBytesShift;
    +  static size_t RegionSizeWordsShift;
    +  static size_t RegionSizeBytesMask;
    +  static size_t RegionSizeWordsMask;
    +  static size_t HumongousThresholdBytes;
    +  static size_t HumongousThresholdWords;
    +  static size_t MaxTLABSizeBytes;
    +  static size_t MaxTLABSizeWords;
    +
    +  // Global allocation counter, increased for each allocation under Shenandoah heap lock.
    +  // Padded to avoid false sharing with the read-only fields above.
    +  struct PaddedAllocSeqNum {
    +    DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(uint64_t));
    +    uint64_t value;
    +    DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +    PaddedAllocSeqNum() {
    +      // start with 1, reserve 0 for uninitialized value
    +      value = 1;
    +    }
    +  };
    +
    +  static PaddedAllocSeqNum _alloc_seq_num;
    +
    +  // Never updated fields
    +  ShenandoahHeap* _heap;
    +  ShenandoahPacer* _pacer;
    +  MemRegion _reserved;
    +  size_t _region_number;
    +
    +  // Rarely updated fields
    +  HeapWord* _new_top;
    +  size_t _critical_pins;
    +  double _empty_time;
    +
    +  // Seldom updated fields
    +  RegionState _state;
    +
    +  // Frequently updated fields
    +  size_t _tlab_allocs;
    +  size_t _gclab_allocs;
    +  size_t _shared_allocs;
    +
    +  uint64_t _seqnum_first_alloc_mutator;
    +  uint64_t _seqnum_first_alloc_gc;
    +  uint64_t _seqnum_last_alloc_mutator;
    +  uint64_t _seqnum_last_alloc_gc;
    +
    +  volatile size_t _live_data;
    +
    +  // Claim some space at the end to protect next region
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +public:
    +  ShenandoahHeapRegion(ShenandoahHeap* heap, HeapWord* start, size_t size_words, size_t index, bool committed);
    +
    +  static const size_t MIN_NUM_REGIONS = 10;
    +
    +  static void setup_sizes(size_t initial_heap_size, size_t max_heap_size);
    +
    +  double empty_time() {
    +    return _empty_time;
    +  }
    +
    +  inline static size_t required_regions(size_t bytes) {
    +    return (bytes + ShenandoahHeapRegion::region_size_bytes() - 1) >> ShenandoahHeapRegion::region_size_bytes_shift();
    +  }
    +
    +  inline static size_t region_count() {
    +    return ShenandoahHeapRegion::RegionCount;
    +  }
    +
    +  inline static size_t region_size_bytes() {
    +    return ShenandoahHeapRegion::RegionSizeBytes;
    +  }
    +
    +  inline static size_t region_size_words() {
    +    return ShenandoahHeapRegion::RegionSizeWords;
    +  }
    +
    +  inline static size_t region_size_bytes_shift() {
    +    return ShenandoahHeapRegion::RegionSizeBytesShift;
    +  }
    +
    +  inline static size_t region_size_words_shift() {
    +    return ShenandoahHeapRegion::RegionSizeWordsShift;
    +  }
    +
    +  inline static size_t region_size_bytes_mask() {
    +    return ShenandoahHeapRegion::RegionSizeBytesMask;
    +  }
    +
    +  inline static size_t region_size_words_mask() {
    +    return ShenandoahHeapRegion::RegionSizeWordsMask;
    +  }
    +
    +  // Convert to jint with sanity checking
    +  inline static jint region_size_bytes_jint() {
    +    assert (ShenandoahHeapRegion::RegionSizeBytes <= (size_t)max_jint, "sanity");
    +    return (jint)ShenandoahHeapRegion::RegionSizeBytes;
    +  }
    +
    +  // Convert to jint with sanity checking
    +  inline static jint region_size_words_jint() {
    +    assert (ShenandoahHeapRegion::RegionSizeWords <= (size_t)max_jint, "sanity");
    +    return (jint)ShenandoahHeapRegion::RegionSizeWords;
    +  }
    +
    +  // Convert to jint with sanity checking
    +  inline static jint region_size_bytes_shift_jint() {
    +    assert (ShenandoahHeapRegion::RegionSizeBytesShift <= (size_t)max_jint, "sanity");
    +    return (jint)ShenandoahHeapRegion::RegionSizeBytesShift;
    +  }
    +
    +  // Convert to jint with sanity checking
    +  inline static jint region_size_words_shift_jint() {
    +    assert (ShenandoahHeapRegion::RegionSizeWordsShift <= (size_t)max_jint, "sanity");
    +    return (jint)ShenandoahHeapRegion::RegionSizeWordsShift;
    +  }
    +
    +  inline static size_t humongous_threshold_bytes() {
    +    return ShenandoahHeapRegion::HumongousThresholdBytes;
    +  }
    +
    +  inline static size_t humongous_threshold_words() {
    +    return ShenandoahHeapRegion::HumongousThresholdWords;
    +  }
    +
    +  inline static size_t max_tlab_size_bytes() {
    +    return ShenandoahHeapRegion::MaxTLABSizeBytes;
    +  }
    +
    +  inline static size_t max_tlab_size_words() {
    +    return ShenandoahHeapRegion::MaxTLABSizeWords;
    +  }
    +
    +  static uint64_t seqnum_current_alloc() {
    +    // Last used seq number
    +    return _alloc_seq_num.value - 1;
    +  }
    +
    +  size_t region_number() const;
    +
    +  // Allocation (return NULL if full)
    +  inline HeapWord* allocate(size_t word_size, ShenandoahAllocRequest::Type type);
    +
    +  HeapWord* allocate(size_t word_size) shenandoah_not_implemented_return(NULL)
    +
    +  void clear_live_data();
    +  void set_live_data(size_t s);
    +
    +  // Increase live data for newly allocated region
    +  inline void increase_live_data_alloc_words(size_t s);
    +
    +  // Increase live data for region scanned with GC
    +  inline void increase_live_data_gc_words(size_t s);
    +
    +  bool has_live() const;
    +  size_t get_live_data_bytes() const;
    +  size_t get_live_data_words() const;
    +
    +  void print_on(outputStream* st) const;
    +
    +  size_t garbage() const;
    +
    +  void recycle();
    +
    +  void oop_iterate(OopIterateClosure* cl);
    +
    +  HeapWord* block_start_const(const void* p) const;
    +
    +  bool in_collection_set() const;
    +
    +  // Find humongous start region that this region belongs to
    +  ShenandoahHeapRegion* humongous_start_region() const;
    +
    +  CompactibleSpace* next_compaction_space() const shenandoah_not_implemented_return(NULL);
    +  void prepare_for_compaction(CompactPoint* cp)   shenandoah_not_implemented;
    +  void adjust_pointers()                          shenandoah_not_implemented;
    +  void compact()                                  shenandoah_not_implemented;
    +
    +  void set_new_top(HeapWord* new_top) { _new_top = new_top; }
    +  HeapWord* new_top() const { return _new_top; }
    +
    +  inline void adjust_alloc_metadata(ShenandoahAllocRequest::Type type, size_t);
    +  void reset_alloc_metadata_to_shared();
    +  void reset_alloc_metadata();
    +  size_t get_shared_allocs() const;
    +  size_t get_tlab_allocs() const;
    +  size_t get_gclab_allocs() const;
    +
    +  uint64_t seqnum_first_alloc() const {
    +    if (_seqnum_first_alloc_mutator == 0) return _seqnum_first_alloc_gc;
    +    if (_seqnum_first_alloc_gc == 0)      return _seqnum_first_alloc_mutator;
    +    return MIN2(_seqnum_first_alloc_mutator, _seqnum_first_alloc_gc);
    +  }
    +
    +  uint64_t seqnum_last_alloc() const {
    +    return MAX2(_seqnum_last_alloc_mutator, _seqnum_last_alloc_gc);
    +  }
    +
    +  uint64_t seqnum_first_alloc_mutator() const {
    +    return _seqnum_first_alloc_mutator;
    +  }
    +
    +  uint64_t seqnum_last_alloc_mutator()  const {
    +    return _seqnum_last_alloc_mutator;
    +  }
    +
    +  uint64_t seqnum_first_alloc_gc() const {
    +    return _seqnum_first_alloc_gc;
    +  }
    +
    +  uint64_t seqnum_last_alloc_gc()  const {
    +    return _seqnum_last_alloc_gc;
    +  }
    +
    +private:
    +  void do_commit();
    +  void do_uncommit();
    +
    +  void oop_iterate_objects(OopIterateClosure* cl);
    +  void oop_iterate_humongous(OopIterateClosure* cl);
    +
    +  inline void internal_increase_live_data(size_t s);
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGION_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.inline.hpp
    new file mode 100644
    index 00000000000..38eef4e138c
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.inline.hpp
    @@ -0,0 +1,111 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGION_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGION_INLINE_HPP
    +
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahPacer.inline.hpp"
    +#include "runtime/atomic.hpp"
    +
    +HeapWord* ShenandoahHeapRegion::allocate(size_t size, ShenandoahAllocRequest::Type type) {
    +  _heap->assert_heaplock_or_safepoint();
    +
    +  HeapWord* obj = top();
    +  if (pointer_delta(end(), obj) >= size) {
    +    make_regular_allocation();
    +    adjust_alloc_metadata(type, size);
    +
    +    HeapWord* new_top = obj + size;
    +    set_top(new_top);
    +    assert(is_aligned(obj) && is_aligned(new_top), "checking alignment");
    +
    +    return obj;
    +  } else {
    +    return NULL;
    +  }
    +}
    +
    +inline void ShenandoahHeapRegion::adjust_alloc_metadata(ShenandoahAllocRequest::Type type, size_t size) {
    +  bool is_first_alloc = (top() == bottom());
    +
    +  switch (type) {
    +    case ShenandoahAllocRequest::_alloc_shared:
    +    case ShenandoahAllocRequest::_alloc_tlab:
    +      _seqnum_last_alloc_mutator = _alloc_seq_num.value++;
    +      if (is_first_alloc) {
    +        assert (_seqnum_first_alloc_mutator == 0, "Region " SIZE_FORMAT " metadata is correct", _region_number);
    +        _seqnum_first_alloc_mutator = _seqnum_last_alloc_mutator;
    +      }
    +      break;
    +    case ShenandoahAllocRequest::_alloc_shared_gc:
    +    case ShenandoahAllocRequest::_alloc_gclab:
    +      _seqnum_last_alloc_gc = _alloc_seq_num.value++;
    +      if (is_first_alloc) {
    +        assert (_seqnum_first_alloc_gc == 0, "Region " SIZE_FORMAT " metadata is correct", _region_number);
    +        _seqnum_first_alloc_gc = _seqnum_last_alloc_gc;
    +      }
    +      break;
    +    default:
    +      ShouldNotReachHere();
    +  }
    +
    +  switch (type) {
    +    case ShenandoahAllocRequest::_alloc_shared:
    +    case ShenandoahAllocRequest::_alloc_shared_gc:
    +      _shared_allocs += size;
    +      break;
    +    case ShenandoahAllocRequest::_alloc_tlab:
    +      _tlab_allocs += size;
    +      break;
    +    case ShenandoahAllocRequest::_alloc_gclab:
    +      _gclab_allocs += size;
    +      break;
    +    default:
    +      ShouldNotReachHere();
    +  }
    +}
    +
    +inline void ShenandoahHeapRegion::increase_live_data_alloc_words(size_t s) {
    +  internal_increase_live_data(s);
    +}
    +
    +inline void ShenandoahHeapRegion::increase_live_data_gc_words(size_t s) {
    +  internal_increase_live_data(s);
    +  if (ShenandoahPacing) {
    +    _pacer->report_mark(s);
    +  }
    +}
    +
    +inline void ShenandoahHeapRegion::internal_increase_live_data(size_t s) {
    +  size_t new_live_data = Atomic::add(s, &_live_data);
    +#ifdef ASSERT
    +  size_t live_bytes = new_live_data * HeapWordSize;
    +  size_t used_bytes = used();
    +  assert(live_bytes <= used_bytes,
    +         "can't have more live data than used: " SIZE_FORMAT ", " SIZE_FORMAT, live_bytes, used_bytes);
    +#endif
    +}
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGION_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.cpp
    new file mode 100644
    index 00000000000..3274c827987
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.cpp
    @@ -0,0 +1,111 @@
    +/*
    + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionCounters.hpp"
    +#include "memory/resourceArea.hpp"
    +#include "runtime/perfData.inline.hpp"
    +
    +ShenandoahHeapRegionCounters::ShenandoahHeapRegionCounters() :
    +  _last_sample_millis(0)
    +{
    +  if (UsePerfData && ShenandoahRegionSampling) {
    +    EXCEPTION_MARK;
    +    ResourceMark rm;
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +    size_t num_regions = heap->num_regions();
    +    const char* cns = PerfDataManager::name_space("shenandoah", "regions");
    +    _name_space = NEW_C_HEAP_ARRAY(char, strlen(cns)+1, mtGC);
    +    strcpy(_name_space, cns);
    +
    +    const char* cname = PerfDataManager::counter_name(_name_space, "timestamp");
    +    _timestamp = PerfDataManager::create_long_variable(SUN_GC, cname, PerfData::U_None, CHECK);
    +
    +    cname = PerfDataManager::counter_name(_name_space, "max_regions");
    +    PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_None, num_regions, CHECK);
    +
    +    cname = PerfDataManager::counter_name(_name_space, "region_size");
    +    PerfDataManager::create_constant(SUN_GC, cname, PerfData::U_None, ShenandoahHeapRegion::region_size_bytes() >> 10, CHECK);
    +
    +    cname = PerfDataManager::counter_name(_name_space, "status");
    +    _status = PerfDataManager::create_long_variable(SUN_GC, cname,
    +                                                    PerfData::U_None, CHECK);
    +
    +    _regions_data = NEW_C_HEAP_ARRAY(PerfVariable*, num_regions, mtGC);
    +    for (uint i = 0; i < num_regions; i++) {
    +      const char* reg_name = PerfDataManager::name_space(_name_space, "region", i);
    +      const char* data_name = PerfDataManager::counter_name(reg_name, "data");
    +      const char* ns = PerfDataManager::ns_to_string(SUN_GC);
    +      const char* fullname = PerfDataManager::counter_name(ns, data_name);
    +      assert(!PerfDataManager::exists(fullname), "must not exist");
    +      _regions_data[i] = PerfDataManager::create_long_variable(SUN_GC, data_name,
    +                                                               PerfData::U_None, CHECK);
    +    }
    +  }
    +}
    +
    +ShenandoahHeapRegionCounters::~ShenandoahHeapRegionCounters() {
    +  if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space);
    +}
    +
    +void ShenandoahHeapRegionCounters::update() {
    +  if (ShenandoahRegionSampling) {
    +    jlong current = os::javaTimeMillis();
    +    jlong last = _last_sample_millis;
    +    if (current - last > ShenandoahRegionSamplingRate &&
    +            Atomic::cmpxchg(current, &_last_sample_millis, last) == last) {
    +
    +      ShenandoahHeap* heap = ShenandoahHeap::heap();
    +      jlong status = 0;
    +      if (heap->is_concurrent_mark_in_progress())      status |= 1 << 0;
    +      if (heap->is_evacuation_in_progress())           status |= 1 << 1;
    +      if (heap->is_update_refs_in_progress())          status |= 1 << 2;
    +      if (heap->is_concurrent_traversal_in_progress()) status |= 1 << 3;
    +      _status->set_value(status);
    +
    +      _timestamp->set_value(os::elapsed_counter());
    +
    +      size_t num_regions = heap->num_regions();
    +
    +      {
    +        ShenandoahHeapLocker locker(heap->lock());
    +        size_t rs = ShenandoahHeapRegion::region_size_bytes();
    +        for (uint i = 0; i < num_regions; i++) {
    +          ShenandoahHeapRegion* r = heap->get_region(i);
    +          jlong data = 0;
    +          data |= ((100 * r->used() / rs)                & PERCENT_MASK) << USED_SHIFT;
    +          data |= ((100 * r->get_live_data_bytes() / rs) & PERCENT_MASK) << LIVE_SHIFT;
    +          data |= ((100 * r->get_tlab_allocs() / rs)     & PERCENT_MASK) << TLAB_SHIFT;
    +          data |= ((100 * r->get_gclab_allocs() / rs)    & PERCENT_MASK) << GCLAB_SHIFT;
    +          data |= ((100 * r->get_shared_allocs() / rs)   & PERCENT_MASK) << SHARED_SHIFT;
    +          data |= (r->state_ordinal() & STATUS_MASK) << STATUS_SHIFT;
    +          _regions_data[i]->set_value(data);
    +        }
    +      }
    +
    +    }
    +  }
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.hpp
    new file mode 100644
    index 00000000000..cca9ddd3a44
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionCounters.hpp
    @@ -0,0 +1,85 @@
    +/*
    + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGIONCOUNTERS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGIONCOUNTERS_HPP
    +
    +#include "memory/allocation.hpp"
    +
    +/**
    + * This provides the following in JVMStat:
    + *
    + * constants:
    + * - sun.gc.shenandoah.regions.timestamp    the timestamp for this sample
    + * - sun.gc.shenandoah.regions.max_regions  maximum number of regions
    + * - sun.gc.shenandoah.regions.region_size  size per region, in kilobytes
    + *
    + * variables:
    + * - sun.gc.shenandoah.regions.status       current GC status:
    + *     - bit 0 set when marking in progress
    + *     - bit 1 set when evacuation in progress
    + *     - bit 2 set when update refs in progress
    + *     - bit 3 set when traversal in progress
    + *
    + * two variable counters per region, with $max_regions (see above) counters:
    + * - sun.gc.shenandoah.regions.region.$i.data
    + * where $ is the region number from 0 <= i < $max_regions
    + *
    + * .data is in the following format:
    + * - bits 0-6    used memory in percent
    + * - bits 7-13   live memory in percent
    + * - bits 14-20  tlab allocated memory in percent
    + * - bits 21-27  gclab allocated memory in percent
    + * - bits 28-34  shared allocated memory in percent
    + * - bits 35-41  
    + * - bits 42-50  
    + * - bits 51-57  
    + * - bits 58-63  status
    + *      - bits describe the state as recorded in ShenandoahHeapRegion
    + */
    +class ShenandoahHeapRegionCounters : public CHeapObj  {
    +private:
    +  static const jlong PERCENT_MASK = 0x7f;
    +  static const jlong STATUS_MASK  = 0x3f;
    +
    +  static const jlong USED_SHIFT   = 0;
    +  static const jlong LIVE_SHIFT   = 7;
    +  static const jlong TLAB_SHIFT   = 14;
    +  static const jlong GCLAB_SHIFT  = 21;
    +  static const jlong SHARED_SHIFT = 28;
    +
    +  static const jlong STATUS_SHIFT = 58;
    +
    +  char* _name_space;
    +  PerfLongVariable** _regions_data;
    +  PerfLongVariable* _timestamp;
    +  PerfLongVariable* _status;
    +  volatile jlong _last_sample_millis;
    +
    +public:
    +  ShenandoahHeapRegionCounters();
    +  ~ShenandoahHeapRegionCounters();
    +  void update();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGIONCOUNTERS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionSet.cpp
    new file mode 100644
    index 00000000000..faac415d54a
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionSet.cpp
    @@ -0,0 +1,141 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "runtime/atomic.hpp"
    +#include "utilities/copy.hpp"
    +
    +ShenandoahHeapRegionSetIterator::ShenandoahHeapRegionSetIterator(const ShenandoahHeapRegionSet* const set) :
    +        _set(set), _heap(ShenandoahHeap::heap()), _current_index(0) {}
    +
    +void ShenandoahHeapRegionSetIterator::reset(const ShenandoahHeapRegionSet* const set) {
    +  _set = set;
    +  _current_index = 0;
    +}
    +
    +ShenandoahHeapRegionSet::ShenandoahHeapRegionSet() :
    +  _heap(ShenandoahHeap::heap()),
    +  _map_size(_heap->num_regions()),
    +  _region_size_bytes_shift(ShenandoahHeapRegion::region_size_bytes_shift()),
    +  _set_map(NEW_C_HEAP_ARRAY(jbyte, _map_size, mtGC)),
    +  _biased_set_map(_set_map - ((uintx)_heap->base() >> _region_size_bytes_shift)),
    +  _region_count(0)
    +{
    +  // Use 1-byte data type
    +  STATIC_ASSERT(sizeof(jbyte) == 1);
    +
    +  // Initialize cset map
    +  Copy::zero_to_bytes(_set_map, _map_size);
    +}
    +
    +ShenandoahHeapRegionSet::~ShenandoahHeapRegionSet() {
    +  FREE_C_HEAP_ARRAY(jbyte, _set_map);
    +}
    +
    +void ShenandoahHeapRegionSet::add_region(ShenandoahHeapRegion* r) {
    +  assert(!is_in(r), "Already in collection set");
    +  _set_map[r->region_number()] = 1;
    +  _region_count++;
    +}
    +
    +bool ShenandoahHeapRegionSet::add_region_check_for_duplicates(ShenandoahHeapRegion* r) {
    +  if (!is_in(r)) {
    +    add_region(r);
    +    return true;
    +  } else {
    +    return false;
    +  }
    +}
    +
    +void ShenandoahHeapRegionSet::remove_region(ShenandoahHeapRegion* r) {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +  assert(Thread::current()->is_VM_thread(), "Must be VMThread");
    +  assert(is_in(r), "Not in region set");
    +  _set_map[r->region_number()] = 0;
    +  _region_count --;
    +}
    +
    +void ShenandoahHeapRegionSet::clear() {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +  Copy::zero_to_bytes(_set_map, _map_size);
    +
    +  _region_count = 0;
    +}
    +
    +ShenandoahHeapRegion* ShenandoahHeapRegionSetIterator::claim_next() {
    +  size_t num_regions = _heap->num_regions();
    +  if (_current_index >= (jint)num_regions) {
    +    return NULL;
    +  }
    +
    +  jint saved_current = _current_index;
    +  size_t index = (size_t)saved_current;
    +
    +  while(index < num_regions) {
    +    if (_set->is_in(index)) {
    +      jint cur = Atomic::cmpxchg((jint)(index + 1), &_current_index, saved_current);
    +      assert(cur >= (jint)saved_current, "Must move forward");
    +      if (cur == saved_current) {
    +        assert(_set->is_in(index), "Invariant");
    +        return _heap->get_region(index);
    +      } else {
    +        index = (size_t)cur;
    +        saved_current = cur;
    +      }
    +    } else {
    +      index ++;
    +    }
    +  }
    +  return NULL;
    +}
    +
    +ShenandoahHeapRegion* ShenandoahHeapRegionSetIterator::next() {
    +  size_t num_regions = _heap->num_regions();
    +  for (size_t index = (size_t)_current_index; index < num_regions; index ++) {
    +    if (_set->is_in(index)) {
    +      _current_index = (jint)(index + 1);
    +      return _heap->get_region(index);
    +    }
    +  }
    +
    +  return NULL;
    +}
    +
    +void ShenandoahHeapRegionSet::print_on(outputStream* out) const {
    +  out->print_cr("Region Set : " SIZE_FORMAT "", count());
    +
    +  debug_only(size_t regions = 0;)
    +  for (size_t index = 0; index < _heap->num_regions(); index ++) {
    +    if (is_in(index)) {
    +      _heap->get_region(index)->print_on(out);
    +      debug_only(regions ++;)
    +    }
    +  }
    +  assert(regions == count(), "Must match");
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionSet.hpp
    new file mode 100644
    index 00000000000..067b925d5da
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionSet.hpp
    @@ -0,0 +1,98 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGIONSET_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGIONSET_HPP
    +
    +#include "memory/allocation.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +
    +class ShenandoahHeapRegionSet;
    +
    +class ShenandoahHeapRegionSetIterator : public StackObj {
    +private:
    +  const ShenandoahHeapRegionSet* _set;
    +  ShenandoahHeap* const _heap;
    +
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile jint));
    +  volatile jint _current_index;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +  // No implicit copying: iterators should be passed by reference to capture the state
    +  ShenandoahHeapRegionSetIterator(const ShenandoahHeapRegionSetIterator& that);
    +  ShenandoahHeapRegionSetIterator& operator=(const ShenandoahHeapRegionSetIterator& o);
    +
    +public:
    +  ShenandoahHeapRegionSetIterator(const ShenandoahHeapRegionSet* const set);
    +
    +  // Reset existing iterator to new set
    +  void reset(const ShenandoahHeapRegionSet* const set);
    +
    +  // MT version
    +  ShenandoahHeapRegion* claim_next();
    +
    +  // Single-thread version
    +  ShenandoahHeapRegion* next();
    +};
    +
    +class ShenandoahHeapRegionSet : public CHeapObj {
    +  friend class ShenandoahHeap;
    +private:
    +  ShenandoahHeap* const _heap;
    +  size_t const          _map_size;
    +  size_t const          _region_size_bytes_shift;
    +  jbyte* const          _set_map;
    +  // Bias set map's base address for fast test if an oop is in set
    +  jbyte* const          _biased_set_map;
    +  size_t                _region_count;
    +
    +public:
    +  ShenandoahHeapRegionSet();
    +  ~ShenandoahHeapRegionSet();
    +
    +  // Add region to set
    +  void add_region(ShenandoahHeapRegion* r);
    +  bool add_region_check_for_duplicates(ShenandoahHeapRegion* r);
    +
    +  // Remove region from set
    +  void remove_region(ShenandoahHeapRegion* r);
    +
    +  size_t count()  const { return _region_count; }
    +  bool is_empty() const { return _region_count == 0; }
    +
    +  inline bool is_in(ShenandoahHeapRegion* r) const;
    +  inline bool is_in(size_t region_number)    const;
    +  inline bool is_in(HeapWord* p)             const;
    +
    +  void print_on(outputStream* out) const;
    +
    +  void clear();
    +
    +private:
    +  jbyte* biased_map_address() const {
    +    return _biased_set_map;
    +  }
    +};
    +
    +#endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGIONSET_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionSet.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionSet.inline.hpp
    new file mode 100644
    index 00000000000..0065420b766
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegionSet.inline.hpp
    @@ -0,0 +1,49 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGIONSET_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGIONSET_INLINE_HPP
    +
    +#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +
    +bool ShenandoahHeapRegionSet::is_in(size_t region_number) const {
    +  assert(region_number < _heap->num_regions(), "Sanity");
    +  return _set_map[region_number] == 1;
    +}
    +
    +bool ShenandoahHeapRegionSet::is_in(ShenandoahHeapRegion* r) const {
    +  return is_in(r->region_number());
    +}
    +
    +bool ShenandoahHeapRegionSet::is_in(HeapWord* p) const {
    +  assert(_heap->is_in(p), "Must be in the heap");
    +  uintx index = ((uintx) p) >> _region_size_bytes_shift;
    +  // no need to subtract the bottom of the heap from p,
    +  // _biased_set_map is biased
    +  return _biased_set_map[index] == 1;
    +}
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEAPREGIONSET_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeuristics.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeuristics.cpp
    new file mode 100644
    index 00000000000..85b9235fbae
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeuristics.cpp
    @@ -0,0 +1,336 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shared/gcCause.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
    +#include "logging/log.hpp"
    +#include "logging/logTag.hpp"
    +
    +int ShenandoahHeuristics::compare_by_garbage(RegionData a, RegionData b) {
    +  if (a._garbage > b._garbage)
    +    return -1;
    +  else if (a._garbage < b._garbage)
    +    return 1;
    +  else return 0;
    +}
    +
    +int ShenandoahHeuristics::compare_by_garbage_then_alloc_seq_ascending(RegionData a, RegionData b) {
    +  int r = compare_by_garbage(a, b);
    +  if (r != 0) {
    +    return r;
    +  }
    +  return compare_by_alloc_seq_ascending(a, b);
    +}
    +
    +int ShenandoahHeuristics::compare_by_alloc_seq_ascending(RegionData a, RegionData b) {
    +  if (a._seqnum_last_alloc == b._seqnum_last_alloc)
    +    return 0;
    +  else if (a._seqnum_last_alloc < b._seqnum_last_alloc)
    +    return -1;
    +  else return 1;
    +}
    +
    +int ShenandoahHeuristics::compare_by_alloc_seq_descending(RegionData a, RegionData b) {
    +  return -compare_by_alloc_seq_ascending(a, b);
    +}
    +
    +ShenandoahHeuristics::ShenandoahHeuristics() :
    +  _update_refs_early(false),
    +  _update_refs_adaptive(false),
    +  _region_data(NULL),
    +  _region_data_size(0),
    +  _degenerated_cycles_in_a_row(0),
    +  _successful_cycles_in_a_row(0),
    +  _bytes_in_cset(0),
    +  _cycle_start(os::elapsedTime()),
    +  _last_cycle_end(0),
    +  _gc_times_learned(0),
    +  _gc_time_penalties(0),
    +  _gc_time_history(new TruncatedSeq(5)),
    +  _metaspace_oom()
    +{
    +  if (strcmp(ShenandoahUpdateRefsEarly, "on") == 0 ||
    +      strcmp(ShenandoahUpdateRefsEarly, "true") == 0 ) {
    +    _update_refs_early = true;
    +  } else if (strcmp(ShenandoahUpdateRefsEarly, "off") == 0 ||
    +             strcmp(ShenandoahUpdateRefsEarly, "false") == 0 ) {
    +    _update_refs_early = false;
    +  } else if (strcmp(ShenandoahUpdateRefsEarly, "adaptive") == 0) {
    +    _update_refs_adaptive = true;
    +    _update_refs_early = true;
    +  } else {
    +    vm_exit_during_initialization("Unknown -XX:ShenandoahUpdateRefsEarly option: %s", ShenandoahUpdateRefsEarly);
    +  }
    +
    +  // No unloading during concurrent mark? Communicate that to heuristics
    +  if (!ClassUnloadingWithConcurrentMark) {
    +    FLAG_SET_DEFAULT(ShenandoahUnloadClassesFrequency, 0);
    +  }
    +}
    +
    +ShenandoahHeuristics::~ShenandoahHeuristics() {
    +  if (_region_data != NULL) {
    +    FREE_C_HEAP_ARRAY(RegionGarbage, _region_data);
    +  }
    +}
    +
    +ShenandoahHeuristics::RegionData* ShenandoahHeuristics::get_region_data_cache(size_t num) {
    +  RegionData* res = _region_data;
    +  if (res == NULL) {
    +    res = NEW_C_HEAP_ARRAY(RegionData, num, mtGC);
    +    _region_data = res;
    +    _region_data_size = num;
    +  } else if (_region_data_size < num) {
    +    res = REALLOC_C_HEAP_ARRAY(RegionData, _region_data, num, mtGC);
    +    _region_data = res;
    +    _region_data_size = num;
    +  }
    +  return res;
    +}
    +
    +void ShenandoahHeuristics::choose_collection_set(ShenandoahCollectionSet* collection_set) {
    +  assert(collection_set->count() == 0, "Must be empty");
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  // Step 1. Build up the region candidates we care about, rejecting losers and accepting winners right away.
    +
    +  size_t num_regions = heap->num_regions();
    +
    +  RegionData* candidates = get_region_data_cache(num_regions);
    +
    +  size_t cand_idx = 0;
    +
    +  size_t total_garbage = 0;
    +
    +  size_t immediate_garbage = 0;
    +  size_t immediate_regions = 0;
    +
    +  size_t free = 0;
    +  size_t free_regions = 0;
    +
    +  ShenandoahMarkingContext* const ctx = heap->complete_marking_context();
    +
    +  for (size_t i = 0; i < num_regions; i++) {
    +    ShenandoahHeapRegion* region = heap->get_region(i);
    +
    +    size_t garbage = region->garbage();
    +    total_garbage += garbage;
    +
    +    if (region->is_empty()) {
    +      free_regions++;
    +      free += ShenandoahHeapRegion::region_size_bytes();
    +    } else if (region->is_regular()) {
    +      if (!region->has_live()) {
    +        // We can recycle it right away and put it in the free set.
    +        immediate_regions++;
    +        immediate_garbage += garbage;
    +        region->make_trash_immediate();
    +      } else {
    +        // This is our candidate for later consideration.
    +        candidates[cand_idx]._region = region;
    +        candidates[cand_idx]._garbage = garbage;
    +        cand_idx++;
    +      }
    +    } else if (region->is_humongous_start()) {
    +      // Reclaim humongous regions here, and count them as the immediate garbage
    +#ifdef ASSERT
    +      bool reg_live = region->has_live();
    +      bool bm_live = ctx->is_marked(oop(region->bottom() + ShenandoahBrooksPointer::word_size()));
    +      assert(reg_live == bm_live,
    +             "Humongous liveness and marks should agree. Region live: %s; Bitmap live: %s; Region Live Words: " SIZE_FORMAT,
    +             BOOL_TO_STR(reg_live), BOOL_TO_STR(bm_live), region->get_live_data_words());
    +#endif
    +      if (!region->has_live()) {
    +        heap->trash_humongous_region_at(region);
    +
    +        // Count only the start. Continuations would be counted on "trash" path
    +        immediate_regions++;
    +        immediate_garbage += garbage;
    +      }
    +    } else if (region->is_trash()) {
    +      // Count in just trashed collection set, during coalesced CM-with-UR
    +      immediate_regions++;
    +      immediate_garbage += garbage;
    +    }
    +  }
    +
    +  // Step 2. Look back at garbage statistics, and decide if we want to collect anything,
    +  // given the amount of immediately reclaimable garbage. If we do, figure out the collection set.
    +
    +  assert (immediate_garbage <= total_garbage,
    +          "Cannot have more immediate garbage than total garbage: " SIZE_FORMAT "M vs " SIZE_FORMAT "M",
    +          immediate_garbage / M, total_garbage / M);
    +
    +  size_t immediate_percent = total_garbage == 0 ? 0 : (immediate_garbage * 100 / total_garbage);
    +
    +  if (immediate_percent <= ShenandoahImmediateThreshold) {
    +    choose_collection_set_from_regiondata(collection_set, candidates, cand_idx, immediate_garbage + free);
    +    collection_set->update_region_status();
    +
    +    size_t cset_percent = total_garbage == 0 ? 0 : (collection_set->garbage() * 100 / total_garbage);
    +    log_info(gc, ergo)("Collectable Garbage: " SIZE_FORMAT "M (" SIZE_FORMAT "%% of total), " SIZE_FORMAT "M CSet, " SIZE_FORMAT " CSet regions",
    +                       collection_set->garbage() / M, cset_percent, collection_set->live_data() / M, collection_set->count());
    +  }
    +
    +  log_info(gc, ergo)("Immediate Garbage: " SIZE_FORMAT "M (" SIZE_FORMAT "%% of total), " SIZE_FORMAT " regions",
    +                     immediate_garbage / M, immediate_percent, immediate_regions);
    +}
    +
    +void ShenandoahHeuristics::record_gc_start() {
    +  // Do nothing
    +}
    +
    +void ShenandoahHeuristics::record_gc_end() {
    +  // Do nothing
    +}
    +
    +void ShenandoahHeuristics::record_cycle_start() {
    +  _cycle_start = os::elapsedTime();
    +}
    +
    +void ShenandoahHeuristics::record_cycle_end() {
    +  _last_cycle_end = os::elapsedTime();
    +}
    +
    +void ShenandoahHeuristics::record_phase_time(ShenandoahPhaseTimings::Phase phase, double secs) {
    +  // Do nothing
    +}
    +
    +bool ShenandoahHeuristics::should_start_update_refs() {
    +  return _update_refs_early;
    +}
    +
    +bool ShenandoahHeuristics::should_start_normal_gc() const {
    +  // Perform GC to cleanup metaspace
    +  if (has_metaspace_oom()) {
    +    // Some of vmTestbase/metaspace tests depend on following line to count GC cycles
    +    log_info(gc)("Trigger: %s", GCCause::to_string(GCCause::_metadata_GC_threshold));
    +    return true;
    +  }
    +
    +  double last_time_ms = (os::elapsedTime() - _last_cycle_end) * 1000;
    +  bool periodic_gc = (last_time_ms > ShenandoahGuaranteedGCInterval);
    +  if (periodic_gc) {
    +    log_info(gc)("Trigger: Time since last GC (%.0f ms) is larger than guaranteed interval (" UINTX_FORMAT " ms)",
    +                  last_time_ms, ShenandoahGuaranteedGCInterval);
    +  }
    +  return periodic_gc;
    +}
    +
    +bool ShenandoahHeuristics::should_start_traversal_gc() {
    +  return false;
    +}
    +
    +bool ShenandoahHeuristics::can_do_traversal_gc() {
    +  return false;
    +}
    +
    +bool ShenandoahHeuristics::should_degenerate_cycle() {
    +  return _degenerated_cycles_in_a_row <= ShenandoahFullGCThreshold;
    +}
    +
    +void ShenandoahHeuristics::record_success_concurrent() {
    +  _degenerated_cycles_in_a_row = 0;
    +  _successful_cycles_in_a_row++;
    +
    +  _gc_time_history->add(time_since_last_gc());
    +  _gc_times_learned++;
    +  _gc_time_penalties -= MIN2(_gc_time_penalties, Concurrent_Adjust);
    +}
    +
    +void ShenandoahHeuristics::record_success_degenerated() {
    +  _degenerated_cycles_in_a_row++;
    +  _successful_cycles_in_a_row = 0;
    +  _gc_time_penalties += Degenerated_Penalty;
    +}
    +
    +void ShenandoahHeuristics::record_success_full() {
    +  _degenerated_cycles_in_a_row = 0;
    +  _successful_cycles_in_a_row++;
    +  _gc_time_penalties += Full_Penalty;
    +}
    +
    +void ShenandoahHeuristics::record_allocation_failure_gc() {
    +  _bytes_in_cset = 0;
    +}
    +
    +void ShenandoahHeuristics::record_requested_gc() {
    +  _bytes_in_cset = 0;
    +
    +  // Assume users call System.gc() when external state changes significantly,
    +  // which forces us to re-learn the GC timings and allocation rates.
    +  _gc_times_learned = 0;
    +}
    +
    +bool ShenandoahHeuristics::can_process_references() {
    +  if (ShenandoahRefProcFrequency == 0) return false;
    +  return true;
    +}
    +
    +bool ShenandoahHeuristics::should_process_references() {
    +  if (!can_process_references()) return false;
    +  size_t cycle = ShenandoahHeap::heap()->shenandoah_policy()->cycle_counter();
    +  // Process references every Nth GC cycle.
    +  return cycle % ShenandoahRefProcFrequency == 0;
    +}
    +
    +bool ShenandoahHeuristics::can_unload_classes() {
    +  if (!ClassUnloading) return false;
    +  return true;
    +}
    +
    +bool ShenandoahHeuristics::can_unload_classes_normal() {
    +  if (!can_unload_classes()) return false;
    +  if (has_metaspace_oom()) return true;
    +  if (!ClassUnloadingWithConcurrentMark) return false;
    +  if (ShenandoahUnloadClassesFrequency == 0) return false;
    +  return true;
    +}
    +
    +bool ShenandoahHeuristics::should_unload_classes() {
    +  if (!can_unload_classes_normal()) return false;
    +  if (has_metaspace_oom()) return true;
    +  size_t cycle = ShenandoahHeap::heap()->shenandoah_policy()->cycle_counter();
    +  // Unload classes every Nth GC cycle.
    +  // This should not happen in the same cycle as process_references to amortize costs.
    +  // Offsetting by one is enough to break the rendezvous when periods are equal.
    +  // When periods are not equal, offsetting by one is just as good as any other guess.
    +  return (cycle + 1) % ShenandoahUnloadClassesFrequency == 0;
    +}
    +
    +void ShenandoahHeuristics::initialize() {
    +  // Nothing to do by default.
    +}
    +
    +double ShenandoahHeuristics::time_since_last_gc() const {
    +  return os::elapsedTime() - _cycle_start;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeuristics.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeuristics.hpp
    new file mode 100644
    index 00000000000..10e42abfe80
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeuristics.hpp
    @@ -0,0 +1,167 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEURISTICS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEURISTICS_HPP
    +
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shenandoah/shenandoahSharedVariables.hpp"
    +#include "memory/allocation.hpp"
    +#include "runtime/globals_extension.hpp"
    +
    +#define SHENANDOAH_ERGO_DISABLE_FLAG(name)                                  \
    +  do {                                                                      \
    +    if (FLAG_IS_DEFAULT(name) && (name)) {                                  \
    +      log_info(gc)("Heuristics ergonomically sets -XX:-" #name);            \
    +      FLAG_SET_DEFAULT(name, false);                                        \
    +    }                                                                       \
    +  } while (0)
    +
    +#define SHENANDOAH_ERGO_ENABLE_FLAG(name)                                   \
    +  do {                                                                      \
    +    if (FLAG_IS_DEFAULT(name) && !(name)) {                                 \
    +      log_info(gc)("Heuristics ergonomically sets -XX:+" #name);            \
    +      FLAG_SET_DEFAULT(name, true);                                         \
    +    }                                                                       \
    +  } while (0)
    +
    +#define SHENANDOAH_ERGO_OVERRIDE_DEFAULT(name, value)                       \
    +  do {                                                                      \
    +    if (FLAG_IS_DEFAULT(name)) {                                            \
    +      log_info(gc)("Heuristics ergonomically sets -XX:" #name "=" #value);  \
    +      FLAG_SET_DEFAULT(name, value);                                        \
    +    }                                                                       \
    +  } while (0)
    +
    +#define SHENANDOAH_CHECK_FLAG_SET(name)                                     \
    +  do {                                                                      \
    +    if (!name) {                                                            \
    +      err_msg message("Heuristics needs -XX:+" #name " to work correctly"); \
    +      vm_exit_during_initialization("Error", message);                      \
    +    }                                                                       \
    +  } while (0)
    +
    +class ShenandoahCollectionSet;
    +class ShenandoahHeapRegion;
    +
    +class ShenandoahHeuristics : public CHeapObj {
    +  static const intx Concurrent_Adjust   =  1; // recover from penalties
    +  static const intx Degenerated_Penalty = 10; // how much to penalize average GC duration history on Degenerated GC
    +  static const intx Full_Penalty        = 20; // how much to penalize average GC duration history on Full GC
    +
    +protected:
    +  typedef struct {
    +    ShenandoahHeapRegion* _region;
    +    size_t _garbage;
    +    uint64_t _seqnum_last_alloc;
    +  } RegionData;
    +
    +  bool _update_refs_early;
    +  bool _update_refs_adaptive;
    +
    +  RegionData* _region_data;
    +  size_t _region_data_size;
    +
    +  uint _degenerated_cycles_in_a_row;
    +  uint _successful_cycles_in_a_row;
    +
    +  size_t _bytes_in_cset;
    +
    +  double _cycle_start;
    +  double _last_cycle_end;
    +
    +  size_t _gc_times_learned;
    +  size_t _gc_time_penalties;
    +  TruncatedSeq* _gc_time_history;
    +
    +  // There may be many threads that contend to set this flag
    +  ShenandoahSharedFlag _metaspace_oom;
    +
    +  static int compare_by_garbage(RegionData a, RegionData b);
    +  static int compare_by_garbage_then_alloc_seq_ascending(RegionData a, RegionData b);
    +  static int compare_by_alloc_seq_ascending(RegionData a, RegionData b);
    +  static int compare_by_alloc_seq_descending(RegionData a, RegionData b);
    +
    +  RegionData* get_region_data_cache(size_t num);
    +
    +  virtual void choose_collection_set_from_regiondata(ShenandoahCollectionSet* set,
    +                                                     RegionData* data, size_t data_size,
    +                                                     size_t free) = 0;
    +
    +public:
    +  ShenandoahHeuristics();
    +  virtual ~ShenandoahHeuristics();
    +
    +  void record_gc_start();
    +
    +  void record_gc_end();
    +
    +  void record_metaspace_oom()     { _metaspace_oom.set(); }
    +  void clear_metaspace_oom()      { _metaspace_oom.unset(); }
    +  bool has_metaspace_oom() const  { return _metaspace_oom.is_set(); }
    +
    +  virtual void record_cycle_start();
    +
    +  virtual void record_cycle_end();
    +
    +  virtual void record_phase_time(ShenandoahPhaseTimings::Phase phase, double secs);
    +
    +  virtual bool should_start_normal_gc() const;
    +
    +  virtual bool should_start_update_refs();
    +
    +  virtual bool should_start_traversal_gc();
    +
    +  virtual bool can_do_traversal_gc();
    +
    +  virtual bool should_degenerate_cycle();
    +
    +  virtual void record_success_concurrent();
    +
    +  virtual void record_success_degenerated();
    +
    +  virtual void record_success_full();
    +
    +  virtual void record_allocation_failure_gc();
    +
    +  virtual void record_requested_gc();
    +
    +  virtual void choose_collection_set(ShenandoahCollectionSet* collection_set);
    +
    +  virtual bool can_process_references();
    +  virtual bool should_process_references();
    +
    +  virtual bool can_unload_classes();
    +  virtual bool can_unload_classes_normal();
    +  virtual bool should_unload_classes();
    +
    +  virtual const char* name() = 0;
    +  virtual bool is_diagnostic() = 0;
    +  virtual bool is_experimental() = 0;
    +  virtual void initialize();
    +
    +  double time_since_last_gc() const;
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHHEURISTICS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMarkCompact.cpp b/src/hotspot/share/gc/shenandoah/shenandoahMarkCompact.cpp
    new file mode 100644
    index 00000000000..f807ba3b5d5
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahMarkCompact.cpp
    @@ -0,0 +1,844 @@
    +/*
    + * Copyright (c) 2014, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "code/codeCache.hpp"
    +#include "gc/shared/gcTraceTime.inline.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +#include "gc/shenandoah/shenandoahConcurrentMark.inline.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/shenandoahFreeSet.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shenandoah/shenandoahMarkCompact.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
    +#include "gc/shenandoah/shenandoahRootProcessor.hpp"
    +#include "gc/shenandoah/shenandoahTraversalGC.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.inline.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "gc/shenandoah/shenandoahVerifier.hpp"
    +#include "gc/shenandoah/shenandoahVMOperations.hpp"
    +#include "gc/shenandoah/shenandoahWorkerPolicy.hpp"
    +#include "memory/metaspace.hpp"
    +#include "oops/oop.inline.hpp"
    +#include "runtime/thread.hpp"
    +#include "utilities/copy.hpp"
    +#include "utilities/growableArray.hpp"
    +#include "gc/shared/workgroup.hpp"
    +
    +void ShenandoahMarkCompact::initialize(GCTimer* gc_timer) {
    +  _gc_timer = gc_timer;
    +}
    +
    +void ShenandoahMarkCompact::do_it(GCCause::Cause gc_cause) {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  if (ShenandoahVerify) {
    +    heap->verifier()->verify_before_fullgc();
    +  }
    +
    +  if (VerifyBeforeGC) {
    +    Universe::verify();
    +  }
    +
    +  heap->set_full_gc_in_progress(true);
    +
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "must be at a safepoint");
    +  assert(Thread::current()->is_VM_thread(), "Do full GC only while world is stopped");
    +
    +  {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_heapdumps);
    +    heap->pre_full_gc_dump(_gc_timer);
    +  }
    +
    +  {
    +    ShenandoahGCPhase prepare_phase(ShenandoahPhaseTimings::full_gc_prepare);
    +    // Full GC is supposed to recover from any GC state:
    +
    +    // a0. Remember if we have forwarded objects
    +    bool has_forwarded_objects = heap->has_forwarded_objects();
    +
    +    // a1. Cancel evacuation, if in progress
    +    if (heap->is_evacuation_in_progress()) {
    +      heap->set_evacuation_in_progress(false);
    +    }
    +    assert(!heap->is_evacuation_in_progress(), "sanity");
    +
    +    // a2. Cancel update-refs, if in progress
    +    if (heap->is_update_refs_in_progress()) {
    +      heap->set_update_refs_in_progress(false);
    +    }
    +    assert(!heap->is_update_refs_in_progress(), "sanity");
    +
    +    // a3. Cancel concurrent traversal GC, if in progress
    +    if (heap->is_concurrent_traversal_in_progress()) {
    +      heap->traversal_gc()->reset();
    +      heap->set_concurrent_traversal_in_progress(false);
    +    }
    +
    +    // b. Cancel concurrent mark, if in progress
    +    if (heap->is_concurrent_mark_in_progress()) {
    +      heap->concurrent_mark()->cancel();
    +      heap->stop_concurrent_marking();
    +    }
    +    assert(!heap->is_concurrent_mark_in_progress(), "sanity");
    +
    +    // c. Reset the bitmaps for new marking
    +    heap->reset_mark_bitmap();
    +    assert(heap->marking_context()->is_bitmap_clear(), "sanity");
    +    assert(!heap->marking_context()->is_complete(), "sanity");
    +
    +    // d. Abandon reference discovery and clear all discovered references.
    +    ReferenceProcessor* rp = heap->ref_processor();
    +    rp->disable_discovery();
    +    rp->abandon_partial_discovery();
    +    rp->verify_no_references_recorded();
    +
    +    // e. Set back forwarded objects bit back, in case some steps above dropped it.
    +    heap->set_has_forwarded_objects(has_forwarded_objects);
    +  }
    +
    +  heap->make_parsable(true);
    +
    +  CodeCache::gc_prologue();
    +
    +  OrderAccess::fence();
    +
    +  phase1_mark_heap();
    +
    +  // Once marking is done, which may have fixed up forwarded objects, we can drop it.
    +  // Coming out of Full GC, we would not have any forwarded objects.
    +  // This also prevents read barrier from kicking in while adjusting pointers in phase3.
    +  heap->set_has_forwarded_objects(false);
    +
    +  heap->set_full_gc_move_in_progress(true);
    +
    +  // Setup workers for the rest
    +  OrderAccess::fence();
    +
    +  // Initialize worker slices
    +  ShenandoahHeapRegionSet** worker_slices = NEW_C_HEAP_ARRAY(ShenandoahHeapRegionSet*, heap->max_workers(), mtGC);
    +  for (uint i = 0; i < heap->max_workers(); i++) {
    +    worker_slices[i] = new ShenandoahHeapRegionSet();
    +  }
    +
    +  {
    +    // The rest of code performs region moves, where region status is undefined
    +    // until all phases run together.
    +    ShenandoahHeapLocker lock(heap->lock());
    +
    +    phase2_calculate_target_addresses(worker_slices);
    +
    +    OrderAccess::fence();
    +
    +    phase3_update_references();
    +
    +    phase4_compact_objects(worker_slices);
    +  }
    +
    +  // Resize metaspace
    +  MetaspaceGC::compute_new_size();
    +
    +  // Free worker slices
    +  for (uint i = 0; i < heap->max_workers(); i++) {
    +    delete worker_slices[i];
    +  }
    +  FREE_C_HEAP_ARRAY(ShenandoahHeapRegionSet*, worker_slices);
    +
    +  CodeCache::gc_epilogue();
    +  JvmtiExport::gc_epilogue();
    +
    +  heap->set_full_gc_move_in_progress(false);
    +  heap->set_full_gc_in_progress(false);
    +
    +  if (ShenandoahVerify) {
    +    heap->verifier()->verify_after_fullgc();
    +  }
    +
    +  if (VerifyAfterGC) {
    +    Universe::verify();
    +  }
    +
    +  {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_heapdumps);
    +    heap->post_full_gc_dump(_gc_timer);
    +  }
    +}
    +
    +class ShenandoahPrepareForMarkClosure: public ShenandoahHeapRegionClosure {
    +private:
    +  ShenandoahMarkingContext* const _ctx;
    +
    +public:
    +  ShenandoahPrepareForMarkClosure() : _ctx(ShenandoahHeap::heap()->marking_context()) {}
    +
    +  void heap_region_do(ShenandoahHeapRegion *r) {
    +    _ctx->capture_top_at_mark_start(r);
    +    r->clear_live_data();
    +    r->set_concurrent_iteration_safe_limit(r->top());
    +  }
    +};
    +
    +void ShenandoahMarkCompact::phase1_mark_heap() {
    +  GCTraceTime(Info, gc, phases) time("Phase 1: Mark live objects", _gc_timer);
    +  ShenandoahGCPhase mark_phase(ShenandoahPhaseTimings::full_gc_mark);
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  ShenandoahPrepareForMarkClosure cl;
    +  heap->heap_region_iterate(&cl);
    +
    +  ShenandoahConcurrentMark* cm = heap->concurrent_mark();
    +
    +  heap->set_process_references(heap->heuristics()->can_process_references());
    +  heap->set_unload_classes(heap->heuristics()->can_unload_classes());
    +
    +  ReferenceProcessor* rp = heap->ref_processor();
    +  // enable ("weak") refs discovery
    +  rp->enable_discovery(true /*verify_no_refs*/);
    +  rp->setup_policy(true); // forcefully purge all soft references
    +  rp->set_active_mt_degree(heap->workers()->active_workers());
    +
    +  cm->update_roots(ShenandoahPhaseTimings::full_gc_roots);
    +  cm->mark_roots(ShenandoahPhaseTimings::full_gc_roots);
    +  cm->finish_mark_from_roots(/* full_gc = */ true);
    +
    +  heap->mark_complete_marking_context();
    +}
    +
    +class ShenandoahPrepareForCompactionObjectClosure : public ObjectClosure {
    +private:
    +  ShenandoahHeap*          const _heap;
    +  GrowableArray& _empty_regions;
    +  int _empty_regions_pos;
    +  ShenandoahHeapRegion*          _to_region;
    +  ShenandoahHeapRegion*          _from_region;
    +  HeapWord* _compact_point;
    +
    +public:
    +  ShenandoahPrepareForCompactionObjectClosure(GrowableArray& empty_regions, ShenandoahHeapRegion* to_region) :
    +    _heap(ShenandoahHeap::heap()),
    +    _empty_regions(empty_regions),
    +    _empty_regions_pos(0),
    +    _to_region(to_region),
    +    _from_region(NULL),
    +    _compact_point(to_region->bottom()) {}
    +
    +  void set_from_region(ShenandoahHeapRegion* from_region) {
    +    _from_region = from_region;
    +  }
    +
    +  void finish_region() {
    +    assert(_to_region != NULL, "should not happen");
    +    _to_region->set_new_top(_compact_point);
    +  }
    +
    +  bool is_compact_same_region() {
    +    return _from_region == _to_region;
    +  }
    +
    +  int empty_regions_pos() {
    +    return _empty_regions_pos;
    +  }
    +
    +  void do_object(oop p) {
    +    assert(_from_region != NULL, "must set before work");
    +    assert(_heap->complete_marking_context()->is_marked(p), "must be marked");
    +    assert(!_heap->complete_marking_context()->allocated_after_mark_start((HeapWord*) p), "must be truly marked");
    +
    +    size_t obj_size = p->size() + ShenandoahBrooksPointer::word_size();
    +    if (_compact_point + obj_size > _to_region->end()) {
    +      finish_region();
    +
    +      // Object doesn't fit. Pick next empty region and start compacting there.
    +      ShenandoahHeapRegion* new_to_region;
    +      if (_empty_regions_pos < _empty_regions.length()) {
    +        new_to_region = _empty_regions.at(_empty_regions_pos);
    +        _empty_regions_pos++;
    +      } else {
    +        // Out of empty region? Compact within the same region.
    +        new_to_region = _from_region;
    +      }
    +
    +      assert(new_to_region != _to_region, "must not reuse same to-region");
    +      assert(new_to_region != NULL, "must not be NULL");
    +      _to_region = new_to_region;
    +      _compact_point = _to_region->bottom();
    +    }
    +
    +    // Object fits into current region, record new location:
    +    assert(_compact_point + obj_size <= _to_region->end(), "must fit");
    +    shenandoah_assert_not_forwarded(NULL, p);
    +    ShenandoahBrooksPointer::set_raw(p, _compact_point + ShenandoahBrooksPointer::word_size());
    +    _compact_point += obj_size;
    +  }
    +};
    +
    +class ShenandoahPrepareForCompactionTask : public AbstractGangTask {
    +private:
    +  ShenandoahHeap*           const _heap;
    +  ShenandoahHeapRegionSet** const _worker_slices;
    +  ShenandoahRegionIterator        _heap_regions;
    +
    +  ShenandoahHeapRegion* next_from_region(ShenandoahHeapRegionSet* slice) {
    +    ShenandoahHeapRegion* from_region = _heap_regions.next();
    +
    +    while (from_region != NULL && (!from_region->is_move_allowed() || from_region->is_humongous())) {
    +      from_region = _heap_regions.next();
    +    }
    +
    +    if (from_region != NULL) {
    +      assert(slice != NULL, "sanity");
    +      assert(!from_region->is_humongous(), "this path cannot handle humongous regions");
    +      assert(from_region->is_move_allowed(), "only regions that can be moved in mark-compact");
    +      slice->add_region(from_region);
    +    }
    +
    +    return from_region;
    +  }
    +
    +public:
    +  ShenandoahPrepareForCompactionTask(ShenandoahHeapRegionSet** worker_slices) :
    +    AbstractGangTask("Shenandoah Prepare For Compaction Task"),
    +    _heap(ShenandoahHeap::heap()), _worker_slices(worker_slices) {
    +  }
    +
    +  void work(uint worker_id) {
    +    ShenandoahHeapRegionSet* slice = _worker_slices[worker_id];
    +    ShenandoahHeapRegion* from_region = next_from_region(slice);
    +    // No work?
    +    if (from_region == NULL) {
    +      return;
    +    }
    +
    +    // Sliding compaction. Walk all regions in the slice, and compact them.
    +    // Remember empty regions and reuse them as needed.
    +    ResourceMark rm;
    +    GrowableArray empty_regions((int)_heap->num_regions());
    +    ShenandoahPrepareForCompactionObjectClosure cl(empty_regions, from_region);
    +    while (from_region != NULL) {
    +      cl.set_from_region(from_region);
    +      if (from_region->has_live()) {
    +        _heap->marked_object_iterate(from_region, &cl);
    +      }
    +
    +      // Compacted the region to somewhere else? From-region is empty then.
    +      if (!cl.is_compact_same_region()) {
    +        empty_regions.append(from_region);
    +      }
    +      from_region = next_from_region(slice);
    +    }
    +    cl.finish_region();
    +
    +    // Mark all remaining regions as empty
    +    for (int pos = cl.empty_regions_pos(); pos < empty_regions.length(); ++pos) {
    +      ShenandoahHeapRegion* r = empty_regions.at(pos);
    +      r->set_new_top(r->bottom());
    +    }
    +  }
    +};
    +
    +void ShenandoahMarkCompact::calculate_target_humongous_objects() {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  // Compute the new addresses for humongous objects. We need to do this after addresses
    +  // for regular objects are calculated, and we know what regions in heap suffix are
    +  // available for humongous moves.
    +  //
    +  // Scan the heap backwards, because we are compacting humongous regions towards the end.
    +  // Maintain the contiguous compaction window in [to_begin; to_end), so that we can slide
    +  // humongous start there.
    +  //
    +  // The complication is potential non-movable regions during the scan. If such region is
    +  // detected, then sliding restarts towards that non-movable region.
    +
    +  size_t to_begin = heap->num_regions();
    +  size_t to_end = heap->num_regions();
    +
    +  for (size_t c = heap->num_regions() - 1; c > 0; c--) {
    +    ShenandoahHeapRegion *r = heap->get_region(c);
    +    if (r->is_humongous_continuation() || (r->new_top() == r->bottom())) {
    +      // To-region candidate: record this, and continue scan
    +      to_begin = r->region_number();
    +      continue;
    +    }
    +
    +    if (r->is_humongous_start() && r->is_move_allowed()) {
    +      // From-region candidate: movable humongous region
    +      oop old_obj = oop(r->bottom() + ShenandoahBrooksPointer::word_size());
    +      size_t words_size = old_obj->size() + ShenandoahBrooksPointer::word_size();
    +      size_t num_regions = ShenandoahHeapRegion::required_regions(words_size * HeapWordSize);
    +
    +      size_t start = to_end - num_regions;
    +
    +      if (start >= to_begin && start != r->region_number()) {
    +        // Fits into current window, and the move is non-trivial. Record the move then, and continue scan.
    +        ShenandoahBrooksPointer::set_raw(old_obj, heap->get_region(start)->bottom() + ShenandoahBrooksPointer::word_size());
    +        to_end = start;
    +        continue;
    +      }
    +    }
    +
    +    // Failed to fit. Scan starting from current region.
    +    to_begin = r->region_number();
    +    to_end = r->region_number();
    +  }
    +}
    +
    +class ShenandoahEnsureHeapActiveClosure: public ShenandoahHeapRegionClosure {
    +private:
    +  ShenandoahHeap* const _heap;
    +
    +public:
    +  ShenandoahEnsureHeapActiveClosure() : _heap(ShenandoahHeap::heap()) {}
    +  void heap_region_do(ShenandoahHeapRegion* r) {
    +    if (r->is_trash()) {
    +      r->recycle();
    +    }
    +    if (r->is_cset()) {
    +      r->make_regular_bypass();
    +    }
    +    if (r->is_empty_uncommitted()) {
    +      r->make_committed_bypass();
    +    }
    +    assert (r->is_committed(), "only committed regions in heap now, see region " SIZE_FORMAT, r->region_number());
    +
    +    // Record current region occupancy: this communicates empty regions are free
    +    // to the rest of Full GC code.
    +    r->set_new_top(r->top());
    +  }
    +};
    +
    +class ShenandoahTrashImmediateGarbageClosure: public ShenandoahHeapRegionClosure {
    +private:
    +  ShenandoahHeap* const _heap;
    +  ShenandoahMarkingContext* const _ctx;
    +
    +public:
    +  ShenandoahTrashImmediateGarbageClosure() :
    +    _heap(ShenandoahHeap::heap()),
    +    _ctx(ShenandoahHeap::heap()->complete_marking_context()) {}
    +
    +  void heap_region_do(ShenandoahHeapRegion* r) {
    +    if (r->is_humongous_start()) {
    +      oop humongous_obj = oop(r->bottom() + ShenandoahBrooksPointer::word_size());
    +      if (!_ctx->is_marked(humongous_obj)) {
    +        assert(!r->has_live(),
    +               "Region " SIZE_FORMAT " is not marked, should not have live", r->region_number());
    +        _heap->trash_humongous_region_at(r);
    +      } else {
    +        assert(r->has_live(),
    +               "Region " SIZE_FORMAT " should have live", r->region_number());
    +      }
    +    } else if (r->is_humongous_continuation()) {
    +      // If we hit continuation, the non-live humongous starts should have been trashed already
    +      assert(r->humongous_start_region()->has_live(),
    +             "Region " SIZE_FORMAT " should have live", r->region_number());
    +    } else if (r->is_regular()) {
    +      if (!r->has_live()) {
    +        r->make_trash_immediate();
    +      }
    +    }
    +  }
    +};
    +
    +void ShenandoahMarkCompact::phase2_calculate_target_addresses(ShenandoahHeapRegionSet** worker_slices) {
    +  GCTraceTime(Info, gc, phases) time("Phase 2: Compute new object addresses", _gc_timer);
    +  ShenandoahGCPhase calculate_address_phase(ShenandoahPhaseTimings::full_gc_calculate_addresses);
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  {
    +    // Trash the immediately collectible regions before computing addresses
    +    ShenandoahTrashImmediateGarbageClosure tigcl;
    +    heap->heap_region_iterate(&tigcl);
    +
    +    // Make sure regions are in good state: committed, active, clean.
    +    // This is needed because we are potentially sliding the data through them.
    +    ShenandoahEnsureHeapActiveClosure ecl;
    +    heap->heap_region_iterate(&ecl);
    +  }
    +
    +  // Compute the new addresses for regular objects
    +  {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_calculate_addresses_regular);
    +    ShenandoahPrepareForCompactionTask prepare_task(worker_slices);
    +    heap->workers()->run_task(&prepare_task);
    +  }
    +
    +  // Compute the new addresses for humongous objects
    +  {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_calculate_addresses_humong);
    +    calculate_target_humongous_objects();
    +  }
    +}
    +
    +class ShenandoahAdjustPointersClosure : public MetadataVisitingOopIterateClosure {
    +private:
    +  ShenandoahHeap* const _heap;
    +  ShenandoahMarkingContext* const _ctx;
    +
    +  template 
    +  inline void do_oop_work(T* p) {
    +    T o = RawAccess<>::oop_load(p);
    +    if (!CompressedOops::is_null(o)) {
    +      oop obj = CompressedOops::decode_not_null(o);
    +      assert(_ctx->is_marked(obj), "must be marked");
    +      oop forw = oop(ShenandoahBrooksPointer::get_raw(obj));
    +      RawAccess::oop_store(p, forw);
    +    }
    +  }
    +
    +public:
    +  ShenandoahAdjustPointersClosure() :
    +    _heap(ShenandoahHeap::heap()),
    +    _ctx(ShenandoahHeap::heap()->complete_marking_context()) {}
    +
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +};
    +
    +class ShenandoahAdjustPointersObjectClosure : public ObjectClosure {
    +private:
    +  ShenandoahHeap* const _heap;
    +  ShenandoahAdjustPointersClosure _cl;
    +
    +public:
    +  ShenandoahAdjustPointersObjectClosure() :
    +    _heap(ShenandoahHeap::heap()) {
    +  }
    +  void do_object(oop p) {
    +    assert(_heap->complete_marking_context()->is_marked(p), "must be marked");
    +    HeapWord* forw = ShenandoahBrooksPointer::get_raw(p);
    +    p->oop_iterate(&_cl);
    +  }
    +};
    +
    +class ShenandoahAdjustPointersTask : public AbstractGangTask {
    +private:
    +  ShenandoahHeap*          const _heap;
    +  ShenandoahRegionIterator       _regions;
    +
    +public:
    +  ShenandoahAdjustPointersTask() :
    +    AbstractGangTask("Shenandoah Adjust Pointers Task"),
    +    _heap(ShenandoahHeap::heap()) {
    +  }
    +
    +  void work(uint worker_id) {
    +    ShenandoahAdjustPointersObjectClosure obj_cl;
    +    ShenandoahHeapRegion* r = _regions.next();
    +    while (r != NULL) {
    +      if (!r->is_humongous_continuation() && r->has_live()) {
    +        _heap->marked_object_iterate(r, &obj_cl);
    +      }
    +      r = _regions.next();
    +    }
    +  }
    +};
    +
    +class ShenandoahAdjustRootPointersTask : public AbstractGangTask {
    +private:
    +  ShenandoahRootProcessor* _rp;
    +
    +public:
    +  ShenandoahAdjustRootPointersTask(ShenandoahRootProcessor* rp) :
    +    AbstractGangTask("Shenandoah Adjust Root Pointers Task"),
    +    _rp(rp) {}
    +
    +  void work(uint worker_id) {
    +    ShenandoahAdjustPointersClosure cl;
    +    CLDToOopClosure adjust_cld_closure(&cl, ClassLoaderData::_claim_strong);
    +    MarkingCodeBlobClosure adjust_code_closure(&cl,
    +                                             CodeBlobToOopClosure::FixRelocations);
    +
    +    _rp->process_all_roots(&cl, &cl,
    +                           &adjust_cld_closure,
    +                           &adjust_code_closure, NULL, worker_id);
    +  }
    +};
    +
    +void ShenandoahMarkCompact::phase3_update_references() {
    +  GCTraceTime(Info, gc, phases) time("Phase 3: Adjust pointers", _gc_timer);
    +  ShenandoahGCPhase adjust_pointer_phase(ShenandoahPhaseTimings::full_gc_adjust_pointers);
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  WorkGang* workers = heap->workers();
    +  uint nworkers = workers->active_workers();
    +  {
    +#if COMPILER2_OR_JVMCI
    +    DerivedPointerTable::clear();
    +#endif
    +    ShenandoahRootProcessor rp(heap, nworkers, ShenandoahPhaseTimings::full_gc_roots);
    +    ShenandoahAdjustRootPointersTask task(&rp);
    +    workers->run_task(&task);
    +#if COMPILER2_OR_JVMCI
    +    DerivedPointerTable::update_pointers();
    +#endif
    +  }
    +
    +  ShenandoahAdjustPointersTask adjust_pointers_task;
    +  workers->run_task(&adjust_pointers_task);
    +}
    +
    +class ShenandoahCompactObjectsClosure : public ObjectClosure {
    +private:
    +  ShenandoahHeap* const _heap;
    +  uint            const _worker_id;
    +
    +public:
    +  ShenandoahCompactObjectsClosure(uint worker_id) :
    +    _heap(ShenandoahHeap::heap()), _worker_id(worker_id) {}
    +
    +  void do_object(oop p) {
    +    assert(_heap->complete_marking_context()->is_marked(p), "must be marked");
    +    size_t size = (size_t)p->size();
    +    HeapWord* compact_to = ShenandoahBrooksPointer::get_raw(p);
    +    HeapWord* compact_from = (HeapWord*) p;
    +    if (compact_from != compact_to) {
    +      Copy::aligned_conjoint_words(compact_from, compact_to, size);
    +    }
    +    oop new_obj = oop(compact_to);
    +    ShenandoahBrooksPointer::initialize(new_obj);
    +  }
    +};
    +
    +class ShenandoahCompactObjectsTask : public AbstractGangTask {
    +private:
    +  ShenandoahHeap* const _heap;
    +  ShenandoahHeapRegionSet** const _worker_slices;
    +
    +public:
    +  ShenandoahCompactObjectsTask(ShenandoahHeapRegionSet** worker_slices) :
    +    AbstractGangTask("Shenandoah Compact Objects Task"),
    +    _heap(ShenandoahHeap::heap()),
    +    _worker_slices(worker_slices) {
    +  }
    +
    +  void work(uint worker_id) {
    +    ShenandoahHeapRegionSetIterator slice(_worker_slices[worker_id]);
    +
    +    ShenandoahCompactObjectsClosure cl(worker_id);
    +    ShenandoahHeapRegion* r = slice.next();
    +    while (r != NULL) {
    +      assert(!r->is_humongous(), "must not get humongous regions here");
    +      if (r->has_live()) {
    +        _heap->marked_object_iterate(r, &cl);
    +      }
    +      r->set_top(r->new_top());
    +      r = slice.next();
    +    }
    +  }
    +};
    +
    +class ShenandoahPostCompactClosure : public ShenandoahHeapRegionClosure {
    +private:
    +  ShenandoahHeap* const _heap;
    +  size_t _live;
    +
    +public:
    +  ShenandoahPostCompactClosure() : _heap(ShenandoahHeap::heap()), _live(0) {
    +    _heap->free_set()->clear();
    +  }
    +
    +  void heap_region_do(ShenandoahHeapRegion* r) {
    +    assert (!r->is_cset(), "cset regions should have been demoted already");
    +
    +    // Need to reset the complete-top-at-mark-start pointer here because
    +    // the complete marking bitmap is no longer valid. This ensures
    +    // size-based iteration in marked_object_iterate().
    +    // NOTE: See blurb at ShenandoahMCResetCompleteBitmapTask on why we need to skip
    +    // pinned regions.
    +    if (!r->is_pinned()) {
    +      _heap->complete_marking_context()->reset_top_at_mark_start(r);
    +    }
    +
    +    size_t live = r->used();
    +
    +    // Make empty regions that have been allocated into regular
    +    if (r->is_empty() && live > 0) {
    +      r->make_regular_bypass();
    +    }
    +
    +    // Reclaim regular regions that became empty
    +    if (r->is_regular() && live == 0) {
    +      r->make_trash();
    +    }
    +
    +    // Recycle all trash regions
    +    if (r->is_trash()) {
    +      live = 0;
    +      r->recycle();
    +    }
    +
    +    r->set_live_data(live);
    +    r->reset_alloc_metadata_to_shared();
    +    _live += live;
    +  }
    +
    +  size_t get_live() {
    +    return _live;
    +  }
    +};
    +
    +void ShenandoahMarkCompact::compact_humongous_objects() {
    +  // Compact humongous regions, based on their fwdptr objects.
    +  //
    +  // This code is serial, because doing the in-slice parallel sliding is tricky. In most cases,
    +  // humongous regions are already compacted, and do not require further moves, which alleviates
    +  // sliding costs. We may consider doing this in parallel in future.
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  for (size_t c = heap->num_regions() - 1; c > 0; c--) {
    +    ShenandoahHeapRegion* r = heap->get_region(c);
    +    if (r->is_humongous_start()) {
    +      oop old_obj = oop(r->bottom() + ShenandoahBrooksPointer::word_size());
    +      size_t words_size = old_obj->size() + ShenandoahBrooksPointer::word_size();
    +      size_t num_regions = ShenandoahHeapRegion::required_regions(words_size * HeapWordSize);
    +
    +      size_t old_start = r->region_number();
    +      size_t old_end   = old_start + num_regions - 1;
    +      size_t new_start = heap->heap_region_index_containing(ShenandoahBrooksPointer::get_raw(old_obj));
    +      size_t new_end   = new_start + num_regions - 1;
    +
    +      if (old_start == new_start) {
    +        // No need to move the object, it stays at the same slot
    +        continue;
    +      }
    +
    +      assert (r->is_move_allowed(), "should be movable");
    +
    +      Copy::aligned_conjoint_words(heap->get_region(old_start)->bottom(),
    +                                   heap->get_region(new_start)->bottom(),
    +                                   ShenandoahHeapRegion::region_size_words()*num_regions);
    +
    +      oop new_obj = oop(heap->get_region(new_start)->bottom() + ShenandoahBrooksPointer::word_size());
    +      ShenandoahBrooksPointer::initialize(new_obj);
    +
    +      {
    +        for (size_t c = old_start; c <= old_end; c++) {
    +          ShenandoahHeapRegion* r = heap->get_region(c);
    +          r->make_regular_bypass();
    +          r->set_top(r->bottom());
    +        }
    +
    +        for (size_t c = new_start; c <= new_end; c++) {
    +          ShenandoahHeapRegion* r = heap->get_region(c);
    +          if (c == new_start) {
    +            r->make_humongous_start_bypass();
    +          } else {
    +            r->make_humongous_cont_bypass();
    +          }
    +
    +          // Trailing region may be non-full, record the remainder there
    +          size_t remainder = words_size & ShenandoahHeapRegion::region_size_words_mask();
    +          if ((c == new_end) && (remainder != 0)) {
    +            r->set_top(r->bottom() + remainder);
    +          } else {
    +            r->set_top(r->end());
    +          }
    +
    +          r->reset_alloc_metadata_to_shared();
    +        }
    +      }
    +    }
    +  }
    +}
    +
    +// This is slightly different to ShHeap::reset_next_mark_bitmap:
    +// we need to remain able to walk pinned regions.
    +// Since pinned region do not move and don't get compacted, we will get holes with
    +// unreachable objects in them (which may have pointers to unloaded Klasses and thus
    +// cannot be iterated over using oop->size(). The only way to safely iterate over those is using
    +// a valid marking bitmap and valid TAMS pointer. This class only resets marking
    +// bitmaps for un-pinned regions, and later we only reset TAMS for unpinned regions.
    +class ShenandoahMCResetCompleteBitmapTask : public AbstractGangTask {
    +private:
    +  ShenandoahRegionIterator _regions;
    +
    +public:
    +  ShenandoahMCResetCompleteBitmapTask() :
    +    AbstractGangTask("Parallel Reset Bitmap Task") {
    +  }
    +
    +  void work(uint worker_id) {
    +    ShenandoahHeapRegion* region = _regions.next();
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +    ShenandoahMarkingContext* const ctx = heap->complete_marking_context();
    +    while (region != NULL) {
    +      if (heap->is_bitmap_slice_committed(region) && !region->is_pinned() && region->has_live()) {
    +        ctx->clear_bitmap(region);
    +      }
    +      region = _regions.next();
    +    }
    +  }
    +};
    +
    +void ShenandoahMarkCompact::phase4_compact_objects(ShenandoahHeapRegionSet** worker_slices) {
    +  GCTraceTime(Info, gc, phases) time("Phase 4: Move objects", _gc_timer);
    +  ShenandoahGCPhase compaction_phase(ShenandoahPhaseTimings::full_gc_copy_objects);
    +
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  // Compact regular objects first
    +  {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_copy_objects_regular);
    +    ShenandoahCompactObjectsTask compact_task(worker_slices);
    +    heap->workers()->run_task(&compact_task);
    +  }
    +
    +  // Compact humongous objects after regular object moves
    +  {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_copy_objects_humong);
    +    compact_humongous_objects();
    +  }
    +
    +  // Reset complete bitmap. We're about to reset the complete-top-at-mark-start pointer
    +  // and must ensure the bitmap is in sync.
    +  {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_copy_objects_reset_complete);
    +    ShenandoahMCResetCompleteBitmapTask task;
    +    heap->workers()->run_task(&task);
    +  }
    +
    +  // Bring regions in proper states after the collection, and set heap properties.
    +  {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_copy_objects_rebuild);
    +
    +    ShenandoahPostCompactClosure post_compact;
    +    heap->heap_region_iterate(&post_compact);
    +    heap->set_used(post_compact.get_live());
    +
    +    heap->collection_set()->clear();
    +    heap->free_set()->rebuild();
    +  }
    +
    +  heap->clear_cancelled_gc();
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMarkCompact.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMarkCompact.hpp
    new file mode 100644
    index 00000000000..2d3f1394d82
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahMarkCompact.hpp
    @@ -0,0 +1,71 @@
    +/*
    + * Copyright (c) 2014, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHMARKCOMPACT_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHMARKCOMPACT_HPP
    +
    +#include "gc/shared/gcTimer.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
    +
    +/**
    + * This implements Full GC (e.g. when invoking System.gc()) using a mark-compact algorithm.
    + *
    + * Current implementation is parallel sliding Lisp-2-style algorithm, based on
    + * "Parallel Garbage Collection for Shared Memory Multiprocessors", by Christine Flood et al.
    + * http://people.csail.mit.edu/shanir/publications/dfsz2001.pdf
    + *
    + * It is implemented in four phases:
    + *
    + * 1. Mark all live objects of the heap by traversing objects starting at GC roots.
    + * 2. Calculate the new location of each live object. This is done by sequentially scanning
    + *    the heap, keeping track of a next-location-pointer, which is then written to each
    + *    object's fwdptr field.
    + * 3. Update all references. This is implemented by another scan of the heap, and updates
    + *    all references in live objects by what's stored in the target object's fwdptr.
    + * 4. Compact the heap by copying all live objects to their new location.
    + *
    + * Parallelization is handled by assigning each GC worker the slice of the heap (the set of regions)
    + * where it does sliding compaction, without interfering with other threads.
    + */
    +
    +class ShenandoahMarkCompact : public CHeapObj {
    +private:
    +  GCTimer* _gc_timer;
    +
    +public:
    +  void initialize(GCTimer* gc_timer);
    +  void do_it(GCCause::Cause gc_cause);
    +
    +private:
    +  void phase1_mark_heap();
    +  void phase2_calculate_target_addresses(ShenandoahHeapRegionSet** worker_slices);
    +  void phase3_update_references();
    +  void phase4_compact_objects(ShenandoahHeapRegionSet** worker_slices);
    +
    +  void calculate_target_humongous_objects();
    +  void compact_humongous_objects();
    +
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHMARKCOMPACT_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.cpp b/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.cpp
    new file mode 100644
    index 00000000000..fb0c60f5162
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.cpp
    @@ -0,0 +1,112 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shared/markBitMap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.inline.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.hpp"
    +
    +ShenandoahMarkingContext::ShenandoahMarkingContext(MemRegion heap_region, MemRegion bitmap_region, size_t num_regions) :
    +  _top_bitmaps(NEW_C_HEAP_ARRAY(HeapWord*, num_regions, mtGC)),
    +  _top_at_mark_starts_base(NEW_C_HEAP_ARRAY(HeapWord*, num_regions, mtGC)),
    +  _top_at_mark_starts(_top_at_mark_starts_base -
    +                      ((uintx) heap_region.start() >> ShenandoahHeapRegion::region_size_bytes_shift())) {
    +  _mark_bit_map.initialize(heap_region, bitmap_region);
    +}
    +
    +bool ShenandoahMarkingContext::is_bitmap_clear() const {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  size_t num_regions = heap->num_regions();
    +  for (size_t idx = 0; idx < num_regions; idx++) {
    +    ShenandoahHeapRegion* r = heap->get_region(idx);
    +    if (heap->is_bitmap_slice_committed(r) && !is_bitmap_clear_range(r->bottom(), r->end())) {
    +      return false;
    +    }
    +  }
    +  return true;
    +}
    +
    +bool ShenandoahMarkingContext::is_bitmap_clear_range(HeapWord* start, HeapWord* end) const {
    +  return _mark_bit_map.get_next_marked_addr(start, end) == end;
    +}
    +
    +void ShenandoahMarkingContext::initialize_top_at_mark_start(ShenandoahHeapRegion* r) {
    +  size_t idx = r->region_number();
    +  HeapWord *bottom = r->bottom();
    +  _top_at_mark_starts_base[idx] = bottom;
    +  _top_bitmaps[idx] = bottom;
    +}
    +
    +void ShenandoahMarkingContext::capture_top_at_mark_start(ShenandoahHeapRegion *r) {
    +  size_t region_number = r->region_number();
    +  HeapWord* old_tams = _top_at_mark_starts_base[region_number];
    +  HeapWord* new_tams = r->top();
    +
    +  assert(new_tams >= old_tams,
    +         "Region " SIZE_FORMAT", TAMS updates should be monotonic: " PTR_FORMAT " -> " PTR_FORMAT,
    +         region_number, p2i(old_tams), p2i(new_tams));
    +  assert(is_bitmap_clear_range(old_tams, new_tams),
    +         "Region " SIZE_FORMAT ", bitmap should be clear while adjusting TAMS: " PTR_FORMAT " -> " PTR_FORMAT,
    +         region_number, p2i(old_tams), p2i(new_tams));
    +
    +  _top_at_mark_starts_base[region_number] = new_tams;
    +  _top_bitmaps[region_number] = new_tams;
    +}
    +
    +void ShenandoahMarkingContext::reset_top_at_mark_start(ShenandoahHeapRegion* r) {
    +  _top_at_mark_starts_base[r->region_number()] = r->bottom();
    +}
    +
    +HeapWord* ShenandoahMarkingContext::top_at_mark_start(ShenandoahHeapRegion* r) const {
    +  return _top_at_mark_starts_base[r->region_number()];
    +}
    +
    +void ShenandoahMarkingContext::reset_top_bitmap(ShenandoahHeapRegion* r) {
    +  assert(is_bitmap_clear_range(r->bottom(), r->end()),
    +         "Region " SIZE_FORMAT " should have no marks in bitmap", r->region_number());
    +  _top_bitmaps[r->region_number()] = r->bottom();
    +}
    +
    +void ShenandoahMarkingContext::clear_bitmap(ShenandoahHeapRegion* r) {
    +  HeapWord* bottom = r->bottom();
    +  HeapWord* top_bitmap = _top_bitmaps[r->region_number()];
    +  if (top_bitmap > bottom) {
    +    _mark_bit_map.clear_range_large(MemRegion(bottom, top_bitmap));
    +    _top_bitmaps[r->region_number()] = bottom;
    +  }
    +  assert(is_bitmap_clear_range(bottom, r->end()),
    +         "Region " SIZE_FORMAT " should have no marks in bitmap", r->region_number());
    +}
    +
    +bool ShenandoahMarkingContext::is_complete() {
    +  return _is_complete.is_set();
    +}
    +
    +void ShenandoahMarkingContext::mark_complete() {
    +  _is_complete.set();
    +}
    +
    +void ShenandoahMarkingContext::mark_incomplete() {
    +  _is_complete.unset();
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.hpp
    new file mode 100644
    index 00000000000..19696e1f94f
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.hpp
    @@ -0,0 +1,80 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHMARKINGCONTEXT_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHMARKINGCONTEXT_HPP
    +
    +#include "gc/shared/markBitMap.hpp"
    +#include "memory/allocation.hpp"
    +#include "memory/memRegion.hpp"
    +#include "oops/oopsHierarchy.hpp"
    +
    +class HeapWord;
    +
    +/**
    + * Encapsulate a marking bitmap with the top-at-mark-start and top-bitmaps array.
    + */
    +class ShenandoahMarkingContext : public CHeapObj {
    +private:
    +  MarkBitMap _mark_bit_map;
    +
    +  HeapWord** const _top_bitmaps;
    +  HeapWord** const _top_at_mark_starts_base;
    +  HeapWord** const _top_at_mark_starts;
    +
    +  ShenandoahSharedFlag _is_complete;
    +
    +public:
    +  ShenandoahMarkingContext(MemRegion heap_region, MemRegion bitmap_region, size_t num_regions);
    +
    +  /*
    +   * Marks the object. Returns true if the object has not been marked before and has
    +   * been marked by this thread. Returns false if the object has already been marked,
    +   * or if a competing thread succeeded in marking this object.
    +   */
    +  inline bool mark(oop obj);
    +
    +  inline bool is_marked(oop obj) const;
    +
    +  inline bool allocated_after_mark_start(HeapWord* addr) const;
    +
    +  inline MarkBitMap* mark_bit_map();
    +
    +  HeapWord* top_at_mark_start(ShenandoahHeapRegion* r) const;
    +  void capture_top_at_mark_start(ShenandoahHeapRegion* r);
    +  void reset_top_at_mark_start(ShenandoahHeapRegion* r);
    +  void initialize_top_at_mark_start(ShenandoahHeapRegion* r);
    +
    +  void reset_top_bitmap(ShenandoahHeapRegion *r);
    +  void clear_bitmap(ShenandoahHeapRegion *r);
    +
    +  bool is_bitmap_clear() const;
    +  bool is_bitmap_clear_range(HeapWord* start, HeapWord* end) const;
    +
    +  bool is_complete();
    +  void mark_complete();
    +  void mark_incomplete();
    +
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHMARKINGCONTEXT_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.inline.hpp
    new file mode 100644
    index 00000000000..1089ec0392b
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.inline.hpp
    @@ -0,0 +1,51 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHMARKINGCONTEXT_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHMARKINGCONTEXT_INLINE_HPP
    +
    +#include "gc/shenandoah/shenandoahMarkingContext.hpp"
    +
    +inline MarkBitMap* ShenandoahMarkingContext::mark_bit_map() {
    +  return &_mark_bit_map;
    +}
    +
    +inline bool ShenandoahMarkingContext::mark(oop obj) {
    +  shenandoah_assert_not_forwarded(NULL, obj);
    +  HeapWord* addr = (HeapWord*) obj;
    +  return (! allocated_after_mark_start(addr)) && _mark_bit_map.par_mark(addr);
    +}
    +
    +inline bool ShenandoahMarkingContext::is_marked(oop obj) const {
    +  HeapWord* addr = (HeapWord*) obj;
    +  return allocated_after_mark_start(addr) || _mark_bit_map.is_marked(addr);
    +}
    +
    +inline bool ShenandoahMarkingContext::allocated_after_mark_start(HeapWord* addr) const {
    +  uintx index = ((uintx) addr) >> ShenandoahHeapRegion::region_size_bytes_shift();
    +  HeapWord* top_at_mark_start = _top_at_mark_starts[index];
    +  bool alloc_after_mark_start = addr >= top_at_mark_start;
    +  return alloc_after_mark_start;
    +}
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHMARKINGCONTEXT_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.cpp b/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.cpp
    new file mode 100644
    index 00000000000..36071ef6d40
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.cpp
    @@ -0,0 +1,46 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shenandoah/shenandoahMemoryPool.hpp"
    +
    +ShenandoahMemoryPool::ShenandoahMemoryPool(ShenandoahHeap* heap) :
    +        CollectedMemoryPool("Shenandoah",
    +                            heap->capacity(),
    +                            heap->max_capacity(),
    +                            true /* support_usage_threshold */),
    +                            _heap(heap) {}
    +
    +MemoryUsage ShenandoahMemoryPool::get_memory_usage() {
    +  size_t initial   = initial_size();
    +  size_t max       = max_size();
    +  size_t used      = used_in_bytes();
    +  size_t committed = _heap->committed();
    +
    +  assert(initial <= max,    "initial: "   SIZE_FORMAT ", max: "       SIZE_FORMAT, initial,   max);
    +  assert(used <= max,       "used: "      SIZE_FORMAT ", max: "       SIZE_FORMAT, used,      max);
    +  assert(committed <= max,  "committed: " SIZE_FORMAT ", max: "       SIZE_FORMAT, committed, max);
    +  assert(used <= committed, "used: "      SIZE_FORMAT ", committed: " SIZE_FORMAT, used,      committed);
    +
    +  return MemoryUsage(initial, used, committed, max);
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.hpp
    new file mode 100644
    index 00000000000..7f316f65fb1
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.hpp
    @@ -0,0 +1,44 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_SERVICES_SHENANDOAHMEMORYPOOL_HPP
    +#define SHARE_VM_SERVICES_SHENANDOAHMEMORYPOOL_HPP
    +
    +#ifndef SERIALGC
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "services/memoryPool.hpp"
    +#include "services/memoryUsage.hpp"
    +#endif
    +
    +class ShenandoahMemoryPool : public CollectedMemoryPool {
    +private:
    +   ShenandoahHeap* _heap;
    +
    +public:
    +  ShenandoahMemoryPool(ShenandoahHeap* pool);
    +  MemoryUsage get_memory_usage();
    +  size_t used_in_bytes()              { return _heap->used(); }
    +  size_t max_size() const             { return _heap->max_capacity(); }
    +};
    +
    +#endif //SHARE_VM_SERVICES_SHENANDOAHMEMORYPOOL_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMetrics.cpp b/src/hotspot/share/gc/shenandoah/shenandoahMetrics.cpp
    new file mode 100644
    index 00000000000..6f0d30cb69f
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahMetrics.cpp
    @@ -0,0 +1,176 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shenandoah/shenandoahMetrics.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahFreeSet.hpp"
    +
    +/*
    + * Internal fragmentation metric: describes how fragmented the heap regions are.
    + *
    + * It is derived as:
    + *
    + *               sum(used[i]^2, i=0..k)
    + *   IF = 1 - ------------------------------
    + *              C * sum(used[i], i=0..k)
    + *
    + * ...where k is the number of regions in computation, C is the region capacity, and
    + * used[i] is the used space in the region.
    + *
    + * The non-linearity causes IF to be lower for the cases where the same total heap
    + * used is densely packed. For example:
    + *   a) Heap is completely full  => IF = 0
    + *   b) Heap is half full, first 50% regions are completely full => IF = 0
    + *   c) Heap is half full, each region is 50% full => IF = 1/2
    + *   d) Heap is quarter full, first 50% regions are completely full => IF = 0
    + *   e) Heap is quarter full, each region is 25% full => IF = 3/4
    + *   f) Heap has the small object per each region => IF =~ 1
    + */
    +double ShenandoahMetrics::internal_fragmentation() {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  double squared = 0;
    +  double linear = 0;
    +  int count = 0;
    +  for (size_t c = 0; c < heap->num_regions(); c++) {
    +    ShenandoahHeapRegion* r = heap->get_region(c);
    +    size_t used = r->used();
    +    squared += used * used;
    +    linear += used;
    +    count++;
    +  }
    +
    +  if (count > 0) {
    +    double s = squared / (ShenandoahHeapRegion::region_size_bytes() * linear);
    +    return 1 - s;
    +  } else {
    +    return 0;
    +  }
    +}
    +
    +/*
    + * External fragmentation metric: describes how fragmented the heap is.
    + *
    + * It is derived as:
    + *
    + *   EF = 1 - largest_contiguous_free / total_free
    + *
    + * For example:
    + *   a) Heap is completely empty => EF = 0
    + *   b) Heap is completely full => EF = 1
    + *   c) Heap is first-half full => EF = 1/2
    + *   d) Heap is half full, full and empty regions interleave => EF =~ 1
    + */
    +double ShenandoahMetrics::external_fragmentation() {
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +
    +  size_t last_idx = 0;
    +  size_t max_contig = 0;
    +  size_t empty_contig = 0;
    +
    +  size_t free = 0;
    +  for (size_t c = 0; c < heap->num_regions(); c++) {
    +    ShenandoahHeapRegion* r = heap->get_region(c);
    +
    +    if (r->is_empty() && (last_idx + 1 == c)) {
    +      empty_contig++;
    +    } else {
    +      empty_contig = 0;
    +    }
    +
    +    free += r->free();
    +    max_contig = MAX2(max_contig, empty_contig);
    +    last_idx = c;
    +  }
    +
    +  if (free > 0) {
    +    return 1 - (1.0 * max_contig * ShenandoahHeapRegion::region_size_bytes() / free);
    +  } else {
    +    return 1;
    +  }
    +}
    +
    +ShenandoahMetricsSnapshot::ShenandoahMetricsSnapshot() {
    +  _heap = ShenandoahHeap::heap();
    +}
    +
    +void ShenandoahMetricsSnapshot::snap_before() {
    +  _used_before = _heap->used();
    +  _if_before = ShenandoahMetrics::internal_fragmentation();
    +  _ef_before = ShenandoahMetrics::external_fragmentation();
    +}
    +void ShenandoahMetricsSnapshot::snap_after() {
    +  _used_after = _heap->used();
    +  _if_after = ShenandoahMetrics::internal_fragmentation();
    +  _ef_after = ShenandoahMetrics::external_fragmentation();
    +}
    +
    +void ShenandoahMetricsSnapshot::print() {
    +  log_info(gc, ergo)("Used: before: " SIZE_FORMAT "M, after: " SIZE_FORMAT "M", _used_before/M, _used_after/M);
    +  log_info(gc, ergo)("Internal frag: before: %.1f%%, after: %.1f%%", _if_before * 100, _if_after * 100);
    +  log_info(gc, ergo)("External frag: before: %.1f%%, after: %.1f%%", _ef_before * 100, _ef_after * 100);
    +}
    +
    +bool ShenandoahMetricsSnapshot::is_good_progress(const char *label) {
    +  // Under the critical threshold? Declare failure.
    +  size_t free_actual   = _heap->free_set()->available();
    +  size_t free_expected = _heap->max_capacity() / 100 * ShenandoahCriticalFreeThreshold;
    +  if (free_actual < free_expected) {
    +    log_info(gc, ergo)("Not enough free space (" SIZE_FORMAT "M, need " SIZE_FORMAT "M) after %s",
    +                       free_actual / M, free_expected / M, label);
    +    return false;
    +  }
    +
    +  // Freed up enough? Good! Declare victory.
    +  size_t progress_actual   = (_used_before > _used_after) ? _used_before - _used_after : 0;
    +  size_t progress_expected = ShenandoahHeapRegion::region_size_bytes();
    +  if (progress_actual >= progress_expected) {
    +    return true;
    +  }
    +  log_info(gc,ergo)("Not enough progress (" SIZE_FORMAT "M, need " SIZE_FORMAT "M) after %s",
    +                    progress_actual / M, progress_expected / M, label);
    +
    +  // Internal fragmentation is down? Good! Declare victory.
    +  double if_actual = _if_before - _if_after;
    +  double if_expected = 0.01; // 1% should be enough
    +  if (if_actual > if_expected) {
    +    return true;
    +  }
    +  log_info(gc,ergo)("Not enough internal fragmentation improvement (%.1f%%, need %.1f%%) after %s",
    +                    if_actual * 100, if_expected * 100, label);
    +
    +  // External fragmentation is down? Good! Declare victory.
    +  double ef_actual = _ef_before - _ef_after;
    +  double ef_expected = 0.01; // 1% should be enough
    +  if (ef_actual > ef_expected) {
    +    return true;
    +  }
    +  log_info(gc,ergo)("Not enough external fragmentation improvement (%.1f%%, need %.1f%%) after %s",
    +                    if_actual * 100, if_expected * 100, label);
    +
    +  // Nothing good had happened.
    +  return false;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMetrics.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMetrics.hpp
    new file mode 100644
    index 00000000000..32771b11c1d
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahMetrics.hpp
    @@ -0,0 +1,55 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHMETRICS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHMETRICS_HPP
    +
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +
    +class ShenandoahMetrics {
    +private:
    +  ShenandoahMetrics() {}
    +
    +public:
    +  static double internal_fragmentation();
    +  static double external_fragmentation();
    +};
    +
    +class ShenandoahMetricsSnapshot : public StackObj {
    +private:
    +  ShenandoahHeap* _heap;
    +  size_t _used_before, _used_after;
    +  double _if_before, _if_after;
    +  double _ef_before, _ef_after;
    +
    +public:
    +  ShenandoahMetricsSnapshot();
    +
    +  void snap_before();
    +  void snap_after();
    +  void print();
    +
    +  bool is_good_progress(const char *label);
    +};
    +
    +#endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHMETRICS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMonitoringSupport.cpp b/src/hotspot/share/gc/shenandoah/shenandoahMonitoringSupport.cpp
    new file mode 100644
    index 00000000000..e12fac7cca4
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahMonitoringSupport.cpp
    @@ -0,0 +1,105 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shared/collectorCounters.hpp"
    +#include "gc/shared/generationCounters.hpp"
    +#include "gc/shared/hSpaceCounters.hpp"
    +#include "gc/shenandoah/shenandoahMonitoringSupport.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionCounters.hpp"
    +#include "memory/metaspaceCounters.hpp"
    +#include "services/memoryService.hpp"
    +
    +class ShenandoahYoungGenerationCounters : public GenerationCounters {
    +public:
    +  ShenandoahYoungGenerationCounters() :
    +          GenerationCounters("Young", 0, 0, 0, (size_t)0, (size_t)0) {};
    +
    +  virtual void update_all() {
    +    // no update
    +  }
    +};
    +
    +class ShenandoahGenerationCounters : public GenerationCounters {
    +private:
    +  ShenandoahHeap* _heap;
    +public:
    +  ShenandoahGenerationCounters(ShenandoahHeap* heap) :
    +          GenerationCounters("Heap", 1, 1, heap->initial_capacity(), heap->max_capacity(), heap->committed()),
    +          _heap(heap)
    +  {};
    +
    +  virtual void update_all() {
    +    _current_size->set_value(_heap->committed());
    +  }
    +};
    +
    +ShenandoahMonitoringSupport::ShenandoahMonitoringSupport(ShenandoahHeap* heap) :
    +        _partial_counters(NULL),
    +        _full_counters(NULL)
    +{
    +  // Collection counters do not fit Shenandoah very well.
    +  // We record partial cycles as "young", and full cycles (including full STW GC) as "old".
    +  _partial_counters  = new CollectorCounters("Shenandoah partial", 0);
    +  _full_counters     = new CollectorCounters("Shenandoah full",    1);
    +
    +  // We report young gen as unused.
    +  _young_counters = new ShenandoahYoungGenerationCounters();
    +  _heap_counters  = new ShenandoahGenerationCounters(heap);
    +  _space_counters = new HSpaceCounters(_heap_counters->name_space(), "Heap", 0, heap->max_capacity(), heap->initial_capacity());
    +
    +  _heap_region_counters = new ShenandoahHeapRegionCounters();
    +}
    +
    +CollectorCounters* ShenandoahMonitoringSupport::stw_collection_counters() {
    +  return _full_counters;
    +}
    +
    +CollectorCounters* ShenandoahMonitoringSupport::full_stw_collection_counters() {
    +  return _full_counters;
    +}
    +
    +CollectorCounters* ShenandoahMonitoringSupport::concurrent_collection_counters() {
    +  return _full_counters;
    +}
    +
    +CollectorCounters* ShenandoahMonitoringSupport::partial_collection_counters() {
    +  return _partial_counters;
    +}
    +
    +void ShenandoahMonitoringSupport::update_counters() {
    +  MemoryService::track_memory_usage();
    +
    +  if (UsePerfData) {
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +    size_t used = heap->used();
    +    size_t capacity = heap->capacity();
    +    _heap_counters->update_all();
    +    _space_counters->update_all(capacity, used);
    +    _heap_region_counters->update();
    +
    +    MetaspaceCounters::update_performance_counters();
    +    CompressedClassSpaceCounters::update_performance_counters();
    +  }
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMonitoringSupport.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMonitoringSupport.hpp
    new file mode 100644
    index 00000000000..2fe7dca4e05
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahMonitoringSupport.hpp
    @@ -0,0 +1,56 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHMONITORINGSUPPORT_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHMONITORINGSUPPORT_HPP
    +
    +#include "memory/allocation.hpp"
    +
    +class GenerationCounters;
    +class HSpaceCounters;
    +class ShenandoahHeap;
    +class CollectorCounters;
    +class ShenandoahHeapRegionCounters;
    +
    +class ShenandoahMonitoringSupport : public CHeapObj {
    +private:
    +  CollectorCounters*   _partial_counters;
    +  CollectorCounters*   _full_counters;
    +
    +  GenerationCounters* _young_counters;
    +  GenerationCounters* _heap_counters;
    +
    +  HSpaceCounters* _space_counters;
    +
    +  ShenandoahHeapRegionCounters* _heap_region_counters;
    +
    +public:
    + ShenandoahMonitoringSupport(ShenandoahHeap* heap);
    + CollectorCounters* stw_collection_counters();
    + CollectorCounters* full_stw_collection_counters();
    + CollectorCounters* concurrent_collection_counters();
    + CollectorCounters* partial_collection_counters();
    + void update_counters();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHMONITORINGSUPPORT_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.cpp b/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.cpp
    new file mode 100644
    index 00000000000..da6178e3434
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.cpp
    @@ -0,0 +1,189 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahNumberSeq.hpp"
    +#include "runtime/atomic.hpp"
    +
    +HdrSeq::HdrSeq() {
    +  _hdr = NEW_C_HEAP_ARRAY(int*, MagBuckets, mtInternal);
    +  for (int c = 0; c < MagBuckets; c++) {
    +    _hdr[c] = NULL;
    +  }
    +}
    +
    +HdrSeq::~HdrSeq() {
    +  for (int c = 0; c < MagBuckets; c++) {
    +    int* sub = _hdr[c];
    +    if (sub != NULL) {
    +      FREE_C_HEAP_ARRAY(int, sub);
    +    }
    +  }
    +  FREE_C_HEAP_ARRAY(int*, _hdr);
    +}
    +
    +void HdrSeq::add(double val) {
    +  if (val < 0) {
    +    assert (false, "value (%8.2f) is not negative", val);
    +    val = 0;
    +  }
    +
    +  NumberSeq::add(val);
    +
    +  double v = val;
    +  int mag;
    +  if (v > 0) {
    +    mag = 0;
    +    while (v > 1) {
    +      mag++;
    +      v /= 10;
    +    }
    +    while (v < 0.1) {
    +      mag--;
    +      v *= 10;
    +    }
    +  } else {
    +    mag = MagMinimum;
    +  }
    +
    +  int bucket = -MagMinimum + mag;
    +  int sub_bucket = (int) (v * ValBuckets);
    +
    +  // Defensively saturate for product bits:
    +  if (bucket < 0) {
    +    assert (false, "bucket index (%d) underflow for value (%8.2f)", bucket, val);
    +    bucket = 0;
    +  }
    +
    +  if (bucket >= MagBuckets) {
    +    assert (false, "bucket index (%d) overflow for value (%8.2f)", bucket, val);
    +    bucket = MagBuckets - 1;
    +  }
    +
    +  if (sub_bucket < 0) {
    +    assert (false, "sub-bucket index (%d) underflow for value (%8.2f)", sub_bucket, val);
    +    sub_bucket = 0;
    +  }
    +
    +  if (sub_bucket >= ValBuckets) {
    +    assert (false, "sub-bucket index (%d) overflow for value (%8.2f)", sub_bucket, val);
    +    sub_bucket = ValBuckets - 1;
    +  }
    +
    +  int* b = _hdr[bucket];
    +  if (b == NULL) {
    +    b = NEW_C_HEAP_ARRAY(int, ValBuckets, mtInternal);
    +    for (int c = 0; c < ValBuckets; c++) {
    +      b[c] = 0;
    +    }
    +    _hdr[bucket] = b;
    +  }
    +  b[sub_bucket]++;
    +}
    +
    +double HdrSeq::percentile(double level) const {
    +  // target should be non-zero to find the first sample
    +  int target = MAX2(1, (int) (level * num() / 100));
    +  int cnt = 0;
    +  for (int mag = 0; mag < MagBuckets; mag++) {
    +    if (_hdr[mag] != NULL) {
    +      for (int val = 0; val < ValBuckets; val++) {
    +        cnt += _hdr[mag][val];
    +        if (cnt >= target) {
    +          return pow(10.0, MagMinimum + mag) * val / ValBuckets;
    +        }
    +      }
    +    }
    +  }
    +  return maximum();
    +}
    +
    +BinaryMagnitudeSeq::BinaryMagnitudeSeq() {
    +  _mags = NEW_C_HEAP_ARRAY(size_t, BitsPerSize_t, mtInternal);
    +  for (int c = 0; c < BitsPerSize_t; c++) {
    +    _mags[c] = 0;
    +  }
    +  _sum = 0;
    +}
    +
    +BinaryMagnitudeSeq::~BinaryMagnitudeSeq() {
    +  FREE_C_HEAP_ARRAY(size_t, _mags);
    +}
    +
    +void BinaryMagnitudeSeq::add(size_t val) {
    +  Atomic::add(val, &_sum);
    +
    +  int mag = log2_intptr(val) + 1;
    +
    +  // Defensively saturate for product bits:
    +  if (mag < 0) {
    +    assert (false, "bucket index (%d) underflow for value (" SIZE_FORMAT ")", mag, val);
    +    mag = 0;
    +  }
    +
    +  if (mag >= BitsPerSize_t) {
    +    assert (false, "bucket index (%d) overflow for value (" SIZE_FORMAT ")", mag, val);
    +    mag = BitsPerSize_t - 1;
    +  }
    +
    +  Atomic::add((size_t)1, &_mags[mag]);
    +}
    +
    +size_t BinaryMagnitudeSeq::level(int level) const {
    +  if (0 <= level && level < BitsPerSize_t) {
    +    return _mags[level];
    +  } else {
    +    return 0;
    +  }
    +}
    +
    +size_t BinaryMagnitudeSeq::num() const {
    +  size_t r = 0;
    +  for (int c = 0; c < BitsPerSize_t; c++) {
    +    r += _mags[c];
    +  }
    +  return r;
    +}
    +
    +size_t BinaryMagnitudeSeq::sum() const {
    +  return _sum;
    +}
    +
    +int BinaryMagnitudeSeq::min_level() const {
    +  for (int c = 0; c < BitsPerSize_t; c++) {
    +    if (_mags[c] != 0) {
    +      return c;
    +    }
    +  }
    +  return BitsPerSize_t - 1;
    +}
    +
    +int BinaryMagnitudeSeq::max_level() const {
    +  for (int c = BitsPerSize_t - 1; c > 0; c--) {
    +    if (_mags[c] != 0) {
    +      return c;
    +    }
    +  }
    +  return 0;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.hpp b/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.hpp
    new file mode 100644
    index 00000000000..3a78117bb1a
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahNumberSeq.hpp
    @@ -0,0 +1,74 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHNUMBERSEQ_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHNUMBERSEQ_HPP
    +
    +#include "utilities/numberSeq.hpp"
    +
    +// HDR sequence stores the low-resolution high-dynamic-range values.
    +// It does so by maintaining the double array, where first array defines
    +// the magnitude of the value being stored, and the second array maintains
    +// the low resolution histogram within that magnitude. For example, storing
    +// 4.352819 * 10^3 increments the bucket _hdr[3][435]. This allows for
    +// memory efficient storage of huge amount of samples.
    +//
    +// Accepts positive numbers only.
    +class HdrSeq: public NumberSeq {
    +private:
    +  enum PrivateConstants {
    +    ValBuckets = 512,
    +    MagBuckets = 24,
    +    MagMinimum = -12,
    +  };
    +  int** _hdr;
    +
    +public:
    +  HdrSeq();
    +  ~HdrSeq();
    +
    +  virtual void add(double val);
    +  double percentile(double level) const;
    +};
    +
    +// Binary magnitude sequence stores the power-of-two histogram.
    +// It has very low memory requirements, and is thread-safe. When accuracy
    +// is not needed, it is preferred over HdrSeq.
    +class BinaryMagnitudeSeq {
    +private:
    +  size_t  _sum;
    +  size_t* _mags;
    +
    +public:
    +  BinaryMagnitudeSeq();
    +  ~BinaryMagnitudeSeq();
    +
    +  void add(size_t val);
    +  size_t num() const;
    +  size_t level(int level) const;
    +  size_t sum() const;
    +  int min_level() const;
    +  int max_level() const;
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHNUMBERSEQ_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOopClosures.hpp b/src/hotspot/share/gc/shenandoah/shenandoahOopClosures.hpp
    new file mode 100644
    index 00000000000..30edab30126
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahOopClosures.hpp
    @@ -0,0 +1,350 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
    +
    +#include "gc/shared/referenceProcessor.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahStrDedupQueue.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +#include "gc/shenandoah/shenandoahTraversalGC.hpp"
    +#include "memory/iterator.hpp"
    +#include "runtime/thread.hpp"
    +
    +enum UpdateRefsMode {
    +  NONE,       // No reference updating
    +  RESOLVE,    // Only a read-barrier (no reference updating)
    +  SIMPLE,     // Reference updating using simple store
    +  CONCURRENT  // Reference updating using CAS
    +};
    +
    +enum StringDedupMode {
    +  NO_DEDUP,      // Do not do anything for String deduplication
    +  ENQUEUE_DEDUP, // Enqueue candidate Strings for deduplication
    +};
    +
    +class ShenandoahMarkRefsSuperClosure : public MetadataVisitingOopIterateClosure {
    +private:
    +  ShenandoahObjToScanQueue* _queue;
    +  ShenandoahHeap* _heap;
    +  ShenandoahMarkingContext* const _mark_context;
    +
    +protected:
    +  template 
    +  void work(T *p);
    +
    +public:
    +  ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp);
    +};
    +
    +class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +          ShenandoahMarkRefsSuperClosure(q, rp) {};
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +  virtual bool do_metadata()        { return false; }
    +};
    +
    +class ShenandoahMarkUpdateRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahMarkUpdateRefsDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +          ShenandoahMarkRefsSuperClosure(q, rp) {};
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +  virtual bool do_metadata()        { return false; }
    +};
    +
    +class ShenandoahMarkUpdateRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahMarkUpdateRefsMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahMarkRefsSuperClosure(q, rp) {};
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +  virtual bool do_metadata()        { return true; }
    +};
    +
    +class ShenandoahMarkUpdateRefsMetadataDedupClosure : public ShenandoahMarkRefsSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahMarkUpdateRefsMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +  ShenandoahMarkRefsSuperClosure(q, rp) {};
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +  virtual bool do_metadata()        { return true; }
    +};
    +
    +class ShenandoahMarkRefsClosure : public ShenandoahMarkRefsSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahMarkRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahMarkRefsSuperClosure(q, rp) {};
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +  virtual bool do_metadata()        { return false; }
    +};
    +
    +class ShenandoahMarkRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahMarkRefsDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahMarkRefsSuperClosure(q, rp) {};
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +  virtual bool do_metadata()        { return false; }
    +};
    +
    +class ShenandoahMarkResolveRefsClosure : public ShenandoahMarkRefsSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahMarkResolveRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahMarkRefsSuperClosure(q, rp) {};
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +  virtual bool do_metadata()        { return false; }
    +};
    +
    +class ShenandoahMarkRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahMarkRefsMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahMarkRefsSuperClosure(q, rp) {};
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +  virtual bool do_metadata()        { return true; }
    +};
    +
    +class ShenandoahMarkRefsMetadataDedupClosure : public ShenandoahMarkRefsSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahMarkRefsMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahMarkRefsSuperClosure(q, rp) {};
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +  virtual bool do_metadata()        { return true; }
    +};
    +
    +class ShenandoahUpdateHeapRefsSuperClosure : public BasicOopIterateClosure {
    +private:
    +  ShenandoahHeap* _heap;
    +public:
    +  ShenandoahUpdateHeapRefsSuperClosure() :
    +    _heap(ShenandoahHeap::heap()) {}
    +
    +  template 
    +  void work(T *p);
    +};
    +
    +class ShenandoahUpdateHeapRefsClosure : public ShenandoahUpdateHeapRefsSuperClosure {
    +private:
    +  template 
    +  inline  void do_oop_work(T* p)    { work(p); }
    +
    +public:
    +  ShenandoahUpdateHeapRefsClosure() : ShenandoahUpdateHeapRefsSuperClosure() {}
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +class ShenandoahTraversalSuperClosure : public MetadataVisitingOopIterateClosure {
    +private:
    +  ShenandoahTraversalGC* const _traversal_gc;
    +  Thread* const _thread;
    +  ShenandoahObjToScanQueue* const _queue;
    +  ShenandoahMarkingContext* const _mark_context;
    +protected:
    +  ShenandoahTraversalSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    MetadataVisitingOopIterateClosure(rp),
    +    _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
    +    _thread(Thread::current()),
    +    _queue(q),
    +    _mark_context(ShenandoahHeap::heap()->marking_context()) {
    +  }
    +
    +  template 
    +  void work(T* p);
    +
    +};
    +
    +class ShenandoahTraversalClosure : public ShenandoahTraversalSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahTraversalClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahTraversalSuperClosure(q, rp) {}
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +
    +  virtual bool do_metadata()        { return false; }
    +};
    +
    +class ShenandoahTraversalMetadataClosure : public ShenandoahTraversalSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahTraversalMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahTraversalSuperClosure(q, rp) {}
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +
    +  virtual bool do_metadata()        { return true; }
    +};
    +
    +class ShenandoahTraversalDedupClosure : public ShenandoahTraversalSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahTraversalDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahTraversalSuperClosure(q, rp) {}
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +
    +  virtual bool do_metadata()        { return false; }
    +};
    +
    +class ShenandoahTraversalMetadataDedupClosure : public ShenandoahTraversalSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahTraversalMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahTraversalSuperClosure(q, rp) {}
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +
    +  virtual bool do_metadata()        { return true; }
    +};
    +
    +class ShenandoahTraversalDegenClosure : public ShenandoahTraversalSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahTraversalDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahTraversalSuperClosure(q, rp) {}
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +
    +  virtual bool do_metadata()        { return false; }
    +};
    +
    +class ShenandoahTraversalMetadataDegenClosure : public ShenandoahTraversalSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahTraversalMetadataDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahTraversalSuperClosure(q, rp) {}
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +
    +  virtual bool do_metadata()        { return true; }
    +};
    +
    +class ShenandoahTraversalDedupDegenClosure : public ShenandoahTraversalSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahTraversalDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahTraversalSuperClosure(q, rp) {}
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +
    +  virtual bool do_metadata()        { return false; }
    +};
    +
    +class ShenandoahTraversalMetadataDedupDegenClosure : public ShenandoahTraversalSuperClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p)     { work(p); }
    +
    +public:
    +  ShenandoahTraversalMetadataDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
    +    ShenandoahTraversalSuperClosure(q, rp) {}
    +
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    +
    +  virtual bool do_metadata()        { return true; }
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOopClosures.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahOopClosures.inline.hpp
    new file mode 100644
    index 00000000000..3942a608c12
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahOopClosures.inline.hpp
    @@ -0,0 +1,46 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_INLINE_HPP
    +
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahConcurrentMark.inline.hpp"
    +#include "gc/shenandoah/shenandoahTraversalGC.inline.hpp"
    +
    +template
    +inline void ShenandoahMarkRefsSuperClosure::work(T *p) {
    +  ShenandoahConcurrentMark::mark_through_ref(p, _heap, _queue, _mark_context);
    +}
    +
    +template 
    +inline void ShenandoahUpdateHeapRefsSuperClosure::work(T* p) {
    +  _heap->maybe_update_with_forwarded(p);
    +}
    +
    +template 
    +inline void ShenandoahTraversalSuperClosure::work(T* p) {
    +  _traversal_gc->process_oop(p, _thread, _queue, _mark_context);
    +}
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahPacer.cpp b/src/hotspot/share/gc/shenandoah/shenandoahPacer.cpp
    new file mode 100644
    index 00000000000..8d91b6123b7
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahPacer.cpp
    @@ -0,0 +1,303 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahFreeSet.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahPacer.hpp"
    +
    +/*
    + * In normal concurrent cycle, we have to pace the application to let GC finish.
    + *
    + * Here, we do not know how large would be the collection set, and what are the
    + * relative performances of the each stage in the concurrent cycle, and so we have to
    + * make some assumptions.
    + *
    + * For concurrent mark, there is no clear notion of progress. The moderately accurate
    + * and easy to get metric is the amount of live objects the mark had encountered. But,
    + * that does directly correlate with the used heap, because the heap might be fully
    + * dead or fully alive. We cannot assume either of the extremes: we would either allow
    + * application to run out of memory if we assume heap is fully dead but it is not, and,
    + * conversely, we would pacify application excessively if we assume heap is fully alive
    + * but it is not. So we need to guesstimate the particular expected value for heap liveness.
    + * The best way to do this is apparently recording the past history.
    + *
    + * For concurrent evac and update-refs, we are walking the heap per-region, and so the
    + * notion of progress is clear: we get reported the "used" size from the processed regions
    + * and use the global heap-used as the baseline.
    + *
    + * The allocatable space when GC is running is "free" at the start of cycle, but the
    + * accounted budget is based on "used". So, we need to adjust the tax knowing that.
    + * Also, since we effectively count the used space three times (mark, evac, update-refs),
    + * we need to multiply the tax by 3. Example: for 10 MB free and 90 MB used, GC would
    + * come back with 3*90 MB budget, and thus for each 1 MB of allocation, we have to pay
    + * 3*90 / 10 MBs. In the end, we would pay back the entire budget.
    + */
    +
    +void ShenandoahPacer::setup_for_mark() {
    +  assert(ShenandoahPacing, "Only be here when pacing is enabled");
    +
    +  size_t live = update_and_get_progress_history();
    +  size_t free = _heap->free_set()->available();
    +
    +  size_t non_taxable = free * ShenandoahPacingCycleSlack / 100;
    +  size_t taxable = free - non_taxable;
    +
    +  double tax = 1.0 * live / taxable; // base tax for available free space
    +  tax *= 3;                          // mark is phase 1 of 3, claim 1/3 of free for it
    +  tax *= ShenandoahPacingSurcharge;  // additional surcharge to help unclutter heap
    +
    +  restart_with(non_taxable, tax);
    +
    +  log_info(gc, ergo)("Pacer for Mark. Expected Live: " SIZE_FORMAT "M, Free: " SIZE_FORMAT
    +                     "M, Non-Taxable: " SIZE_FORMAT "M, Alloc Tax Rate: %.1fx",
    +                     live / M, free / M, non_taxable / M, tax);
    +}
    +
    +void ShenandoahPacer::setup_for_evac() {
    +  assert(ShenandoahPacing, "Only be here when pacing is enabled");
    +
    +  size_t used = _heap->collection_set()->used();
    +  size_t free = _heap->free_set()->available();
    +
    +  size_t non_taxable = free * ShenandoahPacingCycleSlack / 100;
    +  size_t taxable = free - non_taxable;
    +
    +  double tax = 1.0 * used / taxable; // base tax for available free space
    +  tax *= 2;                          // evac is phase 2 of 3, claim 1/2 of remaining free
    +  tax = MAX2(1, tax);        // never allocate more than GC processes during the phase
    +  tax *= ShenandoahPacingSurcharge;  // additional surcharge to help unclutter heap
    +
    +  restart_with(non_taxable, tax);
    +
    +  log_info(gc, ergo)("Pacer for Evacuation. Used CSet: " SIZE_FORMAT "M, Free: " SIZE_FORMAT
    +                     "M, Non-Taxable: " SIZE_FORMAT "M, Alloc Tax Rate: %.1fx",
    +                     used / M, free / M, non_taxable / M, tax);
    +}
    +
    +void ShenandoahPacer::setup_for_updaterefs() {
    +  assert(ShenandoahPacing, "Only be here when pacing is enabled");
    +
    +  size_t used = _heap->used();
    +  size_t free = _heap->free_set()->available();
    +
    +  size_t non_taxable = free * ShenandoahPacingCycleSlack / 100;
    +  size_t taxable = free - non_taxable;
    +
    +  double tax = 1.0 * used / taxable; // base tax for available free space
    +  tax *= 1;                          // update-refs is phase 3 of 3, claim the remaining free
    +  tax = MAX2(1, tax);        // never allocate more than GC processes during the phase
    +  tax *= ShenandoahPacingSurcharge;  // additional surcharge to help unclutter heap
    +
    +  restart_with(non_taxable, tax);
    +
    +  log_info(gc, ergo)("Pacer for Update Refs. Used: " SIZE_FORMAT "M, Free: " SIZE_FORMAT
    +                     "M, Non-Taxable: " SIZE_FORMAT "M, Alloc Tax Rate: %.1fx",
    +                     used / M, free / M, non_taxable / M, tax);
    +}
    +
    +/*
    + * Traversal walks the entire heap once, and therefore we have to make assumptions about its
    + * liveness, like concurrent mark does.
    + */
    +
    +void ShenandoahPacer::setup_for_traversal() {
    +  assert(ShenandoahPacing, "Only be here when pacing is enabled");
    +
    +  size_t live = update_and_get_progress_history();
    +  size_t free = _heap->free_set()->available();
    +
    +  size_t non_taxable = free * ShenandoahPacingCycleSlack / 100;
    +  size_t taxable = free - non_taxable;
    +
    +  double tax = 1.0 * live / taxable; // base tax for available free space
    +  tax *= ShenandoahPacingSurcharge;  // additional surcharge to help unclutter heap
    +
    +  restart_with(non_taxable, tax);
    +
    +  log_info(gc, ergo)("Pacer for Traversal. Expected Live: " SIZE_FORMAT "M, Free: " SIZE_FORMAT
    +                     "M, Non-Taxable: " SIZE_FORMAT "M, Alloc Tax Rate: %.1fx",
    +                     live / M, free / M, non_taxable / M, tax);
    +}
    +
    +/*
    + * In idle phase, we have to pace the application to let control thread react with GC start.
    + *
    + * Here, we have rendezvous with concurrent thread that adds up the budget as it acknowledges
    + * it had seen recent allocations. It will naturally pace the allocations if control thread is
    + * not catching up. To bootstrap this feedback cycle, we need to start with some initial budget
    + * for applications to allocate at.
    + */
    +
    +void ShenandoahPacer::setup_for_idle() {
    +  assert(ShenandoahPacing, "Only be here when pacing is enabled");
    +
    +  size_t initial = _heap->capacity() * ShenandoahPacingIdleSlack / 100;
    +  double tax = 1;
    +
    +  restart_with(initial, tax);
    +
    +  log_info(gc, ergo)("Pacer for Idle. Initial: " SIZE_FORMAT "M, Alloc Tax Rate: %.1fx",
    +                     initial / M, tax);
    +}
    +
    +size_t ShenandoahPacer::update_and_get_progress_history() {
    +  if (_progress == -1) {
    +    // First initialization, report some prior
    +    Atomic::store((intptr_t)PACING_PROGRESS_ZERO, &_progress);
    +    return (size_t) (_heap->capacity() * 0.1);
    +  } else {
    +    // Record history, and reply historical data
    +    _progress_history->add(_progress);
    +    Atomic::store((intptr_t)PACING_PROGRESS_ZERO, &_progress);
    +    return (size_t) (_progress_history->avg() * HeapWordSize);
    +  }
    +}
    +
    +void ShenandoahPacer::restart_with(size_t non_taxable_bytes, double tax_rate) {
    +  size_t initial = (size_t)(non_taxable_bytes * tax_rate) >> LogHeapWordSize;
    +  STATIC_ASSERT(sizeof(size_t) <= sizeof(intptr_t));
    +  Atomic::xchg((intptr_t)initial, &_budget);
    +  Atomic::store(tax_rate, &_tax_rate);
    +  Atomic::inc(&_epoch);
    +}
    +
    +bool ShenandoahPacer::claim_for_alloc(size_t words, bool force) {
    +  assert(ShenandoahPacing, "Only be here when pacing is enabled");
    +
    +  intptr_t tax = MAX2(1, words * Atomic::load(&_tax_rate));
    +
    +  intptr_t cur = 0;
    +  intptr_t new_val = 0;
    +  do {
    +    cur = Atomic::load(&_budget);
    +    if (cur < tax && !force) {
    +      // Progress depleted, alas.
    +      return false;
    +    }
    +    new_val = cur - tax;
    +  } while (Atomic::cmpxchg(new_val, &_budget, cur) != cur);
    +  return true;
    +}
    +
    +void ShenandoahPacer::unpace_for_alloc(intptr_t epoch, size_t words) {
    +  assert(ShenandoahPacing, "Only be here when pacing is enabled");
    +
    +  if (_epoch != epoch) {
    +    // Stale ticket, no need to unpace.
    +    return;
    +  }
    +
    +  intptr_t tax = MAX2(1, words * Atomic::load(&_tax_rate));
    +  Atomic::add(tax, &_budget);
    +}
    +
    +intptr_t ShenandoahPacer::epoch() {
    +  return Atomic::load(&_epoch);
    +}
    +
    +void ShenandoahPacer::pace_for_alloc(size_t words) {
    +  assert(ShenandoahPacing, "Only be here when pacing is enabled");
    +
    +  // Fast path: try to allocate right away
    +  if (claim_for_alloc(words, false)) {
    +    return;
    +  }
    +
    +  size_t max = ShenandoahPacingMaxDelay;
    +  double start = os::elapsedTime();
    +
    +  size_t total = 0;
    +  size_t cur = 0;
    +
    +  while (true) {
    +    // We could instead assist GC, but this would suffice for now.
    +    // This code should also participate in safepointing.
    +    // Perform the exponential backoff, limited by max.
    +
    +    cur = cur * 2;
    +    if (total + cur > max) {
    +      cur = (max > total) ? (max - total) : 0;
    +    }
    +    cur = MAX2(1, cur);
    +
    +    os::sleep(Thread::current(), cur, true);
    +
    +    double end = os::elapsedTime();
    +    total = (size_t)((end - start) * 1000);
    +
    +    if (total > max) {
    +      // Spent local time budget to wait for enough GC progress.
    +      // Breaking out and allocating anyway, which may mean we outpace GC,
    +      // and start Degenerated GC cycle.
    +      _delays.add(total);
    +
    +      // Forcefully claim the budget: it may go negative at this point, and
    +      // GC should replenish for this and subsequent allocations
    +      claim_for_alloc(words, true);
    +      break;
    +    }
    +
    +    if (claim_for_alloc(words, false)) {
    +      // Acquired enough permit, nice. Can allocate now.
    +      _delays.add(total);
    +      break;
    +    }
    +  }
    +}
    +
    +void ShenandoahPacer::print_on(outputStream* out) const {
    +  out->print_cr("ALLOCATION PACING:");
    +  out->cr();
    +
    +  out->print_cr("Max pacing delay is set for " UINTX_FORMAT " ms.", ShenandoahPacingMaxDelay);
    +  out->cr();
    +
    +  out->print_cr("Higher delay would prevent application outpacing the GC, but it will hide the GC latencies");
    +  out->print_cr("from the STW pause times. Pacing affects the individual threads, and so it would also be");
    +  out->print_cr("invisible to the usual profiling tools, but would add up to end-to-end application latency.");
    +  out->print_cr("Raise max pacing delay with care.");
    +  out->cr();
    +
    +  out->print_cr("Actual pacing delays histogram:");
    +  out->cr();
    +
    +  out->print_cr("%10s - %10s  %12s%12s", "From", "To", "Count", "Sum");
    +
    +  size_t total_count = 0;
    +  size_t total_sum = 0;
    +  for (int c = _delays.min_level(); c <= _delays.max_level(); c++) {
    +    int l = (c == 0) ? 0 : 1 << (c - 1);
    +    int r = 1 << c;
    +    size_t count = _delays.level(c);
    +    size_t sum   = count * (r - l) / 2;
    +    total_count += count;
    +    total_sum   += sum;
    +
    +    out->print_cr("%7d ms - %7d ms: " SIZE_FORMAT_W(12) SIZE_FORMAT_W(12) " ms", l, r, count, sum);
    +  }
    +  out->print_cr("%23s: " SIZE_FORMAT_W(12) SIZE_FORMAT_W(12) " ms", "Total", total_count, total_sum);
    +  out->cr();
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahPacer.hpp b/src/hotspot/share/gc/shenandoah/shenandoahPacer.hpp
    new file mode 100644
    index 00000000000..804f97c5a80
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahPacer.hpp
    @@ -0,0 +1,99 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHPACER_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHPACER_HPP
    +
    +#include "gc/shenandoah/shenandoahNumberSeq.hpp"
    +#include "memory/allocation.hpp"
    +
    +class ShenandoahHeap;
    +
    +#define PACING_PROGRESS_UNINIT (-1)
    +#define PACING_PROGRESS_ZERO   ( 0)
    +
    +/**
    + * ShenandoahPacer provides allocation pacing mechanism.
    + *
    + * Currently it implements simple tax-and-spend pacing policy: GC threads provide
    + * credit, allocating thread spend the credit, or stall when credit is not available.
    + */
    +class ShenandoahPacer : public CHeapObj {
    +private:
    +  ShenandoahHeap* _heap;
    +  BinaryMagnitudeSeq _delays;
    +  TruncatedSeq* _progress_history;
    +
    +  // Set once per phase
    +  volatile intptr_t _epoch;
    +  volatile double _tax_rate;
    +
    +  // Heavily updated, protect from accidental false sharing
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile intptr_t));
    +  volatile intptr_t _budget;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +  // Heavily updated, protect from accidental false sharing
    +  DEFINE_PAD_MINUS_SIZE(2, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile intptr_t));
    +  volatile intptr_t _progress;
    +  DEFINE_PAD_MINUS_SIZE(3, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +public:
    +  ShenandoahPacer(ShenandoahHeap* heap) :
    +          _heap(heap),
    +          _progress_history(new TruncatedSeq(5)),
    +          _epoch(0),
    +          _tax_rate(1),
    +          _budget(0),
    +          _progress(PACING_PROGRESS_UNINIT) {}
    +
    +  void setup_for_idle();
    +  void setup_for_mark();
    +  void setup_for_evac();
    +  void setup_for_updaterefs();
    +  void setup_for_traversal();
    +
    +  inline void report_mark(size_t words);
    +  inline void report_evac(size_t words);
    +  inline void report_updaterefs(size_t words);
    +
    +  inline void report_alloc(size_t words);
    +
    +  bool claim_for_alloc(size_t words, bool force);
    +  void pace_for_alloc(size_t words);
    +  void unpace_for_alloc(intptr_t epoch, size_t words);
    +
    +  intptr_t epoch();
    +
    +  void print_on(outputStream* out) const;
    +
    +private:
    +  inline void report_internal(size_t words);
    +  inline void report_progress_internal(size_t words);
    +
    +  void restart_with(size_t non_taxable_bytes, double tax_rate);
    +
    +  size_t update_and_get_progress_history();
    +};
    +
    +#endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHPACER_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahPacer.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahPacer.inline.hpp
    new file mode 100644
    index 00000000000..6e59024d8ad
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahPacer.inline.hpp
    @@ -0,0 +1,59 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHPACER_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHPACER_INLINE_HPP
    +
    +#include "gc/shenandoah/shenandoahPacer.hpp"
    +#include "runtime/atomic.hpp"
    +
    +inline void ShenandoahPacer::report_mark(size_t words) {
    +  report_internal(words);
    +  report_progress_internal(words);
    +}
    +
    +inline void ShenandoahPacer::report_evac(size_t words) {
    +  report_internal(words);
    +}
    +
    +inline void ShenandoahPacer::report_updaterefs(size_t words) {
    +  report_internal(words);
    +}
    +
    +inline void ShenandoahPacer::report_alloc(size_t words) {
    +  report_internal(words);
    +}
    +
    +inline void ShenandoahPacer::report_internal(size_t words) {
    +  assert(ShenandoahPacing, "Only be here when pacing is enabled");
    +  STATIC_ASSERT(sizeof(size_t) <= sizeof(intptr_t));
    +  Atomic::add((intptr_t)words, &_budget);
    +}
    +
    +inline void ShenandoahPacer::report_progress_internal(size_t words) {
    +  assert(ShenandoahPacing, "Only be here when pacing is enabled");
    +  STATIC_ASSERT(sizeof(size_t) <= sizeof(intptr_t));
    +  Atomic::add((intptr_t)words, &_progress);
    +}
    +
    +#endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHPACER_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.cpp b/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.cpp
    new file mode 100644
    index 00000000000..77a73b974ee
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.cpp
    @@ -0,0 +1,191 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shared/workerDataArray.inline.hpp"
    +#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "utilities/ostream.hpp"
    +
    +#define GC_PHASE_DECLARE_NAME(type, title) \
    +  title,
    +
    +const char* ShenandoahPhaseTimings::_phase_names[] = {
    +  SHENANDOAH_GC_PHASE_DO(GC_PHASE_DECLARE_NAME)
    +};
    +
    +#undef GC_PHASE_DECLARE_NAME
    +
    +ShenandoahPhaseTimings::ShenandoahPhaseTimings() : _policy(NULL) {
    +  uint max_workers = MAX2(ConcGCThreads, ParallelGCThreads);
    +  _worker_times = new ShenandoahWorkerTimings(max_workers);
    +  _termination_times = new ShenandoahTerminationTimings(max_workers);
    +  _policy = ShenandoahHeap::heap()->shenandoah_policy();
    +  assert(_policy != NULL, "Can not be NULL");
    +}
    +
    +void ShenandoahPhaseTimings::record_phase_start(Phase phase) {
    +  _timing_data[phase]._start = os::elapsedTime();
    +}
    +
    +void ShenandoahPhaseTimings::record_phase_end(Phase phase) {
    +  assert(_policy != NULL, "Not yet initialized");
    +  double end = os::elapsedTime();
    +  double elapsed = end - _timing_data[phase]._start;
    +  if (!_policy->is_at_shutdown()) {
    +    _timing_data[phase]._secs.add(elapsed);
    +  }
    +  ShenandoahHeap::heap()->heuristics()->record_phase_time(phase, elapsed);
    +}
    +
    +void ShenandoahPhaseTimings::record_phase_time(Phase phase, double time) {
    +  assert(_policy != NULL, "Not yet initialized");
    +  if (!_policy->is_at_shutdown()) {
    +    _timing_data[phase]._secs.add(time);
    +  }
    +}
    +
    +void ShenandoahPhaseTimings::record_workers_start(Phase phase) {
    +  for (uint i = 0; i < GCParPhasesSentinel; i++) {
    +    _worker_times->reset(i);
    +  }
    +}
    +
    +void ShenandoahPhaseTimings::record_workers_end(Phase phase) {
    +  if (_policy->is_at_shutdown()) {
    +    // Do not record the past-shutdown events
    +    return;
    +  }
    +
    +  guarantee(phase == init_evac ||
    +            phase == scan_roots ||
    +            phase == update_roots ||
    +            phase == init_traversal_gc_work ||
    +            phase == final_traversal_gc_work ||
    +            phase == final_traversal_update_roots ||
    +            phase == final_update_refs_roots ||
    +            phase == full_gc_roots ||
    +            phase == degen_gc_update_roots ||
    +            phase == _num_phases,
    +            "only in these phases we can add per-thread phase times");
    +  if (phase != _num_phases) {
    +    // Merge _phase_time to counters below the given phase.
    +    for (uint i = 0; i < GCParPhasesSentinel; i++) {
    +      double t = _worker_times->average(i);
    +      _timing_data[phase + i + 1]._secs.add(t);
    +    }
    +  }
    +}
    +
    +void ShenandoahPhaseTimings::print_on(outputStream* out) const {
    +  out->cr();
    +  out->print_cr("GC STATISTICS:");
    +  out->print_cr("  \"(G)\" (gross) pauses include VM time: time to notify and block threads, do the pre-");
    +  out->print_cr("        and post-safepoint housekeeping. Use -XX:+PrintSafepointStatistics to dissect.");
    +  out->print_cr("  \"(N)\" (net) pauses are the times spent in the actual GC code.");
    +  out->print_cr("  \"a\" is average time for each phase, look at levels to see if average makes sense.");
    +  out->print_cr("  \"lvls\" are quantiles: 0%% (minimum), 25%%, 50%% (median), 75%%, 100%% (maximum).");
    +  out->cr();
    +
    +  for (uint i = 0; i < _num_phases; i++) {
    +    if (_timing_data[i]._secs.maximum() != 0) {
    +      print_summary_sd(out, _phase_names[i], &(_timing_data[i]._secs));
    +    }
    +  }
    +}
    +
    +void ShenandoahPhaseTimings::print_summary_sd(outputStream* out, const char* str, const HdrSeq* seq) const {
    +  out->print_cr("%-27s = %8.2lf s (a = %8.0lf us) (n = " INT32_FORMAT_W(5) ") (lvls, us = %8.0lf, %8.0lf, %8.0lf, %8.0lf, %8.0lf)",
    +          str,
    +          seq->sum(),
    +          seq->avg() * 1000000.0,
    +          seq->num(),
    +          seq->percentile(0)  * 1000000.0,
    +          seq->percentile(25) * 1000000.0,
    +          seq->percentile(50) * 1000000.0,
    +          seq->percentile(75) * 1000000.0,
    +          seq->maximum() * 1000000.0
    +  );
    +}
    +
    +ShenandoahWorkerTimings::ShenandoahWorkerTimings(uint max_gc_threads) :
    +        _max_gc_threads(max_gc_threads)
    +{
    +  assert(max_gc_threads > 0, "Must have some GC threads");
    +
    +#define GC_PAR_PHASE_DECLARE_WORKER_DATA(type, title) \
    +  _gc_par_phases[ShenandoahPhaseTimings::type] = new WorkerDataArray(max_gc_threads, title);
    +  // Root scanning phases
    +  SHENANDOAH_GC_PAR_PHASE_DO(GC_PAR_PHASE_DECLARE_WORKER_DATA)
    +#undef GC_PAR_PHASE_DECLARE_WORKER_DATA
    +}
    +
    +// record the time a phase took in seconds
    +void ShenandoahWorkerTimings::record_time_secs(ShenandoahPhaseTimings::GCParPhases phase, uint worker_i, double secs) {
    +  _gc_par_phases[phase]->set(worker_i, secs);
    +}
    +
    +double ShenandoahWorkerTimings::average(uint i) const {
    +  return _gc_par_phases[i]->average();
    +}
    +
    +void ShenandoahWorkerTimings::reset(uint i) {
    +  _gc_par_phases[i]->reset();
    +}
    +
    +void ShenandoahWorkerTimings::print() const {
    +  for (uint i = 0; i < ShenandoahPhaseTimings::GCParPhasesSentinel; i++) {
    +    _gc_par_phases[i]->print_summary_on(tty);
    +  }
    +}
    +
    +
    +ShenandoahTerminationTimings::ShenandoahTerminationTimings(uint max_gc_threads) {
    +  _gc_termination_phase = new WorkerDataArray(max_gc_threads, "Task Termination (ms):");
    +}
    +
    +void ShenandoahTerminationTimings::record_time_secs(uint worker_id, double secs) {
    +  if (_gc_termination_phase->get(worker_id) == WorkerDataArray::uninitialized()) {
    +    _gc_termination_phase->set(worker_id, secs);
    +  } else {
    +    // worker may re-enter termination phase
    +    _gc_termination_phase->add(worker_id, secs);
    +  }
    +}
    +
    +void ShenandoahTerminationTimings::print() const {
    +  _gc_termination_phase->print_summary_on(tty);
    +}
    +
    +double ShenandoahTerminationTimings::average() const {
    +  return _gc_termination_phase->average();
    +}
    +
    +void ShenandoahTerminationTimings::reset() {
    +  _gc_termination_phase->reset();
    +}
    +
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.hpp b/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.hpp
    new file mode 100644
    index 00000000000..d45fbc0b0b6
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.hpp
    @@ -0,0 +1,398 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHPHASETIMEINGS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHPHASETIMEINGS_HPP
    +
    +#include "gc/shenandoah/shenandoahNumberSeq.hpp"
    +#include "gc/shared/workerDataArray.hpp"
    +#include "memory/allocation.hpp"
    +
    +class ShenandoahCollectorPolicy;
    +class ShenandoahWorkerTimings;
    +class ShenandoahTerminationTimings;
    +class outputStream;
    +
    +#define SHENANDOAH_GC_PHASE_DO(f)                                                       \
    +  f(total_pause_gross,                              "Total Pauses (G)")                 \
    +  f(total_pause,                                    "Total Pauses (N)")                 \
    +  f(init_mark_gross,                                "Pause Init Mark (G)")              \
    +  f(init_mark,                                      "Pause Init Mark (N)")              \
    +  f(make_parsable,                                  "  Make Parsable")                  \
    +  f(clear_liveness,                                 "  Clear Liveness")                 \
    +                                                                                        \
    +  /* Per-thread timer block, should have "roots" counters in consistent order */        \
    +  f(scan_roots,                                     "  Scan Roots")                     \
    +  f(scan_thread_roots,                              "    S: Thread Roots")              \
    +  f(scan_code_roots,                                "    S: Code Cache Roots")          \
    +  f(scan_string_table_roots,                        "    S: String Table Roots")        \
    +  f(scan_universe_roots,                            "    S: Universe Roots")            \
    +  f(scan_jni_roots,                                 "    S: JNI Roots")                 \
    +  f(scan_jni_weak_roots,                            "    S: JNI Weak Roots")            \
    +  f(scan_synchronizer_roots,                        "    S: Synchronizer Roots")        \
    +  f(scan_management_roots,                          "    S: Management Roots")          \
    +  f(scan_system_dictionary_roots,                   "    S: System Dict Roots")         \
    +  f(scan_cldg_roots,                                "    S: CLDG Roots")                \
    +  f(scan_jvmti_roots,                               "    S: JVMTI Roots")               \
    +  f(scan_string_dedup_table_roots,                  "    S: Dedup Table Roots")         \
    +  f(scan_string_dedup_queue_roots,                  "    S: Dedup Queue Roots")         \
    +  f(scan_finish_queues,                             "    S: Finish Queues" )            \
    +                                                                                        \
    +  f(resize_tlabs,                                   "  Resize TLABs")                   \
    +                                                                                        \
    +  f(final_mark_gross,                               "Pause Final Mark (G)")             \
    +  f(final_mark,                                     "Pause Final Mark (N)")             \
    +                                                                                        \
    +  /* Per-thread timer block, should have "roots" counters in consistent order */        \
    +  f(update_roots,                                   "  Update Roots")                   \
    +  f(update_thread_roots,                            "    U: Thread Roots")              \
    +  f(update_code_roots,                              "    U: Code Cache Roots")          \
    +  f(update_string_table_roots,                      "    U: String Table Roots")        \
    +  f(update_universe_roots,                          "    U: Universe Roots")            \
    +  f(update_jni_roots,                               "    U: JNI Roots")                 \
    +  f(update_jni_weak_roots,                          "    U: JNI Weak Roots")            \
    +  f(update_synchronizer_roots,                      "    U: Synchronizer Roots")        \
    +  f(update_management_roots,                        "    U: Management Roots")          \
    +  f(update_system_dictionary_roots,                 "    U: System Dict Roots")         \
    +  f(update_cldg_roots,                              "    U: CLDG Roots")                \
    +  f(update_jvmti_roots,                             "    U: JVMTI Roots")               \
    +  f(update_string_dedup_table_roots,                "    U: Dedup Table Roots")         \
    +  f(update_string_dedup_queue_roots,                "    U: Dedup Queue Roots")         \
    +  f(update_finish_queues,                           "    U: Finish Queues")             \
    +                                                                                        \
    +  f(finish_queues,                                  "  Finish Queues")                  \
    +  f(termination,                                    "    Termination")                  \
    +  f(weakrefs,                                       "  Weak References")                \
    +  f(weakrefs_process,                               "    Process")                      \
    +  f(weakrefs_termination,                           "      Termination")                \
    +  f(purge,                                          "  System Purge")                   \
    +  f(purge_class_unload,                             "    Unload Classes")               \
    +  f(purge_par,                                      "    Parallel Cleanup")             \
    +  f(purge_cldg,                                     "    CLDG")                         \
    +  f(purge_string_dedup,                             "    String Dedup")                 \
    +  f(complete_liveness,                              "  Complete Liveness")              \
    +  f(prepare_evac,                                   "  Prepare Evacuation")             \
    +  f(recycle_regions,                                "  Recycle regions")                \
    +                                                                                        \
    +  /* Per-thread timer block, should have "roots" counters in consistent order */        \
    +  f(init_evac,                                      "  Initial Evacuation")             \
    +  f(evac_thread_roots,                              "    E: Thread Roots")              \
    +  f(evac_code_roots,                                "    E: Code Cache Roots")          \
    +  f(evac_string_table_roots,                        "    E: String Table Roots")        \
    +  f(evac_universe_roots,                            "    E: Universe Roots")            \
    +  f(evac_jni_roots,                                 "    E: JNI Roots")                 \
    +  f(evac_jni_weak_roots,                            "    E: JNI Weak Roots")            \
    +  f(evac_synchronizer_roots,                        "    E: Synchronizer Roots")        \
    +  f(evac_management_roots,                          "    E: Management Roots")          \
    +  f(evac_system_dictionary_roots,                   "    E: System Dict Roots")         \
    +  f(evac_cldg_roots,                                "    E: CLDG Roots")                \
    +  f(evac_jvmti_roots,                               "    E: JVMTI Roots")               \
    +  f(evac_string_dedup_table_roots,                  "    E: String Dedup Table Roots")  \
    +  f(evac_string_dedup_queue_roots,                  "    E: String Dedup Queue Roots")  \
    +  f(evac_finish_queues,                             "    E: Finish Queues")             \
    +                                                                                        \
    +  f(final_evac_gross,                               "Pause Final Evac (G)")             \
    +  f(final_evac,                                     "Pause Final Evac (N)")             \
    +                                                                                        \
    +  f(init_update_refs_gross,                         "Pause Init  Update Refs (G)")      \
    +  f(init_update_refs,                               "Pause Init  Update Refs (N)")      \
    +                                                                                        \
    +  f(final_update_refs_gross,                         "Pause Final Update Refs (G)")     \
    +  f(final_update_refs,                               "Pause Final Update Refs (N)")     \
    +  f(final_update_refs_finish_work,                   "  Finish Work")                   \
    +                                                                                        \
    +  /* Per-thread timer block, should have "roots" counters in consistent order */        \
    +  f(final_update_refs_roots,                         "  Update Roots")                  \
    +  f(final_update_refs_thread_roots,                  "    UR: Thread Roots")            \
    +  f(final_update_refs_code_roots,                    "    UR: Code Cache Roots")        \
    +  f(final_update_refs_string_table_roots,            "    UR: String Table Roots")      \
    +  f(final_update_refs_universe_roots,                "    UR: Universe Roots")          \
    +  f(final_update_refs_jni_roots,                     "    UR: JNI Roots")               \
    +  f(final_update_refs_jni_weak_roots,                "    UR: JNI Weak Roots")          \
    +  f(final_update_refs_synchronizer_roots,            "    UR: Synchronizer Roots")      \
    +  f(final_update_refs_management_roots,              "    UR: Management Roots")        \
    +  f(final_update_refs_system_dict_roots,             "    UR: System Dict Roots")       \
    +  f(final_update_refs_cldg_roots,                    "    UR: CLDG Roots")              \
    +  f(final_update_refs_jvmti_roots,                   "    UR: JVMTI Roots")             \
    +  f(final_update_refs_string_dedup_table_roots,      "    UR: Dedup Table Roots")       \
    +  f(final_update_refs_string_dedup_queue_roots,      "    UR: Dedup Queue Roots")       \
    +  f(final_update_refs_finish_queues,                 "    UR: Finish Queues")           \
    +                                                                                        \
    +  f(final_update_refs_recycle,                       "  Recycle")                       \
    +                                                                                        \
    +  f(degen_gc_gross,                                  "Pause Degenerated GC (G)")        \
    +  f(degen_gc,                                        "Pause Degenerated GC (N)")        \
    +                                                                                        \
    +  /* Per-thread timer block, should have "roots" counters in consistent order */        \
    +  f(degen_gc_update_roots,                           "  Degen Update Roots")            \
    +  f(degen_gc_update_thread_roots,                    "    DU: Thread Roots")            \
    +  f(degen_gc_update_code_roots,                      "    DU: Code Cache Roots")        \
    +  f(degen_gc_update_string_table_roots,              "    DU: String Table Roots")      \
    +  f(degen_gc_update_universe_roots,                  "    DU: Universe Roots")          \
    +  f(degen_gc_update_jni_roots,                       "    DU: JNI Roots")               \
    +  f(degen_gc_update_jni_weak_roots,                  "    DU: JNI Weak Roots")          \
    +  f(degen_gc_update_synchronizer_roots,              "    DU: Synchronizer Roots")      \
    +  f(degen_gc_update_management_roots,                "    DU: Management Roots")        \
    +  f(degen_gc_update_system_dict_roots,               "    DU: System Dict Roots")       \
    +  f(degen_gc_update_cldg_roots,                      "    DU: CLDG Roots")              \
    +  f(degen_gc_update_jvmti_roots,                     "    DU: JVMTI Roots")             \
    +  f(degen_gc_update_string_dedup_table_roots,        "    DU: Dedup Table Roots")       \
    +  f(degen_gc_update_string_dedup_queue_roots,        "    DU: Dedup Queue Roots")       \
    +  f(degen_gc_update_finish_queues,                   "    DU: Finish Queues")           \
    +                                                                                        \
    +  f(init_traversal_gc_gross,                         "Pause Init Traversal (G)")        \
    +  f(init_traversal_gc,                               "Pause Init Traversal (N)")        \
    +  f(traversal_gc_prepare,                            "  Prepare")                       \
    +  f(traversal_gc_make_parsable,                      "    Make Parsable")               \
    +  f(traversal_gc_resize_tlabs,                       "    Resize TLABs")                \
    +                                                                                        \
    +  /* Per-thread timer block, should have "roots" counters in consistent order */        \
    +  f(init_traversal_gc_work,                          "  Work")                          \
    +  f(init_traversal_gc_thread_roots,                  "    TI: Thread Roots")            \
    +  f(init_traversal_gc_code_roots,                    "    TI: Code Cache Roots")        \
    +  f(init_traversal_gc_string_table_roots,            "    TI: String Table Roots")      \
    +  f(init_traversal_gc_universe_roots,                "    TI: Universe Roots")          \
    +  f(init_traversal_gc_jni_roots,                     "    TI: JNI Roots")               \
    +  f(init_traversal_gc_jni_weak_roots,                "    TI: JNI Weak Roots")          \
    +  f(init_traversal_gc_synchronizer_roots,            "    TI: Synchronizer Roots")      \
    +  f(init_traversal_gc_management_roots,              "    TI: Management Roots")        \
    +  f(init_traversal_gc_system_dict_roots,             "    TI: System Dict Roots")       \
    +  f(init_traversal_gc_cldg_roots,                    "    TI: CLDG Roots")              \
    +  f(init_traversal_gc_jvmti_roots,                   "    TI: JVMTI Roots")             \
    +  f(init_traversal_gc_string_dedup_table_roots,      "    TI: Dedup Table Roots")       \
    +  f(init_traversal_gc_string_dedup_queue_roots,      "    TI: Dedup Queue Roots")       \
    +  f(init_traversal_gc_finish_queues,                 "    TI: Finish Queues")           \
    +                                                                                        \
    +  f(final_traversal_gc_gross,                        "Pause Final Traversal (G)")       \
    +  f(final_traversal_gc,                              "Pause Final Traversal (N)")       \
    +                                                                                        \
    +  /* Per-thread timer block, should have "roots" counters in consistent order */        \
    +  f(final_traversal_gc_work,                         "  Work")                          \
    +  f(final_traversal_gc_thread_roots,                 "    TF: Thread Roots")            \
    +  f(final_traversal_gc_code_roots,                   "    TF: Code Cache Roots")        \
    +  f(final_traversal_gc_string_table_roots,           "    TF: String Table Roots")      \
    +  f(final_traversal_gc_universe_roots,               "    TF: Universe Roots")          \
    +  f(final_traversal_gc_jni_roots,                    "    TF: JNI Roots")               \
    +  f(final_traversal_gc_jni_weak_roots,               "    TF: JNI Weak Roots")          \
    +  f(final_traversal_gc_synchronizer_roots,           "    TF: Synchronizer Roots")      \
    +  f(final_traversal_gc_management_roots,             "    TF: Management Roots")        \
    +  f(final_traversal_gc_system_dict_roots,            "    TF: System Dict Roots")       \
    +  f(final_traversal_gc_cldg_roots,                   "    TF: CLDG Roots")              \
    +  f(final_traversal_gc_jvmti_roots,                  "    TF: JVMTI Roots")             \
    +  f(final_traversal_gc_string_dedup_table_roots,     "    TF: Dedup Table Roots")       \
    +  f(final_traversal_gc_string_dedup_queue_roots,     "    TF: Dedup Queue Roots")       \
    +  f(final_traversal_gc_finish_queues,                "    TF: Finish Queues")           \
    +  f(final_traversal_gc_termination,                  "    TF:   Termination")           \
    +                                                                                        \
    +  /* Per-thread timer block, should have "roots" counters in consistent order */        \
    +  f(final_traversal_update_roots,                    "  Update Roots")                  \
    +  f(final_traversal_update_thread_roots,             "    TU: Thread Roots")            \
    +  f(final_traversal_update_code_roots,               "    TU: Code Cache Roots")        \
    +  f(final_traversal_update_string_table_roots,       "    TU: String Table Roots")      \
    +  f(final_traversal_update_universe_roots,           "    TU: Universe Roots")          \
    +  f(final_traversal_update_jni_roots,                "    TU: JNI Roots")               \
    +  f(final_traversal_update_jni_weak_roots,           "    TU: JNI Weak Roots")          \
    +  f(final_traversal_update_synchronizer_roots,       "    TU: Synchronizer Roots")      \
    +  f(final_traversal_update_management_roots,         "    TU: Management Roots")        \
    +  f(final_traversal_update_system_dict_roots,        "    TU: System Dict Roots")       \
    +  f(final_traversal_update_cldg_roots,               "    TU: CLDG Roots")              \
    +  f(final_traversal_update_jvmti_roots,              "    TU: JVMTI Roots")             \
    +  f(final_traversal_update_string_dedup_table_roots, "    TU: Dedup Table Roots")       \
    +  f(final_traversal_update_string_dedup_queue_roots, "    TU: Dedup Queue Roots")       \
    +  f(final_traversal_update_finish_queues,            "    TU: Finish Queues")           \
    +                                                                                        \
    +  f(traversal_gc_cleanup,                            "  Cleanup")                       \
    +                                                                                        \
    +  f(full_gc_gross,                                   "Pause Full GC (G)")               \
    +  f(full_gc,                                         "Pause Full GC (N)")               \
    +  f(full_gc_heapdumps,                               "  Heap Dumps")                    \
    +  f(full_gc_prepare,                                 "  Prepare")                       \
    +                                                                                        \
    +  /* Per-thread timer block, should have "roots" counters in consistent order */        \
    +  f(full_gc_roots,                                   "  Roots")                         \
    +  f(full_gc_thread_roots,                            "    F: Thread Roots")             \
    +  f(full_gc_code_roots,                              "    F: Code Cache Roots")         \
    +  f(full_gc_string_table_roots,                      "    F: String Table Roots")       \
    +  f(full_gc_universe_roots,                          "    F: Universe Roots")           \
    +  f(full_gc_jni_roots,                               "    F: JNI Roots")                \
    +  f(full_gc_jni_weak_roots,                          "    F: JNI Weak Roots")           \
    +  f(full_gc_synchronizer_roots,                      "    F: Synchronizer Roots")       \
    +  f(full_gc_management_roots,                        "    F: Management Roots")         \
    +  f(full_gc_system_dictionary_roots,                 "    F: System Dict Roots")        \
    +  f(full_gc_cldg_roots,                              "    F: CLDG Roots")               \
    +  f(full_gc_jvmti_roots,                             "    F: JVMTI Roots")              \
    +  f(full_gc_string_dedup_table_roots,                "    F: Dedup Table Roots")        \
    +  f(full_gc_string_dedup_queue_roots,                "    F: Dedup Queue Roots")        \
    +  f(full_gc_finish_queues,                           "    F: Finish Queues")            \
    +                                                                                        \
    +  f(full_gc_mark,                                    "  Mark")                          \
    +  f(full_gc_mark_finish_queues,                      "    Finish Queues")               \
    +  f(full_gc_mark_termination,                        "      Termination")               \
    +  f(full_gc_weakrefs,                                "    Weak References")             \
    +  f(full_gc_weakrefs_process,                        "      Process")                   \
    +  f(full_gc_weakrefs_termination,                    "        Termination")             \
    +  f(full_gc_purge,                                   "    System Purge")                \
    +  f(full_gc_purge_class_unload,                      "      Unload Classes")            \
    +  f(full_gc_purge_par,                               "    Parallel Cleanup")            \
    +  f(full_gc_purge_cldg,                              "    CLDG")                        \
    +  f(full_gc_purge_string_dedup,                      "    String Dedup")                \
    +  f(full_gc_calculate_addresses,                     "  Calculate Addresses")           \
    +  f(full_gc_calculate_addresses_regular,             "    Regular Objects")             \
    +  f(full_gc_calculate_addresses_humong,              "    Humongous Objects")           \
    +  f(full_gc_adjust_pointers,                         "  Adjust Pointers")               \
    +  f(full_gc_copy_objects,                            "  Copy Objects")                  \
    +  f(full_gc_copy_objects_regular,                    "    Regular Objects")             \
    +  f(full_gc_copy_objects_humong,                     "    Humongous Objects")           \
    +  f(full_gc_copy_objects_reset_complete,             "    Reset Complete Bitmap")       \
    +  f(full_gc_copy_objects_rebuild,                    "    Rebuild Region Sets")         \
    +  f(full_gc_resize_tlabs,                            "  Resize TLABs")                  \
    +                                                                                        \
    +  /* Longer concurrent phases at the end */                                             \
    +  f(conc_reset,                                      "Concurrent Reset")                \
    +  f(conc_mark,                                       "Concurrent Marking")              \
    +  f(conc_termination,                                "  Termination")                   \
    +  f(conc_preclean,                                   "Concurrent Precleaning")          \
    +  f(conc_evac,                                       "Concurrent Evacuation")           \
    +  f(conc_update_refs,                                "Concurrent Update Refs")          \
    +  f(conc_cleanup,                                    "Concurrent Cleanup")              \
    +  f(conc_traversal,                                  "Concurrent Traversal")            \
    +  f(conc_traversal_termination,                      "  Termination")                   \
    +                                                                                        \
    +  f(conc_uncommit,                                   "Concurrent Uncommit")             \
    +                                                                                        \
    +  /* Unclassified */                                                                    \
    +  f(pause_other,                                     "Pause Other")                     \
    +  f(conc_other,                                      "Concurrent Other")                \
    +  // end
    +
    +#define SHENANDOAH_GC_PAR_PHASE_DO(f)                           \
    +  f(ThreadRoots,             "Thread Roots (ms):")              \
    +  f(CodeCacheRoots,          "CodeCache Roots (ms):")           \
    +  f(StringTableRoots,        "StringTable Roots (ms):")         \
    +  f(UniverseRoots,           "Universe Roots (ms):")            \
    +  f(JNIRoots,                "JNI Handles Roots (ms):")         \
    +  f(JNIWeakRoots,            "JNI Weak Roots (ms):")            \
    +  f(ObjectSynchronizerRoots, "ObjectSynchronizer Roots (ms):")  \
    +  f(ManagementRoots,         "Management Roots (ms):")          \
    +  f(SystemDictionaryRoots,   "SystemDictionary Roots (ms):")    \
    +  f(CLDGRoots,               "CLDG Roots (ms):")                \
    +  f(JVMTIRoots,              "JVMTI Roots (ms):")               \
    +  f(StringDedupTableRoots,   "String Dedup Table Roots (ms):")  \
    +  f(StringDedupQueueRoots,   "String Dedup Queue Roots (ms):")  \
    +  f(FinishQueues,            "Finish Queues (ms):")             \
    +  // end
    +
    +class ShenandoahPhaseTimings : public CHeapObj {
    +public:
    +#define GC_PHASE_DECLARE_ENUM(type, title)   type,
    +
    +  enum Phase {
    +    SHENANDOAH_GC_PHASE_DO(GC_PHASE_DECLARE_ENUM)
    +    _num_phases
    +  };
    +
    +  // These are the subphases of GC phases (scan_roots, update_roots,
    +  // init_evac, final_update_refs_roots and full_gc_roots).
    +  // Make sure they are following this order.
    +  enum GCParPhases {
    +    SHENANDOAH_GC_PAR_PHASE_DO(GC_PHASE_DECLARE_ENUM)
    +    GCParPhasesSentinel
    +  };
    +
    +#undef GC_PHASE_DECLARE_ENUM
    +
    +private:
    +  struct TimingData {
    +    HdrSeq _secs;
    +    double _start;
    +  };
    +
    +private:
    +  TimingData          _timing_data[_num_phases];
    +  static const char*  _phase_names[_num_phases];
    +
    +  ShenandoahWorkerTimings*      _worker_times;
    +  ShenandoahTerminationTimings* _termination_times;
    +
    +  ShenandoahCollectorPolicy* _policy;
    +
    +public:
    +  ShenandoahPhaseTimings();
    +
    +  ShenandoahWorkerTimings* const worker_times() const { return _worker_times; }
    +  ShenandoahTerminationTimings* const termination_times() const { return _termination_times; }
    +
    +  // record phase start
    +  void record_phase_start(Phase phase);
    +  // record phase end and return elapsed time in seconds for the phase
    +  void record_phase_end(Phase phase);
    +  // record an elapsed time for the phase
    +  void record_phase_time(Phase phase, double time);
    +
    +  void record_workers_start(Phase phase);
    +  void record_workers_end(Phase phase);
    +
    +  static const char* phase_name(Phase phase) {
    +    assert(phase >= 0 && phase < _num_phases, "Out of bound");
    +    return _phase_names[phase];
    +  }
    +
    +  void print_on(outputStream* out) const;
    +
    +private:
    +  void init_phase_names();
    +  void print_summary_sd(outputStream* out, const char* str, const HdrSeq* seq) const;
    +};
    +
    +class ShenandoahWorkerTimings : public CHeapObj {
    +private:
    +  uint _max_gc_threads;
    +  WorkerDataArray* _gc_par_phases[ShenandoahPhaseTimings::GCParPhasesSentinel];
    +
    +public:
    +  ShenandoahWorkerTimings(uint max_gc_threads);
    +
    +  // record the time a phase took in seconds
    +  void record_time_secs(ShenandoahPhaseTimings::GCParPhases phase, uint worker_i, double secs);
    +
    +  double average(uint i) const;
    +  void reset(uint i);
    +  void print() const;
    +};
    +
    +class ShenandoahTerminationTimings : public CHeapObj {
    +private:
    +  WorkerDataArray* _gc_termination_phase;
    +public:
    +  ShenandoahTerminationTimings(uint max_gc_threads);
    +
    +  // record the time a phase took in seconds
    +  void record_time_secs(uint worker_i, double secs);
    +
    +  double average() const;
    +  void reset();
    +
    +  void print() const;
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHGCPHASETIMEINGS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp
    new file mode 100644
    index 00000000000..a494b0227dc
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp
    @@ -0,0 +1,276 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "classfile/classLoaderDataGraph.hpp"
    +#include "classfile/stringTable.hpp"
    +#include "classfile/systemDictionary.hpp"
    +#include "code/codeCache.hpp"
    +#include "gc/shenandoah/shenandoahRootProcessor.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shenandoah/shenandoahStringDedup.hpp"
    +#include "gc/shenandoah/shenandoahTimingTracker.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "gc/shenandoah/shenandoahVMOperations.hpp"
    +#include "gc/shared/weakProcessor.hpp"
    +#include "memory/allocation.inline.hpp"
    +#include "memory/iterator.hpp"
    +#include "memory/resourceArea.hpp"
    +#include "runtime/thread.hpp"
    +#include "services/management.hpp"
    +
    +ShenandoahRootProcessor::ShenandoahRootProcessor(ShenandoahHeap* heap, uint n_workers,
    +                                                 ShenandoahPhaseTimings::Phase phase) :
    +  _process_strong_tasks(new SubTasksDone(SHENANDOAH_RP_PS_NumElements)),
    +  _srs(n_workers),
    +  _par_state_string(StringTable::weak_storage()),
    +  _phase(phase),
    +  _coderoots_all_iterator(ShenandoahCodeRoots::iterator())
    +{
    +  heap->phase_timings()->record_workers_start(_phase);
    +
    +  if (ShenandoahStringDedup::is_enabled()) {
    +    StringDedup::gc_prologue(false);
    +  }
    +}
    +
    +ShenandoahRootProcessor::~ShenandoahRootProcessor() {
    +  delete _process_strong_tasks;
    +  if (ShenandoahStringDedup::is_enabled()) {
    +    StringDedup::gc_epilogue();
    +  }
    +
    +  ShenandoahHeap::heap()->phase_timings()->record_workers_end(_phase);
    +}
    +
    +void ShenandoahRootProcessor::process_all_roots_slow(OopClosure* oops) {
    +  CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
    +  CodeBlobToOopClosure blobs(oops, !CodeBlobToOopClosure::FixRelocations);
    +
    +  CodeCache::blobs_do(&blobs);
    +  ClassLoaderDataGraph::cld_do(&clds);
    +  Universe::oops_do(oops);
    +  Management::oops_do(oops);
    +  JvmtiExport::oops_do(oops);
    +  JNIHandles::oops_do(oops);
    +  WeakProcessor::oops_do(oops);
    +  ObjectSynchronizer::oops_do(oops);
    +  SystemDictionary::oops_do(oops);
    +  StringTable::oops_do(oops);
    +
    +  if (ShenandoahStringDedup::is_enabled()) {
    +    ShenandoahStringDedup::oops_do_slow(oops);
    +  }
    +
    +  // Do thread roots the last. This allows verification code to find
    +  // any broken objects from those special roots first, not the accidental
    +  // dangling reference from the thread root.
    +  Threads::possibly_parallel_oops_do(false, oops, &blobs);
    +}
    +
    +void ShenandoahRootProcessor::process_strong_roots(OopClosure* oops,
    +                                                   OopClosure* weak_oops,
    +                                                   CLDClosure* clds,
    +                                                   CLDClosure* weak_clds,
    +                                                   CodeBlobClosure* blobs,
    +                                                   ThreadClosure* thread_cl,
    +                                                   uint worker_id) {
    +
    +  process_java_roots(oops, clds, weak_clds, blobs, thread_cl, worker_id);
    +  process_vm_roots(oops, NULL, weak_oops, worker_id);
    +
    +  _process_strong_tasks->all_tasks_completed(n_workers());
    +}
    +
    +void ShenandoahRootProcessor::process_all_roots(OopClosure* oops,
    +                                                OopClosure* weak_oops,
    +                                                CLDClosure* clds,
    +                                                CodeBlobClosure* blobs,
    +                                                ThreadClosure* thread_cl,
    +                                                uint worker_id) {
    +
    +  ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
    +  process_java_roots(oops, clds, clds, blobs, thread_cl, worker_id);
    +  process_vm_roots(oops, oops, weak_oops, worker_id);
    +
    +  if (blobs != NULL) {
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CodeCacheRoots, worker_id);
    +    _coderoots_all_iterator.possibly_parallel_blobs_do(blobs);
    +  }
    +
    +  _process_strong_tasks->all_tasks_completed(n_workers());
    +}
    +
    +class ShenandoahParallelOopsDoThreadClosure : public ThreadClosure {
    +private:
    +  OopClosure* _f;
    +  CodeBlobClosure* _cf;
    +  ThreadClosure* _thread_cl;
    +public:
    +  ShenandoahParallelOopsDoThreadClosure(OopClosure* f, CodeBlobClosure* cf, ThreadClosure* thread_cl) :
    +    _f(f), _cf(cf), _thread_cl(thread_cl) {}
    +
    +  void do_thread(Thread* t) {
    +    if (_thread_cl != NULL) {
    +      _thread_cl->do_thread(t);
    +    }
    +    t->oops_do(_f, _cf);
    +  }
    +};
    +
    +void ShenandoahRootProcessor::process_java_roots(OopClosure* strong_roots,
    +                                                 CLDClosure* strong_clds,
    +                                                 CLDClosure* weak_clds,
    +                                                 CodeBlobClosure* strong_code,
    +                                                 ThreadClosure* thread_cl,
    +                                                 uint worker_id)
    +{
    +  ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
    +  // Iterating over the CLDG and the Threads are done early to allow us to
    +  // first process the strong CLDs and nmethods and then, after a barrier,
    +  // let the thread process the weak CLDs and nmethods.
    +  {
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CLDGRoots, worker_id);
    +    _cld_iterator.root_cld_do(strong_clds, weak_clds);
    +  }
    +
    +  {
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::ThreadRoots, worker_id);
    +    bool is_par = n_workers() > 1;
    +    ResourceMark rm;
    +    ShenandoahParallelOopsDoThreadClosure cl(strong_roots, strong_code, thread_cl);
    +    Threads::possibly_parallel_threads_do(is_par, &cl);
    +  }
    +}
    +
    +void ShenandoahRootProcessor::process_vm_roots(OopClosure* strong_roots,
    +                                               OopClosure* weak_roots,
    +                                               OopClosure* jni_weak_roots,
    +                                               uint worker_id)
    +{
    +  ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
    +  if (_process_strong_tasks->try_claim_task(SHENANDOAH_RP_PS_Universe_oops_do)) {
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::UniverseRoots, worker_id);
    +    Universe::oops_do(strong_roots);
    +  }
    +
    +  if (_process_strong_tasks->try_claim_task(SHENANDOAH_RP_PS_JNIHandles_oops_do)) {
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::JNIRoots, worker_id);
    +    JNIHandles::oops_do(strong_roots);
    +  }
    +  if (_process_strong_tasks->try_claim_task(SHENANDOAH_RP_PS_Management_oops_do)) {
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::ManagementRoots, worker_id);
    +    Management::oops_do(strong_roots);
    +  }
    +  if (_process_strong_tasks->try_claim_task(SHENANDOAH_RP_PS_jvmti_oops_do)) {
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::JVMTIRoots, worker_id);
    +    JvmtiExport::oops_do(strong_roots);
    +  }
    +  if (_process_strong_tasks->try_claim_task(SHENANDOAH_RP_PS_SystemDictionary_oops_do)) {
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::SystemDictionaryRoots, worker_id);
    +    SystemDictionary::oops_do(strong_roots);
    +  }
    +  if (jni_weak_roots != NULL) {
    +    if (_process_strong_tasks->try_claim_task(SHENANDOAH_RP_PS_JNIHandles_weak_oops_do)) {
    +      ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::JNIWeakRoots, worker_id);
    +      WeakProcessor::oops_do(jni_weak_roots);
    +    }
    +  }
    +
    +  if (ShenandoahStringDedup::is_enabled() && weak_roots != NULL) {
    +    ShenandoahStringDedup::parallel_oops_do(weak_roots, worker_id);
    +  }
    +
    +  {
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::ObjectSynchronizerRoots, worker_id);
    +    if (_process_strong_tasks->try_claim_task(SHENANDOAH_RP_PS_ObjectSynchronizer_oops_do)) {
    +      ObjectSynchronizer::oops_do(strong_roots);
    +    }
    +  }
    +
    +  // All threads execute the following. A specific chunk of buckets
    +  // from the StringTable are the individual tasks.
    +  if (weak_roots != NULL) {
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::StringTableRoots, worker_id);
    +    StringTable::possibly_parallel_oops_do(&_par_state_string, weak_roots);
    +  }
    +}
    +
    +uint ShenandoahRootProcessor::n_workers() const {
    +  return _srs.n_threads();
    +}
    +
    +ShenandoahRootEvacuator::ShenandoahRootEvacuator(ShenandoahHeap* heap, uint n_workers, ShenandoahPhaseTimings::Phase phase) :
    +  _evacuation_tasks(new SubTasksDone(SHENANDOAH_EVAC_NumElements)),
    +  _srs(n_workers),
    +  _phase(phase),
    +  _coderoots_cset_iterator(ShenandoahCodeRoots::cset_iterator())
    +{
    +  heap->phase_timings()->record_workers_start(_phase);
    +}
    +
    +ShenandoahRootEvacuator::~ShenandoahRootEvacuator() {
    +  delete _evacuation_tasks;
    +  ShenandoahHeap::heap()->phase_timings()->record_workers_end(_phase);
    +}
    +
    +void ShenandoahRootEvacuator::process_evacuate_roots(OopClosure* oops,
    +                                                     CodeBlobClosure* blobs,
    +                                                     uint worker_id) {
    +
    +  ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
    +  {
    +    bool is_par = n_workers() > 1;
    +    ResourceMark rm;
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::ThreadRoots, worker_id);
    +
    +    Threads::possibly_parallel_oops_do(is_par, oops, NULL);
    +  }
    +
    +  if (blobs != NULL) {
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CodeCacheRoots, worker_id);
    +    _coderoots_cset_iterator.possibly_parallel_blobs_do(blobs);
    +  }
    +
    +  if (_evacuation_tasks->try_claim_task(SHENANDOAH_EVAC_jvmti_oops_do)) {
    +    ShenandoahForwardedIsAliveClosure is_alive;
    +    ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::JVMTIRoots, worker_id);
    +    JvmtiExport::weak_oops_do(&is_alive, oops);
    +  }
    +}
    +
    +uint ShenandoahRootEvacuator::n_workers() const {
    +  return _srs.n_threads();
    +}
    +
    +// Implemenation of ParallelCLDRootIterator
    +ParallelCLDRootIterator::ParallelCLDRootIterator() {
    +  assert(SafepointSynchronize::is_at_safepoint(), "Must at safepoint");
    +  ClassLoaderDataGraph::clear_claimed_marks();
    +}
    +
    +void ParallelCLDRootIterator::root_cld_do(CLDClosure* strong, CLDClosure* weak) {
    +    ClassLoaderDataGraph::roots_cld_do(strong, weak);
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp
    new file mode 100644
    index 00000000000..602e9751b61
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp
    @@ -0,0 +1,126 @@
    +/*
    + * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_HPP
    +
    +#include "code/codeCache.hpp"
    +#include "gc/shared/oopStorageParState.hpp"
    +#include "gc/shenandoah/shenandoahCodeRoots.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shared/strongRootsScope.hpp"
    +#include "gc/shared/workgroup.hpp"
    +#include "memory/allocation.hpp"
    +#include "memory/iterator.hpp"
    +
    +class ParallelCLDRootIterator {
    +public:
    +  ParallelCLDRootIterator();
    +  void root_cld_do(CLDClosure* strong, CLDClosure* weak);
    +};
    +
    +enum Shenandoah_process_roots_tasks {
    +  SHENANDOAH_RP_PS_Universe_oops_do,
    +  SHENANDOAH_RP_PS_JNIHandles_oops_do,
    +  SHENANDOAH_RP_PS_JNIHandles_weak_oops_do,
    +  SHENANDOAH_RP_PS_ObjectSynchronizer_oops_do,
    +  SHENANDOAH_RP_PS_Management_oops_do,
    +  SHENANDOAH_RP_PS_SystemDictionary_oops_do,
    +  SHENANDOAH_RP_PS_jvmti_oops_do,
    +  // Leave this one last.
    +  SHENANDOAH_RP_PS_NumElements
    +};
    +
    +class ShenandoahRootProcessor : public StackObj {
    +  SubTasksDone* _process_strong_tasks;
    +  StrongRootsScope _srs;
    +  OopStorage::ParState _par_state_string;
    +  ShenandoahPhaseTimings::Phase _phase;
    +  ParallelCLDRootIterator   _cld_iterator;
    +  ShenandoahAllCodeRootsIterator _coderoots_all_iterator;
    +  CodeBlobClosure* _threads_nmethods_cl;
    +
    +  void process_java_roots(OopClosure* scan_non_heap_roots,
    +                          CLDClosure* scan_strong_clds,
    +                          CLDClosure* scan_weak_clds,
    +                          CodeBlobClosure* scan_strong_code,
    +                          ThreadClosure* thread_cl,
    +                          uint worker_i);
    +
    +  void process_vm_roots(OopClosure* scan_non_heap_roots,
    +                        OopClosure* scan_non_heap_weak_roots,
    +                        OopClosure* weak_jni_roots,
    +                        uint worker_i);
    +
    +public:
    +  ShenandoahRootProcessor(ShenandoahHeap* heap, uint n_workers,
    +                          ShenandoahPhaseTimings::Phase phase);
    +  ~ShenandoahRootProcessor();
    +
    +  // Apply oops, clds and blobs to all strongly reachable roots in the system
    +  void process_strong_roots(OopClosure* oops, OopClosure* weak_oops,
    +                            CLDClosure* clds,
    +                            CLDClosure* weak_clds,
    +                            CodeBlobClosure* blobs,
    +                            ThreadClosure* thread_cl,
    +                            uint worker_id);
    +
    +  // Apply oops, clds and blobs to strongly and weakly reachable roots in the system
    +  void process_all_roots(OopClosure* oops, OopClosure* weak_oops,
    +                         CLDClosure* clds,
    +                         CodeBlobClosure* blobs,
    +                         ThreadClosure* thread_cl,
    +                         uint worker_id);
    +
    +  // For slow debug/verification code
    +  void process_all_roots_slow(OopClosure* oops);
    +
    +  // Number of worker threads used by the root processor.
    +  uint n_workers() const;
    +};
    +
    +class ShenandoahRootEvacuator : public StackObj {
    +  SubTasksDone* _evacuation_tasks;
    +  StrongRootsScope _srs;
    +  ShenandoahPhaseTimings::Phase _phase;
    +  ShenandoahCsetCodeRootsIterator _coderoots_cset_iterator;
    +
    +  enum Shenandoah_evacuate_roots_tasks {
    +      SHENANDOAH_EVAC_jvmti_oops_do,
    +      // Leave this one last.
    +      SHENANDOAH_EVAC_NumElements
    +  };
    +public:
    +  ShenandoahRootEvacuator(ShenandoahHeap* heap, uint n_workers,
    +                          ShenandoahPhaseTimings::Phase phase);
    +  ~ShenandoahRootEvacuator();
    +
    +  void process_evacuate_roots(OopClosure* oops,
    +                              CodeBlobClosure* blobs,
    +                              uint worker_id);
    +
    +  // Number of worker threads used by the root processor.
    +  uint n_workers() const;
    +};
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHROOTPROCESSOR_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp b/src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp
    new file mode 100644
    index 00000000000..b7e37a12977
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp
    @@ -0,0 +1,66 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSet.hpp"
    +#include "gc/shenandoah/shenandoahRuntime.hpp"
    +#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
    +#include "runtime/interfaceSupport.inline.hpp"
    +#include "oops/oop.inline.hpp"
    +
    +void ShenandoahRuntime::write_ref_array_pre_oop_entry(oop* dst, size_t length) {
    +  ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set();
    +  bs->write_ref_array_pre(dst, length, false);
    +}
    +
    +void ShenandoahRuntime::write_ref_array_pre_narrow_oop_entry(narrowOop* dst, size_t length) {
    +  ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set();
    +  bs->write_ref_array_pre(dst, length, false);
    +}
    +
    +void ShenandoahRuntime::write_ref_array_post_entry(HeapWord* dst, size_t length) {
    +  ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set();
    +  bs->ShenandoahBarrierSet::write_ref_array(dst, length);
    +}
    +
    +// Shenandoah pre write barrier slowpath
    +JRT_LEAF(void, ShenandoahRuntime::write_ref_field_pre_entry(oopDesc* orig, JavaThread *thread))
    +  if (orig == NULL) {
    +    assert(false, "should be optimized out");
    +    return;
    +  }
    +  shenandoah_assert_correct(NULL, orig);
    +  // store the original value that was in the field reference
    +  ShenandoahThreadLocalData::satb_mark_queue(thread).enqueue(orig);
    +JRT_END
    +
    +JRT_LEAF(oopDesc*, ShenandoahRuntime::write_barrier_JRT(oopDesc* src))
    +  oop result = ShenandoahBarrierSet::barrier_set()->write_barrier_mutator(src);
    +  return (oopDesc*) result;
    +JRT_END
    +
    +// Shenandoah clone barrier: makes sure that references point to to-space
    +// in cloned objects.
    +JRT_LEAF(void, ShenandoahRuntime::shenandoah_clone_barrier(oopDesc* obj))
    +  ShenandoahBarrierSet::barrier_set()->write_region(MemRegion((HeapWord*) obj, obj->size()));
    +JRT_END
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp b/src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp
    new file mode 100644
    index 00000000000..15cf5559fee
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp
    @@ -0,0 +1,46 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHRUNTIME_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHRUNTIME_HPP
    +
    +#include "memory/allocation.hpp"
    +#include "oops/oopsHierarchy.hpp"
    +
    +class HeapWord;
    +class JavaThread;
    +class oopDesc;
    +
    +class ShenandoahRuntime : public AllStatic {
    +public:
    +  static void write_ref_array_pre_oop_entry(oop* dst, size_t length);
    +  static void write_ref_array_pre_narrow_oop_entry(narrowOop* dst, size_t length);
    +  static void write_ref_array_post_entry(HeapWord* dst, size_t length);
    +  static void write_ref_field_pre_entry(oopDesc* orig, JavaThread* thread);
    +
    +  static oopDesc* write_barrier_JRT(oopDesc* src);
    +
    +  static void shenandoah_clone_barrier(oopDesc* obj);
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHRUNTIME_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.cpp
    new file mode 100644
    index 00000000000..61d74072f13
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.cpp
    @@ -0,0 +1,89 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahSATBMarkQueueSet.hpp"
    +#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
    +
    +ShenandoahSATBMarkQueueSet::ShenandoahSATBMarkQueueSet() :
    +  _heap(NULL),
    +  _satb_mark_queue_buffer_allocator(ShenandoahSATBBufferSize, SATB_Q_FL_lock)
    +{}
    +
    +void ShenandoahSATBMarkQueueSet::initialize(ShenandoahHeap* const heap,
    +                                            Monitor* cbl_mon,
    +                                            int process_completed_threshold,
    +                                            uint buffer_enqueue_threshold_percentage,
    +                                            Mutex* lock) {
    +  SATBMarkQueueSet::initialize(cbl_mon,
    +                               &_satb_mark_queue_buffer_allocator,
    +                               process_completed_threshold,
    +                               buffer_enqueue_threshold_percentage,
    +                               lock);
    +  _heap = heap;
    +}
    +
    +SATBMarkQueue& ShenandoahSATBMarkQueueSet::satb_queue_for_thread(JavaThread* const t) const {
    +  return ShenandoahThreadLocalData::satb_mark_queue(t);
    +}
    +
    +static inline bool discard_entry(const void* entry, ShenandoahHeap* heap) {
    +  return !heap->requires_marking(entry);
    +}
    +
    +class ShenandoahSATBMarkQueueFilterFn {
    +  ShenandoahHeap* _heap;
    +
    +public:
    +  ShenandoahSATBMarkQueueFilterFn(ShenandoahHeap* heap) : _heap(heap) {}
    +
    +  // Return true if entry should be filtered out (removed), false if
    +  // it should be retained.
    +  bool operator()(const void* entry) const {
    +    return discard_entry(entry, _heap);
    +  }
    +};
    +
    +void ShenandoahSATBMarkQueueSet::filter(SATBMarkQueue* queue) {
    +  assert(_heap != NULL, "SATB queue set not initialized");
    +  apply_filter(ShenandoahSATBMarkQueueFilterFn(_heap), queue);
    +}
    +
    +bool ShenandoahSATBMarkQueue::should_enqueue_buffer() {
    +  bool should_enqueue = SATBMarkQueue::should_enqueue_buffer();
    +  size_t cap = capacity();
    +  Thread* t = Thread::current();
    +  if (ShenandoahThreadLocalData::is_force_satb_flush(t)) {
    +    if (!should_enqueue && cap != index()) {
    +      // Non-empty buffer is compacted, and we decided not to enqueue it.
    +      // We still want to know about leftover work in that buffer eventually.
    +      // This avoid dealing with these leftovers during the final-mark, after
    +      // the buffers are drained completely. See JDK-8205353 for more discussion.
    +      should_enqueue = true;
    +    }
    +    ShenandoahThreadLocalData::set_force_satb_flush(t, false);
    +  }
    +  return should_enqueue;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.hpp
    new file mode 100644
    index 00000000000..c272e6c43a1
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.hpp
    @@ -0,0 +1,55 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHSATBMARKQUEUESET_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHSATBMARKQUEUESET_HPP
    +
    +#include "gc/shared/satbMarkQueue.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "runtime/mutex.hpp"
    +#include "runtime/thread.hpp"
    +
    +class ShenandoahSATBMarkQueue: public SATBMarkQueue {
    +public:
    +  ShenandoahSATBMarkQueue(SATBMarkQueueSet* qset) : SATBMarkQueue(qset, /* permanent = */ false) {}
    +  virtual bool should_enqueue_buffer();
    +};
    +
    +class ShenandoahSATBMarkQueueSet : public SATBMarkQueueSet {
    +private:
    +  ShenandoahHeap* _heap;
    +  BufferNode::Allocator _satb_mark_queue_buffer_allocator;
    +public:
    +  ShenandoahSATBMarkQueueSet();
    +
    +  void initialize(ShenandoahHeap* const heap,
    +                  Monitor* cbl_mon,
    +                  int process_completed_threshold,
    +                  uint buffer_enqueue_threshold_percentage,
    +                  Mutex* lock);
    +
    +  virtual SATBMarkQueue& satb_queue_for_thread(JavaThread* const t) const;
    +  virtual void filter(SATBMarkQueue* queue);
    +};
    +
    +#endif
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahSharedVariables.hpp b/src/hotspot/share/gc/shenandoah/shenandoahSharedVariables.hpp
    new file mode 100644
    index 00000000000..3e9521567f5
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahSharedVariables.hpp
    @@ -0,0 +1,246 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHSHAREDFLAG_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHSHAREDFLAG_HPP
    +
    +#include "memory/allocation.hpp"
    +#include "runtime/orderAccess.hpp"
    +
    +typedef jbyte ShenandoahSharedValue;
    +
    +// Needed for cooperation with generated code.
    +STATIC_ASSERT(sizeof(ShenandoahSharedValue) == 1);
    +
    +typedef struct ShenandoahSharedFlag {
    +  enum {
    +    UNSET = 0,
    +    SET = 1,
    +  };
    +
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile ShenandoahSharedValue));
    +  volatile ShenandoahSharedValue value;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +  ShenandoahSharedFlag() {
    +    unset();
    +  }
    +
    +  void set() {
    +    OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)SET);
    +  }
    +
    +  void unset() {
    +    OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)UNSET);
    +  }
    +
    +  bool is_set() const {
    +    return OrderAccess::load_acquire(&value) == SET;
    +  }
    +
    +  bool is_unset() const {
    +    return OrderAccess::load_acquire(&value) == UNSET;
    +  }
    +
    +  void set_cond(bool value) {
    +    if (value) {
    +      set();
    +    } else {
    +      unset();
    +    }
    +  }
    +
    +  bool try_set() {
    +    if (is_set()) {
    +      return false;
    +    }
    +    ShenandoahSharedValue old = Atomic::cmpxchg((ShenandoahSharedValue)SET, &value, (ShenandoahSharedValue)UNSET);
    +    return old == UNSET; // success
    +  }
    +
    +  bool try_unset() {
    +    if (!is_set()) {
    +      return false;
    +    }
    +    ShenandoahSharedValue old = Atomic::cmpxchg((ShenandoahSharedValue)UNSET, &value, (ShenandoahSharedValue)SET);
    +    return old == SET; // success
    +  }
    +
    +  volatile ShenandoahSharedValue* addr_of() {
    +    return &value;
    +  }
    +
    +private:
    +  volatile ShenandoahSharedValue* operator&() {
    +    fatal("Use addr_of() instead");
    +    return NULL;
    +  }
    +
    +  bool operator==(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +  bool operator!=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +  bool operator> (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +  bool operator>=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +  bool operator< (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +  bool operator<=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +
    +} ShenandoahSharedFlag;
    +
    +typedef struct ShenandoahSharedBitmap {
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile ShenandoahSharedValue));
    +  volatile ShenandoahSharedValue value;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +  ShenandoahSharedBitmap() {
    +    clear();
    +  }
    +
    +  void set(uint mask) {
    +    assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
    +    ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
    +    while (true) {
    +      ShenandoahSharedValue ov = OrderAccess::load_acquire(&value);
    +      if ((ov & mask_val) != 0) {
    +        // already set
    +        return;
    +      }
    +
    +      ShenandoahSharedValue nv = ov | mask_val;
    +      if (Atomic::cmpxchg(nv, &value, ov) == ov) {
    +        // successfully set
    +        return;
    +      }
    +    }
    +  }
    +
    +  void unset(uint mask) {
    +    assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
    +    ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
    +    while (true) {
    +      ShenandoahSharedValue ov = OrderAccess::load_acquire(&value);
    +      if ((ov & mask_val) == 0) {
    +        // already unset
    +        return;
    +      }
    +
    +      ShenandoahSharedValue nv = ov & ~mask_val;
    +      if (Atomic::cmpxchg(nv, &value, ov) == ov) {
    +        // successfully unset
    +        return;
    +      }
    +    }
    +  }
    +
    +  void clear() {
    +    OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)0);
    +  }
    +
    +  bool is_set(uint mask) const {
    +    return !is_unset(mask);
    +  }
    +
    +  bool is_unset(uint mask) const {
    +    assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
    +    return (OrderAccess::load_acquire(&value) & (ShenandoahSharedValue) mask) == 0;
    +  }
    +
    +  bool is_clear() const {
    +    return (OrderAccess::load_acquire(&value)) == 0;
    +  }
    +
    +  void set_cond(uint mask, bool value) {
    +    if (value) {
    +      set(mask);
    +    } else {
    +      unset(mask);
    +    }
    +  }
    +
    +  volatile ShenandoahSharedValue* addr_of() {
    +    return &value;
    +  }
    +
    +  ShenandoahSharedValue raw_value() const {
    +    return value;
    +  }
    +
    +private:
    +  volatile ShenandoahSharedValue* operator&() {
    +    fatal("Use addr_of() instead");
    +    return NULL;
    +  }
    +
    +  bool operator==(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +  bool operator!=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +  bool operator> (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +  bool operator>=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +  bool operator< (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +  bool operator<=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
    +
    +} ShenandoahSharedBitmap;
    +
    +template
    +struct ShenandoahSharedEnumFlag {
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile ShenandoahSharedValue));
    +  volatile ShenandoahSharedValue value;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +  ShenandoahSharedEnumFlag() {
    +    value = 0;
    +  }
    +
    +  void set(T v) {
    +    assert (v >= 0, "sanity");
    +    assert (v < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
    +    OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)v);
    +  }
    +
    +  T get() const {
    +    return (T)OrderAccess::load_acquire(&value);
    +  }
    +
    +  T cmpxchg(T new_value, T expected) {
    +    assert (new_value >= 0, "sanity");
    +    assert (new_value < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
    +    return (T)Atomic::cmpxchg((ShenandoahSharedValue)new_value, &value, (ShenandoahSharedValue)expected);
    +  }
    +
    +  volatile ShenandoahSharedValue* addr_of() {
    +    return &value;
    +  }
    +
    +private:
    +  volatile T* operator&() {
    +    fatal("Use addr_of() instead");
    +    return NULL;
    +  }
    +
    +  bool operator==(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
    +  bool operator!=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
    +  bool operator> (ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
    +  bool operator>=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
    +  bool operator< (ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
    +  bool operator<=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
    +
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHSHAREDFLAG_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahStrDedupQueue.cpp b/src/hotspot/share/gc/shenandoah/shenandoahStrDedupQueue.cpp
    new file mode 100644
    index 00000000000..515be11952a
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahStrDedupQueue.cpp
    @@ -0,0 +1,246 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shared/stringdedup/stringDedup.hpp"
    +#include "gc/shared/stringdedup/stringDedupThread.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahStrDedupQueue.hpp"
    +#include "gc/shenandoah/shenandoahStrDedupQueue.inline.hpp"
    +#include "gc/shenandoah/shenandoahStringDedup.hpp"
    +#include "logging/log.hpp"
    +#include "runtime/mutex.hpp"
    +#include "runtime/mutexLocker.hpp"
    +
    +ShenandoahStrDedupQueue::ShenandoahStrDedupQueue() :
    +  _consumer_queue(NULL),
    +  _num_producer_queue(ShenandoahHeap::heap()->max_workers()),
    +  _published_queues(NULL),
    +  _free_list(NULL),
    +  _num_free_buffer(0),
    +  _max_free_buffer(ShenandoahHeap::heap()->max_workers() * 2),
    +  _cancel(false),
    +  _total_buffers(0) {
    +  _producer_queues = NEW_C_HEAP_ARRAY(ShenandoahQueueBuffer*, _num_producer_queue, mtGC);
    +  for (size_t index = 0; index < _num_producer_queue; index ++) {
    +    _producer_queues[index] = NULL;
    +  }
    +}
    +
    +ShenandoahStrDedupQueue::~ShenandoahStrDedupQueue() {
    +  MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
    +  for (size_t index = 0; index < num_queues(); index ++) {
    +    release_buffers(queue_at(index));
    +  }
    +
    +  release_buffers(_free_list);
    +  FREE_C_HEAP_ARRAY(ShenandoahQueueBuffer*, _producer_queues);
    +}
    +
    +void ShenandoahStrDedupQueue::wait_impl() {
    +  MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
    +  while (_consumer_queue == NULL && !_cancel) {
    +    ml.wait(Mutex::_no_safepoint_check_flag);
    +    assert(_consumer_queue == NULL, "Why wait?");
    +    _consumer_queue = _published_queues;
    +    _published_queues = NULL;
    +  }
    +}
    +
    +void ShenandoahStrDedupQueue::cancel_wait_impl() {
    +  MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
    +  _cancel = true;
    +  ml.notify();
    +}
    +
    +void ShenandoahStrDedupQueue::unlink_or_oops_do_impl(StringDedupUnlinkOrOopsDoClosure* cl, size_t queue) {
    +  ShenandoahQueueBuffer* q = queue_at(queue);
    +  while (q != NULL) {
    +    q->unlink_or_oops_do(cl);
    +    q = q->next();
    +  }
    +}
    +
    +ShenandoahQueueBuffer* ShenandoahStrDedupQueue::queue_at(size_t queue_id) const {
    +  assert(queue_id <= num_queues(), "Invalid queue id");
    +  if (queue_id < _num_producer_queue) {
    +    return _producer_queues[queue_id];
    +  } else if (queue_id == _num_producer_queue) {
    +    return _consumer_queue;
    +  } else {
    +    assert(queue_id == _num_producer_queue + 1, "Must be");
    +    return _published_queues;
    +  }
    +}
    +
    +void ShenandoahStrDedupQueue::set_producer_buffer(ShenandoahQueueBuffer* buf, size_t queue_id) {
    +  assert(queue_id < _num_producer_queue, "Not a producer queue id");
    +  _producer_queues[queue_id] = buf;
    +}
    +
    +void ShenandoahStrDedupQueue::push_impl(uint worker_id, oop string_oop) {
    +  assert(worker_id < _num_producer_queue, "Invalid queue id. Can only push to producer queue");
    +  assert(ShenandoahStringDedup::is_candidate(string_oop), "Not a candidate");
    +
    +  ShenandoahQueueBuffer* buf = queue_at((size_t)worker_id);
    +
    +  if (buf == NULL) {
    +    MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
    +    buf = new_buffer();
    +    set_producer_buffer(buf, worker_id);
    +  } else if (buf->is_full()) {
    +    MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
    +    buf->set_next(_published_queues);
    +    _published_queues = buf;
    +    buf = new_buffer();
    +    set_producer_buffer(buf, worker_id);
    +    ml.notify();
    +  }
    +
    +  assert(!buf->is_full(), "Sanity");
    +  buf->push(string_oop);
    +}
    +
    +oop ShenandoahStrDedupQueue::pop_impl() {
    +  assert(Thread::current() == StringDedupThread::thread(), "Must be dedup thread");
    +  while (true) {
    +    if (_consumer_queue == NULL) {
    +      MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
    +      _consumer_queue = _published_queues;
    +      _published_queues = NULL;
    +    }
    +
    +    // there is nothing
    +    if (_consumer_queue == NULL) {
    +      return NULL;
    +    }
    +
    +    oop obj = NULL;
    +    if (pop_candidate(obj)) {
    +      assert(ShenandoahStringDedup::is_candidate(obj), "Must be a candidate");
    +      return obj;
    +    }
    +    assert(obj == NULL, "No more candidate");
    +  }
    +}
    +
    +bool ShenandoahStrDedupQueue::pop_candidate(oop& obj) {
    +  ShenandoahQueueBuffer* to_release = NULL;
    +  bool suc = true;
    +  do {
    +    if (_consumer_queue->is_empty()) {
    +      ShenandoahQueueBuffer* buf = _consumer_queue;
    +      _consumer_queue = _consumer_queue->next();
    +      buf->set_next(to_release);
    +      to_release = buf;
    +
    +      if (_consumer_queue == NULL) {
    +        suc = false;
    +        break;
    +      }
    +    }
    +    obj = _consumer_queue->pop();
    +  } while (obj == NULL);
    +
    +  if (to_release != NULL) {
    +    MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
    +    release_buffers(to_release);
    +  }
    +
    +  return suc;
    +}
    +
    +ShenandoahQueueBuffer* ShenandoahStrDedupQueue::new_buffer() {
    +  assert_lock_strong(StringDedupQueue_lock);
    +  if (_free_list != NULL) {
    +    assert(_num_free_buffer > 0, "Sanity");
    +    ShenandoahQueueBuffer* buf = _free_list;
    +    _free_list = _free_list->next();
    +    _num_free_buffer --;
    +    buf->reset();
    +    return buf;
    +  } else {
    +    assert(_num_free_buffer == 0, "Sanity");
    +    _total_buffers ++;
    +    return new ShenandoahQueueBuffer;
    +  }
    +}
    +
    +void ShenandoahStrDedupQueue::release_buffers(ShenandoahQueueBuffer* list) {
    +  assert_lock_strong(StringDedupQueue_lock);
    +  while (list != NULL) {
    +    ShenandoahQueueBuffer* tmp = list;
    +    list = list->next();
    +    if (_num_free_buffer < _max_free_buffer) {
    +      tmp->set_next(_free_list);
    +      _free_list = tmp;
    +      _num_free_buffer ++;
    +    } else {
    +      _total_buffers --;
    +      delete tmp;
    +    }
    +  }
    +}
    +
    +void ShenandoahStrDedupQueue::print_statistics_impl() {
    +  Log(gc, stringdedup) log;
    +  log.debug("  Queue:");
    +  log.debug("    Total buffers: " SIZE_FORMAT " (" SIZE_FORMAT " K). " SIZE_FORMAT " buffers are on free list",
    +    _total_buffers, (_total_buffers * sizeof(ShenandoahQueueBuffer) / K), _num_free_buffer);
    +}
    +
    +class VerifyQueueClosure : public OopClosure {
    +private:
    +  ShenandoahHeap* _heap;
    +public:
    +  VerifyQueueClosure();
    +
    +  void do_oop(oop* o);
    +  void do_oop(narrowOop* o) {
    +    ShouldNotCallThis();
    +  }
    +};
    +
    +VerifyQueueClosure::VerifyQueueClosure() :
    +  _heap(ShenandoahHeap::heap()) {
    +}
    +
    +void VerifyQueueClosure::do_oop(oop* o) {
    +  if (*o != NULL) {
    +    oop obj = *o;
    +    shenandoah_assert_correct(o, obj);
    +    assert(java_lang_String::is_instance(obj), "Object must be a String");
    +  }
    +}
    +
    +void ShenandoahStrDedupQueue::verify_impl() {
    +  VerifyQueueClosure vcl;
    +  for (size_t index = 0; index < num_queues(); index ++) {
    +    ShenandoahQueueBuffer* buf = queue_at(index);
    +    while (buf != NULL) {
    +      buf->oops_do(&vcl);
    +      buf = buf->next();
    +    }
    +  }
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahStrDedupQueue.hpp b/src/hotspot/share/gc/shenandoah/shenandoahStrDedupQueue.hpp
    new file mode 100644
    index 00000000000..f72039b1bb0
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahStrDedupQueue.hpp
    @@ -0,0 +1,113 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUPQUEUE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUPQUEUE_HPP
    +
    +#include "gc/shared/stringdedup/stringDedup.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "oops/oop.hpp"
    +
    +template 
    +class ShenandoahOopBuffer : public CHeapObj {
    +private:
    +  oop   _buf[buffer_size];
    +  uint  _index;
    +  ShenandoahOopBuffer* _next;
    +
    +public:
    +  ShenandoahOopBuffer();
    +
    +  bool is_full()  const;
    +  bool is_empty() const;
    +  uint size()     const;
    +
    +  void push(oop obj);
    +  oop pop();
    +
    +  void reset();
    +
    +  void set_next(ShenandoahOopBuffer* next);
    +  ShenandoahOopBuffer* next() const;
    +
    +  void unlink_or_oops_do(StringDedupUnlinkOrOopsDoClosure* cl);
    +  void oops_do(OopClosure* cl);
    +};
    +
    +typedef ShenandoahOopBuffer<64> ShenandoahQueueBuffer;
    +
    +// Muti-producer and single consumer queue set
    +class ShenandoahStrDedupQueue : public StringDedupQueue {
    +private:
    +  ShenandoahQueueBuffer** _producer_queues;
    +  ShenandoahQueueBuffer*  _consumer_queue;
    +  size_t                  _num_producer_queue;
    +
    +  // The queue is used for producers to publish completed buffers
    +  ShenandoahQueueBuffer* _published_queues;
    +
    +  // Cached free buffers
    +  ShenandoahQueueBuffer* _free_list;
    +  size_t                 _num_free_buffer;
    +  const size_t           _max_free_buffer;
    +
    +  bool                   _cancel;
    +
    +  // statistics
    +  size_t                 _total_buffers;
    +
    +private:
    +  ~ShenandoahStrDedupQueue();
    +
    +public:
    +  ShenandoahStrDedupQueue();
    +
    +  void wait_impl();
    +  void cancel_wait_impl();
    +
    +  void push_impl(uint worker_id, oop string_oop);
    +  oop  pop_impl();
    +
    +  void unlink_or_oops_do_impl(StringDedupUnlinkOrOopsDoClosure* cl, size_t queue);
    +
    +  void print_statistics_impl();
    +  void verify_impl();
    +
    +protected:
    +  size_t num_queues() const { return (_num_producer_queue + 2); }
    +
    +private:
    +  ShenandoahQueueBuffer* new_buffer();
    +
    +  void release_buffers(ShenandoahQueueBuffer* list);
    +
    +  ShenandoahQueueBuffer* queue_at(size_t queue_id) const;
    +
    +  bool pop_candidate(oop& obj);
    +
    +  void set_producer_buffer(ShenandoahQueueBuffer* buf, size_t queue_id);
    +
    +  void verify(ShenandoahQueueBuffer* head);
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUPQUEUE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahStrDedupQueue.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahStrDedupQueue.inline.hpp
    new file mode 100644
    index 00000000000..0cee6d4e7aa
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahStrDedupQueue.inline.hpp
    @@ -0,0 +1,98 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUPQUEUE_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUPQUEUE_INLINE_HPP
    +
    +#include "gc/shenandoah/shenandoahStrDedupQueue.hpp"
    +
    +template 
    +ShenandoahOopBuffer::ShenandoahOopBuffer() :
    +  _index(0), _next(NULL) {
    +}
    +
    +template 
    +bool ShenandoahOopBuffer::is_full() const {
    +  return _index >= buffer_size;
    +}
    +
    +template 
    +bool ShenandoahOopBuffer::is_empty() const {
    +  return _index == 0;
    +}
    +
    +template 
    +uint ShenandoahOopBuffer::size() const {
    +  return _index;
    +}
    +
    +template 
    +void ShenandoahOopBuffer::push(oop obj) {
    +  assert(!is_full(),  "Buffer is full");
    +  _buf[_index ++] = obj;
    +}
    +
    +template 
    +oop ShenandoahOopBuffer::pop() {
    +  assert(!is_empty(), "Buffer is empty");
    +  return _buf[--_index];
    +}
    +
    +template 
    +void ShenandoahOopBuffer::set_next(ShenandoahOopBuffer* next) {
    +  _next = next;
    +}
    +
    +template 
    +ShenandoahOopBuffer* ShenandoahOopBuffer::next() const {
    +  return _next;
    +}
    +
    +template 
    +void ShenandoahOopBuffer::reset() {
    +  _index = 0;
    +  _next = NULL;
    +}
    +
    +template 
    +void ShenandoahOopBuffer::unlink_or_oops_do(StringDedupUnlinkOrOopsDoClosure* cl) {
    +  for (uint index = 0; index < size(); index ++) {
    +    oop* obj_addr = &_buf[index];
    +    if (*obj_addr != NULL) {
    +      if (cl->is_alive(*obj_addr)) {
    +        cl->keep_alive(obj_addr);
    +      } else {
    +        *obj_addr = NULL;
    +      }
    +    }
    +  }
    +}
    +
    +template 
    +void ShenandoahOopBuffer::oops_do(OopClosure* cl) {
    +  for (uint index = 0; index < size(); index ++) {
    +    cl->do_oop(&_buf[index]);
    +  }
    +}
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUPQUEUE_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahStringDedup.cpp b/src/hotspot/share/gc/shenandoah/shenandoahStringDedup.cpp
    new file mode 100644
    index 00000000000..aafc7aa9d57
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahStringDedup.cpp
    @@ -0,0 +1,159 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shared/stringdedup/stringDedup.hpp"
    +#include "gc/shared/stringdedup/stringDedup.inline.hpp"
    +#include "gc/shared/workgroup.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
    +#include "gc/shenandoah/shenandoahStringDedup.hpp"
    +#include "gc/shenandoah/shenandoahStrDedupQueue.hpp"
    +#include "gc/shenandoah/shenandoahTimingTracker.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "runtime/thread.hpp"
    +
    +void ShenandoahStringDedup::initialize() {
    +  assert(UseShenandoahGC, "String deduplication available with Shenandoah GC");
    +  StringDedup::initialize_impl();
    +}
    +
    +/* Enqueue candidates for deduplication.
    + * The method should only be called by GC worker threads during marking phases.
    + */
    +void ShenandoahStringDedup::enqueue_candidate(oop java_string) {
    +  assert(Thread::current()->is_Worker_thread(),
    +        "Only from a GC worker thread");
    +
    +  if (java_string->age() <= StringDeduplicationAgeThreshold) {
    +    const markOop mark = java_string->mark();
    +
    +    // Having/had displaced header, too risk to deal with them, skip
    +    if (mark == markOopDesc::INFLATING() || mark->has_displaced_mark_helper()) {
    +      return;
    +    }
    +
    +    // Increase string age and enqueue it when it rearches age threshold
    +    markOop new_mark = mark->incr_age();
    +    if (mark == java_string->cas_set_mark(new_mark, mark)) {
    +      if (mark->age() == StringDeduplicationAgeThreshold) {
    +        StringDedupQueue::push(ShenandoahWorkerSession::worker_id(), java_string);
    +      }
    +    }
    +  }
    +}
    +
    +// Deduplicate a string, return true if it is deduplicated.
    +void ShenandoahStringDedup::deduplicate(oop java_string) {
    +  assert(is_enabled(), "String deduplication not enabled");
    +  StringDedupStat dummy; // Statistics from this path is never used
    +  StringDedupTable::deduplicate(java_string, &dummy);
    +}
    +
    +void ShenandoahStringDedup::parallel_oops_do(OopClosure* cl, uint worker_id) {
    +  assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
    +  assert(is_enabled(), "String deduplication not enabled");
    +
    +  ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
    +
    +  StringDedupUnlinkOrOopsDoClosure sd_cl(NULL, cl);
    +
    +  {
    +    ShenandoahWorkerTimingsTracker x(worker_times, ShenandoahPhaseTimings::StringDedupQueueRoots, worker_id);
    +    StringDedupQueue::unlink_or_oops_do(&sd_cl);
    +  }
    +  {
    +    ShenandoahWorkerTimingsTracker x(worker_times, ShenandoahPhaseTimings::StringDedupTableRoots, worker_id);
    +    StringDedupTable::unlink_or_oops_do(&sd_cl, worker_id);
    +  }
    +}
    +
    +void ShenandoahStringDedup::oops_do_slow(OopClosure* cl) {
    +  assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
    +  assert(is_enabled(), "String deduplication not enabled");
    +  ShenandoahAlwaysTrueClosure always_true;
    +  StringDedupUnlinkOrOopsDoClosure sd_cl(&always_true, cl);
    +  StringDedupQueue::unlink_or_oops_do(&sd_cl);
    +  StringDedupTable::unlink_or_oops_do(&sd_cl, 0);
    +}
    +
    +class ShenandoahIsMarkedNextClosure : public BoolObjectClosure {
    +private:
    +  ShenandoahMarkingContext* const _mark_context;
    +
    +public:
    +  ShenandoahIsMarkedNextClosure() : _mark_context(ShenandoahHeap::heap()->marking_context()) { }
    +
    +  bool do_object_b(oop obj) {
    +    return _mark_context->is_marked(obj);
    +  }
    +};
    +
    +void ShenandoahStringDedup::parallel_cleanup() {
    +  assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
    +  log_debug(gc, stringdedup)("String dedup cleanup");
    +  ShenandoahIsMarkedNextClosure cl;
    +
    +  unlink_or_oops_do(&cl, NULL, true);
    +}
    +
    +//
    +// Task for parallel unlink_or_oops_do() operation on the deduplication queue
    +// and table.
    +//
    +class ShenandoahStringDedupUnlinkOrOopsDoTask : public AbstractGangTask {
    +private:
    +  StringDedupUnlinkOrOopsDoClosure _cl;
    +
    +public:
    +  ShenandoahStringDedupUnlinkOrOopsDoTask(BoolObjectClosure* is_alive,
    +                                  OopClosure* keep_alive,
    +                                  bool allow_resize_and_rehash) :
    +    AbstractGangTask("StringDedupUnlinkOrOopsDoTask"),
    +    _cl(is_alive, keep_alive) {
    +      StringDedup::gc_prologue(allow_resize_and_rehash);
    +  }
    +
    +  ~ShenandoahStringDedupUnlinkOrOopsDoTask() {
    +    StringDedup::gc_epilogue();
    +  }
    +
    +  virtual void work(uint worker_id) {
    +    StringDedupQueue::unlink_or_oops_do(&_cl);
    +    StringDedupTable::unlink_or_oops_do(&_cl, worker_id);
    +  }
    +};
    +
    +void ShenandoahStringDedup::unlink_or_oops_do(BoolObjectClosure* is_alive,
    +                                      OopClosure* keep_alive,
    +                                      bool allow_resize_and_rehash) {
    +  assert(is_enabled(), "String deduplication not enabled");
    +
    +  ShenandoahStringDedupUnlinkOrOopsDoTask task(is_alive, keep_alive, allow_resize_and_rehash);
    +  ShenandoahHeap* heap = ShenandoahHeap::heap();
    +  heap->workers()->run_task(&task);
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahStringDedup.hpp b/src/hotspot/share/gc/shenandoah/shenandoahStringDedup.hpp
    new file mode 100644
    index 00000000000..b872be25ba1
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahStringDedup.hpp
    @@ -0,0 +1,59 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUP_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUP_HPP
    +
    +#include "classfile/javaClasses.inline.hpp"
    +#include "gc/shared/stringdedup/stringDedup.hpp"
    +#include "memory/iterator.hpp"
    +
    +class ShenandoahStringDedup : public StringDedup {
    +public:
    +  // Initialize string deduplication.
    +  static void initialize();
    +
    +  // Enqueue a string to worker's local string dedup queue
    +  static void enqueue_candidate(oop java_string);
    +
    +  // Deduplicate a string, the call is lock-free
    +  static void deduplicate(oop java_string);
    +
    +  static void parallel_oops_do(OopClosure* cl, uint worker_id);
    +  static void oops_do_slow(OopClosure* cl);
    +
    +  // Parallel cleanup string dedup queues/table
    +  static void parallel_cleanup();
    +
    +  static inline bool is_candidate(oop obj) {
    +    return java_lang_String::is_instance_inlined(obj) &&
    +           java_lang_String::value(obj) != NULL;
    +  }
    +private:
    +  static void unlink_or_oops_do(BoolObjectClosure* is_alive,
    +                                OopClosure* keep_alive,
    +                                bool allow_resize_and_rehash);
    +
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUP_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.cpp b/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.cpp
    new file mode 100644
    index 00000000000..773d1bd8e1c
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.cpp
    @@ -0,0 +1,117 @@
    +/*
    + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +#include "logging/log.hpp"
    +#include "logging/logStream.hpp"
    +
    +void ShenandoahObjToScanQueueSet::clear() {
    +  uint size = GenericTaskQueueSet::size();
    +  for (uint index = 0; index < size; index ++) {
    +    ShenandoahObjToScanQueue* q = queue(index);
    +    assert(q != NULL, "Sanity");
    +    q->clear();
    +  }
    +}
    +
    +bool ShenandoahObjToScanQueueSet::is_empty() {
    +  uint size = GenericTaskQueueSet::size();
    +  for (uint index = 0; index < size; index ++) {
    +    ShenandoahObjToScanQueue* q = queue(index);
    +    assert(q != NULL, "Sanity");
    +    if (!q->is_empty()) {
    +      return false;
    +    }
    +  }
    +  return true;
    +}
    +
    +class ShenandoahOWSTTerminator: public OWSTTaskTerminator {
    +public:
    +  ShenandoahOWSTTerminator(uint n_threads, TaskQueueSetSuper* queue_set) :
    +    OWSTTaskTerminator(n_threads, queue_set){ }
    +
    +protected:
    +  bool exit_termination(size_t tasks, TerminatorTerminator* terminator);
    +};
    +
    +bool ShenandoahOWSTTerminator::exit_termination(size_t tasks, TerminatorTerminator* terminator) {
    +  ShenandoahTerminatorTerminator* t = (ShenandoahTerminatorTerminator*)terminator;
    +  bool force = (t != NULL) && t->should_force_termination();
    +  if (force) {
    +    // Force termination : continue termination, even there are remaining tasks.
    +    return false;
    +  } else {
    +    return OWSTTaskTerminator::exit_termination(tasks, terminator);
    +  }
    +}
    +
    +ShenandoahTaskTerminator::ShenandoahTaskTerminator(uint n_threads, TaskQueueSetSuper* queue_set) :
    +  _terminator(new ShenandoahOWSTTerminator(n_threads, queue_set)) { }
    +
    +ShenandoahTaskTerminator::~ShenandoahTaskTerminator() {
    +  assert(_terminator != NULL, "Invariant");
    +  delete _terminator;
    +}
    +
    +#if TASKQUEUE_STATS
    +void ShenandoahObjToScanQueueSet::print_taskqueue_stats_hdr(outputStream* const st) {
    +  st->print_raw_cr("GC Task Stats");
    +  st->print_raw("thr "); TaskQueueStats::print_header(1, st); st->cr();
    +  st->print_raw("--- "); TaskQueueStats::print_header(2, st); st->cr();
    +}
    +
    +void ShenandoahObjToScanQueueSet::print_taskqueue_stats() const {
    +  if (!log_develop_is_enabled(Trace, gc, task, stats)) {
    +    return;
    +  }
    +  Log(gc, task, stats) log;
    +  ResourceMark rm;
    +  LogStream ls(log.trace());
    +  outputStream* st = &ls;
    +  print_taskqueue_stats_hdr(st);
    +
    +  ShenandoahObjToScanQueueSet* queues = const_cast(this);
    +  TaskQueueStats totals;
    +  const uint n = size();
    +  for (uint i = 0; i < n; ++i) {
    +    st->print(UINT32_FORMAT_W(3), i);
    +    queues->queue(i)->stats.print(st);
    +    st->cr();
    +    totals += queues->queue(i)->stats;
    +  }
    +  st->print("tot "); totals.print(st); st->cr();
    +  DEBUG_ONLY(totals.verify());
    +
    +}
    +
    +void ShenandoahObjToScanQueueSet::reset_taskqueue_stats() {
    +  const uint n = size();
    +  for (uint i = 0; i < n; ++i) {
    +    queue(i)->stats.reset();
    +  }
    +}
    +#endif // TASKQUEUE_STATS
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.hpp b/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.hpp
    new file mode 100644
    index 00000000000..790ecf72906
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.hpp
    @@ -0,0 +1,338 @@
    +/*
    + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHTASKQUEUE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHTASKQUEUE_HPP
    +#include "gc/shared/owstTaskTerminator.hpp"
    +#include "gc/shared/taskqueue.hpp"
    +#include "gc/shared/taskqueue.inline.hpp"
    +#include "memory/allocation.hpp"
    +#include "runtime/mutex.hpp"
    +#include "runtime/thread.hpp"
    +
    +template
    +class BufferedOverflowTaskQueue: public OverflowTaskQueue
    +{
    +public:
    +  typedef OverflowTaskQueue taskqueue_t;
    +
    +  BufferedOverflowTaskQueue() : _buf_empty(true) {};
    +
    +  TASKQUEUE_STATS_ONLY(using taskqueue_t::stats;)
    +
    +  // Push task t into the queue. Returns true on success.
    +  inline bool push(E t);
    +
    +  // Attempt to pop from the queue. Returns true on success.
    +  inline bool pop(E &t);
    +
    +  inline void clear()  {
    +    _buf_empty = true;
    +    taskqueue_t::set_empty();
    +    taskqueue_t::overflow_stack()->clear();
    +  }
    +
    +  inline bool is_empty()        const {
    +    return _buf_empty && taskqueue_t::is_empty();
    +  }
    +
    +private:
    +  bool _buf_empty;
    +  E _elem;
    +};
    +
    +// ObjArrayChunkedTask
    +//
    +// Encodes both regular oops, and the array oops plus chunking data for parallel array processing.
    +// The design goal is to make the regular oop ops very fast, because that would be the prevailing
    +// case. On the other hand, it should not block parallel array processing from efficiently dividing
    +// the array work.
    +//
    +// The idea is to steal the bits from the 64-bit oop to encode array data, if needed. For the
    +// proper divide-and-conquer strategies, we want to encode the "blocking" data. It turns out, the
    +// most efficient way to do this is to encode the array block as (chunk * 2^pow), where it is assumed
    +// that the block has the size of 2^pow. This requires for pow to have only 5 bits (2^32) to encode
    +// all possible arrays.
    +//
    +//    |---------oop---------|-pow-|--chunk---|
    +//    0                    49     54        64
    +//
    +// By definition, chunk == 0 means "no chunk", i.e. chunking starts from 1.
    +//
    +// This encoding gives a few interesting benefits:
    +//
    +// a) Encoding/decoding regular oops is very simple, because the upper bits are zero in that task:
    +//
    +//    |---------oop---------|00000|0000000000| // no chunk data
    +//
    +//    This helps the most ubiquitous path. The initialization amounts to putting the oop into the word
    +//    with zero padding. Testing for "chunkedness" is testing for zero with chunk mask.
    +//
    +// b) Splitting tasks for divide-and-conquer is possible. Suppose we have chunk  that covers
    +// interval [ (C-1)*2^P; C*2^P ). We can then split it into two chunks:
    +//      <2*C - 1, P-1>, that covers interval [ (2*C - 2)*2^(P-1); (2*C - 1)*2^(P-1) )
    +//      <2*C, P-1>,     that covers interval [ (2*C - 1)*2^(P-1);       2*C*2^(P-1) )
    +//
    +//    Observe that the union of these two intervals is:
    +//      [ (2*C - 2)*2^(P-1); 2*C*2^(P-1) )
    +//
    +//    ...which is the original interval:
    +//      [ (C-1)*2^P; C*2^P )
    +//
    +// c) The divide-and-conquer strategy could even start with chunk <1, round-log2-len(arr)>, and split
    +//    down in the parallel threads, which alleviates the upfront (serial) splitting costs.
    +//
    +// Encoding limitations caused by current bitscales mean:
    +//    10 bits for chunk: max 1024 blocks per array
    +//     5 bits for power: max 2^32 array
    +//    49 bits for   oop: max 512 TB of addressable space
    +//
    +// Stealing bits from oop trims down the addressable space. Stealing too few bits for chunk ID limits
    +// potential parallelism. Stealing too few bits for pow limits the maximum array size that can be handled.
    +// In future, these might be rebalanced to favor one degree of freedom against another. For example,
    +// if/when Arrays 2.0 bring 2^64-sized arrays, we might need to steal another bit for power. We could regain
    +// some bits back if chunks are counted in ObjArrayMarkingStride units.
    +//
    +// There is also a fallback version that uses plain fields, when we don't have enough space to steal the
    +// bits from the native pointer. It is useful to debug the _LP64 version.
    +//
    +
    +#ifdef _MSC_VER
    +#pragma warning(push)
    +// warning C4522: multiple assignment operators specified
    +#pragma warning( disable:4522 )
    +#endif
    +
    +#ifdef _LP64
    +class ObjArrayChunkedTask
    +{
    +public:
    +  enum {
    +    chunk_bits   = 10,
    +    pow_bits     = 5,
    +    oop_bits     = sizeof(uintptr_t)*8 - chunk_bits - pow_bits,
    +  };
    +  enum {
    +    oop_shift    = 0,
    +    pow_shift    = oop_shift + oop_bits,
    +    chunk_shift  = pow_shift + pow_bits,
    +  };
    +
    +public:
    +  ObjArrayChunkedTask(oop o = NULL) {
    +    _obj = ((uintptr_t)(void*) o) << oop_shift;
    +  }
    +  ObjArrayChunkedTask(oop o, int chunk, int mult) {
    +    assert(0 <= chunk && chunk < nth_bit(chunk_bits), "chunk is sane: %d", chunk);
    +    assert(0 <= mult && mult < nth_bit(pow_bits), "pow is sane: %d", mult);
    +    uintptr_t t_b = ((uintptr_t) chunk) << chunk_shift;
    +    uintptr_t t_m = ((uintptr_t) mult) << pow_shift;
    +    uintptr_t obj = (uintptr_t)(void*)o;
    +    assert(obj < nth_bit(oop_bits), "obj ref is sane: " PTR_FORMAT, obj);
    +    intptr_t t_o = obj << oop_shift;
    +    _obj = t_o | t_m | t_b;
    +  }
    +  ObjArrayChunkedTask(const ObjArrayChunkedTask& t): _obj(t._obj) { }
    +
    +  ObjArrayChunkedTask& operator =(const ObjArrayChunkedTask& t) {
    +    _obj = t._obj;
    +    return *this;
    +  }
    +  volatile ObjArrayChunkedTask&
    +  operator =(const volatile ObjArrayChunkedTask& t) volatile {
    +    (void)const_cast(_obj = t._obj);
    +    return *this;
    +  }
    +
    +  inline oop obj()   const { return (oop) reinterpret_cast((_obj >> oop_shift) & right_n_bits(oop_bits)); }
    +  inline int chunk() const { return (int) (_obj >> chunk_shift) & right_n_bits(chunk_bits); }
    +  inline int pow()   const { return (int) ((_obj >> pow_shift) & right_n_bits(pow_bits)); }
    +  inline bool is_not_chunked() const { return (_obj & ~right_n_bits(oop_bits + pow_bits)) == 0; }
    +
    +  DEBUG_ONLY(bool is_valid() const); // Tasks to be pushed/popped must be valid.
    +
    +  static size_t max_addressable() {
    +    return nth_bit(oop_bits);
    +  }
    +
    +  static int chunk_size() {
    +    return nth_bit(chunk_bits);
    +  }
    +
    +private:
    +  uintptr_t _obj;
    +};
    +#else
    +class ObjArrayChunkedTask
    +{
    +public:
    +  enum {
    +    chunk_bits  = 10,
    +    pow_bits    = 5,
    +  };
    +public:
    +  ObjArrayChunkedTask(oop o = NULL, int chunk = 0, int pow = 0): _obj(o) {
    +    assert(0 <= chunk && chunk < nth_bit(chunk_bits), "chunk is sane: %d", chunk);
    +    assert(0 <= pow && pow < nth_bit(pow_bits), "pow is sane: %d", pow);
    +    _chunk = chunk;
    +    _pow = pow;
    +  }
    +  ObjArrayChunkedTask(const ObjArrayChunkedTask& t): _obj(t._obj), _chunk(t._chunk), _pow(t._pow) { }
    +
    +  ObjArrayChunkedTask& operator =(const ObjArrayChunkedTask& t) {
    +    _obj = t._obj;
    +    _chunk = t._chunk;
    +    _pow = t._pow;
    +    return *this;
    +  }
    +  volatile ObjArrayChunkedTask&
    +  operator =(const volatile ObjArrayChunkedTask& t) volatile {
    +    (void)const_cast(_obj = t._obj);
    +    _chunk = t._chunk;
    +    _pow = t._pow;
    +    return *this;
    +  }
    +
    +  inline oop obj()   const { return _obj; }
    +  inline int chunk() const { return _chunk; }
    +  inline int pow()  const { return _pow; }
    +
    +  inline bool is_not_chunked() const { return _chunk == 0; }
    +
    +  DEBUG_ONLY(bool is_valid() const); // Tasks to be pushed/popped must be valid.
    +
    +  static size_t max_addressable() {
    +    return sizeof(oop);
    +  }
    +
    +  static int chunk_size() {
    +    return nth_bit(chunk_bits);
    +  }
    +
    +private:
    +  oop _obj;
    +  int _chunk;
    +  int _pow;
    +};
    +#endif
    +
    +#ifdef _MSC_VER
    +#pragma warning(pop)
    +#endif
    +
    +typedef ObjArrayChunkedTask ShenandoahMarkTask;
    +typedef BufferedOverflowTaskQueue ShenandoahBufferedOverflowTaskQueue;
    +typedef Padded ShenandoahObjToScanQueue;
    +
    +template 
    +class ParallelClaimableQueueSet: public GenericTaskQueueSet {
    +private:
    +  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile jint));
    +  volatile jint     _claimed_index;
    +  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
    +
    +  debug_only(uint   _reserved;  )
    +
    +public:
    +  using GenericTaskQueueSet::size;
    +
    +public:
    +  ParallelClaimableQueueSet(int n) : GenericTaskQueueSet(n), _claimed_index(0) {
    +    debug_only(_reserved = 0; )
    +  }
    +
    +  void clear_claimed() { _claimed_index = 0; }
    +  T*   claim_next();
    +
    +  // reserve queues that not for parallel claiming
    +  void reserve(uint n) {
    +    assert(n <= size(), "Sanity");
    +    _claimed_index = (jint)n;
    +    debug_only(_reserved = n;)
    +  }
    +
    +  debug_only(uint get_reserved() const { return (uint)_reserved; })
    +};
    +
    +template 
    +T* ParallelClaimableQueueSet::claim_next() {
    +  jint size = (jint)GenericTaskQueueSet::size();
    +
    +  if (_claimed_index >= size) {
    +    return NULL;
    +  }
    +
    +  jint index = Atomic::add(1, &_claimed_index);
    +
    +  if (index <= size) {
    +    return GenericTaskQueueSet::queue((uint)index - 1);
    +  } else {
    +    return NULL;
    +  }
    +}
    +
    +class ShenandoahObjToScanQueueSet: public ParallelClaimableQueueSet {
    +public:
    +  ShenandoahObjToScanQueueSet(int n) : ParallelClaimableQueueSet(n) {}
    +
    +  bool is_empty();
    +  void clear();
    +
    +#if TASKQUEUE_STATS
    +  static void print_taskqueue_stats_hdr(outputStream* const st);
    +  void print_taskqueue_stats() const;
    +  void reset_taskqueue_stats();
    +#endif // TASKQUEUE_STATS
    +};
    +
    +class ShenandoahTerminatorTerminator : public TerminatorTerminator {
    +public:
    +  // return true, terminates immediately, even if there's remaining work left
    +  virtual bool should_force_termination() { return false; }
    +};
    +
    +class ShenandoahCancelledTerminatorTerminator : public ShenandoahTerminatorTerminator {
    +  virtual bool should_exit_termination() {
    +    return false;
    +  }
    +  virtual bool should_force_termination() {
    +    return true;
    +  }
    +};
    +
    +class ShenandoahTaskTerminator : public StackObj {
    +private:
    +  OWSTTaskTerminator* const   _terminator;
    +public:
    +  ShenandoahTaskTerminator(uint n_threads, TaskQueueSetSuper* queue_set);
    +  ~ShenandoahTaskTerminator();
    +
    +  bool offer_termination(ShenandoahTerminatorTerminator* terminator) {
    +    return _terminator->offer_termination(terminator);
    +  }
    +
    +  void reset_for_reuse() { _terminator->reset_for_reuse(); }
    +  bool offer_termination() { return offer_termination((ShenandoahTerminatorTerminator*)NULL); }
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHTASKQUEUE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.inline.hpp
    new file mode 100644
    index 00000000000..139e214c192
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahTaskqueue.inline.hpp
    @@ -0,0 +1,59 @@
    +/*
    + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHTASKQUEUE_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHTASKQUEUE_INLINE_HPP
    +
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +
    +template 
    +bool BufferedOverflowTaskQueue::pop(E &t)
    +{
    +  if (!_buf_empty) {
    +    t = _elem;
    +    _buf_empty = true;
    +    return true;
    +  }
    +
    +  if (taskqueue_t::pop_local(t)) {
    +    return true;
    +  }
    +
    +  return taskqueue_t::pop_overflow(t);
    +}
    +
    +template 
    +inline bool BufferedOverflowTaskQueue::push(E t)
    +{
    +  if (_buf_empty) {
    +    _elem = t;
    +    _buf_empty = false;
    +  } else {
    +    bool pushed = taskqueue_t::push(_elem);
    +    assert(pushed, "overflow queue should always succeed pushing");
    +    _elem = t;
    +  }
    +  return true;
    +}
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHTASKQUEUE_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahThreadLocalData.hpp b/src/hotspot/share/gc/shenandoah/shenandoahThreadLocalData.hpp
    new file mode 100644
    index 00000000000..f4edab15029
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahThreadLocalData.hpp
    @@ -0,0 +1,174 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_GC_SHENANDOAH_SHENANDOAHTHREADLOCALDATA_HPP
    +#define SHARE_GC_SHENANDOAH_SHENANDOAHTHREADLOCALDATA_HPP
    +
    +#include "gc/shared/plab.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSet.hpp"
    +#include "gc/shenandoah/shenandoahSATBMarkQueueSet.hpp"
    +#include "runtime/thread.hpp"
    +#include "utilities/debug.hpp"
    +#include "utilities/sizes.hpp"
    +
    +class ShenandoahThreadLocalData {
    +public:
    +  static const uint INVALID_WORKER_ID = uint(-1);
    +
    +private:
    +  char _gc_state;
    +  char _oom_during_evac;
    +  ShenandoahSATBMarkQueue _satb_mark_queue;
    +  PLAB* _gclab;
    +  size_t _gclab_size;
    +  uint  _worker_id;
    +  bool _force_satb_flush;
    +
    +  ShenandoahThreadLocalData() :
    +    _gc_state(0),
    +    _oom_during_evac(0),
    +    _satb_mark_queue(&ShenandoahBarrierSet::satb_mark_queue_set()),
    +    _gclab(NULL),
    +    _gclab_size(0),
    +    _worker_id(INVALID_WORKER_ID),
    +    _force_satb_flush(false) {
    +  }
    +
    +  ~ShenandoahThreadLocalData() {
    +    if (_gclab != NULL) {
    +      delete _gclab;
    +    }
    +  }
    +
    +  static ShenandoahThreadLocalData* data(Thread* thread) {
    +    assert(UseShenandoahGC, "Sanity");
    +    return thread->gc_data();
    +  }
    +
    +  static ByteSize satb_mark_queue_offset() {
    +    return Thread::gc_data_offset() + byte_offset_of(ShenandoahThreadLocalData, _satb_mark_queue);
    +  }
    +
    +public:
    +  static void create(Thread* thread) {
    +    new (data(thread)) ShenandoahThreadLocalData();
    +  }
    +
    +  static void destroy(Thread* thread) {
    +    data(thread)->~ShenandoahThreadLocalData();
    +  }
    +
    +  static SATBMarkQueue& satb_mark_queue(Thread* thread) {
    +    return data(thread)->_satb_mark_queue;
    +  }
    +
    +  static bool is_oom_during_evac(Thread* thread) {
    +    return (data(thread)->_oom_during_evac & 1) == 1;
    +  }
    +
    +  static void set_oom_during_evac(Thread* thread, bool oom) {
    +    if (oom) {
    +      data(thread)->_oom_during_evac |= 1;
    +    } else {
    +      data(thread)->_oom_during_evac &= ~1;
    +    }
    +  }
    +
    +  static void set_gc_state(Thread* thread, char gc_state) {
    +    data(thread)->_gc_state = gc_state;
    +  }
    +
    +  static char gc_state(Thread* thread) {
    +    return data(thread)->_gc_state;
    +  }
    +
    +  static void set_worker_id(Thread* thread, uint id) {
    +    assert(thread->is_Worker_thread(), "Must be a worker thread");
    +    data(thread)->_worker_id = id;
    +  }
    +
    +  static uint worker_id(Thread* thread) {
    +    assert(thread->is_Worker_thread(), "Must be a worker thread");
    +    return data(thread)->_worker_id;
    +  }
    +
    +  static void set_force_satb_flush(Thread* thread, bool v) {
    +    data(thread)->_force_satb_flush = v;
    +  }
    +
    +  static bool is_force_satb_flush(Thread* thread) {
    +    return data(thread)->_force_satb_flush;
    +  }
    +
    +  static void initialize_gclab(Thread* thread) {
    +    assert (thread->is_Java_thread() || thread->is_Worker_thread(), "Only Java and GC worker threads are allowed to get GCLABs");
    +    data(thread)->_gclab = new PLAB(PLAB::min_size());
    +    data(thread)->_gclab_size = 0;
    +  }
    +
    +  static PLAB* gclab(Thread* thread) {
    +    return data(thread)->_gclab;
    +  }
    +
    +  static size_t gclab_size(Thread* thread) {
    +    return data(thread)->_gclab_size;
    +  }
    +
    +  static void set_gclab_size(Thread* thread, size_t v) {
    +    data(thread)->_gclab_size = v;
    +  }
    +
    +#ifdef ASSERT
    +  static void set_evac_allowed(Thread* thread, bool evac_allowed) {
    +    if (evac_allowed) {
    +      data(thread)->_oom_during_evac |= 2;
    +    } else {
    +      data(thread)->_oom_during_evac &= ~2;
    +    }
    +  }
    +
    +  static bool is_evac_allowed(Thread* thread) {
    +    return (data(thread)->_oom_during_evac & 2) == 2;
    +  }
    +#endif
    +
    +  // Offsets
    +  static ByteSize satb_mark_queue_active_offset() {
    +    return satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_active();
    +  }
    +
    +  static ByteSize satb_mark_queue_index_offset() {
    +    return satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_index();
    +  }
    +
    +  static ByteSize satb_mark_queue_buffer_offset() {
    +    return satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_buf();
    +  }
    +
    +  static ByteSize gc_state_offset() {
    +    return Thread::gc_data_offset() + byte_offset_of(ShenandoahThreadLocalData, _gc_state);
    +  }
    +
    +};
    +
    +#endif // SHARE_GC_SHENANDOAH_SHENANDOAHTHREADLOCALDATA_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTimingTracker.cpp b/src/hotspot/share/gc/shenandoah/shenandoahTimingTracker.cpp
    new file mode 100644
    index 00000000000..4095578b399
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahTimingTracker.cpp
    @@ -0,0 +1,92 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shenandoah/shenandoahTimingTracker.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "runtime/os.hpp"
    +
    +
    +ShenandoahPhaseTimings::Phase ShenandoahTerminationTracker::_current_termination_phase = ShenandoahPhaseTimings::_num_phases;
    +
    +ShenandoahWorkerTimingsTracker::ShenandoahWorkerTimingsTracker(ShenandoahWorkerTimings* worker_times,
    +                                                              ShenandoahPhaseTimings::GCParPhases phase, uint worker_id) :
    +  _phase(phase), _worker_times(worker_times), _worker_id(worker_id) {
    +  if (_worker_times != NULL) {
    +    _start_time = os::elapsedTime();
    +  }
    +}
    +
    +ShenandoahWorkerTimingsTracker::~ShenandoahWorkerTimingsTracker() {
    +  if (_worker_times != NULL) {
    +    _worker_times->record_time_secs(_phase, _worker_id, os::elapsedTime() - _start_time);
    +  }
    +
    +  if (ShenandoahGCPhase::is_root_work_phase()) {
    +    ShenandoahPhaseTimings::Phase root_phase = ShenandoahGCPhase::current_phase();
    +    ShenandoahPhaseTimings::Phase cur_phase = (ShenandoahPhaseTimings::Phase)((int)root_phase + (int)_phase + 1);
    +    _event.commit(GCId::current(), _worker_id, ShenandoahPhaseTimings::phase_name(cur_phase));
    +  }
    +}
    +
    +ShenandoahTerminationTimingsTracker::ShenandoahTerminationTimingsTracker(uint worker_id) :
    +  _worker_id(worker_id)  {
    +  if (ShenandoahTerminationTrace) {
    +    _start_time = os::elapsedTime();
    +  }
    +}
    +
    +ShenandoahTerminationTimingsTracker::~ShenandoahTerminationTimingsTracker() {
    +  if (ShenandoahTerminationTrace) {
    +    ShenandoahHeap::heap()->phase_timings()->termination_times()->record_time_secs(_worker_id, os::elapsedTime() - _start_time);
    +  }
    +}
    +
    +ShenandoahTerminationTracker::ShenandoahTerminationTracker(ShenandoahPhaseTimings::Phase phase) : _phase(phase) {
    +  assert(_current_termination_phase == ShenandoahPhaseTimings::_num_phases, "Should be invalid");
    +  assert(phase == ShenandoahPhaseTimings::termination ||
    +         phase == ShenandoahPhaseTimings::final_traversal_gc_termination ||
    +         phase == ShenandoahPhaseTimings::full_gc_mark_termination ||
    +         phase == ShenandoahPhaseTimings::conc_termination ||
    +         phase == ShenandoahPhaseTimings::conc_traversal_termination ||
    +         phase == ShenandoahPhaseTimings::weakrefs_termination ||
    +         phase == ShenandoahPhaseTimings::full_gc_weakrefs_termination,
    +         "Only these phases");
    +
    +  assert(Thread::current()->is_VM_thread() || Thread::current()->is_ConcurrentGC_thread(),
    +    "Called from wrong thread");
    +  _current_termination_phase = phase;
    +  ShenandoahHeap::heap()->phase_timings()->termination_times()->reset();
    +}
    +
    +ShenandoahTerminationTracker::~ShenandoahTerminationTracker() {
    +  assert(_phase == _current_termination_phase, "Can not change phase");
    +  ShenandoahPhaseTimings* phase_times = ShenandoahHeap::heap()->phase_timings();
    +
    +  double t = phase_times->termination_times()->average();
    +  phase_times->record_phase_time(_phase, t);
    +  debug_only(_current_termination_phase = ShenandoahPhaseTimings::_num_phases;)
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTimingTracker.hpp b/src/hotspot/share/gc/shenandoah/shenandoahTimingTracker.hpp
    new file mode 100644
    index 00000000000..fc6147f2d24
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahTimingTracker.hpp
    @@ -0,0 +1,69 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHTIMINGTRACKER_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHTIMINGTRACKER_HPP
    +
    +#include "jfr/jfrEvents.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "memory/allocation.hpp"
    +
    +class ShenandoahWorkerTimingsTracker : public StackObj {
    +private:
    +  double _start_time;
    +  ShenandoahPhaseTimings::GCParPhases _phase;
    +  ShenandoahWorkerTimings* _worker_times;
    +  uint _worker_id;
    +
    +  EventGCPhaseParallel _event;
    +public:
    +    ShenandoahWorkerTimingsTracker(ShenandoahWorkerTimings* worker_times, ShenandoahPhaseTimings::GCParPhases phase, uint worker_id);
    +    ~ShenandoahWorkerTimingsTracker();
    +};
    +
    +
    +class ShenandoahTerminationTimingsTracker : public StackObj {
    +private:
    +  double _start_time;
    +  uint   _worker_id;
    +
    +public:
    +  ShenandoahTerminationTimingsTracker(uint worker_id);
    +  ~ShenandoahTerminationTimingsTracker();
    +};
    +
    +// Tracking termination time in specific GC phase
    +class ShenandoahTerminationTracker : public StackObj {
    +private:
    +  ShenandoahPhaseTimings::Phase _phase;
    +
    +  static ShenandoahPhaseTimings::Phase _current_termination_phase;
    +public:
    +  ShenandoahTerminationTracker(ShenandoahPhaseTimings::Phase phase);
    +  ~ShenandoahTerminationTracker();
    +
    +  static ShenandoahPhaseTimings::Phase current_termination_phase() { return _current_termination_phase; }
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHTIMINGTRACKER_HPP
    +
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTracer.hpp b/src/hotspot/share/gc/shenandoah/shenandoahTracer.hpp
    new file mode 100644
    index 00000000000..e995825a025
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahTracer.hpp
    @@ -0,0 +1,34 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHTRACER_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHTRACER_HPP
    +
    +#include "gc/shared/gcTrace.hpp"
    +
    +class ShenandoahTracer : public GCTracer {
    +public:
    +  ShenandoahTracer() : GCTracer(Shenandoah) {}
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHTRACER_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp
    new file mode 100644
    index 00000000000..480ff0a5ecc
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp
    @@ -0,0 +1,1129 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "classfile/classLoaderData.hpp"
    +#include "classfile/classLoaderDataGraph.hpp"
    +#include "gc/shared/referenceProcessor.hpp"
    +#include "gc/shared/referenceProcessorPhaseTimes.hpp"
    +#include "gc/shared/workgroup.hpp"
    +#include "gc/shared/weakProcessor.hpp"
    +#include "gc/shared/weakProcessor.inline.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSet.hpp"
    +#include "gc/shenandoah/shenandoahCodeRoots.hpp"
    +#include "gc/shenandoah/shenandoahCollectionSet.hpp"
    +#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
    +#include "gc/shenandoah/shenandoahFreeSet.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
    +#include "gc/shenandoah/shenandoahOopClosures.inline.hpp"
    +#include "gc/shenandoah/shenandoahRootProcessor.hpp"
    +#include "gc/shenandoah/shenandoahStringDedup.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.inline.hpp"
    +#include "gc/shenandoah/shenandoahTimingTracker.hpp"
    +#include "gc/shenandoah/shenandoahTraversalGC.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "gc/shenandoah/shenandoahVerifier.hpp"
    +
    +#include "memory/iterator.hpp"
    +#include "memory/metaspace.hpp"
    +#include "memory/resourceArea.hpp"
    +
    +/**
    + * NOTE: We are using the SATB buffer in thread.hpp and satbMarkQueue.hpp, however, it is not an SATB algorithm.
    + * We're using the buffer as generic oop buffer to enqueue new values in concurrent oop stores, IOW, the algorithm
    + * is incremental-update-based.
    + *
    + * NOTE on interaction with TAMS: we want to avoid traversing new objects for
    + * several reasons:
    + * - We will not reclaim them in this cycle anyway, because they are not in the
    + *   cset
    + * - It makes up for the bulk of work during final-pause
    + * - It also shortens the concurrent cycle because we don't need to
    + *   pointlessly traverse through newly allocated objects.
    + * - As a nice side-effect, it solves the I-U termination problem (mutators
    + *   cannot outrun the GC by allocating like crazy)
    + * - It is an easy way to achieve MWF. What MWF does is to also enqueue the
    + *   target object of stores if it's new. Treating new objects live implicitely
    + *   achieves the same, but without extra barriers. I think the effect of
    + *   shortened final-pause (mentioned above) is the main advantage of MWF. In
    + *   particular, we will not see the head of a completely new long linked list
    + *   in final-pause and end up traversing huge chunks of the heap there.
    + * - We don't need to see/update the fields of new objects either, because they
    + *   are either still null, or anything that's been stored into them has been
    + *   evacuated+enqueued before (and will thus be treated later).
    + *
    + * We achieve this by setting TAMS for each region, and everything allocated
    + * beyond TAMS will be 'implicitely marked'.
    + *
    + * Gotchas:
    + * - While we want new objects to be implicitely marked, we don't want to count
    + *   them alive. Otherwise the next cycle wouldn't pick them up and consider
    + *   them for cset. This means that we need to protect such regions from
    + *   getting accidentally thrashed at the end of traversal cycle. This is why I
    + *   keep track of alloc-regions and check is_alloc_region() in the trashing
    + *   code.
    + * - We *need* to traverse through evacuated objects. Those objects are
    + *   pre-existing, and any references in them point to interesting objects that
    + *   we need to see. We also want to count them as live, because we just
    + *   determined that they are alive :-) I achieve this by upping TAMS
    + *   concurrently for every gclab/gc-shared alloc before publishing the
    + *   evacuated object. This way, the GC threads will not consider such objects
    + *   implictely marked, and traverse through them as normal.
    + */
    +class ShenandoahTraversalSATBBufferClosure : public SATBBufferClosure {
    +private:
    +  ShenandoahObjToScanQueue* _queue;
    +  ShenandoahTraversalGC* _traversal_gc;
    +  ShenandoahHeap* const _heap;
    +
    +public:
    +  ShenandoahTraversalSATBBufferClosure(ShenandoahObjToScanQueue* q) :
    +    _queue(q),
    +    _heap(ShenandoahHeap::heap())
    + { }
    +
    +  void do_buffer(void** buffer, size_t size) {
    +    for (size_t i = 0; i < size; ++i) {
    +      oop* p = (oop*) &buffer[i];
    +      oop obj = RawAccess<>::oop_load(p);
    +      shenandoah_assert_not_forwarded(p, obj);
    +      if (_heap->marking_context()->mark(obj)) {
    +        _queue->push(ShenandoahMarkTask(obj));
    +      }
    +    }
    +  }
    +};
    +
    +class ShenandoahTraversalSATBThreadsClosure : public ThreadClosure {
    +private:
    +  ShenandoahTraversalSATBBufferClosure* _satb_cl;
    +
    +public:
    +  ShenandoahTraversalSATBThreadsClosure(ShenandoahTraversalSATBBufferClosure* satb_cl) :
    +    _satb_cl(satb_cl) {}
    +
    +  void do_thread(Thread* thread) {
    +    if (thread->is_Java_thread()) {
    +      JavaThread* jt = (JavaThread*)thread;
    +      ShenandoahThreadLocalData::satb_mark_queue(jt).apply_closure_and_empty(_satb_cl);
    +    } else if (thread->is_VM_thread()) {
    +      ShenandoahBarrierSet::satb_mark_queue_set().shared_satb_queue()->apply_closure_and_empty(_satb_cl);
    +    }
    +  }
    +};
    +
    +// Like CLDToOopClosure, but clears has_modified_oops, so that we can record modified CLDs during traversal
    +// and remark them later during final-traversal.
    +class ShenandoahMarkCLDClosure : public CLDClosure {
    +private:
    +  OopClosure* _cl;
    +public:
    +  ShenandoahMarkCLDClosure(OopClosure* cl) : _cl(cl) {}
    +  void do_cld(ClassLoaderData* cld) {
    +    cld->oops_do(_cl, true, true);
    +  }
    +};
    +
    +// Like CLDToOopClosure, but only process modified CLDs
    +class ShenandoahRemarkCLDClosure : public CLDClosure {
    +private:
    +  OopClosure* _cl;
    +public:
    +  ShenandoahRemarkCLDClosure(OopClosure* cl) : _cl(cl) {}
    +  void do_cld(ClassLoaderData* cld) {
    +    if (cld->has_modified_oops()) {
    +      cld->oops_do(_cl, true, true);
    +    }
    +  }
    +};
    +
    +class ShenandoahInitTraversalCollectionTask : public AbstractGangTask {
    +private:
    +  ShenandoahRootProcessor* _rp;
    +  ShenandoahHeap* _heap;
    +  ShenandoahCsetCodeRootsIterator* _cset_coderoots;
    +public:
    +  ShenandoahInitTraversalCollectionTask(ShenandoahRootProcessor* rp, ShenandoahCsetCodeRootsIterator* cset_coderoots) :
    +    AbstractGangTask("Shenandoah Init Traversal Collection"),
    +    _rp(rp),
    +    _heap(ShenandoahHeap::heap()),
    +    _cset_coderoots(cset_coderoots) {}
    +
    +  void work(uint worker_id) {
    +    ShenandoahParallelWorkerSession worker_session(worker_id);
    +
    +    ShenandoahEvacOOMScope oom_evac_scope;
    +    ShenandoahObjToScanQueueSet* queues = _heap->traversal_gc()->task_queues();
    +    ShenandoahObjToScanQueue* q = queues->queue(worker_id);
    +
    +    bool process_refs = _heap->process_references();
    +    bool unload_classes = _heap->unload_classes();
    +    ReferenceProcessor* rp = NULL;
    +    if (process_refs) {
    +      rp = _heap->ref_processor();
    +    }
    +
    +    // Step 1: Process ordinary GC roots.
    +    {
    +      ShenandoahTraversalClosure roots_cl(q, rp);
    +      ShenandoahMarkCLDClosure cld_cl(&roots_cl);
    +      MarkingCodeBlobClosure code_cl(&roots_cl, CodeBlobToOopClosure::FixRelocations);
    +      if (unload_classes) {
    +        _rp->process_strong_roots(&roots_cl, process_refs ? NULL : &roots_cl, &cld_cl, NULL, NULL, NULL, worker_id);
    +        // Need to pre-evac code roots here. Otherwise we might see from-space constants.
    +        ShenandoahWorkerTimings* worker_times = _heap->phase_timings()->worker_times();
    +        ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CodeCacheRoots, worker_id);
    +        _cset_coderoots->possibly_parallel_blobs_do(&code_cl);
    +      } else {
    +        _rp->process_all_roots(&roots_cl, process_refs ? NULL : &roots_cl, &cld_cl, &code_cl, NULL, worker_id);
    +      }
    +    }
    +  }
    +};
    +
    +class ShenandoahConcurrentTraversalCollectionTask : public AbstractGangTask {
    +private:
    +  ShenandoahTaskTerminator* _terminator;
    +  ShenandoahHeap* _heap;
    +public:
    +  ShenandoahConcurrentTraversalCollectionTask(ShenandoahTaskTerminator* terminator) :
    +    AbstractGangTask("Shenandoah Concurrent Traversal Collection"),
    +    _terminator(terminator),
    +    _heap(ShenandoahHeap::heap()) {}
    +
    +  void work(uint worker_id) {
    +    ShenandoahConcurrentWorkerSession worker_session(worker_id);
    +    ShenandoahSuspendibleThreadSetJoiner stsj(ShenandoahSuspendibleWorkers);
    +    ShenandoahEvacOOMScope oom_evac_scope;
    +    ShenandoahTraversalGC* traversal_gc = _heap->traversal_gc();
    +
    +    // Drain all outstanding work in queues.
    +    traversal_gc->main_loop(worker_id, _terminator, true);
    +  }
    +};
    +
    +class ShenandoahFinalTraversalCollectionTask : public AbstractGangTask {
    +private:
    +  ShenandoahRootProcessor* _rp;
    +  ShenandoahTaskTerminator* _terminator;
    +  ShenandoahHeap* _heap;
    +public:
    +  ShenandoahFinalTraversalCollectionTask(ShenandoahRootProcessor* rp, ShenandoahTaskTerminator* terminator) :
    +    AbstractGangTask("Shenandoah Final Traversal Collection"),
    +    _rp(rp),
    +    _terminator(terminator),
    +    _heap(ShenandoahHeap::heap()) {}
    +
    +  void work(uint worker_id) {
    +    ShenandoahParallelWorkerSession worker_session(worker_id);
    +
    +    ShenandoahEvacOOMScope oom_evac_scope;
    +    ShenandoahTraversalGC* traversal_gc = _heap->traversal_gc();
    +
    +    ShenandoahObjToScanQueueSet* queues = traversal_gc->task_queues();
    +    ShenandoahObjToScanQueue* q = queues->queue(worker_id);
    +
    +    bool process_refs = _heap->process_references();
    +    bool unload_classes = _heap->unload_classes();
    +    ReferenceProcessor* rp = NULL;
    +    if (process_refs) {
    +      rp = _heap->ref_processor();
    +    }
    +
    +    // Step 0: Drain outstanding SATB queues.
    +    // NOTE: we piggy-back draining of remaining thread SATB buffers on the final root scan below.
    +    ShenandoahTraversalSATBBufferClosure satb_cl(q);
    +    {
    +      // Process remaining finished SATB buffers.
    +      SATBMarkQueueSet& satb_mq_set = ShenandoahBarrierSet::satb_mark_queue_set();
    +      while (satb_mq_set.apply_closure_to_completed_buffer(&satb_cl));
    +      // Process remaining threads SATB buffers below.
    +    }
    +
    +    // Step 1: Process GC roots.
    +    // For oops in code roots, they are marked, evacuated, enqueued for further traversal,
    +    // and the references to the oops are updated during init pause. New nmethods are handled
    +    // in similar way during nmethod-register process. Therefore, we don't need to rescan code
    +    // roots here.
    +    if (!_heap->is_degenerated_gc_in_progress()) {
    +      ShenandoahTraversalClosure roots_cl(q, rp);
    +      CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong);
    +      ShenandoahTraversalSATBThreadsClosure tc(&satb_cl);
    +      if (unload_classes) {
    +        ShenandoahRemarkCLDClosure weak_cld_cl(&roots_cl);
    +        _rp->process_strong_roots(&roots_cl, process_refs ? NULL : &roots_cl, &cld_cl, &weak_cld_cl, NULL, &tc, worker_id);
    +      } else {
    +        _rp->process_all_roots(&roots_cl, process_refs ? NULL : &roots_cl, &cld_cl, NULL, &tc, worker_id);
    +      }
    +    } else {
    +      ShenandoahTraversalDegenClosure roots_cl(q, rp);
    +      CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong);
    +      ShenandoahTraversalSATBThreadsClosure tc(&satb_cl);
    +      if (unload_classes) {
    +        ShenandoahRemarkCLDClosure weak_cld_cl(&roots_cl);
    +        _rp->process_strong_roots(&roots_cl, process_refs ? NULL : &roots_cl, &cld_cl, &weak_cld_cl, NULL, &tc, worker_id);
    +      } else {
    +        _rp->process_all_roots(&roots_cl, process_refs ? NULL : &roots_cl, &cld_cl, NULL, &tc, worker_id);
    +      }
    +    }
    +
    +    {
    +      ShenandoahWorkerTimings *worker_times = _heap->phase_timings()->worker_times();
    +      ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::FinishQueues, worker_id);
    +
    +      // Step 3: Finally drain all outstanding work in queues.
    +      traversal_gc->main_loop(worker_id, _terminator, false);
    +    }
    +
    +  }
    +};
    +
    +ShenandoahTraversalGC::ShenandoahTraversalGC(ShenandoahHeap* heap, size_t num_regions) :
    +  _heap(heap),
    +  _task_queues(new ShenandoahObjToScanQueueSet(heap->max_workers())),
    +  _traversal_set(ShenandoahHeapRegionSet()) {
    +
    +  uint num_queues = heap->max_workers();
    +  for (uint i = 0; i < num_queues; ++i) {
    +    ShenandoahObjToScanQueue* task_queue = new ShenandoahObjToScanQueue();
    +    task_queue->initialize();
    +    _task_queues->register_queue(i, task_queue);
    +  }
    +}
    +
    +ShenandoahTraversalGC::~ShenandoahTraversalGC() {
    +}
    +
    +void ShenandoahTraversalGC::prepare_regions() {
    +  size_t num_regions = _heap->num_regions();
    +  ShenandoahMarkingContext* const ctx = _heap->marking_context();
    +  for (size_t i = 0; i < num_regions; i++) {
    +    ShenandoahHeapRegion* region = _heap->get_region(i);
    +    if (_heap->is_bitmap_slice_committed(region)) {
    +      if (_traversal_set.is_in(i)) {
    +        ctx->capture_top_at_mark_start(region);
    +        region->clear_live_data();
    +        assert(ctx->is_bitmap_clear_range(region->bottom(), region->end()), "bitmap for traversal regions must be cleared");
    +      } else {
    +        // Everything outside the traversal set is always considered live.
    +        ctx->reset_top_at_mark_start(region);
    +      }
    +    } else {
    +      // FreeSet may contain uncommitted empty regions, once they are recommitted,
    +      // their TAMS may have old values, so reset them here.
    +      ctx->reset_top_at_mark_start(region);
    +    }
    +  }
    +}
    +
    +void ShenandoahTraversalGC::prepare() {
    +  _heap->collection_set()->clear();
    +  assert(_heap->collection_set()->count() == 0, "collection set not clear");
    +
    +  {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::traversal_gc_make_parsable);
    +    _heap->make_parsable(true);
    +  }
    +
    +  if (UseTLAB) {
    +    ShenandoahGCPhase phase(ShenandoahPhaseTimings::traversal_gc_resize_tlabs);
    +    _heap->resize_tlabs();
    +  }
    +
    +  assert(_heap->marking_context()->is_bitmap_clear(), "need clean mark bitmap");
    +  assert(!_heap->marking_context()->is_complete(), "should not be complete");
    +
    +  ShenandoahFreeSet* free_set = _heap->free_set();
    +  ShenandoahCollectionSet* collection_set = _heap->collection_set();
    +
    +  // Find collection set
    +  _heap->heuristics()->choose_collection_set(collection_set);
    +  prepare_regions();
    +
    +  // Rebuild free set
    +  free_set->rebuild();
    +
    +  log_info(gc, ergo)("Collectable Garbage: " SIZE_FORMAT "M, " SIZE_FORMAT "M CSet, " SIZE_FORMAT " CSet regions",
    +                     collection_set->garbage() / M, collection_set->live_data() / M, collection_set->count());
    +}
    +
    +void ShenandoahTraversalGC::init_traversal_collection() {
    +  assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "STW traversal GC");
    +
    +  if (ShenandoahVerify) {
    +    _heap->verifier()->verify_before_traversal();
    +  }
    +
    +  if (VerifyBeforeGC) {
    +    Universe::verify();
    +  }
    +
    +  {
    +    ShenandoahGCPhase phase_prepare(ShenandoahPhaseTimings::traversal_gc_prepare);
    +    ShenandoahHeapLocker lock(_heap->lock());
    +    prepare();
    +  }
    +
    +  _heap->set_concurrent_traversal_in_progress(true);
    +
    +  bool process_refs = _heap->process_references();
    +  if (process_refs) {
    +    ReferenceProcessor* rp = _heap->ref_processor();
    +    rp->enable_discovery(true /*verify_no_refs*/);
    +    rp->setup_policy(_heap->soft_ref_policy()->should_clear_all_soft_refs());
    +  }
    +
    +  {
    +    ShenandoahGCPhase phase_work(ShenandoahPhaseTimings::init_traversal_gc_work);
    +    assert(_task_queues->is_empty(), "queues must be empty before traversal GC");
    +    TASKQUEUE_STATS_ONLY(_task_queues->reset_taskqueue_stats());
    +
    +#if defined(COMPILER2) || INCLUDE_JVMCI
    +    DerivedPointerTable::clear();
    +#endif
    +
    +    {
    +      uint nworkers = _heap->workers()->active_workers();
    +      task_queues()->reserve(nworkers);
    +      ShenandoahRootProcessor rp(_heap, nworkers, ShenandoahPhaseTimings::init_traversal_gc_work);
    +
    +      ShenandoahCsetCodeRootsIterator cset_coderoots = ShenandoahCodeRoots::cset_iterator();
    +
    +      ShenandoahInitTraversalCollectionTask traversal_task(&rp, &cset_coderoots);
    +      _heap->workers()->run_task(&traversal_task);
    +    }
    +
    +#if defined(COMPILER2) || INCLUDE_JVMCI
    +    DerivedPointerTable::update_pointers();
    +#endif
    +  }
    +
    +  if (ShenandoahPacing) {
    +    _heap->pacer()->setup_for_traversal();
    +  }
    +}
    +
    +void ShenandoahTraversalGC::main_loop(uint w, ShenandoahTaskTerminator* t, bool sts_yield) {
    +  ShenandoahObjToScanQueue* q = task_queues()->queue(w);
    +
    +  // Initialize live data.
    +  jushort* ld = _heap->get_liveness_cache(w);
    +
    +  ReferenceProcessor* rp = NULL;
    +  if (_heap->process_references()) {
    +    rp = _heap->ref_processor();
    +  }
    +  {
    +    if (!_heap->is_degenerated_gc_in_progress()) {
    +      if (_heap->unload_classes()) {
    +        if (ShenandoahStringDedup::is_enabled()) {
    +          ShenandoahTraversalMetadataDedupClosure cl(q, rp);
    +          main_loop_work(&cl, ld, w, t, sts_yield);
    +        } else {
    +          ShenandoahTraversalMetadataClosure cl(q, rp);
    +          main_loop_work(&cl, ld, w, t, sts_yield);
    +        }
    +      } else {
    +        if (ShenandoahStringDedup::is_enabled()) {
    +          ShenandoahTraversalDedupClosure cl(q, rp);
    +          main_loop_work(&cl, ld, w, t, sts_yield);
    +        } else {
    +          ShenandoahTraversalClosure cl(q, rp);
    +          main_loop_work(&cl, ld, w, t, sts_yield);
    +        }
    +      }
    +    } else {
    +      if (_heap->unload_classes()) {
    +        if (ShenandoahStringDedup::is_enabled()) {
    +          ShenandoahTraversalMetadataDedupDegenClosure cl(q, rp);
    +          main_loop_work(&cl, ld, w, t, sts_yield);
    +        } else {
    +          ShenandoahTraversalMetadataDegenClosure cl(q, rp);
    +          main_loop_work(&cl, ld, w, t, sts_yield);
    +        }
    +      } else {
    +        if (ShenandoahStringDedup::is_enabled()) {
    +          ShenandoahTraversalDedupDegenClosure cl(q, rp);
    +          main_loop_work(&cl, ld, w, t, sts_yield);
    +        } else {
    +          ShenandoahTraversalDegenClosure cl(q, rp);
    +          main_loop_work(&cl, ld, w, t, sts_yield);
    +        }
    +      }
    +    }
    +  }
    +
    +  _heap->flush_liveness_cache(w);
    +}
    +
    +template 
    +void ShenandoahTraversalGC::main_loop_work(T* cl, jushort* live_data, uint worker_id, ShenandoahTaskTerminator* terminator, bool sts_yield) {
    +  ShenandoahObjToScanQueueSet* queues = task_queues();
    +  ShenandoahObjToScanQueue* q = queues->queue(worker_id);
    +  ShenandoahConcurrentMark* conc_mark = _heap->concurrent_mark();
    +
    +  uintx stride = ShenandoahMarkLoopStride;
    +
    +  ShenandoahMarkTask task;
    +
    +  // Process outstanding queues, if any.
    +  q = queues->claim_next();
    +  while (q != NULL) {
    +    if (_heap->check_cancelled_gc_and_yield(sts_yield)) {
    +      ShenandoahCancelledTerminatorTerminator tt;
    +      ShenandoahEvacOOMScopeLeaver oom_scope_leaver;
    +      ShenandoahSuspendibleThreadSetLeaver stsl(sts_yield && ShenandoahSuspendibleWorkers);
    +      while (!terminator->offer_termination(&tt));
    +      return;
    +    }
    +
    +    for (uint i = 0; i < stride; i++) {
    +      if (q->pop(task)) {
    +        conc_mark->do_task(q, cl, live_data, &task);
    +      } else {
    +        assert(q->is_empty(), "Must be empty");
    +        q = queues->claim_next();
    +        break;
    +      }
    +    }
    +  }
    +
    +  if (check_and_handle_cancelled_gc(terminator, sts_yield)) return;
    +
    +  // Normal loop.
    +  q = queues->queue(worker_id);
    +
    +  ShenandoahTraversalSATBBufferClosure drain_satb(q);
    +  SATBMarkQueueSet& satb_mq_set = ShenandoahBarrierSet::satb_mark_queue_set();
    +
    +  while (true) {
    +    if (check_and_handle_cancelled_gc(terminator, sts_yield)) return;
    +
    +    while (satb_mq_set.completed_buffers_num() > 0) {
    +      satb_mq_set.apply_closure_to_completed_buffer(&drain_satb);
    +    }
    +
    +    uint work = 0;
    +    for (uint i = 0; i < stride; i++) {
    +      if (q->pop(task) ||
    +          queues->steal(worker_id, task)) {
    +        conc_mark->do_task(q, cl, live_data, &task);
    +        work++;
    +      } else {
    +        break;
    +      }
    +    }
    +
    +    if (work == 0) {
    +      // No more work, try to terminate
    +      ShenandoahEvacOOMScopeLeaver oom_scope_leaver;
    +      ShenandoahSuspendibleThreadSetLeaver stsl(sts_yield && ShenandoahSuspendibleWorkers);
    +      ShenandoahTerminationTimingsTracker term_tracker(worker_id);
    +      if (terminator->offer_termination()) return;
    +    }
    +  }
    +}
    +
    +bool ShenandoahTraversalGC::check_and_handle_cancelled_gc(ShenandoahTaskTerminator* terminator, bool sts_yield) {
    +  if (_heap->cancelled_gc()) {
    +    ShenandoahCancelledTerminatorTerminator tt;
    +    ShenandoahEvacOOMScopeLeaver oom_scope_leaver;
    +    ShenandoahSuspendibleThreadSetLeaver stsl(sts_yield && ShenandoahSuspendibleWorkers);
    +    while (! terminator->offer_termination(&tt));
    +    return true;
    +  }
    +  return false;
    +}
    +
    +void ShenandoahTraversalGC::concurrent_traversal_collection() {
    +  ClassLoaderDataGraph::clear_claimed_marks();
    +
    +  ShenandoahGCPhase phase_work(ShenandoahPhaseTimings::conc_traversal);
    +  if (!_heap->cancelled_gc()) {
    +    uint nworkers = _heap->workers()->active_workers();
    +    task_queues()->reserve(nworkers);
    +    ShenandoahTerminationTracker tracker(ShenandoahPhaseTimings::conc_traversal_termination);
    +
    +    ShenandoahTaskTerminator terminator(nworkers, task_queues());
    +    ShenandoahConcurrentTraversalCollectionTask task(&terminator);
    +    _heap->workers()->run_task(&task);
    +  }
    +
    +  if (!_heap->cancelled_gc() && ShenandoahPreclean && _heap->process_references()) {
    +    preclean_weak_refs();
    +  }
    +}
    +
    +void ShenandoahTraversalGC::final_traversal_collection() {
    +  _heap->make_parsable(true);
    +
    +  if (!_heap->cancelled_gc()) {
    +#if defined(COMPILER2) || INCLUDE_JVMCI
    +    DerivedPointerTable::clear();
    +#endif
    +    ShenandoahGCPhase phase_work(ShenandoahPhaseTimings::final_traversal_gc_work);
    +    uint nworkers = _heap->workers()->active_workers();
    +    task_queues()->reserve(nworkers);
    +
    +    // Finish traversal
    +    ShenandoahRootProcessor rp(_heap, nworkers, ShenandoahPhaseTimings::final_traversal_gc_work);
    +    ShenandoahTerminationTracker term(ShenandoahPhaseTimings::final_traversal_gc_termination);
    +
    +    ShenandoahTaskTerminator terminator(nworkers, task_queues());
    +    ShenandoahFinalTraversalCollectionTask task(&rp, &terminator);
    +    _heap->workers()->run_task(&task);
    +#if defined(COMPILER2) || INCLUDE_JVMCI
    +    DerivedPointerTable::update_pointers();
    +#endif
    +  }
    +
    +  if (!_heap->cancelled_gc() && _heap->process_references()) {
    +    weak_refs_work();
    +  }
    +
    +  if (!_heap->cancelled_gc() && _heap->unload_classes()) {
    +    _heap->unload_classes_and_cleanup_tables(false);
    +    fixup_roots();
    +  }
    +
    +  if (!_heap->cancelled_gc()) {
    +    assert(_task_queues->is_empty(), "queues must be empty after traversal GC");
    +    TASKQUEUE_STATS_ONLY(_task_queues->print_taskqueue_stats());
    +    TASKQUEUE_STATS_ONLY(_task_queues->reset_taskqueue_stats());
    +
    +    // No more marking expected
    +    _heap->mark_complete_marking_context();
    +
    +    // Resize metaspace
    +    MetaspaceGC::compute_new_size();
    +
    +    // Still good? We can now trash the cset, and make final verification
    +    {
    +      ShenandoahGCPhase phase_cleanup(ShenandoahPhaseTimings::traversal_gc_cleanup);
    +      ShenandoahHeapLocker lock(_heap->lock());
    +
    +      // Trash everything
    +      // Clear immediate garbage regions.
    +      size_t num_regions = _heap->num_regions();
    +
    +      ShenandoahHeapRegionSet* traversal_regions = traversal_set();
    +      ShenandoahFreeSet* free_regions = _heap->free_set();
    +      ShenandoahMarkingContext* const ctx = _heap->marking_context();
    +      free_regions->clear();
    +      for (size_t i = 0; i < num_regions; i++) {
    +        ShenandoahHeapRegion* r = _heap->get_region(i);
    +        bool not_allocated = ctx->top_at_mark_start(r) == r->top();
    +
    +        bool candidate = traversal_regions->is_in(r) && !r->has_live() && not_allocated;
    +        if (r->is_humongous_start() && candidate) {
    +          // Trash humongous.
    +          HeapWord* humongous_obj = r->bottom() + ShenandoahBrooksPointer::word_size();
    +          assert(!ctx->is_marked(oop(humongous_obj)), "must not be marked");
    +          r->make_trash_immediate();
    +          while (i + 1 < num_regions && _heap->get_region(i + 1)->is_humongous_continuation()) {
    +            i++;
    +            r = _heap->get_region(i);
    +            assert(r->is_humongous_continuation(), "must be humongous continuation");
    +            r->make_trash_immediate();
    +          }
    +        } else if (!r->is_empty() && candidate) {
    +          // Trash regular.
    +          assert(!r->is_humongous(), "handled above");
    +          assert(!r->is_trash(), "must not already be trashed");
    +          r->make_trash_immediate();
    +        }
    +      }
    +      _heap->collection_set()->clear();
    +      _heap->free_set()->rebuild();
    +      reset();
    +    }
    +
    +    assert(_task_queues->is_empty(), "queues must be empty after traversal GC");
    +    _heap->set_concurrent_traversal_in_progress(false);
    +    assert(!_heap->cancelled_gc(), "must not be cancelled when getting out here");
    +
    +    if (ShenandoahVerify) {
    +      _heap->verifier()->verify_after_traversal();
    +    }
    +
    +    if (VerifyAfterGC) {
    +      Universe::verify();
    +    }
    +  }
    +}
    +
    +class ShenandoahTraversalFixRootsClosure : public OopClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p) {
    +    T o = RawAccess<>::oop_load(p);
    +    if (!CompressedOops::is_null(o)) {
    +      oop obj = CompressedOops::decode_not_null(o);
    +      oop forw = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    +      if (!oopDesc::equals_raw(obj, forw)) {
    +        RawAccess::oop_store(p, forw);
    +      }
    +    }
    +  }
    +
    +public:
    +  inline void do_oop(oop* p) { do_oop_work(p); }
    +  inline void do_oop(narrowOop* p) { do_oop_work(p); }
    +};
    +
    +class ShenandoahTraversalFixRootsTask : public AbstractGangTask {
    +private:
    +  ShenandoahRootProcessor* _rp;
    +
    +public:
    +  ShenandoahTraversalFixRootsTask(ShenandoahRootProcessor* rp) :
    +    AbstractGangTask("Shenandoah traversal fix roots"),
    +    _rp(rp) {}
    +
    +  void work(uint worker_id) {
    +    ShenandoahParallelWorkerSession worker_session(worker_id);
    +    ShenandoahTraversalFixRootsClosure cl;
    +    MarkingCodeBlobClosure blobsCl(&cl, CodeBlobToOopClosure::FixRelocations);
    +    CLDToOopClosure cldCl(&cl, ClassLoaderData::_claim_strong);
    +    _rp->process_all_roots(&cl, &cl, &cldCl, &blobsCl, NULL, worker_id);
    +  }
    +};
    +
    +void ShenandoahTraversalGC::fixup_roots() {
    +#if defined(COMPILER2) || INCLUDE_JVMCI
    +  DerivedPointerTable::clear();
    +#endif
    +  ShenandoahRootProcessor rp(_heap, _heap->workers()->active_workers(), ShenandoahPhaseTimings::final_traversal_update_roots);
    +  ShenandoahTraversalFixRootsTask update_roots_task(&rp);
    +  _heap->workers()->run_task(&update_roots_task);
    +#if defined(COMPILER2) || INCLUDE_JVMCI
    +  DerivedPointerTable::update_pointers();
    +#endif
    +}
    +
    +void ShenandoahTraversalGC::reset() {
    +  _task_queues->clear();
    +}
    +
    +ShenandoahObjToScanQueueSet* ShenandoahTraversalGC::task_queues() {
    +  return _task_queues;
    +}
    +
    +class ShenandoahTraversalCancelledGCYieldClosure : public YieldClosure {
    +private:
    +  ShenandoahHeap* const _heap;
    +public:
    +  ShenandoahTraversalCancelledGCYieldClosure() : _heap(ShenandoahHeap::heap()) {};
    +  virtual bool should_return() { return _heap->cancelled_gc(); }
    +};
    +
    +class ShenandoahTraversalPrecleanCompleteGCClosure : public VoidClosure {
    +public:
    +  void do_void() {
    +    ShenandoahHeap* sh = ShenandoahHeap::heap();
    +    ShenandoahTraversalGC* traversal_gc = sh->traversal_gc();
    +    assert(sh->process_references(), "why else would we be here?");
    +    ShenandoahTaskTerminator terminator(1, traversal_gc->task_queues());
    +    shenandoah_assert_rp_isalive_installed();
    +    traversal_gc->main_loop((uint) 0, &terminator, true);
    +  }
    +};
    +
    +class ShenandoahTraversalKeepAliveUpdateClosure : public OopClosure {
    +private:
    +  ShenandoahObjToScanQueue* _queue;
    +  Thread* _thread;
    +  ShenandoahTraversalGC* _traversal_gc;
    +  ShenandoahMarkingContext* const _mark_context;
    +
    +  template 
    +  inline void do_oop_work(T* p) {
    +    _traversal_gc->process_oop(p, _thread, _queue, _mark_context);
    +  }
    +
    +public:
    +  ShenandoahTraversalKeepAliveUpdateClosure(ShenandoahObjToScanQueue* q) :
    +    _queue(q), _thread(Thread::current()),
    +    _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
    +    _mark_context(ShenandoahHeap::heap()->marking_context()) {}
    +
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +class ShenandoahTraversalWeakUpdateClosure : public OopClosure {
    +private:
    +  template 
    +  inline void do_oop_work(T* p) {
    +    // Cannot call maybe_update_with_forwarded, because on traversal-degen
    +    // path the collection set is already dropped. Instead, do the unguarded store.
    +    // TODO: This can be fixed after degen-traversal stops dropping cset.
    +    T o = RawAccess<>::oop_load(p);
    +    if (!CompressedOops::is_null(o)) {
    +      oop obj = CompressedOops::decode_not_null(o);
    +      obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    +      shenandoah_assert_marked(p, obj);
    +      RawAccess::oop_store(p, obj);
    +    }
    +  }
    +
    +public:
    +  ShenandoahTraversalWeakUpdateClosure() {}
    +
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +class ShenandoahTraversalKeepAliveUpdateDegenClosure : public OopClosure {
    +private:
    +  ShenandoahObjToScanQueue* _queue;
    +  Thread* _thread;
    +  ShenandoahTraversalGC* _traversal_gc;
    +  ShenandoahMarkingContext* const _mark_context;
    +
    +  template 
    +  inline void do_oop_work(T* p) {
    +    _traversal_gc->process_oop(p, _thread, _queue, _mark_context);
    +  }
    +
    +public:
    +  ShenandoahTraversalKeepAliveUpdateDegenClosure(ShenandoahObjToScanQueue* q) :
    +          _queue(q), _thread(Thread::current()),
    +          _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
    +          _mark_context(ShenandoahHeap::heap()->marking_context()) {}
    +
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +class ShenandoahTraversalSingleThreadKeepAliveUpdateClosure : public OopClosure {
    +private:
    +  ShenandoahObjToScanQueue* _queue;
    +  Thread* _thread;
    +  ShenandoahTraversalGC* _traversal_gc;
    +  ShenandoahMarkingContext* const _mark_context;
    +
    +  template 
    +  inline void do_oop_work(T* p) {
    +    ShenandoahEvacOOMScope evac_scope;
    +    _traversal_gc->process_oop(p, _thread, _queue, _mark_context);
    +  }
    +
    +public:
    +  ShenandoahTraversalSingleThreadKeepAliveUpdateClosure(ShenandoahObjToScanQueue* q) :
    +          _queue(q), _thread(Thread::current()),
    +          _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
    +          _mark_context(ShenandoahHeap::heap()->marking_context()) {}
    +
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +class ShenandoahTraversalSingleThreadKeepAliveUpdateDegenClosure : public OopClosure {
    +private:
    +  ShenandoahObjToScanQueue* _queue;
    +  Thread* _thread;
    +  ShenandoahTraversalGC* _traversal_gc;
    +  ShenandoahMarkingContext* const _mark_context;
    +
    +  template 
    +  inline void do_oop_work(T* p) {
    +    ShenandoahEvacOOMScope evac_scope;
    +    _traversal_gc->process_oop(p, _thread, _queue, _mark_context);
    +  }
    +
    +public:
    +  ShenandoahTraversalSingleThreadKeepAliveUpdateDegenClosure(ShenandoahObjToScanQueue* q) :
    +          _queue(q), _thread(Thread::current()),
    +          _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
    +          _mark_context(ShenandoahHeap::heap()->marking_context()) {}
    +
    +  void do_oop(narrowOop* p) { do_oop_work(p); }
    +  void do_oop(oop* p)       { do_oop_work(p); }
    +};
    +
    +class ShenandoahTraversalPrecleanTask : public AbstractGangTask {
    +private:
    +  ReferenceProcessor* _rp;
    +
    +public:
    +  ShenandoahTraversalPrecleanTask(ReferenceProcessor* rp) :
    +          AbstractGangTask("Precleaning task"),
    +          _rp(rp) {}
    +
    +  void work(uint worker_id) {
    +    assert(worker_id == 0, "The code below is single-threaded, only one worker is expected");
    +    ShenandoahParallelWorkerSession worker_session(worker_id);
    +    ShenandoahSuspendibleThreadSetJoiner stsj(ShenandoahSuspendibleWorkers);
    +    ShenandoahEvacOOMScope oom_evac_scope;
    +
    +    ShenandoahHeap* sh = ShenandoahHeap::heap();
    +
    +    ShenandoahObjToScanQueue* q = sh->traversal_gc()->task_queues()->queue(worker_id);
    +
    +    ShenandoahForwardedIsAliveClosure is_alive;
    +    ShenandoahTraversalCancelledGCYieldClosure yield;
    +    ShenandoahTraversalPrecleanCompleteGCClosure complete_gc;
    +    ShenandoahTraversalKeepAliveUpdateClosure keep_alive(q);
    +    ResourceMark rm;
    +    _rp->preclean_discovered_references(&is_alive, &keep_alive,
    +                                        &complete_gc, &yield,
    +                                        NULL);
    +  }
    +};
    +
    +void ShenandoahTraversalGC::preclean_weak_refs() {
    +  // Pre-cleaning weak references before diving into STW makes sense at the
    +  // end of concurrent mark. This will filter out the references which referents
    +  // are alive. Note that ReferenceProcessor already filters out these on reference
    +  // discovery, and the bulk of work is done here. This phase processes leftovers
    +  // that missed the initial filtering, i.e. when referent was marked alive after
    +  // reference was discovered by RP.
    +
    +  assert(_heap->process_references(), "sanity");
    +  assert(!_heap->is_degenerated_gc_in_progress(), "must be in concurrent non-degenerated phase");
    +
    +  // Shortcut if no references were discovered to avoid winding up threads.
    +  ReferenceProcessor* rp = _heap->ref_processor();
    +  if (!rp->has_discovered_references()) {
    +    return;
    +  }
    +
    +  ReferenceProcessorMTDiscoveryMutator fix_mt_discovery(rp, false);
    +
    +  shenandoah_assert_rp_isalive_not_installed();
    +  ShenandoahForwardedIsAliveClosure is_alive;
    +  ReferenceProcessorIsAliveMutator fix_isalive(rp, &is_alive);
    +
    +  assert(task_queues()->is_empty(), "Should be empty");
    +
    +  // Execute precleaning in the worker thread: it will give us GCLABs, String dedup
    +  // queues and other goodies. When upstream ReferenceProcessor starts supporting
    +  // parallel precleans, we can extend this to more threads.
    +  ShenandoahPushWorkerScope scope(_heap->workers(), 1, /* check_workers = */ false);
    +
    +  WorkGang* workers = _heap->workers();
    +  uint nworkers = workers->active_workers();
    +  assert(nworkers == 1, "This code uses only a single worker");
    +  task_queues()->reserve(nworkers);
    +
    +  ShenandoahTraversalPrecleanTask task(rp);
    +  workers->run_task(&task);
    +
    +  assert(_heap->cancelled_gc() || task_queues()->is_empty(), "Should be empty");
    +}
    +
    +// Weak Reference Closures
    +class ShenandoahTraversalDrainMarkingStackClosure: public VoidClosure {
    +  uint _worker_id;
    +  ShenandoahTaskTerminator* _terminator;
    +  bool _reset_terminator;
    +
    +public:
    +  ShenandoahTraversalDrainMarkingStackClosure(uint worker_id, ShenandoahTaskTerminator* t, bool reset_terminator = false):
    +    _worker_id(worker_id),
    +    _terminator(t),
    +    _reset_terminator(reset_terminator) {
    +  }
    +
    +  void do_void() {
    +    assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +
    +    ShenandoahHeap* sh = ShenandoahHeap::heap();
    +    ShenandoahTraversalGC* traversal_gc = sh->traversal_gc();
    +    assert(sh->process_references(), "why else would we be here?");
    +    shenandoah_assert_rp_isalive_installed();
    +
    +    traversal_gc->main_loop(_worker_id, _terminator, false);
    +
    +    if (_reset_terminator) {
    +      _terminator->reset_for_reuse();
    +    }
    +  }
    +};
    +
    +class ShenandoahTraversalSingleThreadedDrainMarkingStackClosure: public VoidClosure {
    +  uint _worker_id;
    +  ShenandoahTaskTerminator* _terminator;
    +  bool _reset_terminator;
    +
    +public:
    +  ShenandoahTraversalSingleThreadedDrainMarkingStackClosure(uint worker_id, ShenandoahTaskTerminator* t, bool reset_terminator = false):
    +          _worker_id(worker_id),
    +          _terminator(t),
    +          _reset_terminator(reset_terminator) {
    +  }
    +
    +  void do_void() {
    +    assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +
    +    ShenandoahHeap* sh = ShenandoahHeap::heap();
    +    ShenandoahTraversalGC* traversal_gc = sh->traversal_gc();
    +    assert(sh->process_references(), "why else would we be here?");
    +    shenandoah_assert_rp_isalive_installed();
    +
    +    ShenandoahEvacOOMScope evac_scope;
    +    traversal_gc->main_loop(_worker_id, _terminator, false);
    +
    +    if (_reset_terminator) {
    +      _terminator->reset_for_reuse();
    +    }
    +  }
    +};
    +
    +void ShenandoahTraversalGC::weak_refs_work() {
    +  assert(_heap->process_references(), "sanity");
    +
    +  ShenandoahPhaseTimings::Phase phase_root = ShenandoahPhaseTimings::weakrefs;
    +
    +  ShenandoahGCPhase phase(phase_root);
    +
    +  ReferenceProcessor* rp = _heap->ref_processor();
    +
    +  // NOTE: We cannot shortcut on has_discovered_references() here, because
    +  // we will miss marking JNI Weak refs then, see implementation in
    +  // ReferenceProcessor::process_discovered_references.
    +  weak_refs_work_doit();
    +
    +  rp->verify_no_references_recorded();
    +  assert(!rp->discovery_enabled(), "Post condition");
    +
    +}
    +
    +class ShenandoahTraversalRefProcTaskProxy : public AbstractGangTask {
    +private:
    +  AbstractRefProcTaskExecutor::ProcessTask& _proc_task;
    +  ShenandoahTaskTerminator* _terminator;
    +
    +public:
    +  ShenandoahTraversalRefProcTaskProxy(AbstractRefProcTaskExecutor::ProcessTask& proc_task,
    +                                      ShenandoahTaskTerminator* t) :
    +    AbstractGangTask("Process reference objects in parallel"),
    +    _proc_task(proc_task),
    +    _terminator(t) {
    +  }
    +
    +  void work(uint worker_id) {
    +    ShenandoahEvacOOMScope oom_evac_scope;
    +    assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +    ShenandoahTraversalDrainMarkingStackClosure complete_gc(worker_id, _terminator);
    +
    +    ShenandoahForwardedIsAliveClosure is_alive;
    +    if (!heap->is_degenerated_gc_in_progress()) {
    +      ShenandoahTraversalKeepAliveUpdateClosure keep_alive(heap->traversal_gc()->task_queues()->queue(worker_id));
    +      _proc_task.work(worker_id, is_alive, keep_alive, complete_gc);
    +    } else {
    +      ShenandoahTraversalKeepAliveUpdateDegenClosure keep_alive(heap->traversal_gc()->task_queues()->queue(worker_id));
    +      _proc_task.work(worker_id, is_alive, keep_alive, complete_gc);
    +    }
    +  }
    +};
    +
    +class ShenandoahTraversalRefProcTaskExecutor : public AbstractRefProcTaskExecutor {
    +private:
    +  WorkGang* _workers;
    +
    +public:
    +  ShenandoahTraversalRefProcTaskExecutor(WorkGang* workers) : _workers(workers) {}
    +
    +  // Executes a task using worker threads.
    +  void execute(ProcessTask& task, uint ergo_workers) {
    +    assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at a safepoint");
    +
    +    ShenandoahHeap* heap = ShenandoahHeap::heap();
    +    ShenandoahTraversalGC* traversal_gc = heap->traversal_gc();
    +    ShenandoahPushWorkerQueuesScope scope(_workers,
    +                                          traversal_gc->task_queues(),
    +                                          ergo_workers,
    +                                          /* do_check = */ false);
    +    uint nworkers = _workers->active_workers();
    +    traversal_gc->task_queues()->reserve(nworkers);
    +    ShenandoahTaskTerminator terminator(nworkers, traversal_gc->task_queues());
    +    ShenandoahTraversalRefProcTaskProxy proc_task_proxy(task, &terminator);
    +    _workers->run_task(&proc_task_proxy);
    +  }
    +};
    +
    +void ShenandoahTraversalGC::weak_refs_work_doit() {
    +  ReferenceProcessor* rp = _heap->ref_processor();
    +
    +  ShenandoahPhaseTimings::Phase phase_process = ShenandoahPhaseTimings::weakrefs_process;
    +
    +  shenandoah_assert_rp_isalive_not_installed();
    +  ShenandoahForwardedIsAliveClosure is_alive;
    +  ReferenceProcessorIsAliveMutator fix_isalive(rp, &is_alive);
    +
    +  WorkGang* workers = _heap->workers();
    +  uint nworkers = workers->active_workers();
    +
    +  rp->setup_policy(_heap->soft_ref_policy()->should_clear_all_soft_refs());
    +  rp->set_active_mt_degree(nworkers);
    +
    +  assert(task_queues()->is_empty(), "Should be empty");
    +
    +  // complete_gc and keep_alive closures instantiated here are only needed for
    +  // single-threaded path in RP. They share the queue 0 for tracking work, which
    +  // simplifies implementation. Since RP may decide to call complete_gc several
    +  // times, we need to be able to reuse the terminator.
    +  uint serial_worker_id = 0;
    +  ShenandoahTaskTerminator terminator(1, task_queues());
    +  ShenandoahTraversalSingleThreadedDrainMarkingStackClosure complete_gc(serial_worker_id, &terminator, /* reset_terminator = */ true);
    +  ShenandoahPushWorkerQueuesScope scope(workers, task_queues(), 1, /* do_check = */ false);
    +
    +  ShenandoahTraversalRefProcTaskExecutor executor(workers);
    +
    +  ReferenceProcessorPhaseTimes pt(_heap->gc_timer(), rp->num_queues());
    +  if (!_heap->is_degenerated_gc_in_progress()) {
    +    ShenandoahTraversalSingleThreadKeepAliveUpdateClosure keep_alive(task_queues()->queue(serial_worker_id));
    +    rp->process_discovered_references(&is_alive, &keep_alive,
    +                                      &complete_gc, &executor,
    +                                      &pt);
    +  } else {
    +    ShenandoahTraversalSingleThreadKeepAliveUpdateDegenClosure keep_alive(task_queues()->queue(serial_worker_id));
    +    rp->process_discovered_references(&is_alive, &keep_alive,
    +                                      &complete_gc, &executor,
    +                                      &pt);
    +  }
    +
    +  {
    +    ShenandoahGCPhase phase(phase_process);
    +    ShenandoahTerminationTracker termination(ShenandoahPhaseTimings::weakrefs_termination);
    +
    +    // Process leftover weak oops (using parallel version)
    +    ShenandoahTraversalWeakUpdateClosure cl;
    +    WeakProcessor::weak_oops_do(workers, &is_alive, &cl, 1);
    +
    +    pt.print_all_references();
    +
    +    assert(task_queues()->is_empty() || _heap->cancelled_gc(), "Should be empty");
    +  }
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.hpp b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.hpp
    new file mode 100644
    index 00000000000..022752fcc70
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.hpp
    @@ -0,0 +1,73 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHTRAVERSALGC_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHTRAVERSALGC_HPP
    +
    +#include "memory/allocation.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +#include "runtime/thread.hpp"
    +
    +class ShenandoahTraversalGC : public CHeapObj {
    +private:
    +  ShenandoahHeap* const _heap;
    +  ShenandoahObjToScanQueueSet* const _task_queues;
    +  ShenandoahHeapRegionSet _traversal_set;
    +
    +public:
    +  ShenandoahTraversalGC(ShenandoahHeap* heap, size_t num_regions);
    +  ~ShenandoahTraversalGC();
    +
    +  ShenandoahHeapRegionSet* traversal_set() { return &_traversal_set; }
    +
    +  void reset();
    +  void prepare();
    +  void init_traversal_collection();
    +  void concurrent_traversal_collection();
    +  void final_traversal_collection();
    +
    +  template 
    +  inline void process_oop(T* p, Thread* thread, ShenandoahObjToScanQueue* queue, ShenandoahMarkingContext* const mark_context);
    +
    +  bool check_and_handle_cancelled_gc(ShenandoahTaskTerminator* terminator, bool sts_yield);
    +
    +  ShenandoahObjToScanQueueSet* task_queues();
    +
    +  void main_loop(uint worker_id, ShenandoahTaskTerminator* terminator, bool sts_yield);
    +
    +private:
    +  void prepare_regions();
    +
    +  template 
    +  void main_loop_work(T* cl, jushort* live_data, uint worker_id, ShenandoahTaskTerminator* terminator, bool sts_yield);
    +
    +  void preclean_weak_refs();
    +  void weak_refs_work();
    +  void weak_refs_work_doit();
    +
    +  void fixup_roots();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHTRAVERSALGC_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.inline.hpp
    new file mode 100644
    index 00000000000..a37609451f7
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.inline.hpp
    @@ -0,0 +1,77 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHTRAVERSALGC_INLINE_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHTRAVERSALGC_INLINE_HPP
    +
    +#include "gc/shenandoah/shenandoahAsserts.hpp"
    +#include "gc/shenandoah/shenandoahBarrierSet.inline.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
    +#include "gc/shenandoah/shenandoahStringDedup.hpp"
    +#include "gc/shenandoah/shenandoahTraversalGC.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.inline.hpp"
    +#include "oops/oop.inline.hpp"
    +
    +template 
    +void ShenandoahTraversalGC::process_oop(T* p, Thread* thread, ShenandoahObjToScanQueue* queue, ShenandoahMarkingContext* const mark_context) {
    +  T o = RawAccess<>::oop_load(p);
    +  if (!CompressedOops::is_null(o)) {
    +    oop obj = CompressedOops::decode_not_null(o);
    +    if (DEGEN) {
    +      oop forw = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    +      if (!oopDesc::equals_raw(obj, forw)) {
    +        // Update reference.
    +        RawAccess::oop_store(p, forw);
    +      }
    +      obj = forw;
    +    } else if (_heap->in_collection_set(obj)) {
    +      oop forw = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    +      if (oopDesc::equals_raw(obj, forw)) {
    +        forw = _heap->evacuate_object(obj, thread);
    +      }
    +      shenandoah_assert_forwarded_except(p, obj, _heap->cancelled_gc());
    +      // Update reference.
    +      _heap->atomic_compare_exchange_oop(forw, p, obj);
    +      obj = forw;
    +    }
    +
    +    shenandoah_assert_not_forwarded(p, obj);
    +    shenandoah_assert_not_in_cset_except(p, obj, _heap->cancelled_gc());
    +
    +    if (mark_context->mark(obj)) {
    +      bool succeeded = queue->push(ShenandoahMarkTask(obj));
    +      assert(succeeded, "must succeed to push to task queue");
    +
    +      if (STRING_DEDUP && ShenandoahStringDedup::is_candidate(obj) && !_heap->cancelled_gc()) {
    +        assert(ShenandoahStringDedup::is_enabled(), "Must be enabled");
    +        // Only dealing with to-space string, so that we can avoid evac-oom protocol, which is costly here.
    +        shenandoah_assert_not_in_cset(p, obj);
    +        ShenandoahStringDedup::enqueue_candidate(obj);
    +      }
    +    }
    +  }
    +}
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHTRAVERSALGC_INLINE_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahUtils.cpp b/src/hotspot/share/gc/shenandoah/shenandoahUtils.cpp
    new file mode 100644
    index 00000000000..af2f1b5ca73
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahUtils.cpp
    @@ -0,0 +1,182 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "jfr/jfrEvents.hpp"
    +#include "gc/shared/gcCause.hpp"
    +#include "gc/shared/gcTimer.hpp"
    +#include "gc/shared/gcTrace.hpp"
    +#include "gc/shared/gcWhen.hpp"
    +#include "gc/shenandoah/shenandoahAllocTracker.hpp"
    +#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
    +#include "gc/shenandoah/shenandoahMarkCompact.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeuristics.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +
    +ShenandoahPhaseTimings::Phase ShenandoahGCPhase::_current_phase = ShenandoahGCPhase::_invalid_phase;
    +
    +ShenandoahGCSession::ShenandoahGCSession(GCCause::Cause cause) :
    +  _heap(ShenandoahHeap::heap()),
    +  _timer(_heap->gc_timer()),
    +  _tracer(_heap->tracer()) {
    +  assert(!ShenandoahGCPhase::is_valid_phase(ShenandoahGCPhase::current_phase()),
    +    "No current GC phase");
    +
    +  _timer->register_gc_start();
    +  _tracer->report_gc_start(cause, _timer->gc_start());
    +  _heap->trace_heap(GCWhen::BeforeGC, _tracer);
    +
    +  _heap->shenandoah_policy()->record_cycle_start();
    +  _heap->heuristics()->record_cycle_start();
    +  _trace_cycle.initialize(_heap->cycle_memory_manager(), _heap->gc_cause(),
    +          /* allMemoryPoolsAffected */    true,
    +          /* recordGCBeginTime = */       true,
    +          /* recordPreGCUsage = */        true,
    +          /* recordPeakUsage = */         true,
    +          /* recordPostGCUsage = */       true,
    +          /* recordAccumulatedGCTime = */ true,
    +          /* recordGCEndTime = */         true,
    +          /* countCollection = */         true
    +  );
    +}
    +
    +ShenandoahGCSession::~ShenandoahGCSession() {
    +  _heap->heuristics()->record_cycle_end();
    +  _timer->register_gc_end();
    +  _heap->trace_heap(GCWhen::AfterGC, _tracer);
    +  _tracer->report_gc_end(_timer->gc_end(), _timer->time_partitions());
    +  assert(!ShenandoahGCPhase::is_valid_phase(ShenandoahGCPhase::current_phase()),
    +    "No current GC phase");
    +}
    +
    +ShenandoahGCPauseMark::ShenandoahGCPauseMark(uint gc_id, SvcGCMarker::reason_type type) :
    +  _heap(ShenandoahHeap::heap()), _gc_id_mark(gc_id), _svc_gc_mark(type), _is_gc_active_mark() {
    +
    +  // FIXME: It seems that JMC throws away level 0 events, which are the Shenandoah
    +  // pause events. Create this pseudo level 0 event to push real events to level 1.
    +  _heap->gc_timer()->register_gc_phase_start("Shenandoah", Ticks::now());
    +  _trace_pause.initialize(_heap->stw_memory_manager(), _heap->gc_cause(),
    +          /* allMemoryPoolsAffected */    true,
    +          /* recordGCBeginTime = */       true,
    +          /* recordPreGCUsage = */        false,
    +          /* recordPeakUsage = */         false,
    +          /* recordPostGCUsage = */       false,
    +          /* recordAccumulatedGCTime = */ true,
    +          /* recordGCEndTime = */         true,
    +          /* countCollection = */         true
    +  );
    +
    +  _heap->heuristics()->record_gc_start();
    +}
    +
    +ShenandoahGCPauseMark::~ShenandoahGCPauseMark() {
    +  _heap->gc_timer()->register_gc_phase_end(Ticks::now());
    +  _heap->heuristics()->record_gc_end();
    +}
    +
    +ShenandoahGCPhase::ShenandoahGCPhase(const ShenandoahPhaseTimings::Phase phase) :
    +  _heap(ShenandoahHeap::heap()), _phase(phase) {
    +  assert(Thread::current()->is_VM_thread() ||
    +         Thread::current()->is_ConcurrentGC_thread(),
    +        "Must be set by these threads");
    +  _parent_phase = _current_phase;
    +  _current_phase = phase;
    +
    +  _heap->phase_timings()->record_phase_start(_phase);
    +}
    +
    +ShenandoahGCPhase::~ShenandoahGCPhase() {
    +  _heap->phase_timings()->record_phase_end(_phase);
    +  _current_phase = _parent_phase;
    +}
    +
    +bool ShenandoahGCPhase::is_valid_phase(ShenandoahPhaseTimings::Phase phase) {
    +  return phase >= 0 && phase < ShenandoahPhaseTimings::_num_phases;
    +}
    +
    +bool ShenandoahGCPhase::is_root_work_phase() {
    +  switch(current_phase()) {
    +    case ShenandoahPhaseTimings::scan_roots:
    +    case ShenandoahPhaseTimings::update_roots:
    +    case ShenandoahPhaseTimings::init_evac:
    +    case ShenandoahPhaseTimings::final_update_refs_roots:
    +    case ShenandoahPhaseTimings::degen_gc_update_roots:
    +    case ShenandoahPhaseTimings::init_traversal_gc_work:
    +    case ShenandoahPhaseTimings::final_traversal_gc_work:
    +    case ShenandoahPhaseTimings::final_traversal_update_roots:
    +    case ShenandoahPhaseTimings::full_gc_roots:
    +      return true;
    +    default:
    +      return false;
    +  }
    +}
    +
    +ShenandoahAllocTrace::ShenandoahAllocTrace(size_t words_size, ShenandoahAllocRequest::Type alloc_type) {
    +  if (ShenandoahAllocationTrace) {
    +    _start = os::elapsedTime();
    +    _size = words_size;
    +    _alloc_type = alloc_type;
    +  } else {
    +    _start = 0;
    +    _size = 0;
    +    _alloc_type = ShenandoahAllocRequest::Type(0);
    +  }
    +}
    +
    +ShenandoahAllocTrace::~ShenandoahAllocTrace() {
    +  if (ShenandoahAllocationTrace) {
    +    double stop = os::elapsedTime();
    +    double duration_sec = stop - _start;
    +    double duration_us = duration_sec * 1000000;
    +    ShenandoahAllocTracker* tracker = ShenandoahHeap::heap()->alloc_tracker();
    +    assert(tracker != NULL, "Must be");
    +    tracker->record_alloc_latency(_size, _alloc_type, duration_us);
    +    if (duration_us > ShenandoahAllocationStallThreshold) {
    +      log_warning(gc)("Allocation stall: %.0f us (threshold: " INTX_FORMAT " us)",
    +                      duration_us, ShenandoahAllocationStallThreshold);
    +    }
    +  }
    +}
    +
    +ShenandoahWorkerSession::ShenandoahWorkerSession(uint worker_id) : _worker_id(worker_id) {
    +  Thread* thr = Thread::current();
    +  assert(ShenandoahThreadLocalData::worker_id(thr) == ShenandoahThreadLocalData::INVALID_WORKER_ID, "Already set");
    +  ShenandoahThreadLocalData::set_worker_id(thr, worker_id);
    +}
    +
    +ShenandoahConcurrentWorkerSession::~ShenandoahConcurrentWorkerSession() {
    +  _event.commit(GCId::current(), ShenandoahPhaseTimings::phase_name(ShenandoahGCPhase::current_phase()));
    +}
    +
    +ShenandoahParallelWorkerSession::~ShenandoahParallelWorkerSession() {
    +  _event.commit(GCId::current(), _worker_id, ShenandoahPhaseTimings::phase_name(ShenandoahGCPhase::current_phase()));
    +}
    +ShenandoahWorkerSession::~ShenandoahWorkerSession() {
    +#ifdef ASSERT
    +  Thread* thr = Thread::current();
    +  assert(ShenandoahThreadLocalData::worker_id(thr) != ShenandoahThreadLocalData::INVALID_WORKER_ID, "Must be set");
    +  ShenandoahThreadLocalData::set_worker_id(thr, ShenandoahThreadLocalData::INVALID_WORKER_ID);
    +#endif
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahUtils.hpp b/src/hotspot/share/gc/shenandoah/shenandoahUtils.hpp
    new file mode 100644
    index 00000000000..6d6373a78c2
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahUtils.hpp
    @@ -0,0 +1,178 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAHUTILS_HPP
    +#define SHARE_VM_GC_SHENANDOAHUTILS_HPP
    +
    +#include "jfr/jfrEvents.hpp"
    +
    +#include "gc/shared/gcCause.hpp"
    +#include "gc/shared/isGCActiveMark.hpp"
    +#include "gc/shared/suspendibleThreadSet.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
    +#include "memory/allocation.hpp"
    +#include "runtime/safepoint.hpp"
    +#include "runtime/vmThread.hpp"
    +#include "runtime/vmOperations.hpp"
    +#include "services/memoryService.hpp"
    +
    +class GCTimer;
    +class GCTracer;
    +
    +class ShenandoahGCSession : public StackObj {
    +private:
    +  ShenandoahHeap* const _heap;
    +  GCTimer*  const _timer;
    +  GCTracer* const _tracer;
    +
    +  TraceMemoryManagerStats _trace_cycle;
    +public:
    +  ShenandoahGCSession(GCCause::Cause cause);
    +  ~ShenandoahGCSession();
    +};
    +
    +class ShenandoahGCPhase : public StackObj {
    +private:
    +  static const ShenandoahPhaseTimings::Phase _invalid_phase = ShenandoahPhaseTimings::_num_phases;
    +  static ShenandoahPhaseTimings::Phase       _current_phase;
    +
    +  ShenandoahHeap* const _heap;
    +  const ShenandoahPhaseTimings::Phase   _phase;
    +  ShenandoahPhaseTimings::Phase         _parent_phase;
    +public:
    +  ShenandoahGCPhase(ShenandoahPhaseTimings::Phase phase);
    +  ~ShenandoahGCPhase();
    +
    +  static ShenandoahPhaseTimings::Phase current_phase() { return _current_phase; }
    +
    +  static bool is_valid_phase(ShenandoahPhaseTimings::Phase phase);
    +  static bool is_current_phase_valid() { return is_valid_phase(current_phase()); }
    +  static bool is_root_work_phase();
    +};
    +
    +// Aggregates all the things that should happen before/after the pause.
    +class ShenandoahGCPauseMark : public StackObj {
    +private:
    +  ShenandoahHeap* const _heap;
    +  const GCIdMark                _gc_id_mark;
    +  const SvcGCMarker             _svc_gc_mark;
    +  const IsGCActiveMark          _is_gc_active_mark;
    +  TraceMemoryManagerStats       _trace_pause;
    +
    +public:
    +  ShenandoahGCPauseMark(uint gc_id, SvcGCMarker::reason_type type);
    +  ~ShenandoahGCPauseMark();
    +};
    +
    +class ShenandoahAllocTrace : public StackObj {
    +private:
    +  double _start;
    +  size_t _size;
    +  ShenandoahAllocRequest::Type _alloc_type;
    +public:
    +  ShenandoahAllocTrace(size_t words_size, ShenandoahAllocRequest::Type alloc_type);
    +  ~ShenandoahAllocTrace();
    +};
    +
    +class ShenandoahSafepoint : public AllStatic {
    +public:
    +  // check if Shenandoah GC safepoint is in progress
    +  static inline bool is_at_shenandoah_safepoint() {
    +    if (!SafepointSynchronize::is_at_safepoint()) return false;
    +
    +    VM_Operation* vm_op = VMThread::vm_operation();
    +    if (vm_op == NULL) return false;
    +
    +    VM_Operation::VMOp_Type type = vm_op->type();
    +    return type == VM_Operation::VMOp_ShenandoahInitMark ||
    +           type == VM_Operation::VMOp_ShenandoahFinalMarkStartEvac ||
    +           type == VM_Operation::VMOp_ShenandoahFinalEvac ||
    +           type == VM_Operation::VMOp_ShenandoahInitTraversalGC ||
    +           type == VM_Operation::VMOp_ShenandoahFinalTraversalGC ||
    +           type == VM_Operation::VMOp_ShenandoahInitUpdateRefs ||
    +           type == VM_Operation::VMOp_ShenandoahFinalUpdateRefs ||
    +           type == VM_Operation::VMOp_ShenandoahFullGC ||
    +           type == VM_Operation::VMOp_ShenandoahDegeneratedGC;
    +  }
    +};
    +
    +class ShenandoahWorkerSession : public StackObj {
    +protected:
    +  uint _worker_id;
    +
    +  ShenandoahWorkerSession(uint worker_id);
    +  ~ShenandoahWorkerSession();
    +public:
    +  static inline uint worker_id() {
    +    Thread* thr = Thread::current();
    +    uint id = ShenandoahThreadLocalData::worker_id(thr);
    +    assert(id != ShenandoahThreadLocalData::INVALID_WORKER_ID, "Worker session has not been created");
    +    return id;
    +  }
    +};
    +
    +class ShenandoahConcurrentWorkerSession : public ShenandoahWorkerSession {
    +private:
    +  EventGCPhaseConcurrent _event;
    +
    +public:
    +  ShenandoahConcurrentWorkerSession(uint worker_id) : ShenandoahWorkerSession(worker_id) { }
    +  ~ShenandoahConcurrentWorkerSession();
    +};
    +
    +class ShenandoahParallelWorkerSession : public ShenandoahWorkerSession {
    +private:
    +  EventGCPhaseParallel _event;
    +
    +public:
    +  ShenandoahParallelWorkerSession(uint worker_id) : ShenandoahWorkerSession(worker_id) { }
    +  ~ShenandoahParallelWorkerSession();
    +};
    +
    +class ShenandoahSuspendibleThreadSetJoiner {
    +private:
    +  SuspendibleThreadSetJoiner _joiner;
    +public:
    +  ShenandoahSuspendibleThreadSetJoiner(bool active = true) : _joiner(active) {
    +    assert(!ShenandoahThreadLocalData::is_evac_allowed(Thread::current()), "STS should be joined before evac scope");
    +  }
    +  ~ShenandoahSuspendibleThreadSetJoiner() {
    +    assert(!ShenandoahThreadLocalData::is_evac_allowed(Thread::current()), "STS should be left after evac scope");
    +  }
    +};
    +
    +class ShenandoahSuspendibleThreadSetLeaver {
    +private:
    +  SuspendibleThreadSetLeaver _leaver;
    +public:
    +  ShenandoahSuspendibleThreadSetLeaver(bool active = true) : _leaver(active) {
    +    assert(!ShenandoahThreadLocalData::is_evac_allowed(Thread::current()), "STS should be left after evac scope");
    +  }
    +  ~ShenandoahSuspendibleThreadSetLeaver() {
    +    assert(!ShenandoahThreadLocalData::is_evac_allowed(Thread::current()), "STS should be joined before evac scope");
    +  }
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAHUTILS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp
    new file mode 100644
    index 00000000000..048dafd0e2b
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp
    @@ -0,0 +1,85 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "gc/shenandoah/shenandoahVMOperations.hpp"
    +
    +bool VM_ShenandoahReferenceOperation::doit_prologue() {
    +  Heap_lock->lock();
    +  return true;
    +}
    +
    +void VM_ShenandoahReferenceOperation::doit_epilogue() {
    +  if (Universe::has_reference_pending_list()) {
    +    Heap_lock->notify_all();
    +  }
    +  Heap_lock->unlock();
    +}
    +
    +void VM_ShenandoahInitMark::doit() {
    +  ShenandoahGCPauseMark mark(_gc_id, SvcGCMarker::CONCURRENT);
    +  ShenandoahHeap::heap()->entry_init_mark();
    +}
    +
    +void VM_ShenandoahFinalMarkStartEvac::doit() {
    +  ShenandoahGCPauseMark mark(_gc_id, SvcGCMarker::CONCURRENT);
    +  ShenandoahHeap::heap()->entry_final_mark();
    +}
    +
    +void VM_ShenandoahFinalEvac::doit() {
    +  ShenandoahGCPauseMark mark(_gc_id, SvcGCMarker::CONCURRENT);
    +  ShenandoahHeap::heap()->entry_final_evac();
    +}
    +
    +void VM_ShenandoahFullGC::doit() {
    +  ShenandoahGCPauseMark mark(_gc_id, SvcGCMarker::FULL);
    +  ShenandoahHeap::heap()->entry_full(_gc_cause);
    +}
    +
    +void VM_ShenandoahDegeneratedGC::doit() {
    +  ShenandoahGCPauseMark mark(_gc_id, SvcGCMarker::CONCURRENT);
    +  ShenandoahHeap::heap()->entry_degenerated(_point);
    +}
    +
    +void VM_ShenandoahInitTraversalGC::doit() {
    +  ShenandoahGCPauseMark mark(_gc_id, SvcGCMarker::CONCURRENT);
    +  ShenandoahHeap::heap()->entry_init_traversal();
    +}
    +
    +void VM_ShenandoahFinalTraversalGC::doit() {
    +  ShenandoahGCPauseMark mark(_gc_id, SvcGCMarker::CONCURRENT);
    +  ShenandoahHeap::heap()->entry_final_traversal();
    +}
    +
    +void VM_ShenandoahInitUpdateRefs::doit() {
    +  ShenandoahGCPauseMark mark(_gc_id, SvcGCMarker::CONCURRENT);
    +  ShenandoahHeap::heap()->entry_init_updaterefs();
    +}
    +
    +void VM_ShenandoahFinalUpdateRefs::doit() {
    +  ShenandoahGCPauseMark mark(_gc_id, SvcGCMarker::CONCURRENT);
    +  ShenandoahHeap::heap()->entry_final_updaterefs();
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.hpp b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.hpp
    new file mode 100644
    index 00000000000..dcaed4e0d5f
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.hpp
    @@ -0,0 +1,134 @@
    +/*
    + * Copyright (c) 2013, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_VM_OPERATIONS_SHENANDOAH_HPP
    +#define SHARE_VM_GC_SHENANDOAH_VM_OPERATIONS_SHENANDOAH_HPP
    +
    +#include "gc/shared/gcVMOperations.hpp"
    +
    +// VM_operations for the Shenandoah Collector.
    +//
    +// VM_ShenandoahOperation
    +//   - VM_ShenandoahInitMark: initiate concurrent marking
    +//   - VM_ShenandoahReferenceOperation:
    +//       - VM_ShenandoahFinalMarkStartEvac: finish up concurrent marking, and start evacuation
    +//       - VM_ShenandoahFinalEvac: finish concurrent evacuation
    +//       - VM_ShenandoahInitUpdateRefs: initiate update references
    +//       - VM_ShenandoahFinalUpdateRefs: finish up update references
    +//       - VM_ShenandoahFullGC: do full GC
    +//       - VM_ShenandoahInitTraversalGC: init traversal GC
    +//       - VM_ShenandoahFinalTraversalGC: finish traversal GC
    +
    +class VM_ShenandoahOperation : public VM_Operation {
    +protected:
    +  uint         _gc_id;
    +public:
    +  VM_ShenandoahOperation() : _gc_id(GCId::current()) {};
    +};
    +
    +class VM_ShenandoahReferenceOperation : public VM_ShenandoahOperation {
    +public:
    +  VM_ShenandoahReferenceOperation() : VM_ShenandoahOperation() {};
    +  bool doit_prologue();
    +  void doit_epilogue();
    +};
    +
    +class VM_ShenandoahInitMark: public VM_ShenandoahOperation {
    +public:
    +  VM_ShenandoahInitMark() : VM_ShenandoahOperation() {};
    +  VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahInitMark; }
    +  const char* name()             const { return "Shenandoah Init Marking"; }
    +  virtual void doit();
    +};
    +
    +class VM_ShenandoahFinalMarkStartEvac: public VM_ShenandoahReferenceOperation {
    +public:
    +  VM_ShenandoahFinalMarkStartEvac() : VM_ShenandoahReferenceOperation() {};
    +  VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahFinalMarkStartEvac; }
    +  const char* name()             const { return "Shenandoah Final Mark and Start Evacuation"; }
    +  virtual  void doit();
    +};
    +
    +class VM_ShenandoahFinalEvac: public VM_ShenandoahOperation {
    +public:
    +  VM_ShenandoahFinalEvac() : VM_ShenandoahOperation() {};
    +  VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahFinalEvac; }
    +  const char* name()             const { return "Shenandoah Final Evacuation"; }
    +  virtual  void doit();
    +};
    +
    +class VM_ShenandoahDegeneratedGC: public VM_ShenandoahReferenceOperation {
    +private:
    +  // Really the ShenandoahHeap::ShenandoahDegenerationPoint, but casted to int here
    +  // in order to avoid dependency on ShenandoahHeap
    +  int _point;
    +public:
    +  VM_ShenandoahDegeneratedGC(int point) : VM_ShenandoahReferenceOperation(), _point(point) {};
    +  VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahDegeneratedGC; }
    +  const char* name()             const { return "Shenandoah Degenerated GC"; }
    +  virtual  void doit();
    +};
    +
    +class VM_ShenandoahFullGC : public VM_ShenandoahReferenceOperation {
    +private:
    +  GCCause::Cause _gc_cause;
    +public:
    +  VM_ShenandoahFullGC(GCCause::Cause gc_cause) : VM_ShenandoahReferenceOperation(), _gc_cause(gc_cause) {};
    +  VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahFullGC; }
    +  const char* name()             const { return "Shenandoah Full GC"; }
    +  virtual void doit();
    +};
    +
    +class VM_ShenandoahInitTraversalGC: public VM_ShenandoahOperation {
    +public:
    +  VM_ShenandoahInitTraversalGC() : VM_ShenandoahOperation() {};
    +  VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahInitTraversalGC; }
    +  const char* name()             const { return "Shenandoah Init Traversal Collection"; }
    +  virtual void doit();
    +};
    +
    +class VM_ShenandoahFinalTraversalGC: public VM_ShenandoahReferenceOperation {
    +public:
    +  VM_ShenandoahFinalTraversalGC() : VM_ShenandoahReferenceOperation() {};
    +  VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahFinalTraversalGC; }
    +  const char* name()             const { return "Shenandoah Final Traversal Collection"; }
    +  virtual void doit();
    +};
    +
    +class VM_ShenandoahInitUpdateRefs: public VM_ShenandoahOperation {
    +public:
    +  VM_ShenandoahInitUpdateRefs() : VM_ShenandoahOperation() {};
    +  VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahInitUpdateRefs; }
    +  const char* name()             const { return "Shenandoah Init Update References"; }
    +  virtual void doit();
    +};
    +
    +class VM_ShenandoahFinalUpdateRefs: public VM_ShenandoahOperation {
    +public:
    +  VM_ShenandoahFinalUpdateRefs() : VM_ShenandoahOperation() {};
    +  VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahFinalUpdateRefs; }
    +  const char* name()             const { return "Shenandoah Final Update References"; }
    +  virtual void doit();
    +};
    +
    +#endif //SHARE_VM_GC_SHENANDOAH_VM_OPERATIONS_SHENANDOAH_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp
    new file mode 100644
    index 00000000000..88909fc7bfb
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp
    @@ -0,0 +1,906 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahAsserts.hpp"
    +#include "gc/shenandoah/shenandoahBrooksPointer.hpp"
    +#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahRootProcessor.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +#include "gc/shenandoah/shenandoahUtils.hpp"
    +#include "gc/shenandoah/shenandoahVerifier.hpp"
    +#include "memory/allocation.hpp"
    +#include "memory/iterator.inline.hpp"
    +#include "memory/resourceArea.hpp"
    +
    +// Avoid name collision on verify_oop (defined in macroAssembler_arm.hpp)
    +#ifdef verify_oop
    +#undef verify_oop
    +#endif
    +
    +class ShenandoahVerifyOopClosure : public BasicOopIterateClosure {
    +private:
    +  const char* _phase;
    +  ShenandoahVerifier::VerifyOptions _options;
    +  ShenandoahVerifierStack* _stack;
    +  ShenandoahHeap* _heap;
    +  MarkBitMap* _map;
    +  ShenandoahLivenessData* _ld;
    +  void* _interior_loc;
    +  oop _loc;
    +
    +public:
    +  ShenandoahVerifyOopClosure(ShenandoahVerifierStack* stack, MarkBitMap* map, ShenandoahLivenessData* ld,
    +                             const char* phase, ShenandoahVerifier::VerifyOptions options) :
    +    _phase(phase),
    +    _options(options),
    +    _stack(stack),
    +    _heap(ShenandoahHeap::heap()),
    +    _map(map),
    +    _ld(ld),
    +    _interior_loc(NULL),
    +    _loc(NULL) { }
    +
    +private:
    +  void check(ShenandoahAsserts::SafeLevel level, oop obj, bool test, const char* label) {
    +    if (!test) {
    +      ShenandoahAsserts::print_failure(level, obj, _interior_loc, _loc, _phase, label, __FILE__, __LINE__);
    +    }
    +  }
    +
    +  template 
    +  void do_oop_work(T* p) {
    +    T o = RawAccess<>::oop_load(p);
    +    if (!CompressedOops::is_null(o)) {
    +      oop obj = CompressedOops::decode_not_null(o);
    +
    +      // Single threaded verification can use faster non-atomic stack and bitmap
    +      // methods.
    +      //
    +      // For performance reasons, only fully verify non-marked field values.
    +      // We are here when the host object for *p is already marked.
    +
    +      HeapWord* addr = (HeapWord*) obj;
    +      if (_map->par_mark(addr)) {
    +        verify_oop_at(p, obj);
    +        _stack->push(ShenandoahVerifierTask(obj));
    +      }
    +    }
    +  }
    +
    +  void verify_oop(oop obj) {
    +    // Perform consistency checks with gradually decreasing safety level. This guarantees
    +    // that failure report would not try to touch something that was not yet verified to be
    +    // safe to process.
    +
    +    check(ShenandoahAsserts::_safe_unknown, obj, _heap->is_in(obj),
    +              "oop must be in heap");
    +    check(ShenandoahAsserts::_safe_unknown, obj, check_obj_alignment(obj),
    +              "oop must be aligned");
    +
    +    ShenandoahHeapRegion *obj_reg = _heap->heap_region_containing(obj);
    +    Klass* obj_klass = obj->klass_or_null();
    +
    +    // Verify that obj is not in dead space:
    +    {
    +      // Do this before touching obj->size()
    +      check(ShenandoahAsserts::_safe_unknown, obj, obj_klass != NULL,
    +             "Object klass pointer should not be NULL");
    +      check(ShenandoahAsserts::_safe_unknown, obj, Metaspace::contains(obj_klass),
    +             "Object klass pointer must go to metaspace");
    +
    +      HeapWord *obj_addr = (HeapWord *) obj;
    +      check(ShenandoahAsserts::_safe_unknown, obj, obj_addr < obj_reg->top(),
    +             "Object start should be within the region");
    +
    +      if (!obj_reg->is_humongous()) {
    +        check(ShenandoahAsserts::_safe_unknown, obj, (obj_addr + obj->size()) <= obj_reg->top(),
    +               "Object end should be within the region");
    +      } else {
    +        size_t humongous_start = obj_reg->region_number();
    +        size_t humongous_end = humongous_start + (obj->size() >> ShenandoahHeapRegion::region_size_words_shift());
    +        for (size_t idx = humongous_start + 1; idx < humongous_end; idx++) {
    +          check(ShenandoahAsserts::_safe_unknown, obj, _heap->get_region(idx)->is_humongous_continuation(),
    +                 "Humongous object is in continuation that fits it");
    +        }
    +      }
    +
    +      // ------------ obj is safe at this point --------------
    +
    +      check(ShenandoahAsserts::_safe_oop, obj, obj_reg->is_active(),
    +            "Object should be in active region");
    +
    +      switch (_options._verify_liveness) {
    +        case ShenandoahVerifier::_verify_liveness_disable:
    +          // skip
    +          break;
    +        case ShenandoahVerifier::_verify_liveness_complete:
    +          Atomic::add(obj->size() + ShenandoahBrooksPointer::word_size(), &_ld[obj_reg->region_number()]);
    +          // fallthrough for fast failure for un-live regions:
    +        case ShenandoahVerifier::_verify_liveness_conservative:
    +          check(ShenandoahAsserts::_safe_oop, obj, obj_reg->has_live(),
    +                   "Object must belong to region with live data");
    +          break;
    +        default:
    +          assert(false, "Unhandled liveness verification");
    +      }
    +    }
    +
    +    oop fwd = (oop) ShenandoahBrooksPointer::get_raw_unchecked(obj);
    +
    +    ShenandoahHeapRegion* fwd_reg = NULL;
    +
    +    if (!oopDesc::equals_raw(obj, fwd)) {
    +      check(ShenandoahAsserts::_safe_oop, obj, _heap->is_in(fwd),
    +             "Forwardee must be in heap");
    +      check(ShenandoahAsserts::_safe_oop, obj, !CompressedOops::is_null(fwd),
    +             "Forwardee is set");
    +      check(ShenandoahAsserts::_safe_oop, obj, check_obj_alignment(fwd),
    +             "Forwardee must be aligned");
    +
    +      // Do this before touching fwd->size()
    +      Klass* fwd_klass = fwd->klass_or_null();
    +      check(ShenandoahAsserts::_safe_oop, obj, fwd_klass != NULL,
    +             "Forwardee klass pointer should not be NULL");
    +      check(ShenandoahAsserts::_safe_oop, obj, Metaspace::contains(fwd_klass),
    +             "Forwardee klass pointer must go to metaspace");
    +      check(ShenandoahAsserts::_safe_oop, obj, obj_klass == fwd_klass,
    +             "Forwardee klass pointer must go to metaspace");
    +
    +      fwd_reg = _heap->heap_region_containing(fwd);
    +
    +      // Verify that forwardee is not in the dead space:
    +      check(ShenandoahAsserts::_safe_oop, obj, !fwd_reg->is_humongous(),
    +             "Should have no humongous forwardees");
    +
    +      HeapWord *fwd_addr = (HeapWord *) fwd;
    +      check(ShenandoahAsserts::_safe_oop, obj, fwd_addr < fwd_reg->top(),
    +             "Forwardee start should be within the region");
    +      check(ShenandoahAsserts::_safe_oop, obj, (fwd_addr + fwd->size()) <= fwd_reg->top(),
    +             "Forwardee end should be within the region");
    +
    +      oop fwd2 = (oop) ShenandoahBrooksPointer::get_raw_unchecked(fwd);
    +      check(ShenandoahAsserts::_safe_oop, obj, oopDesc::equals_raw(fwd, fwd2),
    +             "Double forwarding");
    +    } else {
    +      fwd_reg = obj_reg;
    +    }
    +
    +    // ------------ obj and fwd are safe at this point --------------
    +
    +    switch (_options._verify_marked) {
    +      case ShenandoahVerifier::_verify_marked_disable:
    +        // skip
    +        break;
    +      case ShenandoahVerifier::_verify_marked_incomplete:
    +        check(ShenandoahAsserts::_safe_all, obj, _heap->marking_context()->is_marked(obj),
    +               "Must be marked in incomplete bitmap");
    +        break;
    +      case ShenandoahVerifier::_verify_marked_complete:
    +        check(ShenandoahAsserts::_safe_all, obj, _heap->complete_marking_context()->is_marked(obj),
    +               "Must be marked in complete bitmap");
    +        break;
    +      default:
    +        assert(false, "Unhandled mark verification");
    +    }
    +
    +    switch (_options._verify_forwarded) {
    +      case ShenandoahVerifier::_verify_forwarded_disable:
    +        // skip
    +        break;
    +      case ShenandoahVerifier::_verify_forwarded_none: {
    +        check(ShenandoahAsserts::_safe_all, obj, oopDesc::equals_raw(obj, fwd),
    +               "Should not be forwarded");
    +        break;
    +      }
    +      case ShenandoahVerifier::_verify_forwarded_allow: {
    +        if (!oopDesc::equals_raw(obj, fwd)) {
    +          check(ShenandoahAsserts::_safe_all, obj, obj_reg != fwd_reg,
    +                 "Forwardee should be in another region");
    +        }
    +        break;
    +      }
    +      default:
    +        assert(false, "Unhandled forwarding verification");
    +    }
    +
    +    switch (_options._verify_cset) {
    +      case ShenandoahVerifier::_verify_cset_disable:
    +        // skip
    +        break;
    +      case ShenandoahVerifier::_verify_cset_none:
    +        check(ShenandoahAsserts::_safe_all, obj, !_heap->in_collection_set(obj),
    +               "Should not have references to collection set");
    +        break;
    +      case ShenandoahVerifier::_verify_cset_forwarded:
    +        if (_heap->in_collection_set(obj)) {
    +          check(ShenandoahAsserts::_safe_all, obj, !oopDesc::equals_raw(obj, fwd),
    +                 "Object in collection set, should have forwardee");
    +        }
    +        break;
    +      default:
    +        assert(false, "Unhandled cset verification");
    +    }
    +
    +  }
    +
    +public:
    +  /**
    +   * Verify object with known interior reference.
    +   * @param p interior reference where the object is referenced from; can be off-heap
    +   * @param obj verified object
    +   */
    +  template 
    +  void verify_oop_at(T* p, oop obj) {
    +    _interior_loc = p;
    +    verify_oop(obj);
    +    _interior_loc = NULL;
    +  }
    +
    +  /**
    +   * Verify object without known interior reference.
    +   * Useful when picking up the object at known offset in heap,
    +   * but without knowing what objects reference it.
    +   * @param obj verified object
    +   */
    +  void verify_oop_standalone(oop obj) {
    +    _interior_loc = NULL;
    +    verify_oop(obj);
    +    _interior_loc = NULL;
    +  }
    +
    +  /**
    +   * Verify oop fields from this object.
    +   * @param obj host object for verified fields
    +   */
    +  void verify_oops_from(oop obj) {
    +    _loc = obj;
    +    obj->oop_iterate(this);
    +    _loc = NULL;
    +  }
    +
    +  virtual void do_oop(oop* p) { do_oop_work(p); }
    +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    +};
    +
    +class ShenandoahCalculateRegionStatsClosure : public ShenandoahHeapRegionClosure {
    +private:
    +  size_t _used, _committed, _garbage;
    +public:
    +  ShenandoahCalculateRegionStatsClosure() : _used(0), _committed(0), _garbage(0) {};
    +
    +  void heap_region_do(ShenandoahHeapRegion* r) {
    +    _used += r->used();
    +    _garbage += r->garbage();
    +    _committed += r->is_committed() ? ShenandoahHeapRegion::region_size_bytes() : 0;
    +  }
    +
    +  size_t used() { return _used; }
    +  size_t committed() { return _committed; }
    +  size_t garbage() { return _garbage; }
    +};
    +
    +class ShenandoahVerifyHeapRegionClosure : public ShenandoahHeapRegionClosure {
    +private:
    +  ShenandoahHeap* _heap;
    +  const char* _phase;
    +  ShenandoahVerifier::VerifyRegions _regions;
    +public:
    +  ShenandoahVerifyHeapRegionClosure(const char* phase, ShenandoahVerifier::VerifyRegions regions) :
    +    _heap(ShenandoahHeap::heap()),
    +    _phase(phase),
    +    _regions(regions) {};
    +
    +  void print_failure(ShenandoahHeapRegion* r, const char* label) {
    +    ResourceMark rm;
    +
    +    ShenandoahMessageBuffer msg("Shenandoah verification failed; %s: %s\n\n", _phase, label);
    +
    +    stringStream ss;
    +    r->print_on(&ss);
    +    msg.append("%s", ss.as_string());
    +
    +    report_vm_error(__FILE__, __LINE__, msg.buffer());
    +  }
    +
    +  void verify(ShenandoahHeapRegion* r, bool test, const char* msg) {
    +    if (!test) {
    +      print_failure(r, msg);
    +    }
    +  }
    +
    +  void heap_region_do(ShenandoahHeapRegion* r) {
    +    switch (_regions) {
    +      case ShenandoahVerifier::_verify_regions_disable:
    +        break;
    +      case ShenandoahVerifier::_verify_regions_notrash:
    +        verify(r, !r->is_trash(),
    +               "Should not have trash regions");
    +        break;
    +      case ShenandoahVerifier::_verify_regions_nocset:
    +        verify(r, !r->is_cset(),
    +               "Should not have cset regions");
    +        break;
    +      case ShenandoahVerifier::_verify_regions_notrash_nocset:
    +        verify(r, !r->is_trash(),
    +               "Should not have trash regions");
    +        verify(r, !r->is_cset(),
    +               "Should not have cset regions");
    +        break;
    +      default:
    +        ShouldNotReachHere();
    +    }
    +
    +    verify(r, r->capacity() == ShenandoahHeapRegion::region_size_bytes(),
    +           "Capacity should match region size");
    +
    +    verify(r, r->bottom() <= r->top(),
    +           "Region top should not be less than bottom");
    +
    +    verify(r, r->bottom() <= _heap->marking_context()->top_at_mark_start(r),
    +           "Region TAMS should not be less than bottom");
    +
    +    verify(r, _heap->marking_context()->top_at_mark_start(r) <= r->top(),
    +           "Complete TAMS should not be larger than top");
    +
    +    verify(r, r->get_live_data_bytes() <= r->capacity(),
    +           "Live data cannot be larger than capacity");
    +
    +    verify(r, r->garbage() <= r->capacity(),
    +           "Garbage cannot be larger than capacity");
    +
    +    verify(r, r->used() <= r->capacity(),
    +           "Used cannot be larger than capacity");
    +
    +    verify(r, r->get_shared_allocs() <= r->capacity(),
    +           "Shared alloc count should not be larger than capacity");
    +
    +    verify(r, r->get_tlab_allocs() <= r->capacity(),
    +           "TLAB alloc count should not be larger than capacity");
    +
    +    verify(r, r->get_gclab_allocs() <= r->capacity(),
    +           "GCLAB alloc count should not be larger than capacity");
    +
    +    verify(r, r->get_shared_allocs() + r->get_tlab_allocs() + r->get_gclab_allocs() == r->used(),
    +           "Accurate accounting: shared + TLAB + GCLAB = used");
    +
    +    verify(r, !r->is_empty() || !r->has_live(),
    +           "Empty regions should not have live data");
    +
    +    verify(r, r->is_cset() == _heap->collection_set()->is_in(r),
    +           "Transitional: region flags and collection set agree");
    +
    +    verify(r, r->is_empty() || r->seqnum_first_alloc() != 0,
    +           "Non-empty regions should have first seqnum set");
    +
    +    verify(r, r->is_empty() || (r->seqnum_first_alloc_mutator() != 0 || r->seqnum_first_alloc_gc() != 0),
    +           "Non-empty regions should have first seqnum set to either GC or mutator");
    +
    +    verify(r, r->is_empty() || r->seqnum_last_alloc() != 0,
    +           "Non-empty regions should have last seqnum set");
    +
    +    verify(r, r->is_empty() || (r->seqnum_last_alloc_mutator() != 0 || r->seqnum_last_alloc_gc() != 0),
    +           "Non-empty regions should have last seqnum set to either GC or mutator");
    +
    +    verify(r, r->seqnum_first_alloc() <= r->seqnum_last_alloc(),
    +           "First seqnum should not be greater than last timestamp");
    +
    +    verify(r, r->seqnum_first_alloc_mutator() <= r->seqnum_last_alloc_mutator(),
    +           "First mutator seqnum should not be greater than last seqnum");
    +
    +    verify(r, r->seqnum_first_alloc_gc() <= r->seqnum_last_alloc_gc(),
    +           "First GC seqnum should not be greater than last seqnum");
    +  }
    +};
    +
    +class ShenandoahVerifierReachableTask : public AbstractGangTask {
    +private:
    +  const char* _label;
    +  ShenandoahRootProcessor* _rp;
    +  ShenandoahVerifier::VerifyOptions _options;
    +  ShenandoahHeap* _heap;
    +  ShenandoahLivenessData* _ld;
    +  MarkBitMap* _bitmap;
    +  volatile size_t _processed;
    +
    +public:
    +  ShenandoahVerifierReachableTask(MarkBitMap* bitmap,
    +                                  ShenandoahLivenessData* ld,
    +                                  ShenandoahRootProcessor* rp,
    +                                  const char* label,
    +                                  ShenandoahVerifier::VerifyOptions options) :
    +    AbstractGangTask("Shenandoah Parallel Verifier Reachable Task"),
    +    _label(label),
    +    _rp(rp),
    +    _options(options),
    +    _heap(ShenandoahHeap::heap()),
    +    _ld(ld),
    +    _bitmap(bitmap),
    +    _processed(0) {};
    +
    +  size_t processed() {
    +    return _processed;
    +  }
    +
    +  virtual void work(uint worker_id) {
    +    ResourceMark rm;
    +    ShenandoahVerifierStack stack;
    +
    +    // On level 2, we need to only check the roots once.
    +    // On level 3, we want to check the roots, and seed the local stack.
    +    // It is a lesser evil to accept multiple root scans at level 3, because
    +    // extended parallelism would buy us out.
    +    if (((ShenandoahVerifyLevel == 2) && (worker_id == 0))
    +        || (ShenandoahVerifyLevel >= 3)) {
    +        ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld,
    +                                      ShenandoahMessageBuffer("%s, Roots", _label),
    +                                      _options);
    +        _rp->process_all_roots_slow(&cl);
    +    }
    +
    +    size_t processed = 0;
    +
    +    if (ShenandoahVerifyLevel >= 3) {
    +      ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld,
    +                                    ShenandoahMessageBuffer("%s, Reachable", _label),
    +                                    _options);
    +      while (!stack.is_empty()) {
    +        processed++;
    +        ShenandoahVerifierTask task = stack.pop();
    +        cl.verify_oops_from(task.obj());
    +      }
    +    }
    +
    +    Atomic::add(processed, &_processed);
    +  }
    +};
    +
    +class ShenandoahVerifierMarkedRegionTask : public AbstractGangTask {
    +private:
    +  const char* _label;
    +  ShenandoahVerifier::VerifyOptions _options;
    +  ShenandoahHeap *_heap;
    +  MarkBitMap* _bitmap;
    +  ShenandoahLivenessData* _ld;
    +  volatile size_t _claimed;
    +  volatile size_t _processed;
    +
    +public:
    +  ShenandoahVerifierMarkedRegionTask(MarkBitMap* bitmap,
    +                                     ShenandoahLivenessData* ld,
    +                                     const char* label,
    +                                     ShenandoahVerifier::VerifyOptions options) :
    +          AbstractGangTask("Shenandoah Parallel Verifier Marked Region"),
    +          _label(label),
    +          _options(options),
    +          _heap(ShenandoahHeap::heap()),
    +          _bitmap(bitmap),
    +          _ld(ld),
    +          _claimed(0),
    +          _processed(0) {};
    +
    +  size_t processed() {
    +    return _processed;
    +  }
    +
    +  virtual void work(uint worker_id) {
    +    ShenandoahVerifierStack stack;
    +    ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld,
    +                                  ShenandoahMessageBuffer("%s, Marked", _label),
    +                                  _options);
    +
    +    while (true) {
    +      size_t v = Atomic::add(1u, &_claimed) - 1;
    +      if (v < _heap->num_regions()) {
    +        ShenandoahHeapRegion* r = _heap->get_region(v);
    +        if (!r->is_humongous() && !r->is_trash()) {
    +          work_regular(r, stack, cl);
    +        } else if (r->is_humongous_start()) {
    +          work_humongous(r, stack, cl);
    +        }
    +      } else {
    +        break;
    +      }
    +    }
    +  }
    +
    +  virtual void work_humongous(ShenandoahHeapRegion *r, ShenandoahVerifierStack& stack, ShenandoahVerifyOopClosure& cl) {
    +    size_t processed = 0;
    +    HeapWord* obj = r->bottom() + ShenandoahBrooksPointer::word_size();
    +    if (_heap->complete_marking_context()->is_marked((oop)obj)) {
    +      verify_and_follow(obj, stack, cl, &processed);
    +    }
    +    Atomic::add(processed, &_processed);
    +  }
    +
    +  virtual void work_regular(ShenandoahHeapRegion *r, ShenandoahVerifierStack &stack, ShenandoahVerifyOopClosure &cl) {
    +    size_t processed = 0;
    +    MarkBitMap* mark_bit_map = _heap->complete_marking_context()->mark_bit_map();
    +    HeapWord* tams = _heap->complete_marking_context()->top_at_mark_start(r);
    +
    +    // Bitmaps, before TAMS
    +    if (tams > r->bottom()) {
    +      HeapWord* start = r->bottom() + ShenandoahBrooksPointer::word_size();
    +      HeapWord* addr = mark_bit_map->get_next_marked_addr(start, tams);
    +
    +      while (addr < tams) {
    +        verify_and_follow(addr, stack, cl, &processed);
    +        addr += ShenandoahBrooksPointer::word_size();
    +        if (addr < tams) {
    +          addr = mark_bit_map->get_next_marked_addr(addr, tams);
    +        }
    +      }
    +    }
    +
    +    // Size-based, after TAMS
    +    {
    +      HeapWord* limit = r->top();
    +      HeapWord* addr = tams + ShenandoahBrooksPointer::word_size();
    +
    +      while (addr < limit) {
    +        verify_and_follow(addr, stack, cl, &processed);
    +        addr += oop(addr)->size() + ShenandoahBrooksPointer::word_size();
    +      }
    +    }
    +
    +    Atomic::add(processed, &_processed);
    +  }
    +
    +  void verify_and_follow(HeapWord *addr, ShenandoahVerifierStack &stack, ShenandoahVerifyOopClosure &cl, size_t *processed) {
    +    if (!_bitmap->par_mark(addr)) return;
    +
    +    // Verify the object itself:
    +    oop obj = oop(addr);
    +    cl.verify_oop_standalone(obj);
    +
    +    // Verify everything reachable from that object too, hopefully realizing
    +    // everything was already marked, and never touching further:
    +    cl.verify_oops_from(obj);
    +    (*processed)++;
    +
    +    while (!stack.is_empty()) {
    +      ShenandoahVerifierTask task = stack.pop();
    +      cl.verify_oops_from(task.obj());
    +      (*processed)++;
    +    }
    +  }
    +};
    +
    +class VerifyThreadGCState : public ThreadClosure {
    +private:
    +  const char* _label;
    +  char _expected;
    +
    +public:
    +  VerifyThreadGCState(const char* label, char expected) : _expected(expected) {}
    +  void do_thread(Thread* t) {
    +    char actual = ShenandoahThreadLocalData::gc_state(t);
    +    if (actual != _expected) {
    +      fatal("%s: Thread %s: expected gc-state %d, actual %d", _label, t->name(), _expected, actual);
    +    }
    +  }
    +};
    +
    +void ShenandoahVerifier::verify_at_safepoint(const char *label,
    +                                             VerifyForwarded forwarded, VerifyMarked marked,
    +                                             VerifyCollectionSet cset,
    +                                             VerifyLiveness liveness, VerifyRegions regions,
    +                                             VerifyGCState gcstate) {
    +  guarantee(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "only when nothing else happens");
    +  guarantee(ShenandoahVerify, "only when enabled, and bitmap is initialized in ShenandoahHeap::initialize");
    +
    +  // Avoid side-effect of changing workers' active thread count, but bypass concurrent/parallel protocol check
    +  ShenandoahPushWorkerScope verify_worker_scope(_heap->workers(), _heap->max_workers(), false /*bypass check*/);
    +
    +  log_info(gc,start)("Verify %s, Level " INTX_FORMAT, label, ShenandoahVerifyLevel);
    +
    +  // GC state checks
    +  {
    +    char expected = -1;
    +    bool enabled;
    +    switch (gcstate) {
    +      case _verify_gcstate_disable:
    +        enabled = false;
    +        break;
    +      case _verify_gcstate_forwarded:
    +        enabled = true;
    +        expected = ShenandoahHeap::HAS_FORWARDED;
    +        break;
    +      case _verify_gcstate_stable:
    +        enabled = true;
    +        expected = ShenandoahHeap::STABLE;
    +        break;
    +      default:
    +        enabled = false;
    +        assert(false, "Unhandled gc-state verification");
    +    }
    +
    +    if (enabled) {
    +      char actual = _heap->gc_state();
    +      if (actual != expected) {
    +        fatal("%s: Global gc-state: expected %d, actual %d", label, expected, actual);
    +      }
    +
    +      VerifyThreadGCState vtgcs(label, expected);
    +      Threads::java_threads_do(&vtgcs);
    +    }
    +  }
    +
    +  // Heap size checks
    +  {
    +    ShenandoahHeapLocker lock(_heap->lock());
    +
    +    ShenandoahCalculateRegionStatsClosure cl;
    +    _heap->heap_region_iterate(&cl);
    +    size_t heap_used = _heap->used();
    +    guarantee(cl.used() == heap_used,
    +              "%s: heap used size must be consistent: heap-used = " SIZE_FORMAT "K, regions-used = " SIZE_FORMAT "K",
    +              label, heap_used/K, cl.used()/K);
    +
    +    size_t heap_committed = _heap->committed();
    +    guarantee(cl.committed() == heap_committed,
    +              "%s: heap committed size must be consistent: heap-committed = " SIZE_FORMAT "K, regions-committed = " SIZE_FORMAT "K",
    +              label, heap_committed/K, cl.committed()/K);
    +  }
    +
    +  // Internal heap region checks
    +  if (ShenandoahVerifyLevel >= 1) {
    +    ShenandoahVerifyHeapRegionClosure cl(label, regions);
    +    _heap->heap_region_iterate(&cl);
    +  }
    +
    +  OrderAccess::fence();
    +  _heap->make_parsable(false);
    +
    +  // Allocate temporary bitmap for storing marking wavefront:
    +  _verification_bit_map->clear();
    +
    +  // Allocate temporary array for storing liveness data
    +  ShenandoahLivenessData* ld = NEW_C_HEAP_ARRAY(ShenandoahLivenessData, _heap->num_regions(), mtGC);
    +  Copy::fill_to_bytes((void*)ld, _heap->num_regions()*sizeof(ShenandoahLivenessData), 0);
    +
    +  const VerifyOptions& options = ShenandoahVerifier::VerifyOptions(forwarded, marked, cset, liveness, regions, gcstate);
    +
    +  // Steps 1-2. Scan root set to get initial reachable set. Finish walking the reachable heap.
    +  // This verifies what application can see, since it only cares about reachable objects.
    +  size_t count_reachable = 0;
    +  if (ShenandoahVerifyLevel >= 2) {
    +    ShenandoahRootProcessor rp(_heap, _heap->workers()->active_workers(),
    +                               ShenandoahPhaseTimings::_num_phases); // no need for stats
    +
    +    ShenandoahVerifierReachableTask task(_verification_bit_map, ld, &rp, label, options);
    +    _heap->workers()->run_task(&task);
    +    count_reachable = task.processed();
    +  }
    +
    +  // Step 3. Walk marked objects. Marked objects might be unreachable. This verifies what collector,
    +  // not the application, can see during the region scans. There is no reason to process the objects
    +  // that were already verified, e.g. those marked in verification bitmap. There is interaction with TAMS:
    +  // before TAMS, we verify the bitmaps, if available; after TAMS, we walk until the top(). It mimics
    +  // what marked_object_iterate is doing, without calling into that optimized (and possibly incorrect)
    +  // version
    +
    +  size_t count_marked = 0;
    +  if (ShenandoahVerifyLevel >= 4 && marked == _verify_marked_complete) {
    +    guarantee(_heap->marking_context()->is_complete(), "Marking context should be complete");
    +    ShenandoahVerifierMarkedRegionTask task(_verification_bit_map, ld, label, options);
    +    _heap->workers()->run_task(&task);
    +    count_marked = task.processed();
    +  } else {
    +    guarantee(ShenandoahVerifyLevel < 4 || marked == _verify_marked_incomplete || marked == _verify_marked_disable, "Should be");
    +  }
    +
    +  // Step 4. Verify accumulated liveness data, if needed. Only reliable if verification level includes
    +  // marked objects.
    +
    +  if (ShenandoahVerifyLevel >= 4 && marked == _verify_marked_complete && liveness == _verify_liveness_complete) {
    +    for (size_t i = 0; i < _heap->num_regions(); i++) {
    +      ShenandoahHeapRegion* r = _heap->get_region(i);
    +
    +      juint verf_live = 0;
    +      if (r->is_humongous()) {
    +        // For humongous objects, test if start region is marked live, and if so,
    +        // all humongous regions in that chain have live data equal to their "used".
    +        juint start_live = OrderAccess::load_acquire(&ld[r->humongous_start_region()->region_number()]);
    +        if (start_live > 0) {
    +          verf_live = (juint)(r->used() / HeapWordSize);
    +        }
    +      } else {
    +        verf_live = OrderAccess::load_acquire(&ld[r->region_number()]);
    +      }
    +
    +      size_t reg_live = r->get_live_data_words();
    +      if (reg_live != verf_live) {
    +        ResourceMark rm;
    +        stringStream ss;
    +        r->print_on(&ss);
    +        fatal("%s: Live data should match: region-live = " SIZE_FORMAT ", verifier-live = " UINT32_FORMAT "\n%s",
    +              label, reg_live, verf_live, ss.as_string());
    +      }
    +    }
    +  }
    +
    +  log_info(gc)("Verify %s, Level " INTX_FORMAT " (" SIZE_FORMAT " reachable, " SIZE_FORMAT " marked)",
    +               label, ShenandoahVerifyLevel, count_reachable, count_marked);
    +
    +  FREE_C_HEAP_ARRAY(ShenandoahLivenessData, ld);
    +}
    +
    +void ShenandoahVerifier::verify_generic(VerifyOption vo) {
    +  verify_at_safepoint(
    +          "Generic Verification",
    +          _verify_forwarded_allow,     // conservatively allow forwarded
    +          _verify_marked_disable,      // do not verify marked: lots ot time wasted checking dead allocations
    +          _verify_cset_disable,        // cset may be inconsistent
    +          _verify_liveness_disable,    // no reliable liveness data
    +          _verify_regions_disable,     // no reliable region data
    +          _verify_gcstate_disable      // no data about gcstate
    +  );
    +}
    +
    +void ShenandoahVerifier::verify_before_concmark() {
    +  if (_heap->has_forwarded_objects()) {
    +    verify_at_safepoint(
    +            "Before Mark",
    +            _verify_forwarded_allow,     // may have forwarded references
    +            _verify_marked_disable,      // do not verify marked: lots ot time wasted checking dead allocations
    +            _verify_cset_forwarded,      // allow forwarded references to cset
    +            _verify_liveness_disable,    // no reliable liveness data
    +            _verify_regions_notrash,     // no trash regions
    +            _verify_gcstate_forwarded    // there are forwarded objects
    +    );
    +  } else {
    +    verify_at_safepoint(
    +            "Before Mark",
    +            _verify_forwarded_none,      // UR should have fixed up
    +            _verify_marked_disable,      // do not verify marked: lots ot time wasted checking dead allocations
    +            _verify_cset_none,           // UR should have fixed this
    +            _verify_liveness_disable,    // no reliable liveness data
    +            _verify_regions_notrash,     // no trash regions
    +            _verify_gcstate_stable       // there are no forwarded objects
    +    );
    +  }
    +}
    +
    +void ShenandoahVerifier::verify_after_concmark() {
    +  verify_at_safepoint(
    +          "After Mark",
    +          _verify_forwarded_none,      // no forwarded references
    +          _verify_marked_complete,     // bitmaps as precise as we can get
    +          _verify_cset_none,           // no references to cset anymore
    +          _verify_liveness_complete,   // liveness data must be complete here
    +          _verify_regions_disable,     // trash regions not yet recycled
    +          _verify_gcstate_stable       // mark should have stabilized the heap
    +  );
    +}
    +
    +void ShenandoahVerifier::verify_before_evacuation() {
    +  verify_at_safepoint(
    +          "Before Evacuation",
    +          _verify_forwarded_none,    // no forwarded references
    +          _verify_marked_complete,   // walk over marked objects too
    +          _verify_cset_disable,      // non-forwarded references to cset expected
    +          _verify_liveness_complete, // liveness data must be complete here
    +          _verify_regions_disable,   // trash regions not yet recycled
    +          _verify_gcstate_stable     // mark should have stabilized the heap
    +  );
    +}
    +
    +void ShenandoahVerifier::verify_after_evacuation() {
    +  verify_at_safepoint(
    +          "After Evacuation",
    +          _verify_forwarded_allow,     // objects are still forwarded
    +          _verify_marked_complete,     // bitmaps might be stale, but alloc-after-mark should be well
    +          _verify_cset_forwarded,      // all cset refs are fully forwarded
    +          _verify_liveness_disable,    // no reliable liveness data anymore
    +          _verify_regions_notrash,     // trash regions have been recycled already
    +          _verify_gcstate_forwarded    // evacuation produced some forwarded objects
    +  );
    +}
    +
    +void ShenandoahVerifier::verify_before_updaterefs() {
    +  verify_at_safepoint(
    +          "Before Updating References",
    +          _verify_forwarded_allow,     // forwarded references allowed
    +          _verify_marked_complete,     // bitmaps might be stale, but alloc-after-mark should be well
    +          _verify_cset_forwarded,      // all cset refs are fully forwarded
    +          _verify_liveness_disable,    // no reliable liveness data anymore
    +          _verify_regions_notrash,     // trash regions have been recycled already
    +          _verify_gcstate_forwarded    // evacuation should have produced some forwarded objects
    +  );
    +}
    +
    +void ShenandoahVerifier::verify_after_updaterefs() {
    +  verify_at_safepoint(
    +          "After Updating References",
    +          _verify_forwarded_none,      // no forwarded references
    +          _verify_marked_complete,     // bitmaps might be stale, but alloc-after-mark should be well
    +          _verify_cset_none,           // no cset references, all updated
    +          _verify_liveness_disable,    // no reliable liveness data anymore
    +          _verify_regions_nocset,      // no cset regions, trash regions have appeared
    +          _verify_gcstate_stable       // update refs had cleaned up forwarded objects
    +  );
    +}
    +
    +void ShenandoahVerifier::verify_after_degenerated() {
    +  verify_at_safepoint(
    +          "After Degenerated GC",
    +          _verify_forwarded_none,      // all objects are non-forwarded
    +          _verify_marked_complete,     // all objects are marked in complete bitmap
    +          _verify_cset_none,           // no cset references
    +          _verify_liveness_disable,    // no reliable liveness data anymore
    +          _verify_regions_notrash_nocset, // no trash, no cset
    +          _verify_gcstate_stable       // degenerated refs had cleaned up forwarded objects
    +  );
    +}
    +
    +void ShenandoahVerifier::verify_before_traversal() {
    +  verify_at_safepoint(
    +          "Before Traversal",
    +          _verify_forwarded_none,      // cannot have forwarded objects
    +          _verify_marked_disable,      // bitmaps are not relevant before traversal
    +          _verify_cset_none,           // no cset references before traversal
    +          _verify_liveness_disable,    // no reliable liveness data anymore
    +          _verify_regions_notrash_nocset, // no trash and no cset regions
    +          _verify_gcstate_stable       // nothing forwarded before traversal
    +  );
    +}
    +
    +void ShenandoahVerifier::verify_after_traversal() {
    +  verify_at_safepoint(
    +          "After Traversal",
    +          _verify_forwarded_none,      // cannot have forwarded objects
    +          _verify_marked_complete,     // should have complete marking after traversal
    +          _verify_cset_none,           // no cset references left after traversal
    +          _verify_liveness_disable,    // liveness data is not collected for new allocations
    +          _verify_regions_nocset,      // no cset regions, trash regions allowed
    +          _verify_gcstate_stable       // nothing forwarded after traversal
    +  );
    +}
    +
    +void ShenandoahVerifier::verify_before_fullgc() {
    +  verify_at_safepoint(
    +          "Before Full GC",
    +          _verify_forwarded_allow,     // can have forwarded objects
    +          _verify_marked_disable,      // do not verify marked: lots ot time wasted checking dead allocations
    +          _verify_cset_disable,        // cset might be foobared
    +          _verify_liveness_disable,    // no reliable liveness data anymore
    +          _verify_regions_disable,     // no reliable region data here
    +          _verify_gcstate_disable      // no reliable gcstate data
    +  );
    +}
    +
    +void ShenandoahVerifier::verify_after_fullgc() {
    +  verify_at_safepoint(
    +          "After Full GC",
    +          _verify_forwarded_none,      // all objects are non-forwarded
    +          _verify_marked_complete,     // all objects are marked in complete bitmap
    +          _verify_cset_none,           // no cset references
    +          _verify_liveness_disable,    // no reliable liveness data anymore
    +          _verify_regions_notrash_nocset, // no trash, no cset
    +          _verify_gcstate_stable       // full gc cleaned up everything
    +  );
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp
    new file mode 100644
    index 00000000000..a16169454cd
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp
    @@ -0,0 +1,187 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHVERIFIER_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHVERIFIER_HPP
    +
    +#include "gc/shared/markBitMap.hpp"
    +#include "memory/allocation.hpp"
    +#include "oops/oopsHierarchy.hpp"
    +#include "utilities/stack.hpp"
    +
    +class ShenandoahHeap;
    +
    +#ifdef _WINDOWS
    +#pragma warning( disable : 4522 )
    +#endif
    +
    +class ShenandoahVerifierTask {
    +public:
    +  ShenandoahVerifierTask(oop o = NULL, int idx = 0): _obj(o) { }
    +  ShenandoahVerifierTask(oop o, size_t idx): _obj(o) { }
    +  ShenandoahVerifierTask(const ShenandoahVerifierTask& t): _obj(t._obj) { }
    +
    +  ShenandoahVerifierTask& operator =(const ShenandoahVerifierTask& t) {
    +    _obj = t._obj;
    +    return *this;
    +  }
    +  volatile ShenandoahVerifierTask&
    +  operator =(const volatile ShenandoahVerifierTask& t) volatile {
    +    (void)const_cast(_obj = t._obj);
    +    return *this;
    +  }
    +
    +  inline oop obj()  const { return _obj; }
    +
    +private:
    +  oop _obj;
    +};
    +
    +typedef Stack ShenandoahVerifierStack;
    +typedef volatile juint ShenandoahLivenessData;
    +
    +class ShenandoahVerifier : public CHeapObj {
    +private:
    +  ShenandoahHeap* _heap;
    +  MarkBitMap* _verification_bit_map;
    +public:
    +  typedef enum {
    +    // Disable marked objects verification.
    +    _verify_marked_disable,
    +
    +    // Objects should be marked in "next" bitmap.
    +    _verify_marked_incomplete,
    +
    +    // Objects should be marked in "complete" bitmap.
    +    _verify_marked_complete,
    +  } VerifyMarked;
    +
    +  typedef enum {
    +    // Disable forwarded objects verification.
    +    _verify_forwarded_disable,
    +
    +    // Objects should not have forwardees.
    +    _verify_forwarded_none,
    +
    +    // Objects may have forwardees.
    +    _verify_forwarded_allow,
    +  } VerifyForwarded;
    +
    +  typedef enum {
    +    // Disable collection set verification.
    +    _verify_cset_disable,
    +
    +    // Should have no references to cset.
    +    _verify_cset_none,
    +
    +    // May have references to cset, all should be forwarded.
    +    // Note: Allowing non-forwarded references to cset is equivalent
    +    // to _verify_cset_disable.
    +    _verify_cset_forwarded,
    +  } VerifyCollectionSet;
    +
    +  typedef enum {
    +    // Disable liveness verification
    +    _verify_liveness_disable,
    +
    +    // All objects should belong to live regions
    +    _verify_liveness_conservative,
    +
    +    // All objects should belong to live regions,
    +    // and liveness data should be accurate
    +    _verify_liveness_complete,
    +  } VerifyLiveness;
    +
    +  typedef enum {
    +    // Disable region verification
    +    _verify_regions_disable,
    +
    +    // No trash regions allowed
    +    _verify_regions_notrash,
    +
    +    // No collection set regions allowed
    +    _verify_regions_nocset,
    +
    +    // No trash and no cset regions allowed
    +    _verify_regions_notrash_nocset,
    +  } VerifyRegions;
    +
    +  typedef enum {
    +    // Disable gc-state verification
    +    _verify_gcstate_disable,
    +
    +    // Nothing is in progress, no forwarded objects
    +    _verify_gcstate_stable,
    +
    +    // Nothing is in progress, some objects are forwarded
    +    _verify_gcstate_forwarded,
    +  } VerifyGCState;
    +
    +  struct VerifyOptions {
    +    VerifyForwarded     _verify_forwarded;
    +    VerifyMarked        _verify_marked;
    +    VerifyCollectionSet _verify_cset;
    +    VerifyLiveness      _verify_liveness;
    +    VerifyRegions       _verify_regions;
    +    VerifyGCState       _verify_gcstate;
    +
    +    VerifyOptions(VerifyForwarded verify_forwarded,
    +                  VerifyMarked verify_marked,
    +                  VerifyCollectionSet verify_collection_set,
    +                  VerifyLiveness verify_liveness,
    +                  VerifyRegions verify_regions,
    +                  VerifyGCState verify_gcstate) :
    +            _verify_forwarded(verify_forwarded), _verify_marked(verify_marked),
    +            _verify_cset(verify_collection_set),
    +            _verify_liveness(verify_liveness), _verify_regions(verify_regions),
    +            _verify_gcstate(verify_gcstate) {}
    +  };
    +
    +private:
    +  void verify_at_safepoint(const char *label,
    +                           VerifyForwarded forwarded,
    +                           VerifyMarked marked,
    +                           VerifyCollectionSet cset,
    +                           VerifyLiveness liveness,
    +                           VerifyRegions regions,
    +                           VerifyGCState gcstate);
    +
    +public:
    +  ShenandoahVerifier(ShenandoahHeap* heap, MarkBitMap* verification_bitmap) :
    +          _heap(heap), _verification_bit_map(verification_bitmap) {};
    +
    +  void verify_before_concmark();
    +  void verify_after_concmark();
    +  void verify_before_evacuation();
    +  void verify_after_evacuation();
    +  void verify_before_updaterefs();
    +  void verify_after_updaterefs();
    +  void verify_before_fullgc();
    +  void verify_after_fullgc();
    +  void verify_before_traversal();
    +  void verify_after_traversal();
    +  void verify_after_degenerated();
    +  void verify_generic(VerifyOption option);
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHVERIFIER_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.cpp b/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.cpp
    new file mode 100644
    index 00000000000..23c98413701
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.cpp
    @@ -0,0 +1,90 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shenandoah/shenandoahHeap.inline.hpp"
    +#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
    +#include "gc/shenandoah/shenandoahWorkGroup.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +
    +#include "logging/log.hpp"
    +
    +ShenandoahWorkerScope::ShenandoahWorkerScope(WorkGang* workers, uint nworkers, const char* msg, bool check) :
    +  _workers(workers) {
    +  assert(msg != NULL, "Missing message");
    +
    +  _n_workers = _workers->update_active_workers(nworkers);
    +  assert(_n_workers <= nworkers, "Must be");
    +
    +  log_info(gc, task)("Using %u of %u workers for %s",
    +    _n_workers, ShenandoahHeap::heap()->max_workers(), msg);
    +
    +  if (check) {
    +    ShenandoahHeap::heap()->assert_gc_workers(_n_workers);
    +  }
    +}
    +
    +ShenandoahWorkerScope::~ShenandoahWorkerScope() {
    +  assert(_workers->active_workers() == _n_workers,
    +    "Active workers can not be changed within this scope");
    +}
    +
    +ShenandoahPushWorkerScope::ShenandoahPushWorkerScope(WorkGang* workers, uint nworkers, bool check) :
    +  _old_workers(workers->active_workers()),
    +  _workers(workers) {
    +  _n_workers = _workers->update_active_workers(nworkers);
    +  assert(_n_workers <= nworkers, "Must be");
    +
    +  // bypass concurrent/parallel protocol check for non-regular paths, e.g. verifier, etc.
    +  if (check) {
    +    ShenandoahHeap::heap()->assert_gc_workers(_n_workers);
    +  }
    +}
    +
    +ShenandoahPushWorkerScope::~ShenandoahPushWorkerScope() {
    +  assert(_workers->active_workers() == _n_workers,
    +    "Active workers can not be changed within this scope");
    +  // Restore old worker value
    +  uint nworkers = _workers->update_active_workers(_old_workers);
    +  assert(nworkers == _old_workers, "Must be able to restore");
    +}
    +
    +ShenandoahPushWorkerQueuesScope::ShenandoahPushWorkerQueuesScope(WorkGang* workers, ShenandoahObjToScanQueueSet* queues, uint nworkers, bool check) :
    +  ShenandoahPushWorkerScope(workers, nworkers, check), _queues(queues) {
    +  _queues->reserve(_n_workers);
    +}
    +
    +ShenandoahPushWorkerQueuesScope::~ShenandoahPushWorkerQueuesScope() {
    +  // Restore old worker value
    +  _queues->reserve(_old_workers);
    +}
    +
    +AbstractGangWorker* ShenandoahWorkGang::install_worker(uint which) {
    +  AbstractGangWorker* worker = WorkGang::install_worker(which);
    +  ShenandoahThreadLocalData::create(worker);
    +  if (_initialize_gclab) {
    +    ShenandoahThreadLocalData::initialize_gclab(worker);
    +  }
    +  return worker;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.hpp b/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.hpp
    new file mode 100644
    index 00000000000..abdc29a71f0
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahWorkGroup.hpp
    @@ -0,0 +1,90 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHWORKGROUP_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHWORKGROUP_HPP
    +
    +#include "gc/shared/workgroup.hpp"
    +#include "gc/shenandoah/shenandoahTaskqueue.hpp"
    +#include "memory/allocation.hpp"
    +
    +class ShenandoahObjToScanQueueSet;
    +
    +class ShenandoahWorkerScope : public StackObj {
    +private:
    +  uint      _n_workers;
    +  WorkGang* _workers;
    +public:
    +  ShenandoahWorkerScope(WorkGang* workers, uint nworkers, const char* msg, bool do_check = true);
    +  ~ShenandoahWorkerScope();
    +};
    +
    +class ShenandoahPushWorkerScope : StackObj {
    +protected:
    +  uint      _n_workers;
    +  uint      _old_workers;
    +  WorkGang* _workers;
    +
    +public:
    +  ShenandoahPushWorkerScope(WorkGang* workers, uint nworkers, bool do_check = true);
    +  ~ShenandoahPushWorkerScope();
    +};
    +
    +class ShenandoahPushWorkerQueuesScope : public ShenandoahPushWorkerScope {
    +private:
    +  ShenandoahObjToScanQueueSet* _queues;
    +
    +public:
    +  ShenandoahPushWorkerQueuesScope(WorkGang* workers, ShenandoahObjToScanQueueSet* queues, uint nworkers, bool do_check = true);
    +  ~ShenandoahPushWorkerQueuesScope();
    +};
    +
    +class ShenandoahWorkGang : public WorkGang {
    +private:
    +  bool     _initialize_gclab;
    +public:
    +  ShenandoahWorkGang(const char* name,
    +           uint workers,
    +           bool are_GC_task_threads,
    +           bool are_ConcurrentGC_threads) :
    +    WorkGang(name, workers, are_GC_task_threads, are_ConcurrentGC_threads), _initialize_gclab(false) {
    +    }
    +
    +  // Create a GC worker and install it into the work gang.
    +  // We need to initialize gclab for dynamic allocated workers
    +  AbstractGangWorker* install_worker(uint which);
    +
    +  // We allow _active_workers < _total_workers when UseDynamicNumberOfGCThreads is off.
    +  // We use the same WorkGang for concurrent and parallel processing, and honor
    +  // ConcGCThreads and ParallelGCThreads settings
    +  virtual uint active_workers() const {
    +    assert(_active_workers > 0, "no active worker");
    +    assert(_active_workers <= _total_workers,
    +           "_active_workers: %u > _total_workers: %u", _active_workers, _total_workers);
    +    return _active_workers;
    +  }
    +
    +  void set_initialize_gclab() { assert(!_initialize_gclab, "Can only enable once"); _initialize_gclab = true; }
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHWORKGROUP_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahWorkerPolicy.cpp b/src/hotspot/share/gc/shenandoah/shenandoahWorkerPolicy.cpp
    new file mode 100644
    index 00000000000..823ec4c5219
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahWorkerPolicy.cpp
    @@ -0,0 +1,157 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#include "precompiled.hpp"
    +
    +#include "gc/shared/workerPolicy.hpp"
    +#include "gc/shenandoah/shenandoahWorkerPolicy.hpp"
    +#include "runtime/thread.hpp"
    +
    +uint ShenandoahWorkerPolicy::_prev_par_marking     = 0;
    +uint ShenandoahWorkerPolicy::_prev_conc_marking    = 0;
    +uint ShenandoahWorkerPolicy::_prev_conc_evac       = 0;
    +uint ShenandoahWorkerPolicy::_prev_fullgc          = 0;
    +uint ShenandoahWorkerPolicy::_prev_degengc         = 0;
    +uint ShenandoahWorkerPolicy::_prev_stw_traversal   = 0;
    +uint ShenandoahWorkerPolicy::_prev_conc_traversal  = 0;
    +uint ShenandoahWorkerPolicy::_prev_conc_update_ref = 0;
    +uint ShenandoahWorkerPolicy::_prev_par_update_ref  = 0;
    +uint ShenandoahWorkerPolicy::_prev_conc_cleanup    = 0;
    +uint ShenandoahWorkerPolicy::_prev_conc_reset      = 0;
    +
    +uint ShenandoahWorkerPolicy::calc_workers_for_init_marking() {
    +  uint active_workers = (_prev_par_marking == 0) ? ParallelGCThreads : _prev_par_marking;
    +
    +  _prev_par_marking =
    +    WorkerPolicy::calc_active_workers(ParallelGCThreads,
    +                                      active_workers,
    +                                      Threads::number_of_non_daemon_threads());
    +  return _prev_par_marking;
    +}
    +
    +uint ShenandoahWorkerPolicy::calc_workers_for_conc_marking() {
    +  uint active_workers = (_prev_conc_marking == 0) ?  ConcGCThreads : _prev_conc_marking;
    +  _prev_conc_marking =
    +    WorkerPolicy::calc_active_conc_workers(ConcGCThreads,
    +                                           active_workers,
    +                                           Threads::number_of_non_daemon_threads());
    +  return _prev_conc_marking;
    +}
    +
    +// Reuse the calculation result from init marking
    +uint ShenandoahWorkerPolicy::calc_workers_for_final_marking() {
    +  return _prev_par_marking;
    +}
    +
    +// Calculate workers for concurrent evacuation (concurrent GC)
    +uint ShenandoahWorkerPolicy::calc_workers_for_conc_evac() {
    +  uint active_workers = (_prev_conc_evac == 0) ? ConcGCThreads : _prev_conc_evac;
    +  _prev_conc_evac =
    +    WorkerPolicy::calc_active_conc_workers(ConcGCThreads,
    +                                           active_workers,
    +                                           Threads::number_of_non_daemon_threads());
    +  return _prev_conc_evac;
    +}
    +
    +// Calculate workers for parallel fullgc
    +uint ShenandoahWorkerPolicy::calc_workers_for_fullgc() {
    +  uint active_workers = (_prev_fullgc == 0) ?  ParallelGCThreads : _prev_fullgc;
    +  _prev_fullgc =
    +    WorkerPolicy::calc_active_workers(ParallelGCThreads,
    +                                      active_workers,
    +                                      Threads::number_of_non_daemon_threads());
    +  return _prev_fullgc;
    +}
    +
    +// Calculate workers for parallel degenerated gc
    +uint ShenandoahWorkerPolicy::calc_workers_for_stw_degenerated() {
    +  uint active_workers = (_prev_degengc == 0) ?  ParallelGCThreads : _prev_degengc;
    +  _prev_degengc =
    +    WorkerPolicy::calc_active_workers(ParallelGCThreads,
    +                                      active_workers,
    +                                      Threads::number_of_non_daemon_threads());
    +  return _prev_degengc;
    +}
    +
    +// Calculate workers for Stop-the-world traversal GC
    +uint ShenandoahWorkerPolicy::calc_workers_for_stw_traversal() {
    +  uint active_workers = (_prev_stw_traversal == 0) ? ParallelGCThreads : _prev_stw_traversal;
    +  _prev_stw_traversal =
    +    WorkerPolicy::calc_active_workers(ParallelGCThreads,
    +                                      active_workers,
    +                                      Threads::number_of_non_daemon_threads());
    +  return _prev_stw_traversal;
    +}
    +
    +// Calculate workers for concurent traversal GC
    +uint ShenandoahWorkerPolicy::calc_workers_for_conc_traversal() {
    +  uint active_workers = (_prev_conc_traversal == 0) ? ConcGCThreads : _prev_conc_traversal;
    +  _prev_conc_traversal =
    +    WorkerPolicy::calc_active_conc_workers(ConcGCThreads,
    +                                           active_workers,
    +                                           Threads::number_of_non_daemon_threads());
    +  return _prev_conc_traversal;
    +}
    +
    +// Calculate workers for concurrent reference update
    +uint ShenandoahWorkerPolicy::calc_workers_for_conc_update_ref() {
    +  uint active_workers = (_prev_conc_update_ref == 0) ? ConcGCThreads : _prev_conc_update_ref;
    +  _prev_conc_update_ref =
    +    WorkerPolicy::calc_active_conc_workers(ConcGCThreads,
    +                                           active_workers,
    +                                           Threads::number_of_non_daemon_threads());
    +  return _prev_conc_update_ref;
    +}
    +
    +// Calculate workers for parallel reference update
    +uint ShenandoahWorkerPolicy::calc_workers_for_final_update_ref() {
    +  uint active_workers = (_prev_par_update_ref == 0) ? ParallelGCThreads : _prev_par_update_ref;
    +  _prev_par_update_ref =
    +    WorkerPolicy::calc_active_workers(ParallelGCThreads,
    +                                      active_workers,
    +                                      Threads::number_of_non_daemon_threads());
    +  return _prev_par_update_ref;
    +}
    +
    +uint ShenandoahWorkerPolicy::calc_workers_for_conc_preclean() {
    +  // Precleaning is single-threaded
    +  return 1;
    +}
    +
    +uint ShenandoahWorkerPolicy::calc_workers_for_conc_cleanup() {
    +  uint active_workers = (_prev_conc_cleanup == 0) ? ConcGCThreads : _prev_conc_cleanup;
    +  _prev_conc_cleanup =
    +          WorkerPolicy::calc_active_conc_workers(ConcGCThreads,
    +                                                 active_workers,
    +                                                 Threads::number_of_non_daemon_threads());
    +  return _prev_conc_cleanup;
    +}
    +
    +uint ShenandoahWorkerPolicy::calc_workers_for_conc_reset() {
    +  uint active_workers = (_prev_conc_reset == 0) ? ConcGCThreads : _prev_conc_reset;
    +  _prev_conc_reset =
    +          WorkerPolicy::calc_active_conc_workers(ConcGCThreads,
    +                                                 active_workers,
    +                                                 Threads::number_of_non_daemon_threads());
    +  return _prev_conc_reset;
    +}
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoahWorkerPolicy.hpp b/src/hotspot/share/gc/shenandoah/shenandoahWorkerPolicy.hpp
    new file mode 100644
    index 00000000000..d1d8fb62301
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoahWorkerPolicy.hpp
    @@ -0,0 +1,84 @@
    +/*
    + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHWORKERPOLICY_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHWORKERPOLICY_HPP
    +
    +#include "memory/allocation.hpp"
    +
    +class ShenandoahWorkerPolicy : AllStatic {
    +private:
    +  static uint _prev_par_marking;
    +  static uint _prev_conc_marking;
    +  static uint _prev_conc_evac;
    +  static uint _prev_fullgc;
    +  static uint _prev_degengc;
    +  static uint _prev_stw_traversal;
    +  static uint _prev_conc_traversal;
    +  static uint _prev_conc_update_ref;
    +  static uint _prev_par_update_ref;
    +  static uint _prev_conc_cleanup;
    +  static uint _prev_conc_reset;
    +
    +public:
    +  // Calculate the number of workers for initial marking
    +  static uint calc_workers_for_init_marking();
    +
    +  // Calculate the number of workers for concurrent marking
    +  static uint calc_workers_for_conc_marking();
    +
    +  // Calculate the number of workers for final marking
    +  static uint calc_workers_for_final_marking();
    +
    +  // Calculate workers for concurrent evacuation (concurrent GC)
    +  static uint calc_workers_for_conc_evac();
    +
    +  // Calculate workers for parallel full gc
    +  static uint calc_workers_for_fullgc();
    +
    +  // Calculate workers for parallel degenerated gc
    +  static uint calc_workers_for_stw_degenerated();
    +
    +  // Calculate workers for Stop-the-world traversal GC
    +  static uint calc_workers_for_stw_traversal();
    +
    +  // Calculate workers for concurrent traversal GC
    +  static uint calc_workers_for_conc_traversal();
    +
    +  // Calculate workers for concurrent reference update
    +  static uint calc_workers_for_conc_update_ref();
    +
    +  // Calculate workers for parallel/final reference update
    +  static uint calc_workers_for_final_update_ref();
    +
    +  // Calculate workers for concurrent precleaning
    +  static uint calc_workers_for_conc_preclean();
    +
    +  // Calculate workers for concurrent cleanup
    +  static uint calc_workers_for_conc_cleanup();
    +
    +  // Calculate workers for concurrent reset
    +  static uint calc_workers_for_conc_reset();
    +};
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHWORKERPOLICY_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp b/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp
    new file mode 100644
    index 00000000000..1a6abede7ca
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp
    @@ -0,0 +1,417 @@
    +/*
    + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +
    +#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAH_GLOBALS_HPP
    +#define SHARE_VM_GC_SHENANDOAH_SHENANDOAH_GLOBALS_HPP
    +
    +#define GC_SHENANDOAH_FLAGS(develop,                                        \
    +                            develop_pd,                                     \
    +                            product,                                        \
    +                            product_pd,                                     \
    +                            diagnostic,                                     \
    +                            diagnostic_pd,                                  \
    +                            experimental,                                   \
    +                            notproduct,                                     \
    +                            manageable,                                     \
    +                            product_rw,                                     \
    +                            lp64_product,                                   \
    +                            range,                                          \
    +                            constraint,                                     \
    +                            writeable)                                      \
    +                                                                            \
    +  experimental(size_t, ShenandoahHeapRegionSize, 0,                         \
    +          "Size of the Shenandoah regions. Set to zero to detect "          \
    +          "automatically.")                                                 \
    +                                                                            \
    +  experimental(size_t, ShenandoahTargetNumRegions, 2048,                    \
    +          "Target number of regions. We try to get around that many "       \
    +          "regions, based on Shenandoah{Min,Max}RegionSize.")               \
    +                                                                            \
    +  experimental(size_t, ShenandoahMinRegionSize, 256 * K,                    \
    +          "Minimum Shenandoah heap region size.")                           \
    +                                                                            \
    +  experimental(size_t, ShenandoahMaxRegionSize, 32 * M,                     \
    +          "Maximum Shenandoah heap region size.")                           \
    +                                                                            \
    +  experimental(intx, ShenandoahHumongousThreshold, 100,                     \
    +          "How large should the object be to get allocated in humongous "   \
    +          "region, in percents of heap region size. This also caps the "    \
    +          "maximum TLAB size.")                                             \
    +          range(1, 100)                                                     \
    +                                                                            \
    +  experimental(ccstr, ShenandoahGCHeuristics, "adaptive",                   \
    +          "The heuristics to use in Shenandoah GC. Possible values:"        \
    +          " *) adaptive - adapt to maintain the given amount of free heap;" \
    +          " *) static  -  start concurrent GC when static free heap "       \
    +          "               threshold and static allocation threshold are "   \
    +          "               tripped;"                                         \
    +          " *) passive -  do not start concurrent GC, wait for Full GC; "   \
    +          " *) aggressive - run concurrent GC continuously, evacuate "      \
    +          "               everything;"                                      \
    +          " *) compact - run GC with lower footprint target, may end up "   \
    +          "               doing continuous GC, evacuate lots of live "      \
    +          "               objects, uncommit heap aggressively;")            \
    +                                                                            \
    +  experimental(ccstr, ShenandoahUpdateRefsEarly, "adaptive",                \
    +          "Run a separate concurrent reference updating phase after"        \
    +          "concurrent evacuation. Possible values: 'on', 'off', 'adaptive'")\
    +                                                                            \
    +  experimental(uintx, ShenandoahRefProcFrequency, 5,                        \
    +          "How often should (weak, soft, etc) references be processed. "    \
    +          "References get processed at every Nth GC cycle. Set to zero "    \
    +          "to disable reference processing.")                               \
    +                                                                            \
    +  experimental(uintx, ShenandoahUnloadClassesFrequency, 5,                  \
    +          "How often should classes get unloaded. "                         \
    +          "Class unloading is performed at every Nth GC cycle. "            \
    +          "Set to zero to disable class unloading during concurrent GC.")   \
    +                                                                            \
    +  experimental(uintx, ShenandoahGarbageThreshold, 60,                       \
    +          "Sets the percentage of garbage a region need to contain before " \
    +          "it can be marked for collection. Does not apply to all "         \
    +          "heuristics.")                                                    \
    +          range(0,100)                                                      \
    +                                                                            \
    +  experimental(uintx, ShenandoahFreeThreshold, 10,                          \
    +          "Set the percentage of free heap at which a GC cycle is started. "\
    +          "Does not apply to all heuristics.")                              \
    +          range(0,100)                                                      \
    +                                                                            \
    +  experimental(uintx, ShenandoahInitFreeThreshold, 70,                      \
    +          "Initial remaining free heap threshold for learning steps in "    \
    +          "heuristics. In percents of total heap size. Does not apply to "  \
    +          "all heuristics.")                                                \
    +          range(0,100)                                                      \
    +                                                                            \
    +  experimental(uintx, ShenandoahMinFreeThreshold, 10,                       \
    +          "Minimum remaining free space threshold, after which collection " \
    +          "definitely triggers. Does not apply to all heuristics.")         \
    +          range(0,100)                                                      \
    +                                                                            \
    +  experimental(uintx, ShenandoahAllocationThreshold, 0,                     \
    +          "Set percentage of memory allocated since last GC cycle before "  \
    +          "a new GC cycle can be started. Set to zero to effectively "      \
    +          "disable.")                                                       \
    +          range(0,100)                                                      \
    +                                                                            \
    +  experimental(uintx, ShenandoahLearningSteps, 5,                           \
    +          "Number of GC cycles to run in order to learn application "       \
    +          "and GC performance for adaptive heuristics.")                    \
    +          range(0,100)                                                      \
    +                                                                            \
    +  experimental(uintx, ShenandoahImmediateThreshold, 90,                     \
    +          "If mark identifies more than this much immediate garbage "       \
    +          "regions, it shall recycle them, and shall not continue the "     \
    +          "rest of the GC cycle. The value is in percents of total "        \
    +          "number of candidate regions for collection set. Setting this "   \
    +          "threshold to 100% effectively disables this shortcut.")          \
    +          range(0,100)                                                      \
    +                                                                            \
    +  experimental(uintx, ShenandoahMergeUpdateRefsMinGap, 100,                 \
    +          "If GC is currently running in separate update-refs mode "        \
    +          "this numbers gives the threshold when to switch to "             \
    +          "merged update-refs mode. Number is percentage relative to"       \
    +          "duration(marking)+duration(update-refs).")                       \
    +                                                                            \
    +  experimental(uintx, ShenandoahMergeUpdateRefsMaxGap, 200,                 \
    +          "If GC is currently running in merged update-refs mode "          \
    +          "this numbers gives the threshold when to switch to "             \
    +          "separate update-refs mode. Number is percentage relative "       \
    +          "to duration(marking)+duration(update-refs).")                    \
    +                                                                            \
    +  experimental(uintx, ShenandoahGuaranteedGCInterval, 5*60*1000,            \
    +          "Adaptive and dynamic heuristics would guarantee a GC cycle "     \
    +          "at least with this interval. This is useful when large idle"     \
    +          " intervals are present, where GC can run without stealing "      \
    +          "time from active application. Time is in milliseconds.")         \
    +                                                                            \
    +  experimental(bool, ShenandoahAlwaysClearSoftRefs, false,                  \
    +          "Clear soft references always, instead of using any smart "       \
    +          "cleanup policy. This minimizes footprint at expense of more "    \
    +          "softref churn in applications.")                                 \
    +                                                                            \
    +  experimental(bool, ShenandoahUncommit, true,                              \
    +          "Allow Shenandoah to uncommit unused memory.")                    \
    +                                                                            \
    +  experimental(uintx, ShenandoahUncommitDelay, 5*60*1000,                   \
    +          "Shenandoah would start to uncommit memory for regions that were" \
    +          " not used for more than this time. First use after that would "  \
    +          "incur allocation stalls. Actively used regions would never be "  \
    +          "uncommitted, because they never decay. Time is in milliseconds." \
    +          "Setting this delay to 0 effectively makes Shenandoah to "        \
    +          "uncommit the regions almost immediately.")                       \
    +                                                                            \
    +  experimental(bool, ShenandoahRegionSampling, false,                       \
    +          "Turns on heap region sampling via JVMStat")                      \
    +                                                                            \
    +  experimental(int, ShenandoahRegionSamplingRate, 40,                       \
    +          "Sampling rate for heap region sampling. "                        \
    +          "Number of milliseconds between samples")                         \
    +                                                                            \
    +  experimental(uintx, ShenandoahControlIntervalMin, 1,                      \
    +          "The minumum sleep interval for control loop that drives "        \
    +          "the cycles. Lower values would increase GC responsiveness "      \
    +          "to changing heap conditions, at the expense of higher perf "     \
    +          "overhead. Time is in milliseconds.")                             \
    +                                                                            \
    +  experimental(uintx, ShenandoahControlIntervalMax, 10,                     \
    +          "The maximum sleep interval for control loop that drives "        \
    +          "the cycles. Lower values would increase GC responsiveness "      \
    +          "to changing heap conditions, at the expense of higher perf "     \
    +          "overhead. Time is in milliseconds.")                             \
    +                                                                            \
    +  experimental(uintx, ShenandoahControlIntervalAdjustPeriod, 1000,          \
    +          "The time period for one step in control loop interval "          \
    +          "adjustment. Lower values make adjustments faster, at the "       \
    +          "expense of higher perf overhead. Time is in milliseconds.")      \
    +                                                                            \
    +  diagnostic(bool, ShenandoahVerify, false,                                 \
    +          "Verify the Shenandoah garbage collector")                        \
    +                                                                            \
    +  diagnostic(intx, ShenandoahVerifyLevel, 4,                                \
    +          "Shenandoah verification level: "                                 \
    +          "0 = basic heap checks; "                                         \
    +          "1 = previous level, plus basic region checks; "                  \
    +          "2 = previous level, plus all roots; "                            \
    +          "3 = previous level, plus all reachable objects; "                \
    +          "4 = previous level, plus all marked objects")                    \
    +                                                                            \
    +  diagnostic(bool, ShenandoahElasticTLAB, true,                             \
    +          "Use Elastic TLABs with Shenandoah")                              \
    +                                                                            \
    +  diagnostic(bool, ShenandoahAllowMixedAllocs, true,                        \
    +          "Allow mixing mutator and collector allocations in a single "     \
    +          "region")                                                         \
    +                                                                            \
    +  experimental(uintx, ShenandoahAllocSpikeFactor, 5,                        \
    +          "The amount of heap space to reserve for absorbing the "          \
    +          "allocation spikes. Larger value wastes more memory in "          \
    +          "non-emergency cases, but provides more safety in emergency "     \
    +          "cases. In percents of total heap size.")                         \
    +          range(0,100)                                                      \
    +                                                                            \
    +  experimental(uintx, ShenandoahEvacReserve, 5,                             \
    +          "Maximum amount of free space to reserve for evacuation. "        \
    +          "Larger values make GC more aggressive, while leaving less "      \
    +          "headroom for application to allocate in. "                       \
    +          "In percents of total heap size.")                                \
    +          range(1,100)                                                      \
    +                                                                            \
    +  experimental(double, ShenandoahEvacWaste, 1.2,                            \
    +          "How much waste evacuations produce within the reserved "         \
    +          "space. Larger values make evacuations more resilient "           \
    +          "against allocation failures, at expense of smaller csets "       \
    +          "on each cycle.")                                                 \
    +          range(1.0,100.0)                                                  \
    +                                                                            \
    +  experimental(bool, ShenandoahEvacReserveOverflow, true,                   \
    +          "Allow evacuations to overflow the reserved space. "              \
    +          "Enabling it will make evacuations more resilient when "          \
    +          "evacuation reserve/waste is incorrect, at the risk that "        \
    +          "application allocations run out of memory too early.")           \
    +                                                                            \
    +  diagnostic(bool, ShenandoahAllocationTrace, false,                        \
    +          "Trace allocation latencies and stalls. Can be expensive when "   \
    +          "lots of allocations happen, and may introduce scalability "      \
    +          "bottlenecks.")                                                   \
    +                                                                            \
    +  diagnostic(intx, ShenandoahAllocationStallThreshold, 10000,               \
    +          "When allocation tracing is enabled, the allocation stalls "      \
    +          "larger than this threshold would be reported as warnings. "      \
    +          "Time is in microseconds.")                                       \
    +                                                                            \
    +  experimental(uintx, ShenandoahEvacAssist, 10,                             \
    +          "How many objects to evacuate on WB assist path. "                \
    +          "Use zero to disable.")                                           \
    +                                                                            \
    +  experimental(bool, ShenandoahPacing, true,                                \
    +          "Pace application allocations to give GC chance to start "        \
    +          "and complete before allocation failure is reached.")             \
    +                                                                            \
    +  experimental(uintx, ShenandoahPacingMaxDelay, 10,                         \
    +          "Max delay for pacing application allocations. "                  \
    +          "Time is in milliseconds.")                                       \
    +                                                                            \
    +  experimental(uintx, ShenandoahPacingIdleSlack, 2,                         \
    +          "Percent of heap counted as non-taxable allocations during idle. "\
    +          "Larger value makes the pacing milder during idle phases, "       \
    +          "requiring less rendezvous with control thread. Lower value "     \
    +          "makes the pacing control less responsive to out-of-cycle allocs.")\
    +          range(0, 100)                                                     \
    +                                                                            \
    +  experimental(uintx, ShenandoahPacingCycleSlack, 10,                       \
    +          "Percent of free space taken as non-taxable allocations during "  \
    +          "the GC cycle. Larger value makes the pacing milder at the "      \
    +          "beginning of the GC cycle. Lower value makes the pacing less "   \
    +          "uniform during the cycle.")                                      \
    +          range(0, 100)                                                     \
    +                                                                            \
    +  experimental(double, ShenandoahPacingSurcharge, 1.1,                      \
    +          "Additional pacing tax surcharge to help unclutter the heap. "    \
    +          "Larger values makes the pacing more aggressive. Lower values "   \
    +          "risk GC cycles finish with less memory than were available at "  \
    +          "the beginning of it.")                                           \
    +          range(1.0, 100.0)                                                 \
    +                                                                            \
    +  experimental(uintx, ShenandoahCriticalFreeThreshold, 1,                   \
    +          "Percent of heap that needs to be free after recovery cycles, "   \
    +          "either Degenerated or Full GC. If this much space is not "       \
    +          "available, next recovery step would triggered.")                 \
    +          range(0, 100)                                                     \
    +                                                                            \
    +  diagnostic(bool, ShenandoahDegeneratedGC, true,                           \
    +          "Use Degenerated GC as the graceful degradation step. Disabling " \
    +          "this leads to degradation to Full GC")                           \
    +                                                                            \
    +  experimental(uintx, ShenandoahFullGCThreshold, 3,                         \
    +          "How many back-to-back Degenerated GCs to do before triggering "  \
    +          "a Full GC.")                                                     \
    +                                                                            \
    +  experimental(bool, ShenandoahImplicitGCInvokesConcurrent, false,          \
    +          "Should internally-caused GCs invoke concurrent cycles, or go to" \
    +          "stop-the-world (degenerated/full)?")                             \
    +                                                                            \
    +  experimental(bool, ShenandoahHumongousMoves, true,                        \
    +          "Allow moving humongous regions. This makes GC more resistant "   \
    +          "to external fragmentation that may otherwise fail other "        \
    +          "humongous allocations, at the expense of higher GC copying "     \
    +          "costs.")                                                         \
    +                                                                            \
    +  diagnostic(bool, ShenandoahOOMDuringEvacALot, false,                      \
    +          "Simulate OOM during evacuation frequently.")                     \
    +                                                                            \
    +  diagnostic(bool, ShenandoahAllocFailureALot, false,                       \
    +          "Make lots of artificial allocation failures.")                   \
    +                                                                            \
    +  diagnostic(bool, ShenandoahTerminationTrace, false,                       \
    +          "Tracing task termination timings")                               \
    +                                                                            \
    +  develop(bool, ShenandoahVerifyObjectEquals, false,                        \
    +          "Verify that == and != are not used on oops. Only in fastdebug")  \
    +                                                                            \
    +  diagnostic(bool, ShenandoahAlwaysPreTouch, false,                         \
    +          "Pre-touch heap memory, overrides global AlwaysPreTouch")         \
    +                                                                            \
    +  experimental(intx, ShenandoahMarkScanPrefetch, 32,                        \
    +          "How many objects to prefetch ahead when traversing mark bitmaps."\
    +          "Set to 0 to disable prefetching.")                               \
    +          range(0, 256)                                                     \
    +                                                                            \
    +  experimental(uintx, ShenandoahMarkLoopStride, 1000,                       \
    +          "How many items are processed during one marking step")           \
    +                                                                            \
    +  experimental(uintx, ShenandoahParallelRegionStride, 1024,                 \
    +          "How many regions are processed in one stride during parallel "   \
    +          "iteration.")                                                     \
    +                                                                            \
    +  experimental(size_t, ShenandoahSATBBufferSize, 1 * K,                     \
    +          "Number of entries in an SATB log buffer.")                       \
    +          range(1, max_uintx)                                               \
    +                                                                            \
    +  experimental(uintx, ShenandoahSATBBufferFlushInterval, 100,               \
    +          "Forcefully flush non-empty SATB buffers at this interval. "      \
    +          "Time is in milliseconds.")                                       \
    +                                                                            \
    +  experimental(uint, ShenandoahParallelSafepointThreads, 4,                 \
    +          "Number of parallel threads used for safepoint prolog/epilog")    \
    +                                                                            \
    +  experimental(bool, ShenandoahPreclean, true,                              \
    +          "Do concurrent preclean phase before final mark: process "        \
    +          "definitely alive references to avoid dealing with them during "  \
    +          "pause.")                                                         \
    +                                                                            \
    +  experimental(bool, ShenandoahSuspendibleWorkers, false,                   \
    +          "Suspend concurrent GC worker threads at safepoints")             \
    +                                                                            \
    +  diagnostic(bool, ShenandoahSATBBarrier, true,                             \
    +          "Turn on/off SATB barriers in Shenandoah")                        \
    +                                                                            \
    +  diagnostic(bool, ShenandoahKeepAliveBarrier, true,                        \
    +          "Turn on/off keep alive barriers in Shenandoah")                  \
    +                                                                            \
    +  diagnostic(bool, ShenandoahWriteBarrier, true,                            \
    +          "Turn on/off write barriers in Shenandoah")                       \
    +                                                                            \
    +  diagnostic(bool, ShenandoahReadBarrier, true,                             \
    +          "Turn on/off read barriers in Shenandoah")                        \
    +                                                                            \
    +  diagnostic(bool, ShenandoahStoreValEnqueueBarrier, false,                 \
    +          "Turn on/off enqueuing of oops for storeval barriers")            \
    +                                                                            \
    +  diagnostic(bool, ShenandoahStoreValReadBarrier, true,                     \
    +          "Turn on/off store val read barriers in Shenandoah")              \
    +                                                                            \
    +  diagnostic(bool, ShenandoahCASBarrier, true,                              \
    +          "Turn on/off CAS barriers in Shenandoah")                         \
    +                                                                            \
    +  diagnostic(bool, ShenandoahAcmpBarrier, true,                             \
    +          "Turn on/off acmp barriers in Shenandoah")                        \
    +                                                                            \
    +  diagnostic(bool, ShenandoahCloneBarrier, true,                            \
    +          "Turn on/off clone barriers in Shenandoah")                       \
    +                                                                            \
    +  diagnostic(bool, ShenandoahStoreCheck, false,                             \
    +          "Emit additional code that checks objects are written to only"    \
    +          " in to-space")                                                   \
    +                                                                            \
    +  experimental(bool, ShenandoahConcurrentScanCodeRoots, true,               \
    +          "Scan code roots concurrently, instead of during a pause")        \
    +                                                                            \
    +  experimental(uintx, ShenandoahCodeRootsStyle, 2,                          \
    +          "Use this style to scan code cache:"                              \
    +          " 0 - sequential iterator;"                                       \
    +          " 1 - parallel iterator;"                                         \
    +          " 2 - parallel iterator with cset filters;")                      \
    +                                                                            \
    +  experimental(bool, ShenandoahOptimizeStaticFinals, true,                  \
    +          "Optimize barriers on static final fields. "                      \
    +          "Turn it off for maximum compatibility with reflection or JNI "   \
    +          "code that manipulates final fields.")                            \
    +                                                                            \
    +  experimental(bool, ShenandoahOptimizeInstanceFinals, false,               \
    +          "Optimize barriers on final instance fields."                     \
    +          "Turn it off for maximum compatibility with reflection or JNI "   \
    +          "code that manipulates final fields.")                            \
    +                                                                            \
    +  experimental(bool, ShenandoahOptimizeStableFinals, false,                 \
    +          "Optimize barriers on stable fields."                             \
    +          "Turn it off for maximum compatibility with reflection or JNI "   \
    +          "code that manipulates final fields.")                            \
    +                                                                            \
    +  diagnostic(bool, ShenandoahDecreaseRegisterPressure, false,               \
    +          "Try to reuse after-barrier values to reduce register pressure")  \
    +                                                                            \
    +  experimental(bool, ShenandoahCommonGCStateLoads, false,                   \
    +         "Enable commonming for GC state loads in generated code.")         \
    +                                                                            \
    +  develop(bool, ShenandoahVerifyOptoBarriers, false,                        \
    +          "Verify no missing barriers in C2")                               \
    +                                                                            \
    +  experimental(bool, ShenandoahDontIncreaseWBFreq, true,                    \
    +          "Common 2 WriteBarriers or WriteBarrier and a ReadBarrier only "  \
    +          "if the resulting WriteBarrier isn't executed more frequently")   \
    +                                                                            \
    +  experimental(bool, ShenandoahLoopOptsAfterExpansion, true,                \
    +          "Attempt more loop opts after write barrier expansion")           \
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAH_GLOBALS_HPP
    diff --git a/src/hotspot/share/gc/shenandoah/vmStructs_shenandoah.hpp b/src/hotspot/share/gc/shenandoah/vmStructs_shenandoah.hpp
    new file mode 100644
    index 00000000000..2051117239d
    --- /dev/null
    +++ b/src/hotspot/share/gc/shenandoah/vmStructs_shenandoah.hpp
    @@ -0,0 +1,46 @@
    +/*
    + * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
    + *
    + * This code is free software; you can redistribute it and/or modify it
    + * under the terms of the GNU General Public License version 2 only, as
    + * published by the Free Software Foundation.
    + *
    + * This code is distributed in the hope that it will be useful, but WITHOUT
    + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    + * version 2 for more details (a copy is included in the LICENSE file that
    + * accompanied this code).
    + *
    + * You should have received a copy of the GNU General Public License version
    + * 2 along with this work; if not, write to the Free Software Foundation,
    + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    + *
    + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    + * or visit www.oracle.com if you need additional information or have any
    + * questions.
    + *
    + */
    +#ifndef SHARE_VM_GC_SHENANDOAH_VMSTRUCTS_SHENANDOAH_HPP
    +#define SHARE_VM_GC_SHENANDOAH_VMSTRUCTS_SHENANDOAH_HPP
    +
    +#include "gc/shenandoah/shenandoahHeap.hpp"
    +#include "gc/shenandoah/shenandoahHeapRegion.hpp"
    +#include "gc/shenandoah/shenandoahMonitoringSupport.hpp"
    +
    +#define VM_STRUCTS_SHENANDOAH(nonstatic_field, volatile_nonstatic_field, static_field)  \
    +  static_field(ShenandoahHeapRegion, RegionSizeBytes,        size_t)                    \
    +  nonstatic_field(ShenandoahHeap, _num_regions,              size_t)                    \
    +  volatile_nonstatic_field(ShenandoahHeap, _used,            size_t)                    \
    +  volatile_nonstatic_field(ShenandoahHeap, _committed,       size_t)                    \
    +
    +#define VM_INT_CONSTANTS_SHENANDOAH(declare_constant, declare_constant_with_value)
    +
    +#define VM_TYPES_SHENANDOAH(declare_type,                                     \
    +                            declare_toplevel_type,                            \
    +                            declare_integer_type)                             \
    +  declare_type(ShenandoahHeap, CollectedHeap)                                 \
    +  declare_type(ShenandoahHeapRegion, ContiguousSpace)                         \
    +  declare_toplevel_type(ShenandoahHeap*)                                      \
    +  declare_toplevel_type(ShenandoahHeapRegion*)                                \
    +
    +#endif // SHARE_VM_GC_SHENANDOAH_VMSTRUCTS_SHENANDOAH_HPP
    diff --git a/src/hotspot/share/gc/z/zDriver.cpp b/src/hotspot/share/gc/z/zDriver.cpp
    index 5b7c752c332..acee23a5486 100644
    --- a/src/hotspot/share/gc/z/zDriver.cpp
    +++ b/src/hotspot/share/gc/z/zDriver.cpp
    @@ -24,8 +24,8 @@
     #include "precompiled.hpp"
     #include "gc/shared/gcId.hpp"
     #include "gc/shared/gcLocker.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "gc/shared/isGCActiveMark.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
     #include "gc/z/zCollectedHeap.hpp"
     #include "gc/z/zDriver.hpp"
     #include "gc/z/zHeap.inline.hpp"
    @@ -34,7 +34,7 @@
     #include "gc/z/zStat.hpp"
     #include "logging/log.hpp"
     #include "memory/universe.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "runtime/vmThread.hpp"
     
     static const ZStatPhaseCycle      ZPhaseCycle("Garbage Collection Cycle");
    diff --git a/src/hotspot/share/gc/z/zErrno.cpp b/src/hotspot/share/gc/z/zErrno.cpp
    index fede88df189..c6c3ae1b747 100644
    --- a/src/hotspot/share/gc/z/zErrno.cpp
    +++ b/src/hotspot/share/gc/z/zErrno.cpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -23,6 +23,7 @@
     
     #include "precompiled.hpp"
     #include "gc/z/zErrno.hpp"
    +#include "runtime/os.inline.hpp"
     
     #include 
     #include 
    @@ -46,5 +47,5 @@ bool ZErrno::operator!=(int error) const {
     }
     
     const char* ZErrno::to_string() const {
    -  return strerror(_error);
    +  return os::strerror(_error);
     }
    diff --git a/src/hotspot/share/interpreter/templateInterpreter.hpp b/src/hotspot/share/interpreter/templateInterpreter.hpp
    index 5503f52a3f6..298c830a2ff 100644
    --- a/src/hotspot/share/interpreter/templateInterpreter.hpp
    +++ b/src/hotspot/share/interpreter/templateInterpreter.hpp
    @@ -111,9 +111,7 @@ class TemplateInterpreter: public AbstractInterpreter {
       static address    _throw_StackOverflowError_entry;
     
       static address    _remove_activation_entry;                   // continuation address if an exception is not handled by current frame
    -#ifdef HOTSWAP
       static address    _remove_activation_preserving_args_entry;   // continuation address when current frame is being popped
    -#endif // HOTSWAP
     
     #ifndef PRODUCT
       static EntryPoint _trace_code;
    @@ -146,9 +144,7 @@ class TemplateInterpreter: public AbstractInterpreter {
      public:
     
       static address    remove_activation_early_entry(TosState state) { return _earlyret_entry.entry(state); }
    -#ifdef HOTSWAP
    -  static address    remove_activation_preserving_args_entry()   { return _remove_activation_preserving_args_entry; }
    -#endif // HOTSWAP
    +  static address    remove_activation_preserving_args_entry()     { return _remove_activation_preserving_args_entry; }
     
       static address    remove_activation_entry()                   { return _remove_activation_entry; }
       static address    throw_exception_entry()                     { return _throw_exception_entry; }
    diff --git a/src/hotspot/share/jfr/leakprofiler/emitEventOperation.cpp b/src/hotspot/share/jfr/leakprofiler/emitEventOperation.cpp
    index 878fd3f0d66..bc00c0af064 100644
    --- a/src/hotspot/share/jfr/leakprofiler/emitEventOperation.cpp
    +++ b/src/hotspot/share/jfr/leakprofiler/emitEventOperation.cpp
    @@ -158,12 +158,14 @@ int EmitEventOperation::write_events(EdgeStore* edge_store) {
       const jlong last_sweep = _emit_all ? max_jlong : _object_sampler->last_sweep().value();
       int count = 0;
     
    -  for (int i = 0; i < _object_sampler->item_count(); ++i) {
    -    const ObjectSample* sample = _object_sampler->item_at(i);
    -    if (sample->is_alive_and_older_than(last_sweep)) {
    -      write_event(sample, edge_store);
    +  const ObjectSample* current = _object_sampler->first();
    +  while (current != NULL) {
    +    ObjectSample* prev = current->prev();
    +    if (current->is_alive_and_older_than(last_sweep)) {
    +      write_event(current, edge_store);
           ++count;
         }
    +    current = prev;
       }
     
       // restore thread local stack trace and thread id
    diff --git a/src/hotspot/share/jfr/leakprofiler/emitEventOperation.hpp b/src/hotspot/share/jfr/leakprofiler/emitEventOperation.hpp
    index 05e37299e10..0c4cb818e7c 100644
    --- a/src/hotspot/share/jfr/leakprofiler/emitEventOperation.hpp
    +++ b/src/hotspot/share/jfr/leakprofiler/emitEventOperation.hpp
    @@ -25,7 +25,7 @@
     #ifndef SHARE_VM_LEAKPROFILER_EMITEVENTOPERATION_HPP
     #define SHARE_VM_LEAKPROFILER_EMITEVENTOPERATION_HPP
     
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     class BFSClosure;
     class EdgeStore;
    diff --git a/src/hotspot/share/jfr/leakprofiler/leakProfiler.cpp b/src/hotspot/share/jfr/leakprofiler/leakProfiler.cpp
    index ab608a63a9c..a81243fdc45 100644
    --- a/src/hotspot/share/jfr/leakprofiler/leakProfiler.cpp
    +++ b/src/hotspot/share/jfr/leakprofiler/leakProfiler.cpp
    @@ -47,6 +47,11 @@ bool LeakProfiler::start(jint sample_count) {
         return false;
       }
     
    +  if (UseShenandoahGC) {
    +    log_warning(jfr)("LeakProfiler is currently not supported in combination with Shenandoah GC");
    +    return false;
    +  }
    +
       if (_object_sampler != NULL) {
         // already started
         return true;
    diff --git a/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.cpp b/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.cpp
    index f07d034135b..1171679fbdb 100644
    --- a/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.cpp
    +++ b/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.cpp
    @@ -122,6 +122,10 @@ const ObjectSample* ObjectSampler::last() const {
       return _list->last();
     }
     
    +const ObjectSample* ObjectSampler::first() const {
    +  return _list->first();
    +}
    +
     const ObjectSample* ObjectSampler::last_resolved() const {
       return _list->last_resolved();
     }
    diff --git a/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.hpp b/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.hpp
    index b8cea323e02..2bf13031f6a 100644
    --- a/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.hpp
    +++ b/src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.hpp
    @@ -69,6 +69,7 @@ class ObjectSampler : public CHeapObj {
       const ObjectSample* item_at(int index) const;
       ObjectSample* item_at(int index);
       int item_count() const;
    +  const ObjectSample* first() const;
       const ObjectSample* last() const;
       const ObjectSample* last_resolved() const;
       void set_last_resolved(const ObjectSample* sample);
    diff --git a/src/hotspot/share/jfr/leakprofiler/sampling/sampleList.cpp b/src/hotspot/share/jfr/leakprofiler/sampling/sampleList.cpp
    index c4bfbc1d9c2..e355015e554 100644
    --- a/src/hotspot/share/jfr/leakprofiler/sampling/sampleList.cpp
    +++ b/src/hotspot/share/jfr/leakprofiler/sampling/sampleList.cpp
    @@ -45,6 +45,10 @@ ObjectSample* SampleList::last() const {
       return _in_use_list.head();
     }
     
    +ObjectSample* SampleList::first() const {
    +  return _in_use_list.tail();
    +}
    +
     const ObjectSample* SampleList::last_resolved() const {
       return _last_resolved;
     }
    diff --git a/src/hotspot/share/jfr/leakprofiler/sampling/sampleList.hpp b/src/hotspot/share/jfr/leakprofiler/sampling/sampleList.hpp
    index 9d7d27fd0d9..6754ed3ba9f 100644
    --- a/src/hotspot/share/jfr/leakprofiler/sampling/sampleList.hpp
    +++ b/src/hotspot/share/jfr/leakprofiler/sampling/sampleList.hpp
    @@ -53,6 +53,7 @@ class SampleList : public JfrCHeapObj {
       void set_last_resolved(const ObjectSample* sample);
       ObjectSample* get();
       ObjectSample* last() const;
    +  ObjectSample* first() const;
       void release(ObjectSample* sample);
       const ObjectSample* last_resolved() const;
       ObjectSample* reuse(ObjectSample* sample);
    diff --git a/src/hotspot/share/jfr/leakprofiler/startOperation.hpp b/src/hotspot/share/jfr/leakprofiler/startOperation.hpp
    index 051a044cee0..a9613f728f1 100644
    --- a/src/hotspot/share/jfr/leakprofiler/startOperation.hpp
    +++ b/src/hotspot/share/jfr/leakprofiler/startOperation.hpp
    @@ -30,7 +30,7 @@
     #include "jfr/leakprofiler/sampling/objectSampler.hpp"
     #include "jfr/recorder/service/jfrOptionSet.hpp"
     #include "logging/log.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     // Safepoint operation for starting leak profiler object sampler
     class StartOperation : public VM_Operation {
    diff --git a/src/hotspot/share/jfr/leakprofiler/stopOperation.hpp b/src/hotspot/share/jfr/leakprofiler/stopOperation.hpp
    index 64318d9c6be..85133f82678 100644
    --- a/src/hotspot/share/jfr/leakprofiler/stopOperation.hpp
    +++ b/src/hotspot/share/jfr/leakprofiler/stopOperation.hpp
    @@ -29,7 +29,7 @@
     #include "jfr/leakprofiler/sampling/objectSampler.hpp"
     #include "jfr/recorder/service/jfrOptionSet.hpp"
     #include "logging/log.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     // Safepoint operation for stopping leak profiler object sampler
     class StopOperation : public VM_Operation {
    diff --git a/src/hotspot/share/jfr/metadata/metadata.xml b/src/hotspot/share/jfr/metadata/metadata.xml
    index 47c4fbd213f..8c665c87222 100644
    --- a/src/hotspot/share/jfr/metadata/metadata.xml
    +++ b/src/hotspot/share/jfr/metadata/metadata.xml
    @@ -613,7 +613,8 @@
         
         
         
    -  
    +    
    +     
     
       
         
    @@ -899,7 +900,7 @@
         
       
     
    -  
    +  
          
          
          
    @@ -908,18 +909,18 @@
          
       
     
    -  
    +  
         
         
       
     
    -  
    +  
         
         
         
       
     
    -  
    +  
         
         
       
    diff --git a/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp b/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp
    index 4e96f76a87b..9f30a82c061 100644
    --- a/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp
    +++ b/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp
    @@ -32,8 +32,8 @@
     #include "gc/g1/g1HeapRegionEventSender.hpp"
     #include "gc/shared/gcConfiguration.hpp"
     #include "gc/shared/gcTrace.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "gc/shared/objectCountEventSender.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
     #include "jfr/jfrEvents.hpp"
     #include "jfr/periodic/jfrModuleEvent.hpp"
     #include "jfr/periodic/jfrOSInterface.hpp"
    @@ -79,6 +79,7 @@ TRACE_REQUEST_FUNC(JVMInformation) {
       event.set_jvmArguments(Arguments::jvm_args());
       event.set_jvmFlags(Arguments::jvm_flags());
       event.set_jvmStartTime(Management::vm_init_done_time());
    +  event.set_pid(os::current_process_id());
       event.commit();
      }
     
    diff --git a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp
    index 1a43d54f644..6c517ab2f79 100644
    --- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp
    +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp
    @@ -49,7 +49,7 @@
     #include "runtime/safepoint.hpp"
     #include "runtime/synchronizer.hpp"
     #include "runtime/thread.inline.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     #ifdef COMPILER2
     #include "opto/compile.hpp"
    diff --git a/src/hotspot/share/jfr/recorder/service/jfrRecorderService.cpp b/src/hotspot/share/jfr/recorder/service/jfrRecorderService.cpp
    index 900dd493766..e9cd2114588 100644
    --- a/src/hotspot/share/jfr/recorder/service/jfrRecorderService.cpp
    +++ b/src/hotspot/share/jfr/recorder/service/jfrRecorderService.cpp
    @@ -50,7 +50,7 @@
     #include "runtime/os.hpp"
     #include "runtime/safepoint.hpp"
     #include "runtime/thread.inline.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "runtime/vmThread.hpp"
     
     // set data iff *dest == NULL
    diff --git a/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTraceRepository.hpp b/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTraceRepository.hpp
    index e9272296278..a763548413e 100644
    --- a/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTraceRepository.hpp
    +++ b/src/hotspot/share/jfr/recorder/stacktrace/jfrStackTraceRepository.hpp
    @@ -30,7 +30,6 @@
     
     class frame;
     class JavaThread;
    -class JfrCheckpointSystem;
     class JfrCheckpointWriter;
     class JfrChunkWriter;
     class Method;
    @@ -55,7 +54,7 @@ class JfrStackFrame {
       JfrStackFrame(const traceid& id, int bci, int type, const Method* method) :
         _method(method), _methodid(id), _line(0), _bci(bci), _type(type) {}
       JfrStackFrame(const traceid& id, int bci, int type, int lineno) :
    -    _method(NULL), _methodid(id), _line(0), _bci(bci), _type(type) {}
    +    _method(NULL), _methodid(id), _line(lineno), _bci(bci), _type(type) {}
       bool equals(const JfrStackFrame& rhs) const;
       void write(JfrChunkWriter& cw) const;
       void write(JfrCheckpointWriter& cpw) const;
    diff --git a/src/hotspot/share/jvmci/jvmciCompiler.cpp b/src/hotspot/share/jvmci/jvmciCompiler.cpp
    index 6df8a952eeb..2351601e296 100644
    --- a/src/hotspot/share/jvmci/jvmciCompiler.cpp
    +++ b/src/hotspot/share/jvmci/jvmciCompiler.cpp
    @@ -65,12 +65,6 @@ void JVMCICompiler::bootstrap(TRAPS) {
         // Nothing to do in -Xint mode
         return;
       }
    -#ifndef PRODUCT
    -  // We turn off CompileTheWorld so that compilation requests are not
    -  // ignored during bootstrap or that JVMCI can be compiled by C1/C2.
    -  FlagSetting ctwOff(CompileTheWorld, false);
    -#endif
    -
       _bootstrapping = true;
       ResourceMark rm;
       HandleMark hm;
    diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
    index c58d9225e13..92ecf3cc8e8 100644
    --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
    +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
    @@ -49,14 +49,14 @@ JVMCIKlassHandle::JVMCIKlassHandle(Thread* thread, Klass* klass) {
       _thread = thread;
       _klass = klass;
       if (klass != NULL) {
    -    _holder = Handle(_thread, klass->holder_phantom());
    +    _holder = Handle(_thread, klass->klass_holder());
       }
     }
     
     JVMCIKlassHandle& JVMCIKlassHandle::operator=(Klass* klass) {
       _klass = klass;
       if (klass != NULL) {
    -    _holder = Handle(_thread, klass->holder_phantom());
    +    _holder = Handle(_thread, klass->klass_holder());
       }
       return *this;
     }
    diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp
    index 5ba49b1f6a2..dca5e4ab91d 100644
    --- a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp
    +++ b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp
    @@ -206,8 +206,6 @@ objArrayHandle CompilerToVM::initialize_intrinsics(TRAPS) {
       do_uintx_flag(CodeCacheSegmentSize)                                      \
       do_intx_flag(CodeEntryAlignment)                                         \
       do_bool_flag(CompactFields)                                              \
    -  NOT_PRODUCT(do_intx_flag(CompileTheWorldStartAt))                        \
    -  NOT_PRODUCT(do_intx_flag(CompileTheWorldStopAt))                         \
       do_intx_flag(ContendedPaddingWidth)                                      \
       do_bool_flag(DontCompileHugeMethods)                                     \
       do_bool_flag(EagerJVMCI)                                                 \
    diff --git a/src/hotspot/share/logging/logFileOutput.cpp b/src/hotspot/share/logging/logFileOutput.cpp
    index 27488a557a4..e2150d1f1aa 100644
    --- a/src/hotspot/share/logging/logFileOutput.cpp
    +++ b/src/hotspot/share/logging/logFileOutput.cpp
    @@ -248,7 +248,7 @@ bool LogFileOutput::initialize(const char* options, outputStream* errstream) {
       _stream = os::fopen(_file_name, FileOpenMode);
       if (_stream == NULL) {
         errstream->print_cr("Error opening log file '%s': %s",
    -                        _file_name, strerror(errno));
    +                        _file_name, os::strerror(errno));
         return false;
       }
     
    diff --git a/src/hotspot/share/logging/logTag.hpp b/src/hotspot/share/logging/logTag.hpp
    index 79cdd7c35f5..393d0c95eca 100644
    --- a/src/hotspot/share/logging/logTag.hpp
    +++ b/src/hotspot/share/logging/logTag.hpp
    @@ -119,6 +119,7 @@
       LOG_TAG(patch) \
       LOG_TAG(path) \
       LOG_TAG(perf) \
    +  LOG_TAG(periodic) \
       LOG_TAG(phases) \
       LOG_TAG(plab) \
       LOG_TAG(preview)   /* Trace loading of preview feature types */ \
    diff --git a/src/hotspot/share/memory/heapShared.cpp b/src/hotspot/share/memory/heapShared.cpp
    index 97b733f997a..0b3d5d30a21 100644
    --- a/src/hotspot/share/memory/heapShared.cpp
    +++ b/src/hotspot/share/memory/heapShared.cpp
    @@ -71,10 +71,7 @@ static ArchivableStaticFieldInfo closed_archive_subgraph_entry_fields[] = {
     };
     // Entry fields for subgraphs archived in the open archive heap region.
     static ArchivableStaticFieldInfo open_archive_subgraph_entry_fields[] = {
    -  {"jdk/internal/module/ArchivedModuleGraph",  "archivedSystemModules"},
    -  {"jdk/internal/module/ArchivedModuleGraph",  "archivedModuleFinder"},
    -  {"jdk/internal/module/ArchivedModuleGraph",  "archivedMainModule"},
    -  {"jdk/internal/module/ArchivedModuleGraph",  "archivedConfiguration"},
    +  {"jdk/internal/module/ArchivedModuleGraph",  "archivedModuleGraph"},
       {"java/util/ImmutableCollections$ListN",     "EMPTY_LIST"},
       {"java/util/ImmutableCollections$MapN",      "EMPTY_MAP"},
       {"java/util/ImmutableCollections$SetN",      "EMPTY_SET"},
    diff --git a/src/hotspot/share/memory/metaspace.cpp b/src/hotspot/share/memory/metaspace.cpp
    index 1098e7bf988..96fae69fec6 100644
    --- a/src/hotspot/share/memory/metaspace.cpp
    +++ b/src/hotspot/share/memory/metaspace.cpp
    @@ -865,6 +865,7 @@ void MetaspaceUtils::verify_metrics() {
     
     // Utils to check if a pointer or range is part of a committed metaspace region.
     metaspace::VirtualSpaceNode* MetaspaceUtils::find_enclosing_virtual_space(const void* p) {
    +  MutexLockerEx cl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag);
       VirtualSpaceNode* vsn = Metaspace::space_list()->find_enclosing_space(p);
       if (Metaspace::using_class_space() && vsn == NULL) {
         vsn = Metaspace::class_space_list()->find_enclosing_space(p);
    diff --git a/src/hotspot/share/memory/metaspace.hpp b/src/hotspot/share/memory/metaspace.hpp
    index f2c47919f4d..a583084fc23 100644
    --- a/src/hotspot/share/memory/metaspace.hpp
    +++ b/src/hotspot/share/memory/metaspace.hpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -231,6 +231,7 @@ class Metaspace : public AllStatic {
     class ClassLoaderMetaspace : public CHeapObj {
       friend class CollectedHeap; // For expand_and_allocate()
       friend class ZCollectedHeap; // For expand_and_allocate()
    +  friend class ShenandoahHeap; // For expand_and_allocate()
       friend class Metaspace;
       friend class MetaspaceUtils;
       friend class metaspace::PrintCLDMetaspaceInfoClosure;
    diff --git a/src/hotspot/share/memory/metaspace/virtualSpaceList.cpp b/src/hotspot/share/memory/metaspace/virtualSpaceList.cpp
    index cf1c71f8744..4d0f90832b9 100644
    --- a/src/hotspot/share/memory/metaspace/virtualSpaceList.cpp
    +++ b/src/hotspot/share/memory/metaspace/virtualSpaceList.cpp
    @@ -89,7 +89,6 @@ void VirtualSpaceList::dec_virtual_space_count() {
     // nodes with a 0 container_count.  Remove Metachunks in
     // the node from their respective freelists.
     void VirtualSpaceList::purge(ChunkManager* chunk_manager) {
    -  assert(SafepointSynchronize::is_at_safepoint(), "must be called at safepoint for contains to work");
       assert_lock_strong(MetaspaceExpand_lock);
       // Don't use a VirtualSpaceListIterator because this
       // list is being changed and a straightforward use of an iterator is not safe.
    diff --git a/src/hotspot/share/memory/metaspaceShared.cpp b/src/hotspot/share/memory/metaspaceShared.cpp
    index 482249c3451..1a998998d28 100644
    --- a/src/hotspot/share/memory/metaspaceShared.cpp
    +++ b/src/hotspot/share/memory/metaspaceShared.cpp
    @@ -61,7 +61,7 @@
     #include "runtime/signature.hpp"
     #include "runtime/timerTrace.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "utilities/align.hpp"
     #include "utilities/bitMap.hpp"
     #include "utilities/defaultStream.hpp"
    diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp
    index b30c20a5c3f..49aadd10f46 100644
    --- a/src/hotspot/share/memory/universe.cpp
    +++ b/src/hotspot/share/memory/universe.cpp
    @@ -72,7 +72,7 @@
     #include "runtime/synchronizer.hpp"
     #include "runtime/thread.inline.hpp"
     #include "runtime/timerTrace.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/memoryService.hpp"
     #include "utilities/align.hpp"
     #include "utilities/copy.hpp"
    @@ -1118,8 +1118,9 @@ void Universe::initialize_verify_flags() {
       size_t length = strlen(VerifySubSet);
       char* subset_list = NEW_C_HEAP_ARRAY(char, length + 1, mtInternal);
       strncpy(subset_list, VerifySubSet, length + 1);
    +  char* save_ptr;
     
    -  char* token = strtok(subset_list, delimiter);
    +  char* token = strtok_r(subset_list, delimiter, &save_ptr);
       while (token != NULL) {
         if (strcmp(token, "threads") == 0) {
           verify_flags |= Verify_Threads;
    @@ -1144,7 +1145,7 @@ void Universe::initialize_verify_flags() {
         } else {
           vm_exit_during_initialization(err_msg("VerifySubSet: \'%s\' memory sub-system is unknown, please correct it", token));
         }
    -    token = strtok(NULL, delimiter);
    +    token = strtok_r(NULL, delimiter, &save_ptr);
       }
       FREE_C_HEAP_ARRAY(char, subset_list);
     }
    diff --git a/src/hotspot/share/oops/constantPool.cpp b/src/hotspot/share/oops/constantPool.cpp
    index ef2184f5af6..bcce4d32e3c 100644
    --- a/src/hotspot/share/oops/constantPool.cpp
    +++ b/src/hotspot/share/oops/constantPool.cpp
    @@ -2326,29 +2326,6 @@ void ConstantPool::patch_resolved_references(GrowableArray* cp_patches)
     #endif // ASSERT
     }
     
    -#ifndef PRODUCT
    -
    -// CompileTheWorld support. Preload all classes loaded references in the passed in constantpool
    -void ConstantPool::preload_and_initialize_all_classes(ConstantPool* obj, TRAPS) {
    -  guarantee(obj->is_constantPool(), "object must be constant pool");
    -  constantPoolHandle cp(THREAD, (ConstantPool*)obj);
    -  guarantee(cp->pool_holder() != NULL, "must be fully loaded");
    -
    -  for (int i = 0; i< cp->length();  i++) {
    -    if (cp->tag_at(i).is_unresolved_klass()) {
    -      // This will force loading of the class
    -      Klass* klass = cp->klass_at(i, CHECK);
    -      if (klass->is_instance_klass()) {
    -        // Force initialization of class
    -        InstanceKlass::cast(klass)->initialize(CHECK);
    -      }
    -    }
    -  }
    -}
    -
    -#endif
    -
    -
     // Printing
     
     void ConstantPool::print_on(outputStream* st) const {
    diff --git a/src/hotspot/share/oops/constantPool.hpp b/src/hotspot/share/oops/constantPool.hpp
    index 8b00d1323d1..dc74e287295 100644
    --- a/src/hotspot/share/oops/constantPool.hpp
    +++ b/src/hotspot/share/oops/constantPool.hpp
    @@ -938,11 +938,6 @@ class ConstantPool : public Metadata {
       void print_entry_on(int index, outputStream* st);
     
       const char* internal_name() const { return "{constant pool}"; }
    -
    -#ifndef PRODUCT
    -  // Compile the world support
    -  static void preload_and_initialize_all_classes(ConstantPool* constant_pool, TRAPS);
    -#endif
     };
     
     class SymbolHashMapEntry : public CHeapObj {
    diff --git a/src/hotspot/share/oops/generateOopMap.cpp b/src/hotspot/share/oops/generateOopMap.cpp
    index 8a53e7a0095..edb9c106d42 100644
    --- a/src/hotspot/share/oops/generateOopMap.cpp
    +++ b/src/hotspot/share/oops/generateOopMap.cpp
    @@ -1879,7 +1879,7 @@ void GenerateOopMap::do_ldc(int bci) {
       constantTag tag = cp->tag_at(ldc.pool_index()); // idx is index in resolved_references
       BasicType       bt  = ldc.result_type();
     #ifdef ASSERT
    -  BasicType   tag_bt = tag.is_dynamic_constant() ? bt : tag.basic_type();
    +  BasicType   tag_bt = (tag.is_dynamic_constant() || tag.is_dynamic_constant_in_error()) ? bt : tag.basic_type();
       assert(bt == tag_bt, "same result");
     #endif
       CellTypeState   cts;
    diff --git a/src/hotspot/share/oops/instanceKlass.hpp b/src/hotspot/share/oops/instanceKlass.hpp
    index 73a8871b8b2..41568f71d84 100644
    --- a/src/hotspot/share/oops/instanceKlass.hpp
    +++ b/src/hotspot/share/oops/instanceKlass.hpp
    @@ -678,12 +678,6 @@ public:
         }
       }
     
    -  // Oop that keeps the metadata for this class from being unloaded
    -  // in places where the metadata is stored in other places, like nmethods
    -  oop klass_holder() const {
    -    return (is_unsafe_anonymous()) ? java_mirror() : class_loader();
    -  }
    -
       bool is_contended() const                {
         return (_misc_flags & _misc_is_contended) != 0;
       }
    diff --git a/src/hotspot/share/oops/klass.cpp b/src/hotspot/share/oops/klass.cpp
    index 7a463cbc24d..8cebabce322 100644
    --- a/src/hotspot/share/oops/klass.cpp
    +++ b/src/hotspot/share/oops/klass.cpp
    @@ -467,10 +467,6 @@ void Klass::clean_subklass() {
       }
     }
     
    -oop Klass::holder_phantom() const {
    -  return class_loader_data()->holder_phantom();
    -}
    -
     void Klass::clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses) {
       if (!ClassUnloading || !unloading_occurred) {
         return;
    diff --git a/src/hotspot/share/oops/klass.hpp b/src/hotspot/share/oops/klass.hpp
    index 4d92ec35a07..b7378114ee6 100644
    --- a/src/hotspot/share/oops/klass.hpp
    +++ b/src/hotspot/share/oops/klass.hpp
    @@ -500,7 +500,11 @@ protected:
     
       oop class_loader() const;
     
    -  virtual oop klass_holder() const      { return class_loader(); }
    +  // This loads the klass's holder as a phantom. This is useful when a weak Klass
    +  // pointer has been "peeked" and then must be kept alive before it may
    +  // be used safely.  All uses of klass_holder need to apply the appropriate barriers,
    +  // except during GC.
    +  oop klass_holder() const { return class_loader_data()->holder_phantom(); }
     
      protected:
       virtual Klass* array_klass_impl(bool or_null, int rank, TRAPS);
    @@ -655,11 +659,6 @@ protected:
       // unloading, and hence during concurrent class unloading.
       bool is_loader_alive() const { return class_loader_data()->is_alive(); }
     
    -  // Load the klass's holder as a phantom. This is useful when a weak Klass
    -  // pointer has been "peeked" and then must be kept alive before it may
    -  // be used safely.
    -  oop holder_phantom() const;
    -
       void clean_subklass();
     
       static void clean_weak_klass_links(bool unloading_occurred, bool clean_alive_klasses = true);
    diff --git a/src/hotspot/share/oops/weakHandle.hpp b/src/hotspot/share/oops/weakHandle.hpp
    index 57587c4f224..614504fe82e 100644
    --- a/src/hotspot/share/oops/weakHandle.hpp
    +++ b/src/hotspot/share/oops/weakHandle.hpp
    @@ -39,7 +39,7 @@ class OopStorage;
     // This is the vm version of jweak but has different GC lifetimes and policies,
     // depending on the type.
     
    -enum WeakHandleType { vm_class_loader_data, vm_string, vm_string_table_data };
    +enum WeakHandleType { vm_class_loader_data, vm_string_table_data };
     
     template 
     class WeakHandle {
    diff --git a/src/hotspot/share/opto/arraycopynode.cpp b/src/hotspot/share/opto/arraycopynode.cpp
    index 0c2348975c2..7a0836f940f 100644
    --- a/src/hotspot/share/opto/arraycopynode.cpp
    +++ b/src/hotspot/share/opto/arraycopynode.cpp
    @@ -497,7 +497,7 @@ bool ArrayCopyNode::finish_transform(PhaseGVN *phase, bool can_reshape,
       } else {
         if (in(TypeFunc::Control) != ctl) {
           // we can't return new memory and control from Ideal at parse time
    -      assert(!is_clonebasic(), "added control for clone?");
    +      assert(!is_clonebasic() || UseShenandoahGC, "added control for clone?");
           phase->record_for_igvn(this);
           return false;
         }
    diff --git a/src/hotspot/share/opto/bytecodeInfo.cpp b/src/hotspot/share/opto/bytecodeInfo.cpp
    index 1a0921171b9..2d6d2c271a9 100644
    --- a/src/hotspot/share/opto/bytecodeInfo.cpp
    +++ b/src/hotspot/share/opto/bytecodeInfo.cpp
    @@ -288,8 +288,8 @@ bool InlineTree::should_not_inline(ciMethod *callee_method,
         return false;
       }
     
    -  // don't use counts with -Xcomp or CTW
    -  if (UseInterpreter && !CompileTheWorld) {
    +  // don't use counts with -Xcomp
    +  if (UseInterpreter) {
     
         if (!callee_method->has_compiled_code() &&
             !callee_method->was_executed_more_than(0)) {
    @@ -364,9 +364,9 @@ bool InlineTree::try_to_inline(ciMethod* callee_method, ciMethod* caller_method,
           }
         }
     
    -    if ((!UseInterpreter || CompileTheWorld) &&
    +    if (!UseInterpreter &&
             is_init_with_ea(callee_method, caller_method, C)) {
    -      // Escape Analysis stress testing when running Xcomp or CTW:
    +      // Escape Analysis stress testing when running Xcomp:
           // inline constructors even if they are not reached.
         } else if (forced_inline()) {
           // Inlining was forced by CompilerOracle, ciReplay or annotation
    @@ -453,7 +453,7 @@ bool pass_initial_checks(ciMethod* caller_method, int caller_bci, ciMethod* call
       // Check if klass of callee_method is loaded
       if( !callee_holder->is_loaded() )      return false;
       if( !callee_holder->is_initialized() ) return false;
    -  if( !UseInterpreter || CompileTheWorld /* running Xcomp or CTW */ ) {
    +  if( !UseInterpreter ) /* running Xcomp */ {
         // Checks that constant pool's call site has been visited
         // stricter than callee_holder->is_initialized()
         ciBytecodeStream iter(caller_method);
    diff --git a/src/hotspot/share/opto/castnode.cpp b/src/hotspot/share/opto/castnode.cpp
    index ebd7d33112e..e4a6de89727 100644
    --- a/src/hotspot/share/opto/castnode.cpp
    +++ b/src/hotspot/share/opto/castnode.cpp
    @@ -291,7 +291,7 @@ Node* CheckCastPPNode::Identity(PhaseGVN* phase) {
         return this;
       }
       // Toned down to rescue meeting at a Phi 3 different oops all implementing
    -  // the same interface.  CompileTheWorld starting at 502, kd12rc1.zip.
    +  // the same interface.
       return (phase->type(in(1)) == phase->type(this)) ? in(1) : this;
     }
     
    diff --git a/src/hotspot/share/opto/cfgnode.hpp b/src/hotspot/share/opto/cfgnode.hpp
    index 356f0e30ed9..d7c6c95302d 100644
    --- a/src/hotspot/share/opto/cfgnode.hpp
    +++ b/src/hotspot/share/opto/cfgnode.hpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -304,7 +304,6 @@ private:
     protected:
       ProjNode* range_check_trap_proj(int& flip, Node*& l, Node*& r);
       Node* Ideal_common(PhaseGVN *phase, bool can_reshape);
    -  Node* dominated_by(Node* prev_dom, PhaseIterGVN* igvn);
       Node* search_identical(int dist);
     
     public:
    @@ -392,6 +391,7 @@ public:
       virtual const RegMask &out_RegMask() const;
       Node* fold_compares(PhaseIterGVN* phase);
       static Node* up_one_dom(Node* curr, bool linear_only = false);
    +  Node* dominated_by(Node* prev_dom, PhaseIterGVN* igvn);
     
       // Takes the type of val and filters it through the test represented
       // by if_proj and returns a more refined type if one is produced.
    diff --git a/src/hotspot/share/opto/classes.cpp b/src/hotspot/share/opto/classes.cpp
    index e8ac3a61de1..75f070f7c84 100644
    --- a/src/hotspot/share/opto/classes.cpp
    +++ b/src/hotspot/share/opto/classes.cpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -51,6 +51,9 @@
     #if INCLUDE_ZGC
     #include "gc/z/c2/zBarrierSetC2.hpp"
     #endif
    +#if INCLUDE_SHENANDOAHGC
    +#include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
    +#endif
     
     // ----------------------------------------------------------------------------
     // Build a table of virtual functions to map from Nodes to dense integer
    diff --git a/src/hotspot/share/opto/classes.hpp b/src/hotspot/share/opto/classes.hpp
    index 75148adcf9c..d92a5840127 100644
    --- a/src/hotspot/share/opto/classes.hpp
    +++ b/src/hotspot/share/opto/classes.hpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -264,6 +264,21 @@ macro(RoundDouble)
     macro(RoundFloat)
     macro(SafePoint)
     macro(SafePointScalarObject)
    +#if INCLUDE_SHENANDOAHGC
    +#define shmacro(x) macro(x)
    +#else
    +#define shmacro(x) optionalmacro(x)
    +#endif
    +shmacro(ShenandoahCompareAndExchangeP)
    +shmacro(ShenandoahCompareAndExchangeN)
    +shmacro(ShenandoahCompareAndSwapN)
    +shmacro(ShenandoahCompareAndSwapP)
    +shmacro(ShenandoahWeakCompareAndSwapN)
    +shmacro(ShenandoahWeakCompareAndSwapP)
    +shmacro(ShenandoahEnqueueBarrier)
    +shmacro(ShenandoahReadBarrier)
    +shmacro(ShenandoahWriteBarrier)
    +shmacro(ShenandoahWBMemProj)
     macro(SCMemProj)
     macro(SqrtD)
     macro(SqrtF)
    diff --git a/src/hotspot/share/opto/compile.cpp b/src/hotspot/share/opto/compile.cpp
    index 5d2465352a8..b113715aed9 100644
    --- a/src/hotspot/share/opto/compile.cpp
    +++ b/src/hotspot/share/opto/compile.cpp
    @@ -3061,7 +3061,7 @@ void Compile::final_graph_reshaping_main_switch(Node* n, Final_Reshape_Counts& f
             Node *m = wq.at(next);
             for (DUIterator_Fast imax, i = m->fast_outs(imax); i < imax; i++) {
               Node* use = m->fast_out(i);
    -          if (use->is_Mem() || use->is_EncodeNarrowPtr()) {
    +          if (use->is_Mem() || use->is_EncodeNarrowPtr() || use->is_ShenandoahBarrier()) {
                 use->ensure_control_or_add_prec(n->in(0));
               } else {
                 switch(use->Opcode()) {
    diff --git a/src/hotspot/share/opto/compile.hpp b/src/hotspot/share/opto/compile.hpp
    index 0afc2bd89a5..23b49689aca 100644
    --- a/src/hotspot/share/opto/compile.hpp
    +++ b/src/hotspot/share/opto/compile.hpp
    @@ -93,6 +93,8 @@ struct Final_Reshape_Counts;
     enum LoopOptsMode {
       LoopOptsDefault,
       LoopOptsNone,
    +  LoopOptsShenandoahExpand,
    +  LoopOptsShenandoahPostExpand,
       LoopOptsSkipSplitIf,
       LoopOptsVerify,
       LoopOptsLastRound
    diff --git a/src/hotspot/share/opto/connode.cpp b/src/hotspot/share/opto/connode.cpp
    index 26c1ef099e6..1bf7aaaf796 100644
    --- a/src/hotspot/share/opto/connode.cpp
    +++ b/src/hotspot/share/opto/connode.cpp
    @@ -57,8 +57,7 @@ ConNode *ConNode::make(const Type *t) {
       case T_NARROWKLASS: return new ConNKlassNode( t->is_narrowklass() );
       case T_METADATA:    return new ConPNode( t->is_ptr() );
         // Expected cases:  TypePtr::NULL_PTR, any is_rawptr()
    -    // Also seen: AnyPtr(TopPTR *+top); from command line:
    -    //   r -XX:+PrintOpto -XX:CIStart=285 -XX:+CompileTheWorld -XX:CompileTheWorldStartAt=660
    +    // Also seen: AnyPtr(TopPTR *+top);
         // %%%% Stop using TypePtr::NULL_PTR to represent nulls:  use either TypeRawPtr::NULL_PTR
         // or else TypeOopPtr::NULL_PTR.  Then set Type::_basic_type[AnyPtr] = T_ILLEGAL
       default:
    diff --git a/src/hotspot/share/opto/lcm.cpp b/src/hotspot/share/opto/lcm.cpp
    index 50c0c2dd341..9e43a24aac5 100644
    --- a/src/hotspot/share/opto/lcm.cpp
    +++ b/src/hotspot/share/opto/lcm.cpp
    @@ -178,6 +178,7 @@ void PhaseCFG::implicit_null_check(Block* block, Node *proj, Node *val, int allo
         case Op_LoadRange:
         case Op_LoadD_unaligned:
         case Op_LoadL_unaligned:
    +    case Op_ShenandoahReadBarrier:
           assert(mach->in(2) == val, "should be address");
           break;
         case Op_StoreB:
    diff --git a/src/hotspot/share/opto/library_call.cpp b/src/hotspot/share/opto/library_call.cpp
    index 31446754120..2f733e1e73a 100644
    --- a/src/hotspot/share/opto/library_call.cpp
    +++ b/src/hotspot/share/opto/library_call.cpp
    @@ -4464,7 +4464,7 @@ JVMState* LibraryCallKit::arraycopy_restore_alloc_state(AllocateArrayNode* alloc
             for (MergeMemStream mms(merged_memory(), mem->as_MergeMem()); mms.next_non_empty2(); ) {
               Node* n = mms.memory();
               if (n != mms.memory2() && !(n->is_Proj() && n->in(0) == alloc->initialization())) {
    -            assert(n->is_Store(), "what else?");
    +            assert(n->is_Store() || n->Opcode() == Op_ShenandoahWBMemProj, "what else?");
                 no_interfering_store = false;
                 break;
               }
    @@ -4473,7 +4473,7 @@ JVMState* LibraryCallKit::arraycopy_restore_alloc_state(AllocateArrayNode* alloc
             for (MergeMemStream mms(merged_memory()); mms.next_non_empty(); ) {
               Node* n = mms.memory();
               if (n != mem && !(n->is_Proj() && n->in(0) == alloc->initialization())) {
    -            assert(n->is_Store(), "what else?");
    +            assert(n->is_Store() || n->Opcode() == Op_ShenandoahWBMemProj, "what else?");
                 no_interfering_store = false;
                 break;
               }
    diff --git a/src/hotspot/share/opto/loopPredicate.cpp b/src/hotspot/share/opto/loopPredicate.cpp
    index de26c44144e..0f848d30d5f 100644
    --- a/src/hotspot/share/opto/loopPredicate.cpp
    +++ b/src/hotspot/share/opto/loopPredicate.cpp
    @@ -536,6 +536,9 @@ class Invariance : public StackObj {
         if (_lpt->is_invariant(n)) { // known invariant
           _invariant.set(n->_idx);
         } else if (!n->is_CFG()) {
    +      if (n->Opcode() == Op_ShenandoahWriteBarrier) {
    +        return;
    +      }
           Node *n_ctrl = _phase->ctrl_or_self(n);
           Node *u_ctrl = _phase->ctrl_or_self(use); // self if use is a CFG
           if (_phase->is_dominator(n_ctrl, u_ctrl)) {
    diff --git a/src/hotspot/share/opto/loopTransform.cpp b/src/hotspot/share/opto/loopTransform.cpp
    index 0e6c289ac13..31e362ef6c1 100644
    --- a/src/hotspot/share/opto/loopTransform.cpp
    +++ b/src/hotspot/share/opto/loopTransform.cpp
    @@ -2795,7 +2795,13 @@ void IdealLoopTree::adjust_loop_exit_prob( PhaseIdealLoop *phase ) {
                  (bol->in(1)->Opcode() == Op_CompareAndSwapI ) ||
                  (bol->in(1)->Opcode() == Op_CompareAndSwapL ) ||
                  (bol->in(1)->Opcode() == Op_CompareAndSwapP ) ||
    -             (bol->in(1)->Opcode() == Op_CompareAndSwapN )))
    +             (bol->in(1)->Opcode() == Op_CompareAndSwapN ) ||
    +             (bol->in(1)->Opcode() == Op_ShenandoahCompareAndExchangeP ) ||
    +             (bol->in(1)->Opcode() == Op_ShenandoahCompareAndExchangeN ) ||
    +             (bol->in(1)->Opcode() == Op_ShenandoahWeakCompareAndSwapP ) ||
    +             (bol->in(1)->Opcode() == Op_ShenandoahWeakCompareAndSwapN ) ||
    +             (bol->in(1)->Opcode() == Op_ShenandoahCompareAndSwapP ) ||
    +             (bol->in(1)->Opcode() == Op_ShenandoahCompareAndSwapN )))
               return;               // Allocation loops RARELY take backedge
             // Find the OTHER exit path from the IF
             Node* ex = iff->proj_out(1-test_con);
    diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp
    index 4bbe9909fef..c1d61ca8e4f 100644
    --- a/src/hotspot/share/opto/loopnode.cpp
    +++ b/src/hotspot/share/opto/loopnode.cpp
    @@ -3968,7 +3968,7 @@ Node *PhaseIdealLoop::get_late_ctrl( Node *n, Node *early ) {
         }
         while(worklist.size() != 0 && LCA != early) {
           Node* s = worklist.pop();
    -      if (s->is_Load() || s->Opcode() == Op_SafePoint ||
    +      if (s->is_Load() || s->is_ShenandoahBarrier() || s->Opcode() == Op_SafePoint ||
               (s->is_CallStaticJava() && s->as_CallStaticJava()->uncommon_trap_request() != 0)) {
             continue;
           } else if (s->is_MergeMem()) {
    @@ -4185,7 +4185,17 @@ void PhaseIdealLoop::verify_strip_mined_scheduling(Node *n, Node* least) {
     //------------------------------build_loop_late_post---------------------------
     // Put Data nodes into some loop nest, by setting the _nodes[]->loop mapping.
     // Second pass finds latest legal placement, and ideal loop placement.
    -void PhaseIdealLoop::build_loop_late_post( Node *n ) {
    +void PhaseIdealLoop::build_loop_late_post(Node *n) {
    +  BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
    +
    +  if (bs->build_loop_late_post(this, n)) {
    +    return;
    +  }
    +
    +  build_loop_late_post_work(n, true);
    +}
    +
    +void PhaseIdealLoop::build_loop_late_post_work(Node *n, bool pinned) {
     
       if (n->req() == 2 && (n->Opcode() == Op_ConvI2L || n->Opcode() == Op_CastII) && !C->major_progress() && !_verify_only) {
         _igvn._worklist.push(n);  // Maybe we'll normalize it, if no more loops.
    @@ -4206,7 +4216,6 @@ void PhaseIdealLoop::build_loop_late_post( Node *n ) {
         // _must_ be pinned (they have to observe their control edge of course).
         // Unlike Stores (which modify an unallocable resource, the memory
         // state), Mods/Loads can float around.  So free them up.
    -    bool pinned = true;
         switch( n->Opcode() ) {
         case Op_DivI:
         case Op_DivF:
    @@ -4503,6 +4512,7 @@ void PhaseIdealLoop::dump( IdealLoopTree *loop, uint idx, Node_List &rpo_list )
         }
       }
     }
    +#endif
     
     // Collect a R-P-O for the whole CFG.
     // Result list is in post-order (scan backwards for RPO)
    @@ -4525,7 +4535,6 @@ void PhaseIdealLoop::rpo( Node *start, Node_Stack &stk, VectorSet &visited, Node
         }
       }
     }
    -#endif
     
     
     //=============================================================================
    diff --git a/src/hotspot/share/opto/loopnode.hpp b/src/hotspot/share/opto/loopnode.hpp
    index cc108d070fa..aff577e2ce1 100644
    --- a/src/hotspot/share/opto/loopnode.hpp
    +++ b/src/hotspot/share/opto/loopnode.hpp
    @@ -38,6 +38,8 @@ class IdealLoopTree;
     class LoopNode;
     class Node;
     class OuterStripMinedLoopEndNode;
    +class ShenandoahBarrierNode;
    +class ShenandoahWriteBarrierNode;
     class PathFrequency;
     class PhaseIdealLoop;
     class CountedLoopReserveKit;
    @@ -636,6 +638,8 @@ class PhaseIdealLoop : public PhaseTransform {
       friend class IdealLoopTree;
       friend class SuperWord;
       friend class CountedLoopReserveKit;
    +  friend class ShenandoahBarrierNode;
    +  friend class ShenandoahWriteBarrierNode;
     
       // Pre-computed def-use info
       PhaseIterGVN &_igvn;
    @@ -863,7 +867,8 @@ private:
       // Place Data nodes in some loop nest
       void build_loop_early( VectorSet &visited, Node_List &worklist, Node_Stack &nstack );
       void build_loop_late ( VectorSet &visited, Node_List &worklist, Node_Stack &nstack );
    -  void build_loop_late_post ( Node* n );
    +  void build_loop_late_post_work(Node* n, bool pinned);
    +  void build_loop_late_post(Node* n);
       void verify_strip_mined_scheduling(Node *n, Node* least);
     
       // Array of immediate dominance info for each CFG node indexed by node idx
    @@ -1309,7 +1314,6 @@ public:
     #ifndef PRODUCT
       void dump( ) const;
       void dump( IdealLoopTree *loop, uint rpo_idx, Node_List &rpo_list ) const;
    -  void rpo( Node *start, Node_Stack &stk, VectorSet &visited, Node_List &rpo_list ) const;
       void verify() const;          // Major slow  :-)
       void verify_compare( Node *n, const PhaseIdealLoop *loop_verify, VectorSet &visited ) const;
       IdealLoopTree *get_loop_idx(Node* n) const {
    @@ -1321,6 +1325,7 @@ public:
       static int _loop_invokes;     // Count of PhaseIdealLoop invokes
       static int _loop_work;        // Sum of PhaseIdealLoop x _unique
     #endif
    +  void rpo( Node *start, Node_Stack &stk, VectorSet &visited, Node_List &rpo_list ) const;
     };
     
     // This kit may be used for making of a reserved copy of a loop before this loop
    diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp
    index ed027202f67..cfa2c45728c 100644
    --- a/src/hotspot/share/opto/loopopts.cpp
    +++ b/src/hotspot/share/opto/loopopts.cpp
    @@ -1024,6 +1024,11 @@ static bool merge_point_safe(Node* region) {
             Node* m = n->fast_out(j);
             if (m->is_FastLock())
               return false;
    +#if INCLUDE_SHENANDOAHGC
    +        if (m->is_ShenandoahBarrier() && m->has_out_with(Op_FastLock)) {
    +          return false;
    +        }
    +#endif
     #ifdef _LP64
             if (m->Opcode() == Op_ConvI2L)
               return false;
    @@ -1310,6 +1315,7 @@ void PhaseIdealLoop::split_if_with_blocks_post(Node *n, bool last_round) {
             // control, then the cloning of n is a pointless exercise, because
             // GVN will ensure that we end up where we started.
             if (!n->is_Load() || late_load_ctrl != n_ctrl) {
    +          BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
               for (DUIterator_Last jmin, j = n->last_outs(jmin); j >= jmin; ) {
                 Node *u = n->last_out(j); // Clone private computation per use
                 _igvn.rehash_node_delayed(u);
    @@ -1340,6 +1346,10 @@ void PhaseIdealLoop::split_if_with_blocks_post(Node *n, bool last_round) {
                 // For inner loop uses get the preheader area.
                 x_ctrl = place_near_use(x_ctrl);
     
    +            if (bs->sink_node(this, n, x, x_ctrl, n_ctrl)) {
    +              continue;
    +            }
    +
                 if (n->is_Load()) {
                   // For loads, add a control edge to a CFG node outside of the loop
                   // to force them to not combine and return back inside the loop
    @@ -3137,7 +3147,7 @@ bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) {
     
               // if not pinned and not a load (which maybe anti-dependent on a store)
               // and not a CMove (Matcher expects only bool->cmove).
    -          if ( n->in(0) == NULL && !n->is_Load() && !n->is_CMove() ) {
    +          if (n->in(0) == NULL && !n->is_Load() && !n->is_CMove() && n->Opcode() != Op_ShenandoahWBMemProj) {
                 cloned_for_outside_use += clone_for_use_outside_loop( loop, n, worklist );
                 sink_list.push(n);
                 peel     >>= n->_idx; // delete n from peel set.
    diff --git a/src/hotspot/share/opto/macro.cpp b/src/hotspot/share/opto/macro.cpp
    index 7e14451981b..8edb3578313 100644
    --- a/src/hotspot/share/opto/macro.cpp
    +++ b/src/hotspot/share/opto/macro.cpp
    @@ -47,9 +47,13 @@
     #include "opto/subnode.hpp"
     #include "opto/type.hpp"
     #include "runtime/sharedRuntime.hpp"
    +#include "utilities/macros.hpp"
     #if INCLUDE_G1GC
     #include "gc/g1/g1ThreadLocalData.hpp"
     #endif // INCLUDE_G1GC
    +#if INCLUDE_SHENANDOAHGC
    +#include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
    +#endif
     
     
     //
    @@ -629,6 +633,7 @@ bool PhaseMacroExpand::can_eliminate_allocation(AllocateNode *alloc, GrowableArr
                                        k < kmax && can_eliminate; k++) {
               Node* n = use->fast_out(k);
               if (!n->is_Store() && n->Opcode() != Op_CastP2X &&
    +              SHENANDOAHGC_ONLY((!UseShenandoahGC || !ShenandoahBarrierSetC2::is_shenandoah_wb_pre_call(n)) &&)
                   !(n->is_ArrayCopy() &&
                     n->as_ArrayCopy()->is_clonebasic() &&
                     n->in(ArrayCopyNode::Dest) == use)) {
    diff --git a/src/hotspot/share/opto/memnode.cpp b/src/hotspot/share/opto/memnode.cpp
    index 2e80495bac7..7d6684e3e82 100644
    --- a/src/hotspot/share/opto/memnode.cpp
    +++ b/src/hotspot/share/opto/memnode.cpp
    @@ -3230,7 +3230,7 @@ MemBarNode* MemBarNode::leading_membar() const {
       while (leading != NULL && (!leading->is_MemBar() || !leading->as_MemBar()->leading())) {
         while (leading == NULL || leading->is_top() || seen.test_set(leading->_idx)) {
           leading = NULL;
    -      while (regions.size() > 0) {
    +      while (regions.size() > 0 && leading == NULL) {
             Node* r = regions.node();
             uint i = regions.index();
             if (i < r->req()) {
    diff --git a/src/hotspot/share/opto/node.hpp b/src/hotspot/share/opto/node.hpp
    index f5717d78f95..6b1dad1550f 100644
    --- a/src/hotspot/share/opto/node.hpp
    +++ b/src/hotspot/share/opto/node.hpp
    @@ -142,6 +142,7 @@ class RegionNode;
     class RootNode;
     class SafePointNode;
     class SafePointScalarObjectNode;
    +class ShenandoahBarrierNode;
     class StartNode;
     class State;
     class StoreNode;
    @@ -675,6 +676,7 @@ public:
           DEFINE_CLASS_ID(EncodeNarrowPtr, Type, 6)
             DEFINE_CLASS_ID(EncodeP, EncodeNarrowPtr, 0)
             DEFINE_CLASS_ID(EncodePKlass, EncodeNarrowPtr, 1)
    +      DEFINE_CLASS_ID(ShenandoahBarrier, Type, 7)
     
         DEFINE_CLASS_ID(Proj,  Node, 3)
           DEFINE_CLASS_ID(CatchProj, Proj, 0)
    @@ -873,6 +875,7 @@ public:
       DEFINE_CLASS_QUERY(Root)
       DEFINE_CLASS_QUERY(SafePoint)
       DEFINE_CLASS_QUERY(SafePointScalarObject)
    +  DEFINE_CLASS_QUERY(ShenandoahBarrier)
       DEFINE_CLASS_QUERY(Start)
       DEFINE_CLASS_QUERY(Store)
       DEFINE_CLASS_QUERY(Sub)
    diff --git a/src/hotspot/share/opto/output.cpp b/src/hotspot/share/opto/output.cpp
    index 1df83d3ace3..a85e6789f16 100644
    --- a/src/hotspot/share/opto/output.cpp
    +++ b/src/hotspot/share/opto/output.cpp
    @@ -1704,7 +1704,9 @@ Scheduling::Scheduling(Arena *arena, Compile &compile)
       _current_latency = NEW_ARENA_ARRAY(arena, unsigned short, node_max);
     
       // Clear the arrays
    -  memset(_node_bundling_base, 0, node_max * sizeof(Bundle));
    +  for (uint i = 0; i < node_max; i++) {
    +    ::new (&_node_bundling_base[i]) Bundle();
    +  }
       memset(_node_latency,       0, node_max * sizeof(unsigned short));
       memset(_uses,               0, node_max * sizeof(short));
       memset(_current_latency,    0, node_max * sizeof(unsigned short));
    diff --git a/src/hotspot/share/opto/type.cpp b/src/hotspot/share/opto/type.cpp
    index e28c244e9ac..73b319fa8e3 100644
    --- a/src/hotspot/share/opto/type.cpp
    +++ b/src/hotspot/share/opto/type.cpp
    @@ -3044,6 +3044,10 @@ const TypeOopPtr *TypeOopPtr::cast_to_instance_id(int instance_id) const {
       return this;
     }
     
    +const TypeOopPtr *TypeOopPtr::cast_to_nonconst() const {
    +  return this;
    +}
    +
     //-----------------------------cast_to_exactness-------------------------------
     const Type *TypeOopPtr::cast_to_exactness(bool klass_is_exact) const {
       // There is no such thing as an exact general oop.
    @@ -3546,6 +3550,11 @@ const TypeOopPtr *TypeInstPtr::cast_to_instance_id(int instance_id) const {
       return make(_ptr, klass(), _klass_is_exact, const_oop(), _offset, instance_id, _speculative, _inline_depth);
     }
     
    +const TypeOopPtr *TypeInstPtr::cast_to_nonconst() const {
    +  if (const_oop() == NULL) return this;
    +  return make(NotNull, klass(), _klass_is_exact, NULL, _offset, _instance_id, _speculative, _inline_depth);
    +}
    +
     //------------------------------xmeet_unloaded---------------------------------
     // Compute the MEET of two InstPtrs when at least one is unloaded.
     // Assume classes are different since called after check for same name/class-loader
    @@ -4073,6 +4082,12 @@ const TypeOopPtr *TypeAryPtr::cast_to_instance_id(int instance_id) const {
       return make(_ptr, const_oop(), _ary, klass(), _klass_is_exact, _offset, instance_id, _speculative, _inline_depth);
     }
     
    +const TypeOopPtr *TypeAryPtr::cast_to_nonconst() const {
    +  if (const_oop() == NULL) return this;
    +  return make(NotNull, NULL, _ary, klass(), _klass_is_exact, _offset, _instance_id, _speculative, _inline_depth);
    +}
    +
    +
     //-----------------------------narrow_size_type-------------------------------
     // Local cache for arrayOopDesc::max_array_length(etype),
     // which is kind of slow (and cached elsewhere by other users).
    diff --git a/src/hotspot/share/opto/type.hpp b/src/hotspot/share/opto/type.hpp
    index 17a1f77aaa4..105e28344db 100644
    --- a/src/hotspot/share/opto/type.hpp
    +++ b/src/hotspot/share/opto/type.hpp
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -1028,6 +1028,8 @@ public:
     
       virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
     
    +  virtual const TypeOopPtr *cast_to_nonconst() const;
    +
       // corresponding pointer to klass, for a given instance
       const TypeKlassPtr* as_klass_type() const;
     
    @@ -1110,6 +1112,8 @@ class TypeInstPtr : public TypeOopPtr {
     
       virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
     
    +  virtual const TypeOopPtr *cast_to_nonconst() const;
    +
       virtual const TypePtr *add_offset( intptr_t offset ) const;
     
       // Speculative type helper methods.
    @@ -1193,6 +1197,8 @@ public:
     
       virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
     
    +  virtual const TypeOopPtr *cast_to_nonconst() const;
    +
       virtual const TypeAryPtr* cast_to_size(const TypeInt* size) const;
       virtual const TypeInt* narrow_size_type(const TypeInt* size) const;
     
    @@ -1770,6 +1776,8 @@ inline bool Type::is_ptr_to_boxing_obj() const {
     // UseOptoBiasInlining
     #define XorXNode     XorLNode
     #define StoreXConditionalNode StoreLConditionalNode
    +#define LoadXNode    LoadLNode
    +#define StoreXNode   StoreLNode
     // Opcodes
     #define Op_LShiftX   Op_LShiftL
     #define Op_AndX      Op_AndL
    @@ -1815,6 +1823,8 @@ inline bool Type::is_ptr_to_boxing_obj() const {
     // UseOptoBiasInlining
     #define XorXNode     XorINode
     #define StoreXConditionalNode StoreIConditionalNode
    +#define LoadXNode    LoadINode
    +#define StoreXNode   StoreINode
     // Opcodes
     #define Op_LShiftX   Op_LShiftI
     #define Op_AndX      Op_AndI
    diff --git a/src/hotspot/share/prims/jni.cpp b/src/hotspot/share/prims/jni.cpp
    index 970d3d4e21b..1278f1d9f3a 100644
    --- a/src/hotspot/share/prims/jni.cpp
    +++ b/src/hotspot/share/prims/jni.cpp
    @@ -79,7 +79,7 @@
     #include "runtime/sharedRuntime.hpp"
     #include "runtime/signature.hpp"
     #include "runtime/thread.inline.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/memTracker.hpp"
     #include "services/runtimeService.hpp"
     #include "utilities/defaultStream.hpp"
    @@ -437,8 +437,9 @@ JNI_ENTRY(jclass, jni_FindClass(JNIEnv *env, const char *name))
       // If we were the first invocation of jni_FindClass, we enable compilation again
       // rather than just allowing invocation counter to overflow and decay.
       // Controlled by flag DelayCompilationDuringStartup.
    -  if (first_time && !CompileTheWorld)
    +  if (first_time) {
         CompilationPolicy::completed_vm_startup();
    +  }
     
       return result;
     JNI_END
    @@ -3969,8 +3970,6 @@ static jint JNI_CreateJavaVM_inner(JavaVM **vm, void **penv, void *args) {
         post_thread_start_event(thread);
     
     #ifndef PRODUCT
    -    // Check if we should compile all classes on bootclasspath
    -    if (CompileTheWorld) ClassLoader::compile_the_world();
         if (ReplayCompiles) ciReplay::replay(thread);
     
         // Some platforms (like Win*) need a wrapper around these test
    diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp
    index 23579e66f7b..429f2d7d469 100644
    --- a/src/hotspot/share/prims/jvm.cpp
    +++ b/src/hotspot/share/prims/jvm.cpp
    @@ -72,7 +72,7 @@
     #include "runtime/thread.inline.hpp"
     #include "runtime/threadSMR.hpp"
     #include "runtime/vframe.inline.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "runtime/vm_version.hpp"
     #include "services/attachListener.hpp"
     #include "services/management.hpp"
    diff --git a/src/hotspot/share/prims/jvmtiEnvBase.cpp b/src/hotspot/share/prims/jvmtiEnvBase.cpp
    index 457745fdd16..cf44acb9712 100644
    --- a/src/hotspot/share/prims/jvmtiEnvBase.cpp
    +++ b/src/hotspot/share/prims/jvmtiEnvBase.cpp
    @@ -52,7 +52,7 @@
     #include "runtime/vframe.hpp"
     #include "runtime/vframe_hp.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     ///////////////////////////////////////////////////////////////
     //
    diff --git a/src/hotspot/share/prims/jvmtiEnvBase.hpp b/src/hotspot/share/prims/jvmtiEnvBase.hpp
    index 9a8f583e847..5aaa541dbd5 100644
    --- a/src/hotspot/share/prims/jvmtiEnvBase.hpp
    +++ b/src/hotspot/share/prims/jvmtiEnvBase.hpp
    @@ -33,7 +33,7 @@
     #include "runtime/fieldDescriptor.hpp"
     #include "runtime/frame.hpp"
     #include "runtime/thread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "utilities/growableArray.hpp"
     #include "utilities/macros.hpp"
     
    diff --git a/src/hotspot/share/prims/jvmtiEnvThreadState.cpp b/src/hotspot/share/prims/jvmtiEnvThreadState.cpp
    index 2e46b22a6ee..f48aa458431 100644
    --- a/src/hotspot/share/prims/jvmtiEnvThreadState.cpp
    +++ b/src/hotspot/share/prims/jvmtiEnvThreadState.cpp
    @@ -37,7 +37,7 @@
     #include "runtime/signature.hpp"
     #include "runtime/thread.inline.hpp"
     #include "runtime/vframe.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     
     ///////////////////////////////////////////////////////////////
    diff --git a/src/hotspot/share/prims/jvmtiEventController.cpp b/src/hotspot/share/prims/jvmtiEventController.cpp
    index 0c0a88e3041..23bac8d29b1 100644
    --- a/src/hotspot/share/prims/jvmtiEventController.cpp
    +++ b/src/hotspot/share/prims/jvmtiEventController.cpp
    @@ -38,7 +38,7 @@
     #include "runtime/vframe.hpp"
     #include "runtime/vframe_hp.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     #ifdef JVMTI_TRACE
     #define EC_TRACE(out) do { \
    diff --git a/src/hotspot/share/prims/jvmtiImpl.cpp b/src/hotspot/share/prims/jvmtiImpl.cpp
    index c634c1b7171..18f3a96a73f 100644
    --- a/src/hotspot/share/prims/jvmtiImpl.cpp
    +++ b/src/hotspot/share/prims/jvmtiImpl.cpp
    @@ -50,7 +50,7 @@
     #include "runtime/threadSMR.hpp"
     #include "runtime/vframe.hpp"
     #include "runtime/vframe_hp.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "utilities/exceptions.hpp"
     
     //
    diff --git a/src/hotspot/share/prims/jvmtiImpl.hpp b/src/hotspot/share/prims/jvmtiImpl.hpp
    index 8f29dd377d0..61b2002ce7d 100644
    --- a/src/hotspot/share/prims/jvmtiImpl.hpp
    +++ b/src/hotspot/share/prims/jvmtiImpl.hpp
    @@ -33,7 +33,7 @@
     #include "prims/jvmtiTrace.hpp"
     #include "prims/jvmtiUtil.hpp"
     #include "runtime/stackValueCollection.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "utilities/ostream.hpp"
     
     //
    diff --git a/src/hotspot/share/prims/jvmtiRedefineClasses.hpp b/src/hotspot/share/prims/jvmtiRedefineClasses.hpp
    index f4b5b8fc958..8c17d901204 100644
    --- a/src/hotspot/share/prims/jvmtiRedefineClasses.hpp
    +++ b/src/hotspot/share/prims/jvmtiRedefineClasses.hpp
    @@ -30,7 +30,7 @@
     #include "memory/resourceArea.hpp"
     #include "oops/objArrayKlass.hpp"
     #include "oops/objArrayOop.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     // Introduction:
     //
    diff --git a/src/hotspot/share/prims/jvmtiTagMap.cpp b/src/hotspot/share/prims/jvmtiTagMap.cpp
    index 092aac1c6f8..fc0c3b60a31 100644
    --- a/src/hotspot/share/prims/jvmtiTagMap.cpp
    +++ b/src/hotspot/share/prims/jvmtiTagMap.cpp
    @@ -58,7 +58,7 @@
     #include "runtime/threadSMR.hpp"
     #include "runtime/vframe.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "utilities/macros.hpp"
     #if INCLUDE_ZGC
     #include "gc/z/zGlobals.hpp"
    diff --git a/src/hotspot/share/prims/jvmtiTrace.hpp b/src/hotspot/share/prims/jvmtiTrace.hpp
    index 2376e827e5e..4cca04d8854 100644
    --- a/src/hotspot/share/prims/jvmtiTrace.hpp
    +++ b/src/hotspot/share/prims/jvmtiTrace.hpp
    @@ -32,7 +32,7 @@
     #include "prims/jvmtiEventController.hpp"
     #include "prims/jvmtiUtil.hpp"
     #include "runtime/stackValueCollection.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     ///////////////////////////////////////////////////////////////
     //
    diff --git a/src/hotspot/share/prims/jvmtiUtil.cpp b/src/hotspot/share/prims/jvmtiUtil.cpp
    index f5c7986085b..640081b8ad5 100644
    --- a/src/hotspot/share/prims/jvmtiUtil.cpp
    +++ b/src/hotspot/share/prims/jvmtiUtil.cpp
    @@ -27,7 +27,7 @@
     #include "runtime/handles.hpp"
     #include "runtime/handles.inline.hpp"
     #include "runtime/interfaceSupport.inline.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "utilities/exceptions.hpp"
     
     //
    diff --git a/src/hotspot/share/runtime/biasedLocking.cpp b/src/hotspot/share/runtime/biasedLocking.cpp
    index 5a832fbe22f..c2e4914c188 100644
    --- a/src/hotspot/share/runtime/biasedLocking.cpp
    +++ b/src/hotspot/share/runtime/biasedLocking.cpp
    @@ -39,7 +39,7 @@
     #include "runtime/threadSMR.hpp"
     #include "runtime/vframe.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     
     static bool _biased_locking_enabled = false;
    diff --git a/src/hotspot/share/runtime/compilationPolicy.cpp b/src/hotspot/share/runtime/compilationPolicy.cpp
    index 8d6a2a06a4d..b1a314e1b3c 100644
    --- a/src/hotspot/share/runtime/compilationPolicy.cpp
    +++ b/src/hotspot/share/runtime/compilationPolicy.cpp
    @@ -42,7 +42,7 @@
     #include "runtime/tieredThresholdPolicy.hpp"
     #include "runtime/timer.hpp"
     #include "runtime/vframe.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "utilities/events.hpp"
     #include "utilities/globalDefinitions.hpp"
     
    @@ -420,7 +420,7 @@ nmethod* NonTieredCompPolicy::event(const methodHandle& method, const methodHand
           return NULL;
         }
       }
    -  if (CompileTheWorld || ReplayCompiles) {
    +  if (ReplayCompiles) {
         // Don't trigger other compiles in testing mode
         if (bci == InvocationEntryBci) {
           reset_counter_for_invocation_event(method);
    diff --git a/src/hotspot/share/runtime/compilationPolicy.hpp b/src/hotspot/share/runtime/compilationPolicy.hpp
    index 9dfa211a323..b148d605ebf 100644
    --- a/src/hotspot/share/runtime/compilationPolicy.hpp
    +++ b/src/hotspot/share/runtime/compilationPolicy.hpp
    @@ -28,7 +28,7 @@
     #include "code/nmethod.hpp"
     #include "compiler/compileBroker.hpp"
     #include "memory/allocation.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "utilities/growableArray.hpp"
     
     // The CompilationPolicy selects which method (if any) should be compiled.
    diff --git a/src/hotspot/share/runtime/fieldDescriptor.hpp b/src/hotspot/share/runtime/fieldDescriptor.hpp
    index 0dcb2975180..ab08fc1cac9 100644
    --- a/src/hotspot/share/runtime/fieldDescriptor.hpp
    +++ b/src/hotspot/share/runtime/fieldDescriptor.hpp
    @@ -91,6 +91,7 @@ class fieldDescriptor {
     
       bool is_static()                const    { return access_flags().is_static(); }
       bool is_final()                 const    { return access_flags().is_final(); }
    +  bool is_stable()                const    { return access_flags().is_stable(); }
       bool is_volatile()              const    { return access_flags().is_volatile(); }
       bool is_transient()             const    { return access_flags().is_transient(); }
     
    diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp
    index 967c067bbb0..64c4078aa41 100644
    --- a/src/hotspot/share/runtime/globals.hpp
    +++ b/src/hotspot/share/runtime/globals.hpp
    @@ -1320,16 +1320,6 @@ define_pd_global(uint64_t,MaxRAM,                    1ULL*G);
               "Delay invoking the compiler until main application class is "    \
               "loaded")                                                         \
                                                                                 \
    -  develop(bool, CompileTheWorld, false,                                     \
    -          "Compile all methods in all classes in bootstrap class path "     \
    -            "(stress test)")                                                \
    -                                                                            \
    -  develop(bool, CompileTheWorldPreloadClasses, true,                        \
    -          "Preload all classes used by a class before start loading")       \
    -                                                                            \
    -  notproduct(intx, CompileTheWorldSafepointInterval, 100,                   \
    -          "Force a safepoint every n compiles so sweeper can keep up")      \
    -                                                                            \
       develop(bool, FillDelaySlots, true,                                       \
               "Fill delay slots (on SPARC only)")                               \
                                                                                 \
    @@ -2111,13 +2101,6 @@ define_pd_global(uint64_t,MaxRAM,                    1ULL*G);
       experimental(bool, UseCriticalCMSThreadPriority, false,                   \
               "ConcurrentMarkSweep thread runs at critical scheduling priority")\
                                                                                 \
    -  /* compiler debugging */                                                  \
    -  notproduct(intx, CompileTheWorldStartAt,     1,                           \
    -          "First class to consider when using +CompileTheWorld")            \
    -                                                                            \
    -  notproduct(intx, CompileTheWorldStopAt, max_jint,                         \
    -          "Last class to consider when using +CompileTheWorld")             \
    -                                                                            \
       develop(intx, NewCodeParameter,      0,                                   \
               "Testing Only: Create a dedicated integer parameter before "      \
               "putback")                                                        \
    diff --git a/src/hotspot/share/runtime/interfaceSupport.inline.hpp b/src/hotspot/share/runtime/interfaceSupport.inline.hpp
    index f37950c6ca5..cdc80e7bd41 100644
    --- a/src/hotspot/share/runtime/interfaceSupport.inline.hpp
    +++ b/src/hotspot/share/runtime/interfaceSupport.inline.hpp
    @@ -32,7 +32,7 @@
     #include "runtime/safepointMechanism.inline.hpp"
     #include "runtime/safepointVerifiers.hpp"
     #include "runtime/thread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "utilities/globalDefinitions.hpp"
     #include "utilities/macros.hpp"
     #include "utilities/preserveException.hpp"
    diff --git a/src/hotspot/share/runtime/java.cpp b/src/hotspot/share/runtime/java.cpp
    index 7ce8750de4b..83831efedf9 100644
    --- a/src/hotspot/share/runtime/java.cpp
    +++ b/src/hotspot/share/runtime/java.cpp
    @@ -68,7 +68,7 @@
     #include "runtime/task.hpp"
     #include "runtime/thread.inline.hpp"
     #include "runtime/timer.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/memTracker.hpp"
     #include "utilities/dtrace.hpp"
     #include "utilities/globalDefinitions.hpp"
    diff --git a/src/hotspot/share/runtime/jniHandles.cpp b/src/hotspot/share/runtime/jniHandles.cpp
    index 04238b01929..6b1692fe189 100644
    --- a/src/hotspot/share/runtime/jniHandles.cpp
    +++ b/src/hotspot/share/runtime/jniHandles.cpp
    @@ -318,7 +318,7 @@ void JNIHandles::print_on(outputStream* st) {
     class VerifyJNIHandles: public OopClosure {
     public:
       virtual void do_oop(oop* root) {
    -    oopDesc::verify(*root);
    +    guarantee(oopDesc::is_oop(RawAccess<>::oop_load(root)), "Invalid oop");
       }
       virtual void do_oop(narrowOop* root) { ShouldNotReachHere(); }
     };
    @@ -327,11 +327,7 @@ void JNIHandles::verify() {
       VerifyJNIHandles verify_handle;
     
       oops_do(&verify_handle);
    -
    -  // JNI weaks are handled concurrently in ZGC, so they can't be verified here
    -  if (!UseZGC) {
    -    weak_oops_do(&verify_handle);
    -  }
    +  weak_oops_do(&verify_handle);
     }
     
     // This method is implemented here to avoid circular includes between
    diff --git a/src/hotspot/share/runtime/mutex.cpp b/src/hotspot/share/runtime/mutex.cpp
    index 79a0d2cb233..d84ee5d516f 100644
    --- a/src/hotspot/share/runtime/mutex.cpp
    +++ b/src/hotspot/share/runtime/mutex.cpp
    @@ -1076,9 +1076,9 @@ bool Monitor::wait(bool no_safepoint_check, long timeout,
       Monitor * least = get_least_ranked_lock_besides_this(Self->owned_locks());
       assert(least != this, "Specification of get_least_... call above");
       if (least != NULL && least->rank() <= special) {
    -    tty->print("Attempting to wait on monitor %s/%d while holding"
    -               " lock %s/%d -- possible deadlock",
    -               name(), rank(), least->name(), least->rank());
    +    ::tty->print("Attempting to wait on monitor %s/%d while holding"
    +                 " lock %s/%d -- possible deadlock",
    +                 name(), rank(), least->name(), least->rank());
         assert(false, "Shouldn't block(wait) while holding a lock of rank special");
       }
       #endif // ASSERT
    diff --git a/src/hotspot/share/runtime/mutex.hpp b/src/hotspot/share/runtime/mutex.hpp
    index 2ab2da0cc51..a6e7c1ee773 100644
    --- a/src/hotspot/share/runtime/mutex.hpp
    +++ b/src/hotspot/share/runtime/mutex.hpp
    @@ -87,6 +87,8 @@ class Monitor : public CHeapObj {
       // The rank 'access' is similar to 'special' and has the same restrictions on usage.
       // It is reserved for locks that may be required in order to perform memory accesses
       // that require special barriers, e.g. SATB GC barriers, that in turn uses locks.
    +  // The rank 'tty' is also similar to 'special' and has the same restrictions.
    +  // It is reserved for the tty_lock.
       // Since memory accesses should be able to be performed pretty much anywhere
       // in the code, that requires locks required for performing accesses being
       // inherently a bit more special than even locks of the 'special' rank.
    @@ -104,7 +106,8 @@ class Monitor : public CHeapObj {
       enum lock_types {
            event,
            access         = event          +   1,
    -       special        = access         +   2,
    +       tty            = access         +   2,
    +       special        = tty            +   1,
            suspend_resume = special        +   1,
            vmweak         = suspend_resume +   2,
            leaf           = vmweak         +   2,
    @@ -236,7 +239,7 @@ class Monitor : public CHeapObj {
     
       #ifndef PRODUCT
         void print_on(outputStream* st) const;
    -    void print() const                      { print_on(tty); }
    +    void print() const                      { print_on(::tty); }
         DEBUG_ONLY(int    rank() const          { return _rank; })
         bool   allow_vm_block()                 { return _allow_vm_block; }
     
    diff --git a/src/hotspot/share/runtime/mutexLocker.cpp b/src/hotspot/share/runtime/mutexLocker.cpp
    index 06e1b3df316..558d865512d 100644
    --- a/src/hotspot/share/runtime/mutexLocker.cpp
    +++ b/src/hotspot/share/runtime/mutexLocker.cpp
    @@ -199,7 +199,7 @@ void assert_lock_strong(const Monitor * lock) {
     
     // Using Padded subclasses to prevent false sharing of these global monitors and mutexes.
     void mutex_init() {
    -  def(tty_lock                     , PaddedMutex  , event,       true,  Monitor::_safepoint_check_never);      // allow to lock in VM
    +  def(tty_lock                     , PaddedMutex  , tty,         true,  Monitor::_safepoint_check_never);      // allow to lock in VM
     
       def(CGC_lock                     , PaddedMonitor, special,     true,  Monitor::_safepoint_check_never);      // coordinate between fore- and background GC
       def(STS_lock                     , PaddedMonitor, leaf,        true,  Monitor::_safepoint_check_never);
    @@ -234,6 +234,14 @@ void mutex_init() {
     
         def(MonitoringSupport_lock     , PaddedMutex  , native   ,   true,  Monitor::_safepoint_check_never);      // used for serviceability monitoring support
       }
    +  if (UseShenandoahGC) {
    +    def(SATB_Q_FL_lock             , PaddedMutex  , access,      true,  Monitor::_safepoint_check_never);
    +    def(SATB_Q_CBL_mon             , PaddedMonitor, access,      true,  Monitor::_safepoint_check_never);
    +    def(Shared_SATB_Q_lock         , PaddedMutex  , access + 1,  true,  Monitor::_safepoint_check_never);
    +
    +    def(StringDedupQueue_lock      , PaddedMonitor, leaf,        true,  Monitor::_safepoint_check_never);
    +    def(StringDedupTable_lock      , PaddedMutex  , leaf,        true,  Monitor::_safepoint_check_never);
    +  }
       def(ParGCRareEvent_lock          , PaddedMutex  , leaf     ,   true,  Monitor::_safepoint_check_sometimes);
       def(DerivedPointerTableGC_lock   , PaddedMutex  , leaf,        true,  Monitor::_safepoint_check_never);
       def(CGCPhaseManager_lock         , PaddedMonitor, leaf,        false, Monitor::_safepoint_check_sometimes);
    @@ -251,7 +259,7 @@ void mutex_init() {
       def(SystemDictionary_lock        , PaddedMonitor, leaf,        true,  Monitor::_safepoint_check_always);     // lookups done by VM thread
       def(SharedDictionary_lock        , PaddedMutex  , leaf,        true,  Monitor::_safepoint_check_always);     // lookups done by VM thread
       def(Module_lock                  , PaddedMutex  , leaf+2,      true,  Monitor::_safepoint_check_always);
    -  def(InlineCacheBuffer_lock       , PaddedMutex  , leaf,        true,  Monitor::_safepoint_check_always);
    +  def(InlineCacheBuffer_lock       , PaddedMutex  , leaf,        true,  Monitor::_safepoint_check_never);
       def(VMStatistic_lock             , PaddedMutex  , leaf,        false, Monitor::_safepoint_check_always);
       def(ExpandHeap_lock              , PaddedMutex  , leaf,        true,  Monitor::_safepoint_check_always);     // Used during compilation by VM thread
       def(JNIHandleBlockFreeList_lock  , PaddedMutex  , leaf-1,      true,  Monitor::_safepoint_check_never);      // handles are used by VM thread
    @@ -281,7 +289,7 @@ void mutex_init() {
       def(VMOperationRequest_lock      , PaddedMonitor, nonleaf,     true,  Monitor::_safepoint_check_sometimes);
       def(RetData_lock                 , PaddedMutex  , nonleaf,     false, Monitor::_safepoint_check_always);
       def(Terminator_lock              , PaddedMonitor, nonleaf,     true,  Monitor::_safepoint_check_sometimes);
    -  def(VtableStubs_lock             , PaddedMutex  , nonleaf,     true,  Monitor::_safepoint_check_always);
    +  def(VtableStubs_lock             , PaddedMutex  , nonleaf,     true,  Monitor::_safepoint_check_never);
       def(Notify_lock                  , PaddedMonitor, nonleaf,     true,  Monitor::_safepoint_check_always);
       def(JNIGlobalAlloc_lock          , PaddedMutex  , nonleaf,     true,  Monitor::_safepoint_check_never);
       def(JNIGlobalActive_lock         , PaddedMutex  , nonleaf-1,   true,  Monitor::_safepoint_check_never);
    @@ -294,7 +302,7 @@ void mutex_init() {
       def(JfieldIdCreation_lock        , PaddedMutex  , nonleaf+1,   true,  Monitor::_safepoint_check_always);     // jfieldID, Used in VM_Operation
       def(ResolvedMethodTable_lock     , PaddedMutex  , nonleaf+1,   false, Monitor::_safepoint_check_always);     // Used to protect ResolvedMethodTable
     
    -  def(CompiledIC_lock              , PaddedMutex  , nonleaf+2,   false, Monitor::_safepoint_check_always);     // locks VtableStubs_lock, InlineCacheBuffer_lock
    +  def(CompiledIC_lock              , PaddedMutex  , nonleaf+2,   false, Monitor::_safepoint_check_never);      // locks VtableStubs_lock, InlineCacheBuffer_lock
       def(CompileTaskAlloc_lock        , PaddedMutex  , nonleaf+2,   true,  Monitor::_safepoint_check_always);
       def(CompileStatistics_lock       , PaddedMutex  , nonleaf+2,   false, Monitor::_safepoint_check_always);
       def(DirectivesStack_lock         , PaddedMutex  , special,     true,  Monitor::_safepoint_check_never);
    diff --git a/src/hotspot/share/runtime/os.cpp b/src/hotspot/share/runtime/os.cpp
    index c8828cb0f70..5362598319e 100644
    --- a/src/hotspot/share/runtime/os.cpp
    +++ b/src/hotspot/share/runtime/os.cpp
    @@ -32,7 +32,7 @@
     #include "code/codeCache.hpp"
     #include "code/icBuffer.hpp"
     #include "code/vtableStubs.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "logging/log.hpp"
     #include "interpreter/interpreter.hpp"
     #include "logging/log.hpp"
    diff --git a/src/hotspot/share/runtime/reflection.cpp b/src/hotspot/share/runtime/reflection.cpp
    index 1eb8f10d860..364b97484a8 100644
    --- a/src/hotspot/share/runtime/reflection.cpp
    +++ b/src/hotspot/share/runtime/reflection.cpp
    @@ -417,11 +417,9 @@ static bool can_relax_access_check_for(const Klass* accessor,
         under_unsafe_anonymous_host(accessee_ik, accessor_ik))
         return true;
     
    -  if ((RelaxAccessControlCheck &&
    +  if (RelaxAccessControlCheck &&
         accessor_ik->major_version() < Verifier::NO_RELAX_ACCESS_CTRL_CHECK_VERSION &&
    -    accessee_ik->major_version() < Verifier::NO_RELAX_ACCESS_CTRL_CHECK_VERSION) ||
    -    (accessor_ik->major_version() < Verifier::STRICTER_ACCESS_CTRL_CHECK_VERSION &&
    -    accessee_ik->major_version() < Verifier::STRICTER_ACCESS_CTRL_CHECK_VERSION)) {
    +    accessee_ik->major_version() < Verifier::NO_RELAX_ACCESS_CTRL_CHECK_VERSION) {
         return classloader_only &&
           Verifier::relax_access_for(accessor_ik->class_loader()) &&
           accessor_ik->protection_domain() == accessee_ik->protection_domain() &&
    diff --git a/src/hotspot/share/runtime/safepoint.cpp b/src/hotspot/share/runtime/safepoint.cpp
    index 8e5fdf94b87..968e0865e3c 100644
    --- a/src/hotspot/share/runtime/safepoint.cpp
    +++ b/src/hotspot/share/runtime/safepoint.cpp
    @@ -732,6 +732,7 @@ void SafepointSynchronize::do_cleanup_tasks() {
       // Finish monitor deflation.
       ObjectSynchronizer::finish_deflate_idle_monitors(&deflate_counters);
     
    +  assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
     }
     
     
    diff --git a/src/hotspot/share/runtime/sharedRuntime.cpp b/src/hotspot/share/runtime/sharedRuntime.cpp
    index da61a30e92d..90c6c9a6485 100644
    --- a/src/hotspot/share/runtime/sharedRuntime.cpp
    +++ b/src/hotspot/share/runtime/sharedRuntime.cpp
    @@ -25,12 +25,13 @@
     #include "precompiled.hpp"
     #include "jvm.h"
     #include "aot/aotLoader.hpp"
    -#include "code/compiledMethod.inline.hpp"
     #include "classfile/stringTable.hpp"
     #include "classfile/systemDictionary.hpp"
     #include "classfile/vmSymbols.hpp"
     #include "code/codeCache.hpp"
     #include "code/compiledIC.hpp"
    +#include "code/icBuffer.hpp"
    +#include "code/compiledMethod.inline.hpp"
     #include "code/scopeDesc.hpp"
     #include "code/vtableStubs.hpp"
     #include "compiler/abstractCompiler.hpp"
    @@ -1058,7 +1059,7 @@ methodHandle SharedRuntime::extract_attached_method(vframeStream& vfst) {
     
       address pc = vfst.frame_pc();
       { // Get call instruction under lock because another thread may be busy patching it.
    -    MutexLockerEx ml_patch(Patching_lock, Mutex::_no_safepoint_check_flag);
    +    CompiledICLocker ic_locker(caller);
         return caller->attached_method_before_pc(pc);
       }
       return NULL;
    @@ -1245,11 +1246,87 @@ methodHandle SharedRuntime::resolve_helper(JavaThread *thread,
       return callee_method;
     }
     
    +// This fails if resolution required refilling of IC stubs
    +bool SharedRuntime::resolve_sub_helper_internal(methodHandle callee_method, const frame& caller_frame,
    +                                                CompiledMethod* caller_nm, bool is_virtual, bool is_optimized,
    +                                                Handle receiver, CallInfo& call_info, Bytecodes::Code invoke_code, TRAPS) {
    +  StaticCallInfo static_call_info;
    +  CompiledICInfo virtual_call_info;
    +
    +  // Make sure the callee nmethod does not get deoptimized and removed before
    +  // we are done patching the code.
    +  CompiledMethod* callee = callee_method->code();
    +
    +  if (callee != NULL) {
    +    assert(callee->is_compiled(), "must be nmethod for patching");
    +  }
    +
    +  if (callee != NULL && !callee->is_in_use()) {
    +    // Patch call site to C2I adapter if callee nmethod is deoptimized or unloaded.
    +    callee = NULL;
    +  }
    +  nmethodLocker nl_callee(callee);
    +#ifdef ASSERT
    +  address dest_entry_point = callee == NULL ? 0 : callee->entry_point(); // used below
    +#endif
    +
    +  bool is_nmethod = caller_nm->is_nmethod();
    +
    +  if (is_virtual) {
    +    assert(receiver.not_null() || invoke_code == Bytecodes::_invokehandle, "sanity check");
    +    bool static_bound = call_info.resolved_method()->can_be_statically_bound();
    +    Klass* klass = invoke_code == Bytecodes::_invokehandle ? NULL : receiver->klass();
    +    CompiledIC::compute_monomorphic_entry(callee_method, klass,
    +                     is_optimized, static_bound, is_nmethod, virtual_call_info,
    +                     CHECK_false);
    +  } else {
    +    // static call
    +    CompiledStaticCall::compute_entry(callee_method, is_nmethod, static_call_info);
    +  }
    +
    +  // grab lock, check for deoptimization and potentially patch caller
    +  {
    +    CompiledICLocker ml(caller_nm);
    +
    +    // Lock blocks for safepoint during which both nmethods can change state.
    +
    +    // Now that we are ready to patch if the Method* was redefined then
    +    // don't update call site and let the caller retry.
    +    // Don't update call site if callee nmethod was unloaded or deoptimized.
    +    // Don't update call site if callee nmethod was replaced by an other nmethod
    +    // which may happen when multiply alive nmethod (tiered compilation)
    +    // will be supported.
    +    if (!callee_method->is_old() &&
    +        (callee == NULL || (callee->is_in_use() && callee_method->code() == callee))) {
    +#ifdef ASSERT
    +      // We must not try to patch to jump to an already unloaded method.
    +      if (dest_entry_point != 0) {
    +        CodeBlob* cb = CodeCache::find_blob(dest_entry_point);
    +        assert((cb != NULL) && cb->is_compiled() && (((CompiledMethod*)cb) == callee),
    +               "should not call unloaded nmethod");
    +      }
    +#endif
    +      if (is_virtual) {
    +        CompiledIC* inline_cache = CompiledIC_before(caller_nm, caller_frame.pc());
    +        if (inline_cache->is_clean()) {
    +          if (!inline_cache->set_to_monomorphic(virtual_call_info)) {
    +            return false;
    +          }
    +        }
    +      } else {
    +        CompiledStaticCall* ssc = caller_nm->compiledStaticCall_before(caller_frame.pc());
    +        if (ssc->is_clean()) ssc->set(static_call_info);
    +      }
    +    }
    +  } // unlock CompiledICLocker
    +  return true;
    +}
    +
     // Resolves a call.  The compilers generate code for calls that go here
     // and are patched with the real destination of the call.
     methodHandle SharedRuntime::resolve_sub_helper(JavaThread *thread,
    -                                           bool is_virtual,
    -                                           bool is_optimized, TRAPS) {
    +                                               bool is_virtual,
    +                                               bool is_optimized, TRAPS) {
     
       ResourceMark rm(thread);
       RegisterMap cbl_map(thread, false);
    @@ -1315,76 +1392,20 @@ methodHandle SharedRuntime::resolve_sub_helper(JavaThread *thread,
       // (cached_oop, destination address) pair. For a static call/optimized
       // virtual this is just a destination address.
     
    -  StaticCallInfo static_call_info;
    -  CompiledICInfo virtual_call_info;
    -
    -  // Make sure the callee nmethod does not get deoptimized and removed before
    -  // we are done patching the code.
    -  CompiledMethod* callee = callee_method->code();
    -
    -  if (callee != NULL) {
    -    assert(callee->is_compiled(), "must be nmethod for patching");
    -  }
    -
    -  if (callee != NULL && !callee->is_in_use()) {
    -    // Patch call site to C2I adapter if callee nmethod is deoptimized or unloaded.
    -    callee = NULL;
    -  }
    -  nmethodLocker nl_callee(callee);
    -#ifdef ASSERT
    -  address dest_entry_point = callee == NULL ? 0 : callee->entry_point(); // used below
    -#endif
    -
    -  bool is_nmethod = caller_nm->is_nmethod();
    -
    -  if (is_virtual) {
    -    assert(receiver.not_null() || invoke_code == Bytecodes::_invokehandle, "sanity check");
    -    bool static_bound = call_info.resolved_method()->can_be_statically_bound();
    -    Klass* klass = invoke_code == Bytecodes::_invokehandle ? NULL : receiver->klass();
    -    CompiledIC::compute_monomorphic_entry(callee_method, klass,
    -                     is_optimized, static_bound, is_nmethod, virtual_call_info,
    -                     CHECK_(methodHandle()));
    -  } else {
    -    // static call
    -    CompiledStaticCall::compute_entry(callee_method, is_nmethod, static_call_info);
    -  }
    -
    -  // grab lock, check for deoptimization and potentially patch caller
    -  {
    -    CompiledICLocker ml(caller_nm);
    -
    -    // Lock blocks for safepoint during which both nmethods can change state.
    -
    -    // Now that we are ready to patch if the Method* was redefined then
    -    // don't update call site and let the caller retry.
    -    // Don't update call site if callee nmethod was unloaded or deoptimized.
    -    // Don't update call site if callee nmethod was replaced by an other nmethod
    -    // which may happen when multiply alive nmethod (tiered compilation)
    -    // will be supported.
    -    if (!callee_method->is_old() &&
    -        (callee == NULL || (callee->is_in_use() && callee_method->code() == callee))) {
    -#ifdef ASSERT
    -      // We must not try to patch to jump to an already unloaded method.
    -      if (dest_entry_point != 0) {
    -        CodeBlob* cb = CodeCache::find_blob(dest_entry_point);
    -        assert((cb != NULL) && cb->is_compiled() && (((CompiledMethod*)cb) == callee),
    -               "should not call unloaded nmethod");
    -      }
    -#endif
    -      if (is_virtual) {
    -        CompiledIC* inline_cache = CompiledIC_before(caller_nm, caller_frame.pc());
    -        if (inline_cache->is_clean()) {
    -          inline_cache->set_to_monomorphic(virtual_call_info);
    -        }
    -      } else {
    -        CompiledStaticCall* ssc = caller_nm->compiledStaticCall_before(caller_frame.pc());
    -        if (ssc->is_clean()) ssc->set(static_call_info);
    -      }
    +  // Patching IC caches may fail if we run out if transition stubs.
    +  // We refill the ic stubs then and try again.
    +  for (;;) {
    +    ICRefillVerifier ic_refill_verifier;
    +    bool successful = resolve_sub_helper_internal(callee_method, caller_frame, caller_nm,
    +                                                  is_virtual, is_optimized, receiver,
    +                                                  call_info, invoke_code, CHECK_(methodHandle()));
    +    if (successful) {
    +      return callee_method;
    +    } else {
    +      InlineCacheBuffer::refill_ic_stubs();
         }
    +  }
     
    -  } // unlock CompiledICLocker
    -
    -  return callee_method;
     }
     
     
    @@ -1518,7 +1539,85 @@ JRT_BLOCK_ENTRY(address, SharedRuntime::resolve_opt_virtual_call_C(JavaThread *t
       return callee_method->verified_code_entry();
     JRT_END
     
    +// The handle_ic_miss_helper_internal function returns false if it failed due
    +// to either running out of vtable stubs or ic stubs due to IC transitions
    +// to transitional states. The needs_ic_stub_refill value will be set if
    +// the failure was due to running out of IC stubs, in which case handle_ic_miss_helper
    +// refills the IC stubs and tries again.
    +bool SharedRuntime::handle_ic_miss_helper_internal(Handle receiver, CompiledMethod* caller_nm,
    +                                                   const frame& caller_frame, methodHandle callee_method,
    +                                                   Bytecodes::Code bc, CallInfo& call_info,
    +                                                   bool& needs_ic_stub_refill, TRAPS) {
    +  CompiledICLocker ml(caller_nm);
    +  CompiledIC* inline_cache = CompiledIC_before(caller_nm, caller_frame.pc());
    +  bool should_be_mono = false;
    +  if (inline_cache->is_optimized()) {
    +    if (TraceCallFixup) {
    +      ResourceMark rm(THREAD);
    +      tty->print("OPTIMIZED IC miss (%s) call to", Bytecodes::name(bc));
    +      callee_method->print_short_name(tty);
    +      tty->print_cr(" code: " INTPTR_FORMAT, p2i(callee_method->code()));
    +    }
    +    should_be_mono = true;
    +  } else if (inline_cache->is_icholder_call()) {
    +    CompiledICHolder* ic_oop = inline_cache->cached_icholder();
    +    if (ic_oop != NULL) {
    +      if (!ic_oop->is_loader_alive()) {
    +        // Deferred IC cleaning due to concurrent class unloading
    +        if (!inline_cache->set_to_clean()) {
    +          needs_ic_stub_refill = true;
    +          return false;
    +        }
    +      } else if (receiver()->klass() == ic_oop->holder_klass()) {
    +        // This isn't a real miss. We must have seen that compiled code
    +        // is now available and we want the call site converted to a
    +        // monomorphic compiled call site.
    +        // We can't assert for callee_method->code() != NULL because it
    +        // could have been deoptimized in the meantime
    +        if (TraceCallFixup) {
    +          ResourceMark rm(THREAD);
    +          tty->print("FALSE IC miss (%s) converting to compiled call to", Bytecodes::name(bc));
    +          callee_method->print_short_name(tty);
    +          tty->print_cr(" code: " INTPTR_FORMAT, p2i(callee_method->code()));
    +        }
    +        should_be_mono = true;
    +      }
    +    }
    +  }
     
    +  if (should_be_mono) {
    +    // We have a path that was monomorphic but was going interpreted
    +    // and now we have (or had) a compiled entry. We correct the IC
    +    // by using a new icBuffer.
    +    CompiledICInfo info;
    +    Klass* receiver_klass = receiver()->klass();
    +    inline_cache->compute_monomorphic_entry(callee_method,
    +                                            receiver_klass,
    +                                            inline_cache->is_optimized(),
    +                                            false, caller_nm->is_nmethod(),
    +                                            info, CHECK_false);
    +    if (!inline_cache->set_to_monomorphic(info)) {
    +      needs_ic_stub_refill = true;
    +      return false;
    +    }
    +  } else if (!inline_cache->is_megamorphic() && !inline_cache->is_clean()) {
    +    // Potential change to megamorphic
    +
    +    bool successful = inline_cache->set_to_megamorphic(&call_info, bc, needs_ic_stub_refill, CHECK_false);
    +    if (needs_ic_stub_refill) {
    +      return false;
    +    }
    +    if (!successful) {
    +      if (!inline_cache->set_to_clean()) {
    +        needs_ic_stub_refill = true;
    +        return false;
    +      }
    +    }
    +  } else {
    +    // Either clean or megamorphic
    +  }
    +  return true;
    +}
     
     methodHandle SharedRuntime::handle_ic_miss_helper(JavaThread *thread, TRAPS) {
       ResourceMark rm(thread);
    @@ -1555,8 +1654,6 @@ methodHandle SharedRuntime::handle_ic_miss_helper(JavaThread *thread, TRAPS) {
     
       methodHandle callee_method = call_info.selected_method();
     
    -  bool should_be_mono = false;
    -
     #ifndef PRODUCT
       Atomic::inc(&_ic_miss_ctr);
     
    @@ -1585,75 +1682,42 @@ methodHandle SharedRuntime::handle_ic_miss_helper(JavaThread *thread, TRAPS) {
       JvmtiDynamicCodeEventCollector event_collector;
     
       // Update inline cache to megamorphic. Skip update if we are called from interpreted.
    -  {
    -    RegisterMap reg_map(thread, false);
    -    frame caller_frame = thread->last_frame().sender(®_map);
    -    CodeBlob* cb = caller_frame.cb();
    -    CompiledMethod* caller_nm = cb->as_compiled_method_or_null();
    -    CompiledICLocker ml(caller_nm);
    +  // Transitioning IC caches may require transition stubs. If we run out
    +  // of transition stubs, we have to drop locks and perform a safepoint
    +  // that refills them.
    +  RegisterMap reg_map(thread, false);
    +  frame caller_frame = thread->last_frame().sender(®_map);
    +  CodeBlob* cb = caller_frame.cb();
    +  CompiledMethod* caller_nm = cb->as_compiled_method();
     
    -    if (cb->is_compiled()) {
    -      CompiledIC* inline_cache = CompiledIC_before(((CompiledMethod*)cb), caller_frame.pc());
    -      bool should_be_mono = false;
    -      if (inline_cache->is_optimized()) {
    -        if (TraceCallFixup) {
    -          ResourceMark rm(thread);
    -          tty->print("OPTIMIZED IC miss (%s) call to", Bytecodes::name(bc));
    -          callee_method->print_short_name(tty);
    -          tty->print_cr(" code: " INTPTR_FORMAT, p2i(callee_method->code()));
    -        }
    -        should_be_mono = true;
    -      } else if (inline_cache->is_icholder_call()) {
    -        CompiledICHolder* ic_oop = inline_cache->cached_icholder();
    -        if (ic_oop != NULL) {
    -          if (!ic_oop->is_loader_alive()) {
    -            // Deferred IC cleaning due to concurrent class unloading
    -            inline_cache->set_to_clean();
    -          } else if (receiver()->klass() == ic_oop->holder_klass()) {
    -            // This isn't a real miss. We must have seen that compiled code
    -            // is now available and we want the call site converted to a
    -            // monomorphic compiled call site.
    -            // We can't assert for callee_method->code() != NULL because it
    -            // could have been deoptimized in the meantime
    -            if (TraceCallFixup) {
    -              ResourceMark rm(thread);
    -              tty->print("FALSE IC miss (%s) converting to compiled call to", Bytecodes::name(bc));
    -              callee_method->print_short_name(tty);
    -              tty->print_cr(" code: " INTPTR_FORMAT, p2i(callee_method->code()));
    -            }
    -            should_be_mono = true;
    -          }
    -        }
    -      }
    -
    -      if (should_be_mono) {
    -
    -        // We have a path that was monomorphic but was going interpreted
    -        // and now we have (or had) a compiled entry. We correct the IC
    -        // by using a new icBuffer.
    -        CompiledICInfo info;
    -        Klass* receiver_klass = receiver()->klass();
    -        inline_cache->compute_monomorphic_entry(callee_method,
    -                                                receiver_klass,
    -                                                inline_cache->is_optimized(),
    -                                                false, caller_nm->is_nmethod(),
    -                                                info, CHECK_(methodHandle()));
    -        inline_cache->set_to_monomorphic(info);
    -      } else if (!inline_cache->is_megamorphic() && !inline_cache->is_clean()) {
    -        // Potential change to megamorphic
    -        bool successful = inline_cache->set_to_megamorphic(&call_info, bc, CHECK_(methodHandle()));
    -        if (!successful) {
    -          inline_cache->set_to_clean();
    -        }
    -      } else {
    -        // Either clean or megamorphic
    -      }
    +  for (;;) {
    +    ICRefillVerifier ic_refill_verifier;
    +    bool needs_ic_stub_refill = false;
    +    bool successful = handle_ic_miss_helper_internal(receiver, caller_nm, caller_frame, callee_method,
    +                                                     bc, call_info, needs_ic_stub_refill, CHECK_(methodHandle()));
    +    if (successful || !needs_ic_stub_refill) {
    +      return callee_method;
         } else {
    -      fatal("Unimplemented");
    +      InlineCacheBuffer::refill_ic_stubs();
         }
    -  } // Release CompiledICLocker
    +  }
    +}
     
    -  return callee_method;
    +static bool clear_ic_at_addr(CompiledMethod* caller_nm, address call_addr, bool is_static_call) {
    +  CompiledICLocker ml(caller_nm);
    +  if (is_static_call) {
    +    CompiledStaticCall* ssc = caller_nm->compiledStaticCall_at(call_addr);
    +    if (!ssc->is_clean()) {
    +      return ssc->set_to_clean();
    +    }
    +  } else {
    +    // compiled, dispatched call (which used to call an interpreted method)
    +    CompiledIC* inline_cache = CompiledIC_at(caller_nm, call_addr);
    +    if (!inline_cache->is_clean()) {
    +      return inline_cache->set_to_clean();
    +    }
    +  }
    +  return true;
     }
     
     //
    @@ -1703,7 +1767,7 @@ methodHandle SharedRuntime::reresolve_call_site(JavaThread *thread, TRAPS) {
         {
           // Get call instruction under lock because another thread may be
           // busy patching it.
    -      MutexLockerEx ml_patch(Patching_lock, Mutex::_no_safepoint_check_flag);
    +      CompiledICLocker ml(caller_nm);
           // Location of call instruction
           call_addr = caller_nm->call_instruction_address(pc);
         }
    @@ -1735,14 +1799,13 @@ methodHandle SharedRuntime::reresolve_call_site(JavaThread *thread, TRAPS) {
           // to a wrong method). It should not be performance critical, since the
           // resolve is only done once.
     
    -      CompiledICLocker ml(caller_nm);
    -      if (is_static_call) {
    -        CompiledStaticCall* ssc = caller_nm->compiledStaticCall_at(call_addr);
    -        ssc->set_to_clean();
    -      } else {
    -        // compiled, dispatched call (which used to call an interpreted method)
    -        CompiledIC* inline_cache = CompiledIC_at(caller_nm, call_addr);
    -        inline_cache->set_to_clean();
    +      for (;;) {
    +        ICRefillVerifier ic_refill_verifier;
    +        if (!clear_ic_at_addr(caller_nm, call_addr, is_static_call)) {
    +          InlineCacheBuffer::refill_ic_stubs();
    +        } else {
    +          break;
    +        }
           }
         }
       }
    @@ -1880,9 +1943,8 @@ IRT_LEAF(void, SharedRuntime::fixup_callers_callsite(Method* method, address cal
       if (moop->code() == NULL) return;
     
       if (nm->is_in_use()) {
    -
         // Expect to find a native call there (unless it was no-inline cache vtable dispatch)
    -    MutexLockerEx ml_patch(Patching_lock, Mutex::_no_safepoint_check_flag);
    +    CompiledICLocker ic_locker(nm);
         if (NativeCall::is_call_before(return_pc)) {
           ResourceMark mark;
           NativeCallWrapper* call = nm->call_wrapper_before(return_pc);
    diff --git a/src/hotspot/share/runtime/sharedRuntime.hpp b/src/hotspot/share/runtime/sharedRuntime.hpp
    index d2b946b13d1..15e51fa65d9 100644
    --- a/src/hotspot/share/runtime/sharedRuntime.hpp
    +++ b/src/hotspot/share/runtime/sharedRuntime.hpp
    @@ -48,6 +48,9 @@ class SharedRuntime: AllStatic {
       friend class VMStructs;
     
      private:
    +  static bool resolve_sub_helper_internal(methodHandle callee_method, const frame& caller_frame,
    +                                          CompiledMethod* caller_nm, bool is_virtual, bool is_optimized,
    +                                          Handle receiver, CallInfo& call_info, Bytecodes::Code invoke_code, TRAPS);
       static methodHandle resolve_sub_helper(JavaThread *thread,
                                              bool is_virtual,
                                              bool is_optimized, TRAPS);
    @@ -324,6 +327,10 @@ class SharedRuntime: AllStatic {
       // deopt blob
       static void generate_deopt_blob(void);
     
    +  static bool handle_ic_miss_helper_internal(Handle receiver, CompiledMethod* caller_nm, const frame& caller_frame,
    +                                             methodHandle callee_method, Bytecodes::Code bc, CallInfo& call_info,
    +                                             bool& needs_ic_stub_refill, TRAPS);
    +
      public:
       static DeoptimizationBlob* deopt_blob(void)      { return _deopt_blob; }
     
    diff --git a/src/hotspot/share/runtime/sweeper.cpp b/src/hotspot/share/runtime/sweeper.cpp
    index c121f90c2ae..88a94f32dfb 100644
    --- a/src/hotspot/share/runtime/sweeper.cpp
    +++ b/src/hotspot/share/runtime/sweeper.cpp
    @@ -46,7 +46,7 @@
     #include "runtime/os.hpp"
     #include "runtime/sweeper.hpp"
     #include "runtime/thread.inline.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "runtime/vmThread.hpp"
     #include "utilities/events.hpp"
     #include "utilities/xmlstream.hpp"
    @@ -699,7 +699,6 @@ NMethodSweeper::MethodStateChange NMethodSweeper::process_compiled_method(Compil
         // But still remember to clean-up inline caches for alive nmethods
         if (cm->is_alive() && !cm->is_unloading()) {
           // Clean inline caches that point to zombie/non-entrant/unloaded nmethods
    -      CompiledICLocker ml(cm);
           cm->cleanup_inline_caches(false);
           SWEEP(cm);
         }
    @@ -745,19 +744,16 @@ NMethodSweeper::MethodStateChange NMethodSweeper::process_compiled_method(Compil
           }
         } else {
           // Still alive, clean up its inline caches
    -      CompiledICLocker ml(cm);
           cm->cleanup_inline_caches(false);
           SWEEP(cm);
         }
       } else if (cm->is_unloaded()) {
         // Code is unloaded, so there are no activations on the stack.
         // Convert the nmethod to zombie or flush it directly in the OSR case.
    -    {
    -      // Clean ICs of unloaded nmethods as well because they may reference other
    -      // unloaded nmethods that may be flushed earlier in the sweeper cycle.
    -      CompiledICLocker ml(cm);
    -      cm->cleanup_inline_caches(false);
    -    }
    +
    +    // Clean ICs of unloaded nmethods as well because they may reference other
    +    // unloaded nmethods that may be flushed earlier in the sweeper cycle.
    +    cm->cleanup_inline_caches(false);
         if (cm->is_osr_method()) {
           SWEEP(cm);
           // No inline caches will ever point to osr methods, so we can just remove it
    @@ -776,7 +772,6 @@ NMethodSweeper::MethodStateChange NMethodSweeper::process_compiled_method(Compil
           possibly_flush((nmethod*)cm);
         }
         // Clean inline caches that point to zombie/non-entrant/unloaded nmethods
    -    CompiledICLocker ml(cm);
         cm->cleanup_inline_caches(false);
         SWEEP(cm);
       }
    diff --git a/src/hotspot/share/runtime/thread.cpp b/src/hotspot/share/runtime/thread.cpp
    index 0c23cf014de..3026e9daf0f 100644
    --- a/src/hotspot/share/runtime/thread.cpp
    +++ b/src/hotspot/share/runtime/thread.cpp
    @@ -100,7 +100,7 @@
     #include "runtime/vframeArray.hpp"
     #include "runtime/vframe_hp.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "runtime/vm_version.hpp"
     #include "services/attachListener.hpp"
     #include "services/management.hpp"
    @@ -231,6 +231,7 @@ Thread::Thread() {
       set_active_handles(NULL);
       set_free_handle_block(NULL);
       set_last_handle_mark(NULL);
    +  DEBUG_ONLY(_missed_ic_stub_refill_mark = NULL);
     
       // This initial value ==> never claimed.
       _oops_do_parity = 0;
    diff --git a/src/hotspot/share/runtime/thread.hpp b/src/hotspot/share/runtime/thread.hpp
    index d737e1b18f9..bee8e407546 100644
    --- a/src/hotspot/share/runtime/thread.hpp
    +++ b/src/hotspot/share/runtime/thread.hpp
    @@ -328,6 +328,21 @@ class Thread: public ThreadShadow {
       HandleMark* last_handle_mark() const          { return _last_handle_mark; }
      private:
     
    +#ifdef ASSERT
    +  void* _missed_ic_stub_refill_mark;
    +
    + public:
    +  void* missed_ic_stub_refill_mark() {
    +    return _missed_ic_stub_refill_mark;
    +  }
    +
    +  void set_missed_ic_stub_refill_mark(void* mark) {
    +    _missed_ic_stub_refill_mark = mark;
    +  }
    +#endif
    +
    + private:
    +
       // debug support for checking if code does allow safepoints or not
       // GC points in the VM can happen because of allocation, invoking a VM operation, or blocking on
       // mutex, or blocking on an object synchronizer (Java locking).
    diff --git a/src/hotspot/share/runtime/threadSMR.cpp b/src/hotspot/share/runtime/threadSMR.cpp
    index d9da8e6fc4a..391eb0fa13f 100644
    --- a/src/hotspot/share/runtime/threadSMR.cpp
    +++ b/src/hotspot/share/runtime/threadSMR.cpp
    @@ -28,7 +28,7 @@
     #include "runtime/jniHandles.inline.hpp"
     #include "runtime/thread.inline.hpp"
     #include "runtime/threadSMR.inline.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/threadService.hpp"
     #include "utilities/copy.hpp"
     #include "utilities/globalDefinitions.hpp"
    diff --git a/src/hotspot/share/runtime/tieredThresholdPolicy.cpp b/src/hotspot/share/runtime/tieredThresholdPolicy.cpp
    index ac88de786f1..9a4cd90f962 100644
    --- a/src/hotspot/share/runtime/tieredThresholdPolicy.cpp
    +++ b/src/hotspot/share/runtime/tieredThresholdPolicy.cpp
    @@ -386,7 +386,7 @@ nmethod* TieredThresholdPolicy::event(const methodHandle& method, const methodHa
           thread->is_interp_only_mode()) {
         return NULL;
       }
    -  if (CompileTheWorld || ReplayCompiles) {
    +  if (ReplayCompiles) {
         // Don't trigger other compiles in testing mode
         return NULL;
       }
    diff --git a/src/hotspot/share/runtime/vm_operations.cpp b/src/hotspot/share/runtime/vmOperations.cpp
    similarity index 99%
    rename from src/hotspot/share/runtime/vm_operations.cpp
    rename to src/hotspot/share/runtime/vmOperations.cpp
    index 4d265dc1ea7..42519d12309 100644
    --- a/src/hotspot/share/runtime/vm_operations.cpp
    +++ b/src/hotspot/share/runtime/vmOperations.cpp
    @@ -40,7 +40,7 @@
     #include "runtime/sweeper.hpp"
     #include "runtime/thread.inline.hpp"
     #include "runtime/threadSMR.inline.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/threadService.hpp"
     
     #define VM_OP_NAME_INITIALIZE(name) #name,
    diff --git a/src/hotspot/share/runtime/vm_operations.hpp b/src/hotspot/share/runtime/vmOperations.hpp
    similarity index 96%
    rename from src/hotspot/share/runtime/vm_operations.hpp
    rename to src/hotspot/share/runtime/vmOperations.hpp
    index 24bd0c470e3..3ee80b8e93c 100644
    --- a/src/hotspot/share/runtime/vm_operations.hpp
    +++ b/src/hotspot/share/runtime/vmOperations.hpp
    @@ -22,8 +22,8 @@
      *
      */
     
    -#ifndef SHARE_VM_RUNTIME_VM_OPERATIONS_HPP
    -#define SHARE_VM_RUNTIME_VM_OPERATIONS_HPP
    +#ifndef SHARE_VM_RUNTIME_VMOPERATIONS_HPP
    +#define SHARE_VM_RUNTIME_VMOPERATIONS_HPP
     
     #include "classfile/javaClasses.hpp"
     #include "memory/allocation.hpp"
    @@ -63,11 +63,11 @@
       template(GenCollectForAllocation)               \
       template(ParallelGCFailedAllocation)            \
       template(ParallelGCSystemGC)                    \
    -  template(CGC_Operation)                         \
       template(CMS_Initial_Mark)                      \
       template(CMS_Final_Remark)                      \
       template(G1CollectForAllocation)                \
       template(G1CollectFull)                         \
    +  template(G1Concurrent)                          \
       template(ZOperation)                            \
       template(HandshakeOneThread)                    \
       template(HandshakeAllThreads)                   \
    @@ -98,6 +98,15 @@
       template(HeapIterateOperation)                  \
       template(ReportJavaOutOfMemory)                 \
       template(JFRCheckpoint)                         \
    +  template(ShenandoahFullGC)                      \
    +  template(ShenandoahInitMark)                    \
    +  template(ShenandoahFinalMarkStartEvac)          \
    +  template(ShenandoahFinalEvac)                   \
    +  template(ShenandoahInitTraversalGC)             \
    +  template(ShenandoahFinalTraversalGC)            \
    +  template(ShenandoahInitUpdateRefs)              \
    +  template(ShenandoahFinalUpdateRefs)             \
    +  template(ShenandoahDegeneratedGC)               \
       template(Exit)                                  \
       template(LinuxDllLoad)                          \
       template(RotateGCLog)                           \
    @@ -509,4 +518,4 @@ class VM_PrintClassHierarchy: public VM_Operation {
     };
     #endif // INCLUDE_SERVICES
     
    -#endif // SHARE_VM_RUNTIME_VM_OPERATIONS_HPP
    +#endif // SHARE_VM_RUNTIME_VMOPERATIONS_HPP
    diff --git a/src/hotspot/share/runtime/vmThread.cpp b/src/hotspot/share/runtime/vmThread.cpp
    index 37f2e5809b6..418ff2112e3 100644
    --- a/src/hotspot/share/runtime/vmThread.cpp
    +++ b/src/hotspot/share/runtime/vmThread.cpp
    @@ -39,7 +39,7 @@
     #include "runtime/safepoint.hpp"
     #include "runtime/thread.inline.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/runtimeService.hpp"
     #include "utilities/dtrace.hpp"
     #include "utilities/events.hpp"
    diff --git a/src/hotspot/share/runtime/vmThread.hpp b/src/hotspot/share/runtime/vmThread.hpp
    index ef01208c5ca..0a85e22ae7c 100644
    --- a/src/hotspot/share/runtime/vmThread.hpp
    +++ b/src/hotspot/share/runtime/vmThread.hpp
    @@ -27,7 +27,7 @@
     
     #include "runtime/perfData.hpp"
     #include "runtime/thread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     
     //
     // Prioritized queue of VM operations.
    diff --git a/src/hotspot/share/runtime/vm_version.cpp b/src/hotspot/share/runtime/vm_version.cpp
    index eb05460adef..e5f38cbfe99 100644
    --- a/src/hotspot/share/runtime/vm_version.cpp
    +++ b/src/hotspot/share/runtime/vm_version.cpp
    @@ -81,8 +81,6 @@ int Abstract_VM_Version::_vm_minor_version = VERSION_INTERIM;
     int Abstract_VM_Version::_vm_security_version = VERSION_UPDATE;
     int Abstract_VM_Version::_vm_patch_version = VERSION_PATCH;
     int Abstract_VM_Version::_vm_build_number = VERSION_BUILD;
    -unsigned int Abstract_VM_Version::_parallel_worker_threads = 0;
    -bool Abstract_VM_Version::_parallel_worker_threads_initialized = false;
     
     #if defined(_LP64)
       #define VMLP "64-Bit "
    @@ -312,55 +310,3 @@ void VM_Version_init() {
         os::print_cpu_info(&ls, buf, sizeof(buf));
       }
     }
    -
    -unsigned int Abstract_VM_Version::nof_parallel_worker_threads(
    -                                                      unsigned int num,
    -                                                      unsigned int den,
    -                                                      unsigned int switch_pt) {
    -  if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
    -    assert(ParallelGCThreads == 0, "Default ParallelGCThreads is not 0");
    -    unsigned int threads;
    -    // For very large machines, there are diminishing returns
    -    // for large numbers of worker threads.  Instead of
    -    // hogging the whole system, use a fraction of the workers for every
    -    // processor after the first 8.  For example, on a 72 cpu machine
    -    // and a chosen fraction of 5/8
    -    // use 8 + (72 - 8) * (5/8) == 48 worker threads.
    -    unsigned int ncpus = (unsigned int) os::initial_active_processor_count();
    -    threads = (ncpus <= switch_pt) ?
    -             ncpus :
    -             (switch_pt + ((ncpus - switch_pt) * num) / den);
    -#ifndef _LP64
    -    // On 32-bit binaries the virtual address space available to the JVM
    -    // is usually limited to 2-3 GB (depends on the platform).
    -    // Do not use up address space with too many threads (stacks and per-thread
    -    // data). Note that x86 apps running on Win64 have 2 stacks per thread.
    -    // GC may more generally scale down threads by max heap size (etc), but the
    -    // consequences of over-provisioning threads are higher on 32-bit JVMS,
    -    // so add hard limit here:
    -    threads = MIN2(threads, (2*switch_pt));
    -#endif
    -    return threads;
    -  } else {
    -    return ParallelGCThreads;
    -  }
    -}
    -
    -unsigned int Abstract_VM_Version::calc_parallel_worker_threads() {
    -  return nof_parallel_worker_threads(5, 8, 8);
    -}
    -
    -
    -// Does not set the _initialized flag since it is
    -// a global flag.
    -unsigned int Abstract_VM_Version::parallel_worker_threads() {
    -  if (!_parallel_worker_threads_initialized) {
    -    if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
    -      _parallel_worker_threads = VM_Version::calc_parallel_worker_threads();
    -    } else {
    -      _parallel_worker_threads = ParallelGCThreads;
    -    }
    -    _parallel_worker_threads_initialized = true;
    -  }
    -  return _parallel_worker_threads;
    -}
    diff --git a/src/hotspot/share/runtime/vm_version.hpp b/src/hotspot/share/runtime/vm_version.hpp
    index c7b5779c8d2..7705f38b6cb 100644
    --- a/src/hotspot/share/runtime/vm_version.hpp
    +++ b/src/hotspot/share/runtime/vm_version.hpp
    @@ -56,12 +56,7 @@ class Abstract_VM_Version: AllStatic {
       static int          _vm_security_version;
       static int          _vm_patch_version;
       static int          _vm_build_number;
    -  static unsigned int _parallel_worker_threads;
    -  static bool         _parallel_worker_threads_initialized;
     
    -  static unsigned int nof_parallel_worker_threads(unsigned int num,
    -                                                  unsigned int dem,
    -                                                  unsigned int switch_pt);
      public:
       // Called as part of the runtime services initialization which is
       // called from the management module initialization (via init_globals())
    @@ -148,14 +143,9 @@ class Abstract_VM_Version: AllStatic {
       // that the O/S may support more sizes, but at most this many are used.
       static uint page_size_count() { return 2; }
     
    -  // Returns the number of parallel threads to be used for VM
    -  // work.  If that number has not been calculated, do so and
    -  // save it.  Returns ParallelGCThreads if it is set on the
    -  // command line.
    -  static unsigned int parallel_worker_threads();
    -  // Calculates and returns the number of parallel threads.  May
    -  // be VM version specific.
    -  static unsigned int calc_parallel_worker_threads();
    +  // Denominator for computing default ParallelGCThreads for machines with
    +  // a large number of cores.
    +  static uint parallel_worker_threads_denominator() { return 8; }
     
       // Does this CPU support spin wait instruction?
       static bool supports_on_spin_wait() { return false; }
    diff --git a/src/hotspot/share/services/attachListener.cpp b/src/hotspot/share/services/attachListener.cpp
    index fc77970a000..81b0fa19c54 100644
    --- a/src/hotspot/share/services/attachListener.cpp
    +++ b/src/hotspot/share/services/attachListener.cpp
    @@ -25,7 +25,7 @@
     #include "precompiled.hpp"
     #include "classfile/javaClasses.hpp"
     #include "classfile/systemDictionary.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "memory/resourceArea.hpp"
     #include "oops/oop.inline.hpp"
     #include "oops/typeArrayOop.inline.hpp"
    diff --git a/src/hotspot/share/services/diagnosticCommand.cpp b/src/hotspot/share/services/diagnosticCommand.cpp
    index d94dc13c3f9..c9e36d02066 100644
    --- a/src/hotspot/share/services/diagnosticCommand.cpp
    +++ b/src/hotspot/share/services/diagnosticCommand.cpp
    @@ -28,7 +28,7 @@
     #include "classfile/classLoaderStats.hpp"
     #include "compiler/compileBroker.hpp"
     #include "compiler/directivesParser.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "memory/metaspace/metaspaceDCmd.hpp"
     #include "memory/resourceArea.hpp"
     #include "oops/objArrayOop.inline.hpp"
    diff --git a/src/hotspot/share/services/dtraceAttacher.cpp b/src/hotspot/share/services/dtraceAttacher.cpp
    index 2d7e32c2ddc..07062fb2006 100644
    --- a/src/hotspot/share/services/dtraceAttacher.cpp
    +++ b/src/hotspot/share/services/dtraceAttacher.cpp
    @@ -28,7 +28,7 @@
     #include "runtime/deoptimization.hpp"
     #include "runtime/flags/jvmFlag.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/dtraceAttacher.hpp"
     
     #ifdef SOLARIS
    diff --git a/src/hotspot/share/services/heapDumper.cpp b/src/hotspot/share/services/heapDumper.cpp
    index 41cc16d3981..e81a53f3a5a 100644
    --- a/src/hotspot/share/services/heapDumper.cpp
    +++ b/src/hotspot/share/services/heapDumper.cpp
    @@ -30,7 +30,7 @@
     #include "classfile/systemDictionary.hpp"
     #include "classfile/vmSymbols.hpp"
     #include "gc/shared/gcLocker.hpp"
    -#include "gc/shared/vmGCOperations.hpp"
    +#include "gc/shared/gcVMOperations.hpp"
     #include "memory/allocation.inline.hpp"
     #include "memory/resourceArea.hpp"
     #include "memory/universe.hpp"
    @@ -48,7 +48,7 @@
     #include "runtime/threadSMR.hpp"
     #include "runtime/vframe.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/heapDumper.hpp"
     #include "services/threadService.hpp"
     #include "utilities/macros.hpp"
    diff --git a/src/hotspot/share/services/memTracker.cpp b/src/hotspot/share/services/memTracker.cpp
    index 2a20a0931f2..42683393060 100644
    --- a/src/hotspot/share/services/memTracker.cpp
    +++ b/src/hotspot/share/services/memTracker.cpp
    @@ -26,7 +26,7 @@
     
     #include "runtime/orderAccess.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/memBaseline.hpp"
     #include "services/memReporter.hpp"
     #include "services/mallocTracker.inline.hpp"
    diff --git a/src/hotspot/share/services/nmtDCmd.cpp b/src/hotspot/share/services/nmtDCmd.cpp
    index f573d5f43c4..8e0e8a9944d 100644
    --- a/src/hotspot/share/services/nmtDCmd.cpp
    +++ b/src/hotspot/share/services/nmtDCmd.cpp
    @@ -25,7 +25,7 @@
     #include "memory/resourceArea.hpp"
     #include "runtime/mutexLocker.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/nmtDCmd.hpp"
     #include "services/memReporter.hpp"
     #include "services/memTracker.hpp"
    diff --git a/src/hotspot/share/services/threadService.cpp b/src/hotspot/share/services/threadService.cpp
    index 89e88af2364..f81a2a558d7 100644
    --- a/src/hotspot/share/services/threadService.cpp
    +++ b/src/hotspot/share/services/threadService.cpp
    @@ -39,7 +39,7 @@
     #include "runtime/threadSMR.inline.hpp"
     #include "runtime/vframe.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "services/threadService.hpp"
     
     // TODO: we need to define a naming convention for perf counters
    diff --git a/src/hotspot/share/utilities/globalDefinitions.hpp b/src/hotspot/share/utilities/globalDefinitions.hpp
    index f9b5c5c1df1..710a98574d0 100644
    --- a/src/hotspot/share/utilities/globalDefinitions.hpp
    +++ b/src/hotspot/share/utilities/globalDefinitions.hpp
    @@ -69,6 +69,7 @@
     #define UINT64_FORMAT_X        "%" PRIx64
     #define INT64_FORMAT_W(width)  "%" #width PRId64
     #define UINT64_FORMAT_W(width) "%" #width PRIu64
    +#define UINT64_FORMAT_X_W(width) "%" #width PRIx64
     
     #define PTR64_FORMAT           "0x%016" PRIx64
     
    @@ -422,14 +423,6 @@ const size_t minimumStringTableSize = 128;
     const size_t defaultSymbolTableSize = 32768; // 2^15
     const size_t minimumSymbolTableSize = 1024;
     
    -
    -//----------------------------------------------------------------------------------------------------
    -// HotSwap - for JVMTI   aka Class File Replacement and PopFrame
    -//
    -// Determines whether on-the-fly class replacement and frame popping are enabled.
    -
    -#define HOTSWAP
    -
     //----------------------------------------------------------------------------------------------------
     // Object alignment, in units of HeapWords.
     //
    diff --git a/src/hotspot/share/utilities/macros.hpp b/src/hotspot/share/utilities/macros.hpp
    index 5e6362f8df6..6393dc39190 100644
    --- a/src/hotspot/share/utilities/macros.hpp
    +++ b/src/hotspot/share/utilities/macros.hpp
    @@ -221,6 +221,24 @@
     #define NOT_SERIALGC_RETURN_(code) { return code; }
     #endif // INCLUDE_SERIALGC
     
    +#ifndef INCLUDE_SHENANDOAHGC
    +#define INCLUDE_SHENANDOAHGC 1
    +#endif // INCLUDE_SHENANDOAHGC
    +
    +#if INCLUDE_SHENANDOAHGC
    +#define SHENANDOAHGC_ONLY(x) x
    +#define SHENANDOAHGC_ONLY_ARG(arg) arg,
    +#define NOT_SHENANDOAHGC(x)
    +#define NOT_SHENANDOAHGC_RETURN        /* next token must be ; */
    +#define NOT_SHENANDOAHGC_RETURN_(code) /* next token must be ; */
    +#else
    +#define SHENANDOAHGC_ONLY(x)
    +#define SHENANDOAHGC_ONLY_ARG(arg)
    +#define NOT_SHENANDOAHGC(x) x
    +#define NOT_SHENANDOAHGC_RETURN        {}
    +#define NOT_SHENANDOAHGC_RETURN_(code) { return code; }
    +#endif // INCLUDE_SHENANDOAHGC
    +
     #ifndef INCLUDE_ZGC
     #define INCLUDE_ZGC 1
     #endif // INCLUDE_ZGC
    diff --git a/src/hotspot/share/utilities/vmError.cpp b/src/hotspot/share/utilities/vmError.cpp
    index 937df5b65d8..f7d147ae453 100644
    --- a/src/hotspot/share/utilities/vmError.cpp
    +++ b/src/hotspot/share/utilities/vmError.cpp
    @@ -40,7 +40,7 @@
     #include "runtime/thread.inline.hpp"
     #include "runtime/threadSMR.hpp"
     #include "runtime/vmThread.hpp"
    -#include "runtime/vm_operations.hpp"
    +#include "runtime/vmOperations.hpp"
     #include "runtime/vm_version.hpp"
     #include "runtime/flags/jvmFlag.hpp"
     #include "services/memTracker.hpp"
    diff --git a/src/java.base/share/classes/com/sun/java/util/jar/pack/ConstantPool.java b/src/java.base/share/classes/com/sun/java/util/jar/pack/ConstantPool.java
    index c4875bf27e6..b75d8c4e7a9 100644
    --- a/src/java.base/share/classes/com/sun/java/util/jar/pack/ConstantPool.java
    +++ b/src/java.base/share/classes/com/sun/java/util/jar/pack/ConstantPool.java
    @@ -1366,7 +1366,7 @@ class ConstantPool {
                 }
                 if (tag == CONSTANT_Utf8) {
                     // Special case:  First Utf8 must always be empty string.
    -                assert(cpMap.length == 0 || cpMap[0].stringValue().equals(""));
    +                assert(cpMap.length == 0 || cpMap[0].stringValue().isEmpty());
                 }
                 indexByTag[tag] = ix;
                 // decache indexes derived from this one:
    diff --git a/src/java.base/share/classes/com/sun/java/util/jar/pack/Driver.java b/src/java.base/share/classes/com/sun/java/util/jar/pack/Driver.java
    index 0411c464f52..bddaa00f621 100644
    --- a/src/java.base/share/classes/com/sun/java/util/jar/pack/Driver.java
    +++ b/src/java.base/share/classes/com/sun/java/util/jar/pack/Driver.java
    @@ -208,7 +208,7 @@ class Driver {
                 }
             }
     
    -        if (logFile != null && !logFile.equals("")) {
    +        if (logFile != null && !logFile.isEmpty()) {
                 if (logFile.equals("-")) {
                     System.setErr(System.out);
                 } else {
    @@ -246,7 +246,7 @@ class Driver {
                 }
                 newfile = packfile;
                 // The optional second argument is the source JAR file.
    -            if (jarfile.equals("")) {
    +            if (jarfile.isEmpty()) {
                     // If only one file is given, it is the only JAR.
                     // It serves as both input and output.
                     jarfile = newfile;
    @@ -352,7 +352,7 @@ class Driver {
                     if (Utils.isGZIPMagic(Utils.readMagic(inBuf))) {
                         in = new GZIPInputStream(in);
                     }
    -                String outfile = newfile.equals("")? jarfile: newfile;
    +                String outfile = newfile.isEmpty()? jarfile: newfile;
                     OutputStream fileOut;
                     if (outfile.equals("-"))
                         fileOut = System.out;
    @@ -366,7 +366,7 @@ class Driver {
                     // At this point, we have a good jarfile (or newfile, if -r)
                 }
     
    -            if (!bakfile.equals("")) {
    +            if (!bakfile.isEmpty()) {
                             // On success, abort jarfile recovery bracket.
                             new File(bakfile).delete();
                             bakfile = "";
    @@ -374,13 +374,13 @@ class Driver {
     
             } finally {
                 // Close jarfile recovery bracket.
    -            if (!bakfile.equals("")) {
    +            if (!bakfile.isEmpty()) {
                     File jarFile = new File(jarfile);
                     jarFile.delete(); // Win32 requires this, see above
                     new File(bakfile).renameTo(jarFile);
                 }
                 // In all cases, delete temporary *.pack.
    -            if (!tmpfile.equals(""))
    +            if (!tmpfile.isEmpty())
                     new File(tmpfile).delete();
             }
         }
    diff --git a/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java b/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java
    index 1d1a273ef7d..f54626b35f5 100644
    --- a/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java
    +++ b/src/java.base/share/classes/com/sun/java/util/jar/pack/Package.java
    @@ -685,7 +685,7 @@ class Package {
                     return;  // do not choose yet
                 }
                 String canonName = canonicalFileName();
    -            if (file.nameString.equals("")) {
    +            if (file.nameString.isEmpty()) {
                     file.nameString = canonName;
                 }
                 if (file.nameString.equals(canonName)) {
    @@ -706,7 +706,7 @@ class Package {
     
             public java.io.File getFileName(java.io.File parent) {
                 String name = file.name.stringValue();
    -            if (name.equals(""))
    +            if (name.isEmpty())
                     name = canonicalFileName();
                 String fname = name.replace('/', java.io.File.separatorChar);
                 return new java.io.File(parent, fname);
    @@ -779,7 +779,7 @@ class Package {
             }
             public boolean isTrivialClassStub() {
                 return isClassStub()
    -                && name.stringValue().equals("")
    +                && name.stringValue().isEmpty()
                     && (modtime == NO_MODTIME || modtime == default_modtime)
                     && (options &~ FO_IS_CLASS_STUB) == 0;
             }
    diff --git a/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageWriter.java b/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageWriter.java
    index bd3c89951ee..2447fa45e8b 100644
    --- a/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageWriter.java
    +++ b/src/java.base/share/classes/com/sun/java/util/jar/pack/PackageWriter.java
    @@ -646,7 +646,7 @@ class PackageWriter extends BandStructure {
                 return;  // nothing to write
     
             // The first element must always be the empty string.
    -        assert(cpMap[0].stringValue().equals(""));
    +        assert(cpMap[0].stringValue().isEmpty());
             final int SUFFIX_SKIP_1 = 1;
             final int PREFIX_SKIP_2 = 2;
     
    diff --git a/src/java.base/share/classes/com/sun/java/util/jar/pack/PackerImpl.java b/src/java.base/share/classes/com/sun/java/util/jar/pack/PackerImpl.java
    index d1391c4d30b..5c64915e6f8 100644
    --- a/src/java.base/share/classes/com/sun/java/util/jar/pack/PackerImpl.java
    +++ b/src/java.base/share/classes/com/sun/java/util/jar/pack/PackerImpl.java
    @@ -237,7 +237,7 @@ public class PackerImpl  extends TLGlobals implements Pack200.Packer {
             final long segmentLimit;
             {
                 long limit;
    -            if (props.getProperty(Pack200.Packer.SEGMENT_LIMIT, "").equals(""))
    +            if (props.getProperty(Pack200.Packer.SEGMENT_LIMIT, "").isEmpty())
                     limit = -1;
                 else
                     limit = props.getLong(Pack200.Packer.SEGMENT_LIMIT);
    diff --git a/src/java.base/share/classes/java/io/File.java b/src/java.base/share/classes/java/io/File.java
    index c37767c38db..28f4cfa4eed 100644
    --- a/src/java.base/share/classes/java/io/File.java
    +++ b/src/java.base/share/classes/java/io/File.java
    @@ -257,7 +257,7 @@ public class File
          */
         private File(String child, File parent) {
             assert parent.path != null;
    -        assert (!parent.path.equals(""));
    +        assert (!parent.path.isEmpty());
             this.path = fs.resolve(parent.path, child);
             this.prefixLength = parent.prefixLength;
         }
    @@ -316,7 +316,7 @@ public class File
                 throw new NullPointerException();
             }
             if (parent != null) {
    -            if (parent.equals("")) {
    +            if (parent.isEmpty()) {
                     this.path = fs.resolve(fs.getDefaultParent(),
                                            fs.normalize(child));
                 } else {
    @@ -359,7 +359,7 @@ public class File
                 throw new NullPointerException();
             }
             if (parent != null) {
    -            if (parent.path.equals("")) {
    +            if (parent.path.isEmpty()) {
                     this.path = fs.resolve(fs.getDefaultParent(),
                                            fs.normalize(child));
                 } else {
    @@ -426,7 +426,7 @@ public class File
             if (uri.getRawQuery() != null)
                 throw new IllegalArgumentException("URI has a query component");
             String p = uri.getPath();
    -        if (p.equals(""))
    +        if (p.isEmpty())
                 throw new IllegalArgumentException("URI path component is empty");
     
             // Okay, now initialize
    diff --git a/src/java.base/share/classes/java/io/InputStream.java b/src/java.base/share/classes/java/io/InputStream.java
    index 7bccfaf7525..938f041bbb7 100644
    --- a/src/java.base/share/classes/java/io/InputStream.java
    +++ b/src/java.base/share/classes/java/io/InputStream.java
    @@ -64,8 +64,8 @@ public abstract class InputStream implements Closeable {
          * 

    While the stream is open, the {@code available()}, {@code read()}, * {@code read(byte[])}, {@code read(byte[], int, int)}, * {@code readAllBytes()}, {@code readNBytes(byte[], int, int)}, - * {@code readNBytes(int)}, {@code skip(long)}, and - * {@code transferTo()} methods all behave as if end of stream has been + * {@code readNBytes(int)}, {@code skip(long)}, {@code skipNBytes(long)}, + * and {@code transferTo()} methods all behave as if end of stream has been * reached. After the stream has been closed, these methods all throw * {@code IOException}. * @@ -138,6 +138,14 @@ public abstract class InputStream implements Closeable { return 0L; } + @Override + public void skipNBytes(long n) throws IOException { + ensureOpen(); + if (n > 0) { + throw new EOFException(); + } + } + @Override public long transferTo(OutputStream out) throws IOException { Objects.requireNonNull(out); @@ -513,11 +521,11 @@ public abstract class InputStream implements Closeable { * For instance, the implementation may depend on the ability to seek. * * @param n the number of bytes to be skipped. - * @return the actual number of bytes skipped. + * @return the actual number of bytes skipped which might be zero. * @throws IOException if an I/O error occurs. + * @see java.io.InputStream#skipNBytes(long) */ public long skip(long n) throws IOException { - long remaining = n; int nr; @@ -538,6 +546,65 @@ public abstract class InputStream implements Closeable { return n - remaining; } + /** + * Skips over and discards exactly {@code n} bytes of data from this input + * stream. If {@code n} is zero, then no bytes are skipped. + * If {@code n} is negative, then no bytes are skipped. + * Subclasses may handle the negative value differently. + * + *

    This method blocks until the requested number of bytes have been + * skipped, end of file is reached, or an exception is thrown. + * + *

    If end of stream is reached before the stream is at the desired + * position, then an {@code EOFException} is thrown. + * + *

    If an I/O error occurs, then the input stream may be + * in an inconsistent state. It is strongly recommended that the + * stream be promptly closed if an I/O error occurs. + * + * @implNote + * Subclasses are encouraged to provide a more efficient implementation + * of this method. + * + * @implSpec + * If {@code n} is zero or negative, then no bytes are skipped. + * If {@code n} is positive, the default implementation of this method + * invokes {@link #skip(long) skip()} with parameter {@code n}. If the + * return value of {@code skip(n)} is non-negative and less than {@code n}, + * then {@link #read()} is invoked repeatedly until the stream is {@code n} + * bytes beyond its position when this method was invoked or end of stream + * is reached. If the return value of {@code skip(n)} is negative or + * greater than {@code n}, then an {@code IOException} is thrown. Any + * exception thrown by {@code skip()} or {@code read()} will be propagated. + * + * @param n the number of bytes to be skipped. + * @throws EOFException if end of stream is encountered before the + * stream can be positioned {@code n} bytes beyond its position + * when this method was invoked. + * @throws IOException if the stream cannot be positioned properly or + * if an I/O error occurs. + * @see java.io.InputStream#skip(long) + */ + public void skipNBytes(long n) throws IOException { + if (n > 0) { + long ns = skip(n); + if (ns >= 0 && ns < n) { // skipped too few bytes + // adjust number to skip + n -= ns; + // read until requested number skipped or EOS reached + while (n > 0 && read() != -1) { + n--; + } + // if not enough skipped, then EOFE + if (n != 0) { + throw new EOFException(); + } + } else if (ns != n) { // skipped negative or too many bytes + throw new IOException("Unable to skip exactly"); + } + } + } + /** * Returns an estimate of the number of bytes that can be read (or skipped * over) from this input stream without blocking, which may be 0, or 0 when diff --git a/src/java.base/share/classes/java/lang/Class.java b/src/java.base/share/classes/java/lang/Class.java index 692da5b744e..07430235230 100644 --- a/src/java.base/share/classes/java/lang/Class.java +++ b/src/java.base/share/classes/java/lang/Class.java @@ -26,6 +26,8 @@ package java.lang; import java.lang.annotation.Annotation; +import java.lang.constant.ClassDesc; +import java.lang.invoke.TypeDescriptor; import java.lang.module.ModuleReader; import java.lang.ref.SoftReference; import java.io.IOException; @@ -46,6 +48,7 @@ import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; +import java.lang.constant.Constable; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; @@ -58,6 +61,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.StringJoiner; import java.util.stream.Stream; import java.util.stream.Collectors; @@ -72,6 +76,7 @@ import jdk.internal.reflect.ConstantPool; import jdk.internal.reflect.Reflection; import jdk.internal.reflect.ReflectionFactory; import jdk.internal.vm.annotation.ForceInline; +import sun.invoke.util.Wrapper; import sun.reflect.generics.factory.CoreReflectionFactory; import sun.reflect.generics.factory.GenericsFactory; import sun.reflect.generics.repository.ClassRepository; @@ -154,7 +159,9 @@ import sun.reflect.misc.ReflectUtil; public final class Class implements java.io.Serializable, GenericDeclaration, Type, - AnnotatedElement { + AnnotatedElement, + TypeDescriptor.OfField>, + Constable { private static final int ANNOTATION= 0x00002000; private static final int ENUM = 0x00004000; private static final int SYNTHETIC = 0x00001000; @@ -4027,4 +4034,68 @@ public final class Class implements java.io.Serializable, } return members; } + + /** + * Returns the type descriptor string for this class. + *

    + * Note that this is not a strict inverse of {@link #forName}; + * distinct classes which share a common name but have different class loaders + * will have identical descriptor strings. + * + * @return the type descriptor representation + * @jvms 4.3.2 Field Descriptors + * @since 12 + */ + @Override + public String descriptorString() { + if (isPrimitive()) + return Wrapper.forPrimitiveType(this).basicTypeString(); + else if (isArray()) { + return "[" + componentType.descriptorString(); + } + else { + return "L" + getName().replace('.', '/') + ";"; + } + } + + /** + * Returns the component type of this {@code Class}, if it describes + * an array type, or {@code null} otherwise. + * + * @implSpec + * Equivalent to {@link Class#getComponentType()}. + * + * @return a {@code Class} describing the component type, or {@code null} + * if this {@code Class} does not describe an array type + * @since 12 + */ + @Override + public Class componentType() { + return isArray() ? componentType : null; + } + + /** + * Returns a {@code Class} for an array type whose component type + * is described by this {@linkplain Class}. + * + * @return a {@code Class} describing the array type + * @since 12 + */ + @Override + public Class arrayType() { + return Array.newInstance(this, 0).getClass(); + } + + /** + * Returns a nominal descriptor for this instance, if one can be + * constructed, or an empty {@link Optional} if one cannot be. + * + * @return An {@link Optional} containing the resulting nominal descriptor, + * or an empty {@link Optional} if one cannot be constructed. + * @since 12 + */ + @Override + public Optional describeConstable() { + return Optional.of(ClassDesc.ofDescriptor(descriptorString())); + } } diff --git a/src/java.base/share/classes/java/lang/ClassLoader.java b/src/java.base/share/classes/java/lang/ClassLoader.java index f6dedb93139..12cefac5357 100644 --- a/src/java.base/share/classes/java/lang/ClassLoader.java +++ b/src/java.base/share/classes/java/lang/ClassLoader.java @@ -2430,7 +2430,7 @@ public abstract class ClassLoader { if (!load0(name, isBuiltin)) return false; // register the class loader for cleanup when unloaded - // built class loaders are never unloaded + // builtin class loaders are never unloaded ClassLoader loader = fromClass.getClassLoader(); if (loader != null && loader != getBuiltinPlatformClassLoader() && diff --git a/src/java.base/share/classes/java/lang/Double.java b/src/java.base/share/classes/java/lang/Double.java index 52bf32c8153..1ae2380495e 100644 --- a/src/java.base/share/classes/java/lang/Double.java +++ b/src/java.base/share/classes/java/lang/Double.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,11 @@ package java.lang; +import java.lang.invoke.MethodHandles; +import java.lang.constant.Constable; +import java.lang.constant.ConstantDesc; +import java.util.Optional; + import jdk.internal.math.FloatingDecimal; import jdk.internal.math.DoubleConsts; import jdk.internal.HotSpotIntrinsicCandidate; @@ -46,7 +51,8 @@ import jdk.internal.HotSpotIntrinsicCandidate; * @author Joseph D. Darcy * @since 1.0 */ -public final class Double extends Number implements Comparable { +public final class Double extends Number + implements Comparable, Constable, ConstantDesc { /** * A constant holding the positive infinity of type * {@code double}. It is equal to the value returned by @@ -1070,6 +1076,31 @@ public final class Double extends Number implements Comparable { return Math.min(a, b); } + /** + * Returns a nominal descriptor for this instance, which is the instance + * itself. + * + * @return an {@link Optional} describing the {@linkplain Double} instance + * @since 12 + */ + @Override + public Optional describeConstable() { + return Optional.of(this); + } + + /** + * Resolves this instance as a {@link ConstantDesc}, the result of which is + * the instance itself. + * + * @param lookup ignored + * @return the {@linkplain Double} instance + * @since 12 + */ + @Override + public Double resolveConstantDesc(MethodHandles.Lookup lookup) { + return this; + } + /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -9172774392245257468L; } diff --git a/src/java.base/share/classes/java/lang/Enum.java b/src/java.base/share/classes/java/lang/Enum.java index 0fe060a0629..fad2f300d47 100644 --- a/src/java.base/share/classes/java/lang/Enum.java +++ b/src/java.base/share/classes/java/lang/Enum.java @@ -25,11 +25,19 @@ package java.lang; -import java.io.Serializable; import java.io.IOException; import java.io.InvalidObjectException; import java.io.ObjectInputStream; import java.io.ObjectStreamException; +import java.io.Serializable; +import java.lang.constant.ClassDesc; +import java.lang.constant.Constable; +import java.lang.constant.ConstantDescs; +import java.lang.constant.DynamicConstantDesc; +import java.lang.invoke.MethodHandles; +import java.util.Optional; + +import static java.util.Objects.requireNonNull; /** * This is the common base class of all Java language enumeration types. @@ -56,7 +64,7 @@ import java.io.ObjectStreamException; @SuppressWarnings("serial") // No serialVersionUID needed due to // special-casing of enum types. public abstract class Enum> - implements Comparable, Serializable { + implements Constable, Comparable, Serializable { /** * The name of this enum constant, as declared in the enum declaration. * Most programmers should use the {@link #toString} method rather than @@ -203,6 +211,21 @@ public abstract class Enum> return (zuper == Enum.class) ? (Class)clazz : (Class)zuper; } + /** + * Returns an enum descriptor {@code EnumDesc} for this instance, if one can be + * constructed, or an empty {@link Optional} if one cannot be. + * + * @return An {@link Optional} containing the resulting nominal descriptor, + * or an empty {@link Optional} if one cannot be constructed. + * @since 12 + */ + @Override + public final Optional> describeConstable() { + return getDeclaringClass() + .describeConstable() + .map(c -> EnumDesc.of(c, name)); + } + /** * Returns the enum constant of the specified enum type with the * specified name. The name must match exactly an identifier used @@ -258,4 +281,56 @@ public abstract class Enum> private void readObjectNoData() throws ObjectStreamException { throw new InvalidObjectException("can't deserialize enum"); } + + /** + * A nominal descriptor for an + * {@code enum} constant. + * + * @param the type of the enum constant + * + * @since 12 + */ + public static final class EnumDesc> + extends DynamicConstantDesc { + + /** + * Constructs a nominal descriptor for the specified {@code enum} class and name. + * + * @param constantType a {@link ClassDesc} describing the {@code enum} class + * @param constantName the unqualified name of the enum constant + * @throws NullPointerException if any argument is null + * @jvms 4.2.2 Unqualified Names + */ + private EnumDesc(ClassDesc constantType, String constantName) { + super(ConstantDescs.BSM_ENUM_CONSTANT, requireNonNull(constantName), requireNonNull(constantType)); + } + + /** + * Returns a nominal descriptor for the specified {@code enum} class and name + * + * @param the type of the enum constant + * @param enumClass a {@link ClassDesc} describing the {@code enum} class + * @param constantName the unqualified name of the enum constant + * @return the nominal descriptor + * @throws NullPointerException if any argument is null + * @jvms 4.2.2 Unqualified Names + * @since 12 + */ + public static> EnumDesc of(ClassDesc enumClass, + String constantName) { + return new EnumDesc<>(enumClass, constantName); + } + + @Override + @SuppressWarnings("unchecked") + public E resolveConstantDesc(MethodHandles.Lookup lookup) + throws ReflectiveOperationException { + return Enum.valueOf((Class) constantType().resolveConstantDesc(lookup), constantName()); + } + + @Override + public String toString() { + return String.format("EnumDesc[%s.%s]", constantType().displayName(), constantName()); + } + } } diff --git a/src/java.base/share/classes/java/lang/Float.java b/src/java.base/share/classes/java/lang/Float.java index 52cb2c09b79..9712c1a10e1 100644 --- a/src/java.base/share/classes/java/lang/Float.java +++ b/src/java.base/share/classes/java/lang/Float.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,11 @@ package java.lang; +import java.lang.invoke.MethodHandles; +import java.lang.constant.Constable; +import java.lang.constant.ConstantDesc; +import java.util.Optional; + import jdk.internal.math.FloatingDecimal; import jdk.internal.HotSpotIntrinsicCandidate; @@ -45,7 +50,8 @@ import jdk.internal.HotSpotIntrinsicCandidate; * @author Joseph D. Darcy * @since 1.0 */ -public final class Float extends Number implements Comparable { +public final class Float extends Number + implements Comparable, Constable, ConstantDesc { /** * A constant holding the positive infinity of type * {@code float}. It is equal to the value returned by @@ -982,6 +988,31 @@ public final class Float extends Number implements Comparable { return Math.min(a, b); } + /** + * Returns a nominal descriptor for this instance, which is the instance + * itself. + * + * @return an {@link Optional} describing the {@linkplain Float} instance + * @since 12 + */ + @Override + public Optional describeConstable() { + return Optional.of(this); + } + + /** + * Resolves this instance as a {@link ConstantDesc}, the result of which is + * the instance itself. + * + * @param lookup ignored + * @return the {@linkplain Float} instance + * @since 12 + */ + @Override + public Float resolveConstantDesc(MethodHandles.Lookup lookup) { + return this; + } + /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -2671257302660747028L; } diff --git a/src/java.base/share/classes/java/lang/Integer.java b/src/java.base/share/classes/java/lang/Integer.java index 4508f8a1480..062e8170177 100644 --- a/src/java.base/share/classes/java/lang/Integer.java +++ b/src/java.base/share/classes/java/lang/Integer.java @@ -26,7 +26,12 @@ package java.lang; import java.lang.annotation.Native; +import java.lang.invoke.MethodHandles; +import java.lang.constant.Constable; +import java.lang.constant.ConstantDesc; import java.util.Objects; +import java.util.Optional; + import jdk.internal.HotSpotIntrinsicCandidate; import jdk.internal.misc.VM; @@ -56,7 +61,8 @@ import static java.lang.String.UTF16; * @author Joseph D. Darcy * @since 1.0 */ -public final class Integer extends Number implements Comparable { +public final class Integer extends Number + implements Comparable, Constable, ConstantDesc { /** * A constant holding the minimum value an {@code int} can * have, -231. @@ -1831,6 +1837,31 @@ public final class Integer extends Number implements Comparable { return Math.min(a, b); } + /** + * Returns a nominal descriptor for this instance, which is the instance + * itself. + * + * @return an {@link Optional} describing the {@linkplain Integer} instance + * @since 12 + */ + @Override + public Optional describeConstable() { + return Optional.of(this); + } + + /** + * Resolves this instance as a {@link ConstantDesc}, the result of which is + * the instance itself. + * + * @param lookup ignored + * @return the {@linkplain Integer} instance + * @since 12 + */ + @Override + public Integer resolveConstantDesc(MethodHandles.Lookup lookup) { + return this; + } + /** use serialVersionUID from JDK 1.0.2 for interoperability */ @Native private static final long serialVersionUID = 1360826667806852920L; } diff --git a/src/java.base/share/classes/java/lang/Long.java b/src/java.base/share/classes/java/lang/Long.java index 97d23ba5ac1..c2c466d08a0 100644 --- a/src/java.base/share/classes/java/lang/Long.java +++ b/src/java.base/share/classes/java/lang/Long.java @@ -26,8 +26,13 @@ package java.lang; import java.lang.annotation.Native; +import java.lang.invoke.MethodHandles; +import java.lang.constant.Constable; +import java.lang.constant.ConstantDesc; import java.math.*; import java.util.Objects; +import java.util.Optional; + import jdk.internal.HotSpotIntrinsicCandidate; import jdk.internal.misc.VM; @@ -57,7 +62,8 @@ import static java.lang.String.UTF16; * @author Joseph D. Darcy * @since 1.0 */ -public final class Long extends Number implements Comparable { +public final class Long extends Number + implements Comparable, Constable, ConstantDesc { /** * A constant holding the minimum value a {@code long} can * have, -263. @@ -1960,6 +1966,31 @@ public final class Long extends Number implements Comparable { return Math.min(a, b); } + /** + * Returns a nominal descriptor for this instance, which is the instance + * itself. + * + * @return an {@link Optional} describing the {@linkplain Long} instance + * @since 12 + */ + @Override + public Optional describeConstable() { + return Optional.of(this); + } + + /** + * Resolves this instance as a {@link ConstantDesc}, the result of which is + * the instance itself. + * + * @param lookup ignored + * @return the {@linkplain Long} instance + * @since 12 + */ + @Override + public Long resolveConstantDesc(MethodHandles.Lookup lookup) { + return this; + } + /** use serialVersionUID from JDK 1.0.2 for interoperability */ @Native private static final long serialVersionUID = 4290774380558885855L; } diff --git a/src/java.base/share/classes/java/lang/SecurityManager.java b/src/java.base/share/classes/java/lang/SecurityManager.java index dc1b46e2372..9ef644081ce 100644 --- a/src/java.base/share/classes/java/lang/SecurityManager.java +++ b/src/java.base/share/classes/java/lang/SecurityManager.java @@ -1201,7 +1201,7 @@ public class SecurityManager { private static String[] getPackages(String p) { String packages[] = null; - if (p != null && !p.equals("")) { + if (p != null && !p.isEmpty()) { java.util.StringTokenizer tok = new java.util.StringTokenizer(p, ","); int n = tok.countTokens(); diff --git a/src/java.base/share/classes/java/lang/String.java b/src/java.base/share/classes/java/lang/String.java index b687894df1c..201f3f5d804 100644 --- a/src/java.base/share/classes/java/lang/String.java +++ b/src/java.base/share/classes/java/lang/String.java @@ -28,6 +28,9 @@ package java.lang; import java.io.ObjectStreamField; import java.io.UnsupportedEncodingException; import java.lang.annotation.Native; +import java.lang.invoke.MethodHandles; +import java.lang.constant.Constable; +import java.lang.constant.ConstantDesc; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; @@ -35,6 +38,7 @@ import java.util.Comparator; import java.util.Formatter; import java.util.Locale; import java.util.Objects; +import java.util.Optional; import java.util.Spliterator; import java.util.StringJoiner; import java.util.function.Function; @@ -127,7 +131,8 @@ import static java.util.function.Predicate.not; */ public final class String - implements java.io.Serializable, Comparable, CharSequence { + implements java.io.Serializable, Comparable, CharSequence, + Constable, ConstantDesc { /** * The value is used for character storage. @@ -3538,4 +3543,30 @@ public final class String throw new IllegalArgumentException( format("Not a valid Unicode code point: 0x%X", codePoint)); } + + /** + * Returns a nominal descriptor for this instance, which is the instance + * itself. + * + * @return an {@link Optional} describing the {@linkplain String} instance + * @since 12 + */ + @Override + public Optional describeConstable() { + return Optional.of(this); + } + + /** + * Resolves this instance as a {@link ConstantDesc}, the result of which is + * the instance itself. + * + * @param lookup ignored + * @return the {@linkplain String} instance + * @since 12 + */ + @Override + public String resolveConstantDesc(MethodHandles.Lookup lookup) { + return this; + } + } diff --git a/src/java.base/share/classes/java/lang/System.java b/src/java.base/share/classes/java/lang/System.java index c901ab4e3e5..fb0ac21675b 100644 --- a/src/java.base/share/classes/java/lang/System.java +++ b/src/java.base/share/classes/java/lang/System.java @@ -970,7 +970,7 @@ public final class System { if (key == null) { throw new NullPointerException("key can't be null"); } - if (key.equals("")) { + if (key.isEmpty()) { throw new IllegalArgumentException("key can't be empty"); } } diff --git a/src/java.base/share/classes/java/lang/constant/AsTypeMethodHandleDesc.java b/src/java.base/share/classes/java/lang/constant/AsTypeMethodHandleDesc.java new file mode 100644 index 00000000000..b2fe91268d2 --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/AsTypeMethodHandleDesc.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +import static java.lang.constant.ConstantDescs.BSM_INVOKE; +import static java.lang.constant.ConstantDescs.CD_MethodHandle; +import static java.util.Objects.requireNonNull; + +/** + * A nominal descriptor for a + * {@link MethodHandle} constant that performs a {@link MethodHandle#asType(MethodType)} + * adaptation on another {@link MethodHandle}. + */ +final class AsTypeMethodHandleDesc extends DynamicConstantDesc + implements MethodHandleDesc { + + private final MethodHandleDesc underlying; + private final MethodTypeDesc type; + + AsTypeMethodHandleDesc(MethodHandleDesc underlying, MethodTypeDesc type) { + super(BSM_INVOKE, ConstantDescs.DEFAULT_NAME, CD_MethodHandle, + ConstantDescs.MHD_METHODHANDLE_ASTYPE, underlying, type); + this.underlying = requireNonNull(underlying); + this.type = requireNonNull(type); + } + + @Override + public MethodTypeDesc invocationType() { + return type; + } + + @Override + public MethodHandle resolveConstantDesc(MethodHandles.Lookup lookup) + throws ReflectiveOperationException { + MethodHandle handle = (MethodHandle) underlying.resolveConstantDesc(lookup); + MethodType methodType = (MethodType) type.resolveConstantDesc(lookup); + return handle.asType(methodType); + } + + @Override + public String toString() { + return String.format("%s.asType%s", underlying.toString(), type.displayDescriptor()); + } +} diff --git a/src/java.base/share/classes/java/lang/constant/ClassDesc.java b/src/java.base/share/classes/java/lang/constant/ClassDesc.java new file mode 100644 index 00000000000..00081362c7c --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/ClassDesc.java @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.invoke.TypeDescriptor; +import java.util.stream.Stream; + +import sun.invoke.util.Wrapper; + +import static java.lang.constant.ConstantUtils.binaryToInternal; +import static java.lang.constant.ConstantUtils.dropLastChar; +import static java.lang.constant.ConstantUtils.internalToBinary; +import static java.lang.constant.ConstantUtils.validateMemberName; +import static java.util.Objects.requireNonNull; +import static java.util.stream.Collectors.joining; + +/** + * A nominal descriptor for a + * {@link Class} constant. + * + *

    For common system types, including all the primitive types, there are + * predefined {@linkplain ClassDesc} constants in {@link ConstantDescs}. + * (The {@code java.lang.constant} APIs consider {@code void} to be a primitive type.) + * To create a {@linkplain ClassDesc} for a class or interface type, use {@link #of} or + * {@link #ofDescriptor(String)}; to create a {@linkplain ClassDesc} for an array + * type, use {@link #ofDescriptor(String)}, or first obtain a + * {@linkplain ClassDesc} for the component type and then call the {@link #arrayType()} + * or {@link #arrayType(int)} methods. + * + * @apiNote In the future, if the Java language permits, {@linkplain ClassDesc} + * may become a {@code sealed} interface, which would prohibit subclassing except + * by explicitly permitted types. Non-platform classes should not implement + * {@linkplain ClassDesc} directly. + * + * @see ConstantDescs + * + * @since 12 + */ +public interface ClassDesc + extends ConstantDesc, + TypeDescriptor.OfField { + + /** + * Returns a {@linkplain ClassDesc} for a class or interface type, + * given the name of the class or interface, such as {@code "java.lang.String"}. + * (To create a descriptor for an array type, either use {@link #ofDescriptor(String)} + * or {@link #arrayType()}; to create a descriptor for a primitive type, use + * {@link #ofDescriptor(String)} or use the predefined constants in + * {@link ConstantDescs}). + * + * @param name the fully qualified (dot-separated) binary class name + * @return a {@linkplain ClassDesc} describing the desired class + * @throws NullPointerException if any argument is {@code null} + * @throws IllegalArgumentException if the name string is not in the + * correct format + */ + static ClassDesc of(String name) { + ConstantUtils.validateBinaryClassName(requireNonNull(name)); + return ClassDesc.ofDescriptor("L" + binaryToInternal(name) + ";"); + } + + /** + * Returns a {@linkplain ClassDesc} for a class or interface type, + * given a package name and the unqualified (simple) name for the + * class or interface. + * + * @param packageName the package name (dot-separated); if the package + * name is the empty string, the class is considered to + * be in the unnamed package + * @param className the unqualified (simple) class name + * @return a {@linkplain ClassDesc} describing the desired class + * @throws NullPointerException if any argument is {@code null} + * @throws IllegalArgumentException if the package name or class name are + * not in the correct format + */ + static ClassDesc of(String packageName, String className) { + ConstantUtils.validateBinaryClassName(requireNonNull(packageName)); + validateMemberName(requireNonNull(className)); + return ofDescriptor(String.format("L%s%s%s;", + binaryToInternal(packageName), + (packageName.length() > 0 ? "/" : ""), + className)); + } + + /** + * Returns a {@linkplain ClassDesc} given a descriptor string for a class, + * interface, array, or primitive type. + * + * @apiNote + * + * A field type descriptor string for a non-array type is either + * a one-letter code corresponding to a primitive type + * ({@code J,I,C,S,B,D,F,Z,V}), or the letter {@code L}, followed + * by the fully qualified binary name of a class, followed by {@code ;}. + * A field type descriptor for an array type is the character {@code [} + * followed by the field descriptor for the component type. Examples of + * valid type descriptor strings include {@code Ljava/lang/String;}, {@code I}, + * {@code [I}, {@code V}, {@code [Ljava/lang/String;}, etc. + * for more detail. + * + * @param descriptor a field descriptor string + * @return a {@linkplain ClassDesc} describing the desired class + * @throws NullPointerException if any argument is {@code null} + * @throws IllegalArgumentException if the name string is not in the + * correct format + * @jvms 4.3.2 Field Descriptors + */ + static ClassDesc ofDescriptor(String descriptor) { + requireNonNull(descriptor); + return (descriptor.length() == 1) + ? new PrimitiveClassDescImpl(descriptor) + : new ReferenceClassDescImpl(descriptor); + } + + /** + * Returns a {@linkplain ClassDesc} for an array type whose component type + * is described by this {@linkplain ClassDesc}. + * + * @return a {@linkplain ClassDesc} describing the array type + */ + default ClassDesc arrayType() { + return arrayType(1); + } + + /** + * Returns a {@linkplain ClassDesc} for an array type of the specified rank, + * whose component type is described by this {@linkplain ClassDesc}. + * + * @param rank the rank of the array + * @return a {@linkplain ClassDesc} describing the array type + * @throws IllegalArgumentException if the rank is zero or negative + */ + default ClassDesc arrayType(int rank) { + if (rank <= 0) + throw new IllegalArgumentException("rank: " + rank); + return ClassDesc.ofDescriptor("[".repeat(rank) + descriptorString()); + } + + /** + * Returns a {@linkplain ClassDesc} for a nested class of the class or + * interface type described by this {@linkplain ClassDesc}. + * + * @param nestedName the unqualified name of the nested class + * @return a {@linkplain ClassDesc} describing the nested class + * @throws NullPointerException if any argument is {@code null} + * @throws IllegalStateException if this {@linkplain ClassDesc} does not + * describe a class or interface type + * @throws IllegalArgumentException if the nested class name is invalid + */ + default ClassDesc nested(String nestedName) { + validateMemberName(nestedName); + if (!isClassOrInterface()) + throw new IllegalStateException("Outer class is not a class or interface type"); + return ClassDesc.ofDescriptor(String.format("%s$%s;", dropLastChar(descriptorString()), nestedName)); + } + + /** + * Returns a {@linkplain ClassDesc} for a nested class of the class or + * interface type described by this {@linkplain ClassDesc}. + * + * @param firstNestedName the unqualified name of the first level of nested class + * @param moreNestedNames the unqualified name(s) of the remaining levels of + * nested class + * @return a {@linkplain ClassDesc} describing the nested class + * @throws NullPointerException if any argument is {@code null} + * @throws IllegalStateException if this {@linkplain ClassDesc} does not + * describe a class or interface type + * @throws IllegalArgumentException if the nested class name is invalid + */ + default ClassDesc nested(String firstNestedName, String... moreNestedNames) { + if (!isClassOrInterface()) + throw new IllegalStateException("Outer class is not a class or interface type"); + return moreNestedNames.length == 0 + ? nested(firstNestedName) + : nested(firstNestedName + Stream.of(moreNestedNames).collect(joining("$", "$", ""))); + } + + /** + * Returns whether this {@linkplain ClassDesc} describes an array type. + * + * @return whether this {@linkplain ClassDesc} describes an array type + */ + default boolean isArray() { + return descriptorString().startsWith("["); + } + + /** + * Returns whether this {@linkplain ClassDesc} describes a primitive type. + * + * @return whether this {@linkplain ClassDesc} describes a primitive type + */ + default boolean isPrimitive() { + return descriptorString().length() == 1; + } + + /** + * Returns whether this {@linkplain ClassDesc} describes a class or interface type. + * + * @return whether this {@linkplain ClassDesc} describes a class or interface type + */ + default boolean isClassOrInterface() { + return descriptorString().startsWith("L"); + } + + /** + * Returns the component type of this {@linkplain ClassDesc}, if it describes + * an array type, or {@code null} otherwise. + * + * @return a {@linkplain ClassDesc} describing the component type, or {@code null} + * if this descriptor does not describe an array type + */ + default ClassDesc componentType() { + return isArray() ? ClassDesc.ofDescriptor(descriptorString().substring(1)) : null; + } + + /** + * Returns the package name of this {@linkplain ClassDesc}, if it describes + * a class or interface type. + * + * @return the package name, or the empty string if the class is in the + * default package, or this {@linkplain ClassDesc} does not describe a class or interface type + */ + default String packageName() { + if (!isClassOrInterface()) + return ""; + String className = internalToBinary(ConstantUtils.dropFirstAndLastChar(descriptorString())); + int index = className.lastIndexOf('.'); + return (index == -1) ? "" : className.substring(0, index); + } + + /** + * Returns a human-readable name for the type described by this descriptor. + * + * @implSpec + *

    The default implementation returns the simple name + * (e.g., {@code int}) for primitive types, the unqualified class name + * for class or interface types, or the display name of the component type + * suffixed with the appropriate number of {@code []} pairs for array types. + * + * @return the human-readable name + */ + default String displayName() { + if (isPrimitive()) + return Wrapper.forBasicType(descriptorString().charAt(0)).primitiveSimpleName(); + else if (isClassOrInterface()) { + return descriptorString().substring(Math.max(1, descriptorString().lastIndexOf('/') + 1), + descriptorString().length() - 1); + } + else if (isArray()) { + int depth = ConstantUtils.arrayDepth(descriptorString()); + ClassDesc c = this; + for (int i=0; iconstable. A constable type is one whose + * values are constants that can be represented in the constant pool of a Java + * classfile as described in JVMS 4.4, and whose instances can describe themselves + * nominally as a {@link ConstantDesc}. + * + *

    Some constable types have a native representation in the constant pool: + * {@link String}, {@link Integer}, {@link Long}, {@link Float}, + * {@link Double}, {@link Class}, {@link MethodType}, and {@link MethodHandle}. + * The types {@link String}, {@link Integer}, {@link Long}, {@link Float}, + * and {@link Double} serve as their own nominal descriptors; {@link Class}, + * {@link MethodType}, and {@link MethodHandle} have corresponding nominal + * descriptors {@link ClassDesc}, {@link MethodTypeDesc}, and {@link MethodHandleDesc}. + * + *

    Other reference types can be constable if their instances can describe + * themselves in nominal form as a {@link ConstantDesc}. Examples in the Java SE + * Platform API are types that support Java language features such as {@link Enum}, + * and runtime support classes such as {@link VarHandle}. These are typically + * described with a {@link DynamicConstantDesc}, which describes dynamically + * generated constants (JVMS 4.4.10). + * + *

    The nominal form of an instance of a constable type is obtained via + * {@link #describeConstable()}. A {@linkplain Constable} need + * not be able to (or may choose not to) describe all its instances in the form of + * a {@link ConstantDesc}; this method returns an {@link Optional} that can be + * empty to indicate that a nominal descriptor could not be created for an instance. + * (For example, {@link MethodHandle} will produce nominal descriptors for direct + * method handles, but not necessarily those produced by method handle + * combinators.) + * @jvms 4.4 The Constant Pool + * @jvms 4.4.10 The CONSTANT_InvokeDynamic_info Structure + * + * @since 12 + */ +public interface Constable { + /** + * Returns a nominal descriptor for this instance, if one can be + * constructed, or an empty {@link Optional} if one cannot be constructed. + * + * @return An {@link Optional} containing the resulting nominal descriptor, + * or an empty {@link Optional} if one cannot be constructed. + */ + Optional describeConstable(); +} diff --git a/src/java.base/share/classes/java/lang/constant/ConstantDesc.java b/src/java.base/share/classes/java/lang/constant/ConstantDesc.java new file mode 100644 index 00000000000..5cd398dd485 --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/ConstantDesc.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.Enum.EnumDesc; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.invoke.VarHandle.VarHandleDesc; + +/** + * A nominal descriptor for a loadable + * constant value, as defined in JVMS 4.4. Such a descriptor can be resolved via + * {@link ConstantDesc#resolveConstantDesc(MethodHandles.Lookup)} to yield the + * constant value itself. + * + *

    Class names in a nominal descriptor, like class names in the constant pool + * of a classfile, must be interpreted with respect to a particular class + * loader, which is not part of the nominal descriptor. + * + *

    Static constants that are expressible natively in the constant pool ({@link String}, + * {@link Integer}, {@link Long}, {@link Float}, and {@link Double}) implement + * {@link ConstantDesc}, and serve as nominal descriptors for themselves. + * Native linkable constants ({@link Class}, {@link MethodType}, and + * {@link MethodHandle}) have counterpart {@linkplain ConstantDesc} types: + * {@link ClassDesc}, {@link MethodTypeDesc}, and {@link MethodHandleDesc}. + * Other constants are represented by subtypes of {@link DynamicConstantDesc}. + * + *

    APIs that perform generation or parsing of bytecode are encouraged to use + * {@linkplain ConstantDesc} to describe the operand of an {@code ldc} instruction + * (including dynamic constants), the static bootstrap arguments of + * dynamic constants and {@code invokedynamic} instructions, and other + * bytecodes or classfile structures that make use of the constant pool. + * + *

    Constants describing various common constants (such as {@link ClassDesc} + * instances for platform types) can be found in {@link ConstantDescs}. + * + *

    Implementations of {@linkplain ConstantDesc} must be + * value-based classes. + * + *

    Non-platform classes should not implement {@linkplain ConstantDesc} directly. + * Instead, they should extend {@link DynamicConstantDesc} (as {@link EnumDesc} + * and {@link VarHandleDesc} do.) + * + *

    Nominal descriptors should be compared using the + * {@link Object#equals(Object)} method. There is no guarantee that any + * particular entity will always be represented by the same descriptor instance. + * + * @apiNote In the future, if the Java language permits, {@linkplain ConstantDesc} + * may become a {@code sealed} interface, which would prohibit subclassing except by + * explicitly permitted types. Clients can assume that the following + * set of subtypes is exhaustive: {@link String}, {@link Integer}, + * {@link Long}, {@link Float}, {@link Double}, {@link ClassDesc}, + * {@link MethodTypeDesc}, {@link MethodHandleDesc}, and + * {@link DynamicConstantDesc}; this list may be extended to reflect future + * changes to the constant pool format as defined in JVMS 4.4. + * + * @see Constable + * @see ConstantDescs + * + * @jvms 4.4 The Constant Pool + * + * @since 12 + */ +public interface ConstantDesc { + /** + * Resolves this descriptor reflectively, emulating the resolution behavior + * of JVMS 5.4.3 and the access control behavior of JVMS 5.4.4. The resolution + * and access control context is provided by the {@link MethodHandles.Lookup} + * parameter. No caching of the resulting value is performed. + * + * @param lookup The {@link MethodHandles.Lookup} to provide name resolution + * and access control context + * @return the resolved constant value + * @throws ReflectiveOperationException if a class, method, or field + * could not be reflectively resolved in the course of resolution + * @throws LinkageError if a linkage error occurs + * @jvms 5.4.3 Resolution + * @jvms 5.4.4 Access Control + */ + Object resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException; +} diff --git a/src/java.base/share/classes/java/lang/constant/ConstantDescs.java b/src/java.base/share/classes/java/lang/constant/ConstantDescs.java new file mode 100644 index 00000000000..0dd8531d315 --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/ConstantDescs.java @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.Enum.EnumDesc; +import java.lang.invoke.CallSite; +import java.lang.invoke.ConstantBootstraps; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; +import java.lang.invoke.MethodType; +import java.lang.invoke.VarHandle; +import java.lang.invoke.VarHandle.VarHandleDesc; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static java.lang.constant.DirectMethodHandleDesc.*; +import static java.lang.constant.DirectMethodHandleDesc.Kind.STATIC; + +/** + * Predefined values of nominal descriptor + * for common constants, including descriptors for primitive class types and + * other common platform types, and descriptors for method handles for standard + * bootstrap methods. + * + * @see ConstantDesc + * + * @since 12 + */ +public final class ConstantDescs { + // No instances + private ConstantDescs() { } + + /** Invocation name to use when no name is needed, such as the name of a + * constructor, or the invocation name of a dynamic constant or dynamic + * callsite when the bootstrap is known to ignore the invocation name. + */ + public static final String DEFAULT_NAME = "_"; + + // Don't change the order of these declarations! + + /** {@link ClassDesc} representing {@link Object} */ + public static final ClassDesc CD_Object = ClassDesc.of("java.lang.Object"); + + /** {@link ClassDesc} representing {@link String} */ + public static final ClassDesc CD_String = ClassDesc.of("java.lang.String"); + + /** {@link ClassDesc} representing {@link Class} */ + public static final ClassDesc CD_Class = ClassDesc.of("java.lang.Class"); + + /** {@link ClassDesc} representing {@link Number} */ + public static final ClassDesc CD_Number = ClassDesc.of("java.lang.Number"); + + /** {@link ClassDesc} representing {@link Integer} */ + public static final ClassDesc CD_Integer = ClassDesc.of("java.lang.Integer"); + + /** {@link ClassDesc} representing {@link Long} */ + public static final ClassDesc CD_Long = ClassDesc.of("java.lang.Long"); + + /** {@link ClassDesc} representing {@link Float} */ + public static final ClassDesc CD_Float = ClassDesc.of("java.lang.Float"); + + /** {@link ClassDesc} representing {@link Double} */ + public static final ClassDesc CD_Double = ClassDesc.of("java.lang.Double"); + + /** {@link ClassDesc} representing {@link Short} */ + public static final ClassDesc CD_Short = ClassDesc.of("java.lang.Short"); + + /** {@link ClassDesc} representing {@link Byte} */ + public static final ClassDesc CD_Byte = ClassDesc.of("java.lang.Byte"); + + /** {@link ClassDesc} representing {@link Character} */ + public static final ClassDesc CD_Character = ClassDesc.of("java.lang.Character"); + + /** {@link ClassDesc} representing {@link Boolean} */ + public static final ClassDesc CD_Boolean = ClassDesc.of("java.lang.Boolean"); + + /** {@link ClassDesc} representing {@link Void} */ + public static final ClassDesc CD_Void = ClassDesc.of("java.lang.Void"); + + /** {@link ClassDesc} representing {@link Throwable} */ + public static final ClassDesc CD_Throwable = ClassDesc.of("java.lang.Throwable"); + + /** {@link ClassDesc} representing {@link Exception} */ + public static final ClassDesc CD_Exception = ClassDesc.of("java.lang.Exception"); + + /** {@link ClassDesc} representing {@link Enum} */ + public static final ClassDesc CD_Enum = ClassDesc.of("java.lang.Enum"); + + /** {@link ClassDesc} representing {@link VarHandle} */ + public static final ClassDesc CD_VarHandle = ClassDesc.of("java.lang.invoke.VarHandle"); + + /** {@link ClassDesc} representing {@link MethodHandles} */ + public static final ClassDesc CD_MethodHandles = ClassDesc.of("java.lang.invoke.MethodHandles"); + + /** {@link ClassDesc} representing {@link MethodHandles.Lookup} */ + public static final ClassDesc CD_MethodHandles_Lookup = CD_MethodHandles.nested("Lookup"); + + /** {@link ClassDesc} representing {@link MethodHandle} */ + public static final ClassDesc CD_MethodHandle = ClassDesc.of("java.lang.invoke.MethodHandle"); + + /** {@link ClassDesc} representing {@link MethodType} */ + public static final ClassDesc CD_MethodType = ClassDesc.of("java.lang.invoke.MethodType"); + + /** {@link ClassDesc} representing {@link CallSite} */ + public static final ClassDesc CD_CallSite = ClassDesc.of("java.lang.invoke.CallSite"); + + /** {@link ClassDesc} representing {@link Collection} */ + public static final ClassDesc CD_Collection = ClassDesc.of("java.util.Collection"); + + /** {@link ClassDesc} representing {@link List} */ + public static final ClassDesc CD_List = ClassDesc.of("java.util.List"); + + /** {@link ClassDesc} representing {@link Set} */ + public static final ClassDesc CD_Set = ClassDesc.of("java.util.Set"); + + /** {@link ClassDesc} representing {@link Map} */ + public static final ClassDesc CD_Map = ClassDesc.of("java.util.Map"); + + /** {@link ClassDesc} representing {@link ConstantDesc} */ + public static final ClassDesc CD_ConstantDesc = ClassDesc.of("java.lang.constant.ConstantDesc"); + + /** {@link ClassDesc} representing {@link ClassDesc} */ + public static final ClassDesc CD_ClassDesc = ClassDesc.of("java.lang.constant.ClassDesc"); + + /** {@link ClassDesc} representing {@link EnumDesc} */ + public static final ClassDesc CD_EnumDesc = CD_Enum.nested("EnumDesc"); + + /** {@link ClassDesc} representing {@link MethodTypeDesc} */ + public static final ClassDesc CD_MethodTypeDesc = ClassDesc.of("java.lang.constant.MethodTypeDesc"); + + /** {@link ClassDesc} representing {@link MethodHandleDesc} */ + public static final ClassDesc CD_MethodHandleDesc = ClassDesc.of("java.lang.constant.MethodHandleDesc"); + + /** {@link ClassDesc} representing {@link DirectMethodHandleDesc} */ + public static final ClassDesc CD_DirectMethodHandleDesc = ClassDesc.of("java.lang.constant.DirectMethodHandleDesc"); + + /** {@link ClassDesc} representing {@link VarHandleDesc} */ + public static final ClassDesc CD_VarHandleDesc = CD_VarHandle.nested("VarHandleDesc"); + + /** {@link ClassDesc} representing {@link DirectMethodHandleDesc.Kind} */ + public static final ClassDesc CD_MethodHandleDesc_Kind = CD_DirectMethodHandleDesc.nested("Kind"); + + /** {@link ClassDesc} representing {@link DynamicConstantDesc} */ + public static final ClassDesc CD_DynamicConstantDesc = ClassDesc.of("java.lang.constant.DynamicConstantDesc"); + + /** {@link ClassDesc} representing {@link DynamicCallSiteDesc} */ + public static final ClassDesc CD_DynamicCallSiteDesc = ClassDesc.of("java.lang.constant.DynamicCallSiteDesc"); + + /** {@link ClassDesc} representing {@link ConstantBootstraps} */ + public static final ClassDesc CD_ConstantBootstraps = ClassDesc.of("java.lang.invoke.ConstantBootstraps"); + + private static final ClassDesc[] INDY_BOOTSTRAP_ARGS = { + ConstantDescs.CD_MethodHandles_Lookup, + ConstantDescs.CD_String, + ConstantDescs.CD_MethodType}; + + private static final ClassDesc[] CONDY_BOOTSTRAP_ARGS = { + ConstantDescs.CD_MethodHandles_Lookup, + ConstantDescs.CD_String, + ConstantDescs.CD_Class}; + + /** {@link MethodHandleDesc} representing {@link ConstantBootstraps#primitiveClass(Lookup, String, Class) ConstantBootstraps.primitiveClass} */ + public static final DirectMethodHandleDesc BSM_PRIMITIVE_CLASS + = ofConstantBootstrap(CD_ConstantBootstraps, "primitiveClass", + CD_Class); + + /** {@link MethodHandleDesc} representing {@link ConstantBootstraps#enumConstant(Lookup, String, Class) ConstantBootstraps.enumConstant} */ + public static final DirectMethodHandleDesc BSM_ENUM_CONSTANT + = ofConstantBootstrap(CD_ConstantBootstraps, "enumConstant", + CD_Enum); + + /** {@link MethodHandleDesc} representing {@link ConstantBootstraps#nullConstant(Lookup, String, Class) ConstantBootstraps.nullConstant} */ + public static final DirectMethodHandleDesc BSM_NULL_CONSTANT + = ofConstantBootstrap(CD_ConstantBootstraps, "nullConstant", + ConstantDescs.CD_Object); + + /** {@link MethodHandleDesc} representing {@link ConstantBootstraps#fieldVarHandle(Lookup, String, Class, Class, Class) ConstantBootstraps.fieldVarHandle} */ + public static final DirectMethodHandleDesc BSM_VARHANDLE_FIELD + = ofConstantBootstrap(CD_ConstantBootstraps, "fieldVarHandle", + CD_VarHandle, CD_Class, CD_Class); + + /** {@link MethodHandleDesc} representing {@link ConstantBootstraps#staticFieldVarHandle(Lookup, String, Class, Class, Class) ConstantBootstraps.staticVarHandle} */ + public static final DirectMethodHandleDesc BSM_VARHANDLE_STATIC_FIELD + = ofConstantBootstrap(CD_ConstantBootstraps, "staticFieldVarHandle", + CD_VarHandle, CD_Class, CD_Class); + + /** {@link MethodHandleDesc} representing {@link ConstantBootstraps#arrayVarHandle(Lookup, String, Class, Class) ConstantBootstraps.arrayVarHandle} */ + public static final DirectMethodHandleDesc BSM_VARHANDLE_ARRAY + = ofConstantBootstrap(CD_ConstantBootstraps, "arrayVarHandle", + CD_VarHandle, CD_Class); + + /** {@link MethodHandleDesc} representing {@link ConstantBootstraps#invoke(Lookup, String, Class, MethodHandle, Object...) ConstantBootstraps.invoke} */ + public static final DirectMethodHandleDesc BSM_INVOKE + = ofConstantBootstrap(CD_ConstantBootstraps, "invoke", + CD_Object, CD_MethodHandle, CD_Object.arrayType()); + + /** {@link ClassDesc} representing the primitive type {@code int} */ + public static final ClassDesc CD_int = ClassDesc.ofDescriptor("I"); + + /** {@link ClassDesc} representing the primitive type {@code long} */ + public static final ClassDesc CD_long = ClassDesc.ofDescriptor("J"); + + /** {@link ClassDesc} representing the primitive type {@code float} */ + public static final ClassDesc CD_float = ClassDesc.ofDescriptor("F"); + + /** {@link ClassDesc} representing the primitive type {@code double} */ + public static final ClassDesc CD_double = ClassDesc.ofDescriptor("D"); + + /** {@link ClassDesc} representing the primitive type {@code short} */ + public static final ClassDesc CD_short = ClassDesc.ofDescriptor("S"); + + /** {@link ClassDesc} representing the primitive type {@code byte} */ + public static final ClassDesc CD_byte = ClassDesc.ofDescriptor("B"); + + /** {@link ClassDesc} representing the primitive type {@code char} */ + public static final ClassDesc CD_char = ClassDesc.ofDescriptor("C"); + + /** {@link ClassDesc} representing the primitive type {@code boolean} */ + public static final ClassDesc CD_boolean = ClassDesc.ofDescriptor("Z"); + + /** {@link ClassDesc} representing the primitive type {@code void} */ + public static final ClassDesc CD_void = ClassDesc.ofDescriptor("V"); + + /** Nominal descriptor representing the constant {@code null} */ + public static final ConstantDesc NULL + = DynamicConstantDesc.ofNamed(ConstantDescs.BSM_NULL_CONSTANT, + DEFAULT_NAME, ConstantDescs.CD_Object); + + static final DirectMethodHandleDesc MHD_METHODHANDLE_ASTYPE + = MethodHandleDesc.ofMethod(Kind.VIRTUAL, CD_MethodHandle, "asType", + MethodTypeDesc.of(CD_MethodHandle, CD_MethodType)); + /** + * Returns a {@link MethodHandleDesc} corresponding to a bootstrap method for + * an {@code invokedynamic} callsite, which is a static method whose leading + * parameter types are {@code Lookup}, {@code String}, and {@code MethodType}. + * + * @param owner the class declaring the method + * @param name the unqualified name of the method + * @param returnType the return type of the method + * @param paramTypes the types of the static bootstrap arguments, if any + * @return the {@link MethodHandleDesc} + * @throws NullPointerException if any of the arguments are null + * @jvms 4.2.2 Unqualified Names + */ + public static DirectMethodHandleDesc ofCallsiteBootstrap(ClassDesc owner, + String name, + ClassDesc returnType, + ClassDesc... paramTypes) { + return MethodHandleDesc.ofMethod(STATIC, owner, name, MethodTypeDesc.of(returnType, paramTypes) + .insertParameterTypes(0, INDY_BOOTSTRAP_ARGS)); + } + + /** + * Returns a {@link MethodHandleDesc} corresponding to a bootstrap method for a + * dynamic constant, which is a static method whose leading arguments are + * {@code Lookup}, {@code String}, and {@code Class}. + * + * @param owner the class declaring the method + * @param name the unqualified name of the method + * @param returnType the return type of the method + * @param paramTypes the types of the static bootstrap arguments, if any + * @return the {@link MethodHandleDesc} + * @throws NullPointerException if any of the arguments are null + * @jvms 4.2.2 Unqualified Names + */ + public static DirectMethodHandleDesc ofConstantBootstrap(ClassDesc owner, + String name, + ClassDesc returnType, + ClassDesc... paramTypes) { + return MethodHandleDesc.ofMethod(STATIC, owner, name, MethodTypeDesc.of(returnType, paramTypes) + .insertParameterTypes(0, CONDY_BOOTSTRAP_ARGS)); + } +} diff --git a/src/java.base/share/classes/java/lang/constant/ConstantUtils.java b/src/java.base/share/classes/java/lang/constant/ConstantUtils.java new file mode 100644 index 00000000000..a758a948c0d --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/ConstantUtils.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import static java.util.Objects.requireNonNull; + +/** + * Helper methods for the implementation of {@code java.lang.constant}. + */ +class ConstantUtils { + /** an empty constant descriptor */ + public static final ConstantDesc[] EMPTY_CONSTANTDESC = new ConstantDesc[0]; + static final Constable[] EMPTY_CONSTABLE = new Constable[0]; + + private static final Set pointyNames = Set.of("", ""); + + /** + * Validates the correctness of a binary class name. In particular checks for the presence of + * invalid characters in the name. + * + * @param name the class name + * @return the class name passed if valid + * @throws IllegalArgumentException if the class name is invalid + */ + static String validateBinaryClassName(String name) { + for (int i=0; i') { + if (!pointyNames.contains(name)) + throw new IllegalArgumentException("Invalid member name: " + name); + } + } + return name; + } + + static void validateClassOrInterface(ClassDesc classDesc) { + if (!classDesc.isClassOrInterface()) + throw new IllegalArgumentException("not a class or interface type: " + classDesc); + } + + static int arrayDepth(String descriptorString) { + int depth = 0; + while (descriptorString.charAt(depth) == '[') + depth++; + return depth; + } + + static String binaryToInternal(String name) { + return name.replace('.', '/'); + } + + static String internalToBinary(String name) { + return name.replace('/', '.'); + } + + static String dropLastChar(String s) { + return s.substring(0, s.length() - 1); + } + + static String dropFirstAndLastChar(String s) { + return s.substring(1, s.length() - 1); + } + + /** + * Parses a method descriptor string, and return a list of field descriptor + * strings, return type first, then parameter types + * + * @param descriptor the descriptor string + * @return the list of types + * @throws IllegalArgumentException if the descriptor string is not valid + */ + static List parseMethodDescriptor(String descriptor) { + int cur = 0, end = descriptor.length(); + ArrayList ptypes = new ArrayList<>(); + + if (cur >= end || descriptor.charAt(cur) != '(') + throw new IllegalArgumentException("Bad method descriptor: " + descriptor); + + ++cur; // skip '(' + while (cur < end && descriptor.charAt(cur) != ')') { + int len = matchSig(descriptor, cur, end); + if (len == 0 || descriptor.charAt(cur) == 'V') + throw new IllegalArgumentException("Bad method descriptor: " + descriptor); + ptypes.add(descriptor.substring(cur, cur + len)); + cur += len; + } + if (cur >= end) + throw new IllegalArgumentException("Bad method descriptor: " + descriptor); + ++cur; // skip ')' + + int rLen = matchSig(descriptor, cur, end); + if (rLen == 0 || cur + rLen != end) + throw new IllegalArgumentException("Bad method descriptor: " + descriptor); + ptypes.add(0, descriptor.substring(cur, cur + rLen)); + return ptypes; + } + + /** + * Validates that the characters at [start, end) within the provided string + * describe a valid field type descriptor. + * + * @param str the descriptor string + * @param start the starting index into the string + * @param end the ending index within the string + * @return the length of the descriptor, or 0 if it is not a descriptor + * @throws IllegalArgumentException if the descriptor string is not valid + */ + static int matchSig(String str, int start, int end) { + if (start >= end || start >= str.length() || end > str.length()) + return 0; + char c = str.charAt(start); + if (c == 'L') { + int endc = str.indexOf(';', start); + int badc = str.indexOf('.', start); + if (badc >= 0 && badc < endc) + return 0; + badc = str.indexOf('[', start); + if (badc >= 0 && badc < endc) + return 0; + return (endc < 0) ? 0 : endc - start + 1; + } else if (c == '[') { + int t = matchSig(str, start+1, end); + return (t > 0) ? t + 1 : 0; + } else { + return ("IJCSBFDZV".indexOf(c) >= 0) ? 1 : 0; + } + } +} diff --git a/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDesc.java b/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDesc.java new file mode 100644 index 00000000000..6b9e8482442 --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDesc.java @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandleInfo; +import java.util.OptionalInt; +import java.util.stream.Stream; + +import jdk.internal.vm.annotation.Stable; + +import static java.lang.invoke.MethodHandleInfo.REF_getField; +import static java.lang.invoke.MethodHandleInfo.REF_getStatic; +import static java.lang.invoke.MethodHandleInfo.REF_invokeInterface; +import static java.lang.invoke.MethodHandleInfo.REF_invokeSpecial; +import static java.lang.invoke.MethodHandleInfo.REF_invokeStatic; +import static java.lang.invoke.MethodHandleInfo.REF_invokeVirtual; +import static java.lang.invoke.MethodHandleInfo.REF_newInvokeSpecial; +import static java.lang.invoke.MethodHandleInfo.REF_putField; +import static java.lang.invoke.MethodHandleInfo.REF_putStatic; + +/** + * A nominal descriptor for a direct + * {@link MethodHandle}. A {@linkplain DirectMethodHandleDesc} corresponds to + * a {@code Constant_MethodHandle_info} entry in the constant pool of a classfile. + * + * @apiNote In the future, if the Java language permits, {@linkplain DirectMethodHandleDesc} + * may become a {@code sealed} interface, which would prohibit subclassing except + * by explicitly permitted types. Non-platform classes should not implement + * {@linkplain DirectMethodHandleDesc} directly. + * + * @since 12 + */ +public interface DirectMethodHandleDesc extends MethodHandleDesc { + /** + * Kinds of method handles that can be described with {@linkplain DirectMethodHandleDesc}. + * + * @since 12 + */ + enum Kind { + /** A method handle for a method invoked as with {@code invokestatic} */ + STATIC(REF_invokeStatic), + /** A method handle for a method invoked as with {@code invokestatic} */ + INTERFACE_STATIC(REF_invokeStatic, true), + /** A method handle for a method invoked as with {@code invokevirtual} */ + VIRTUAL(REF_invokeVirtual), + /** A method handle for a method invoked as with {@code invokeinterface} */ + INTERFACE_VIRTUAL(REF_invokeInterface, true), + /** A method handle for a method invoked as with {@code invokespecial} */ + SPECIAL(REF_invokeSpecial), + /** A method handle for an interface method invoked as with {@code invokespecial} */ + INTERFACE_SPECIAL(REF_invokeSpecial, true), + /** A method handle for a constructor */ + CONSTRUCTOR(REF_newInvokeSpecial), + /** A method handle for a read accessor for an instance field */ + GETTER(REF_getField), + /** A method handle for a write accessor for an instance field */ + SETTER(REF_putField), + /** A method handle for a read accessor for a static field */ + STATIC_GETTER(REF_getStatic), + /** A method handle for a write accessor for a static field */ + STATIC_SETTER(REF_putStatic); + + /** The corresponding {@code refKind} value for this kind of method handle, + * as defined by {@link MethodHandleInfo} + */ + public final int refKind; + + /** Is this an interface + */ + public final boolean isInterface; + Kind(int refKind) { + this(refKind, false); + } + + Kind(int refKind, boolean isInterface) { this.refKind = refKind; this.isInterface = isInterface; } + + /** + * Returns the enumeration member with the given {@code refKind} field. + * Behaves as if {@code valueOf(refKind, false)}. As a special case, + * if {@code refKind} is {@code REF_invokeInterface} (9) then the + * {@code isInterface} field will be true. + * + * @param refKind refKind of desired member + * @return the matching enumeration member + * @throws IllegalArgumentException if there is no such member + */ + public static Kind valueOf(int refKind) { + return valueOf(refKind, false); + } + + /** + * Returns the enumeration member with the given the {@code refKind} and + * {@code isInterface} arguments. + * For most values of {@code refKind} there is an exact match regardless of the value of {@code isInterface}. + * These are: + *

      + *
    • {@code REF_invokeVirtual} which matches to {@code VIRTUAL} + *
    • {@code REF_invokeInterface} which matches to {@code INTERFACE_VIRTUAL} + *
    • {@code REF_newInvokeSpecial} which matches to {@code CONSTRUCTOR} + *
    • {@code REF_getField} which matches to {@code GETTER} + *
    • {@code REF_putField} which matches to {@code SETTER} + *
    • {@code REF_getStatic} which matches to {@code STATIC_GETTER} + *
    • {@code REF_putStatic} which matches to {@code STATIC_SETTER} + *
    + * As for the rest, the returned kind will depend on the value (false or true accordingly) of {@code isInterface}: + *
      + *
    • {@code REF_invokeStatic} which matches to {@code STATIC} or {@code INTERFACE_STATIC} + *
    • {@code REF_invokeSpecial} which matches to {@code SPECIAL} or {@code INTERFACE_SPECIAL} + *
    + * @param refKind refKind of desired member + * @param isInterface whether desired member is for interface methods + * @return the matching enumeration member + * @throws IllegalArgumentException if there is no such member + */ + public static Kind valueOf(int refKind, boolean isInterface) { + int i = tableIndex(refKind, isInterface); + if (i >= 0 && i < TABLE.length) { + Kind kind = TABLE[i]; + if (kind == null) { + throw new IllegalArgumentException(String.format("refKind=%d", refKind)); + } + if (kind.refKind == refKind && kind.isInterface == isInterface) { + return kind; + } + } + throw new IllegalArgumentException(String.format("refKind=%d", refKind)); + } + + private static int tableIndex(int refKind, boolean isInterface) { + if (refKind < 0) return refKind; + return (refKind * 2) + (isInterface ? 1 : 0); + } + + private static final @Stable Kind[] TABLE; + + static { + // Pack the static table. + int max = 0; + for (Kind k : values()) + max = Math.max(max, tableIndex(k.refKind, true)); + + TABLE = new Kind[max+1]; + for (Kind kind : values()) { + int i = tableIndex(kind.refKind, kind.isInterface); + if (i >= TABLE.length || TABLE[i] != null) + throw new AssertionError("TABLE entry for " + kind); + TABLE[i] = kind; + } + + // Pack in some aliases also. + int ii = tableIndex(REF_invokeInterface, false); + if (TABLE[ii] != null) + throw new AssertionError("TABLE entry for (invokeInterface, false) used by " + TABLE[ii]); + TABLE[ii] = INTERFACE_VIRTUAL; + + for (Kind kind : values()) { + if (!kind.isInterface) { + // Add extra cache entry to alias the isInterface case. + // For example, (REF_getStatic, X) will produce STATIC_GETTER + // for either truth value of X. + int i = tableIndex(kind.refKind, true); + if (TABLE[i] == null) { + // There is not a specific Kind for interfaces + if (kind == VIRTUAL) kind = INTERFACE_VIRTUAL; + if (TABLE[i] == null) TABLE[i] = kind; + } + } + } + } + + /** + * Does this {@code Kind} correspond to a virtual method invocation? + * + * @return if this {@code Kind} corresponds to a virtual method invocation + */ + boolean isVirtualMethod() { + switch (this) { + case VIRTUAL: + case SPECIAL: + case INTERFACE_VIRTUAL: + case INTERFACE_SPECIAL: + return true; + default: + return false; + } + } + } + + /** + * Returns the {@code kind} of the method handle described by this nominal + * descriptor. + * + * @return the {@link Kind} + */ + Kind kind(); + + /** + * Returns the {@code refKind} of the method handle described by this nominal + * reference, as defined by {@link MethodHandleInfo}. + * + * @return the reference kind + */ + int refKind(); + + /** + * Indicates if the method is declared by an interface + * + * @return true if the method is declared by an interface + */ + boolean isOwnerInterface(); + + /** + * Returns a {@link ClassDesc} describing the class declaring the + * method or field described by this nominal descriptor. + * + * @return the class declaring the method or field + */ + ClassDesc owner(); + + /** + * Returns the name of the method or field described by this nominal descriptor. + * For constructors, returns the reserved name {@code ""}. + * + * @return the name of the method or field + */ + String methodName(); + + /** + * Returns the lookup descriptor of the method handle described by this descriptor, + * after adjusting for the invocation mode. This will correspond to either + * a method type descriptor string (for methods and constructors), or a field + * descriptor string (for field access method handles). The lookup descriptor + * string is in the same format as accepted by {@link MethodHandleDesc#of(Kind, ClassDesc, String, String)}. + * + * @return the lookup descriptor string + */ + String lookupDescriptor(); +} diff --git a/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDescImpl.java b/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDescImpl.java new file mode 100644 index 00000000000..7a989a56a7e --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/DirectMethodHandleDescImpl.java @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.Objects; + +import static java.lang.constant.ConstantDescs.CD_void; +import static java.lang.constant.ConstantUtils.validateClassOrInterface; +import static java.lang.constant.ConstantUtils.validateMemberName; +import static java.lang.constant.DirectMethodHandleDesc.Kind.CONSTRUCTOR; +import static java.util.Objects.requireNonNull; + +/** + * A nominal descriptor for a direct + * {@link MethodHandle}. A {@linkplain DirectMethodHandleDescImpl} corresponds to + * a {@code Constant_MethodHandle_info} entry in the constant pool of a classfile. + */ +final class DirectMethodHandleDescImpl implements DirectMethodHandleDesc { + + private final Kind kind; + private final ClassDesc owner; + private final String name; + private final MethodTypeDesc invocationType; + + /** + * Constructs a {@linkplain DirectMethodHandleDescImpl} for a method or field + * from a kind, owner, name, and type + * + * @param kind the kind of the method handle + * @param owner the declaring class or interface for the method + * @param name the unqualified name of the method (ignored if {@code kind} is {@code CONSTRUCTOR}) + * @param type the lookup type of the method + * @throws NullPointerException if any non-ignored argument is null + * @throws IllegalArgumentException if {@code kind} describes a field accessor, + * and {@code type} is not consistent with that kind of field accessor, or if + * {@code kind} describes a constructor, and the return type of {@code type} + * is not {@code void} + * @jvms 4.2.2 Unqualified Names + */ + DirectMethodHandleDescImpl(Kind kind, ClassDesc owner, String name, MethodTypeDesc type) { + if (kind == CONSTRUCTOR) + name = ""; + + requireNonNull(kind); + validateClassOrInterface(requireNonNull(owner)); + validateMemberName(requireNonNull(name)); + requireNonNull(type); + + switch (kind) { + case CONSTRUCTOR: validateConstructor(type); break; + case GETTER: validateFieldType(type, false, true); break; + case SETTER: validateFieldType(type, true, true); break; + case STATIC_GETTER: validateFieldType(type, false, false); break; + case STATIC_SETTER: validateFieldType(type, true, false); break; + } + + this.kind = kind; + this.owner = owner; + this.name = name; + if (kind.isVirtualMethod()) + this.invocationType = type.insertParameterTypes(0, owner); + else if (kind == CONSTRUCTOR) + this.invocationType = type.changeReturnType(owner); + else + this.invocationType = type; + } + + private static void validateFieldType(MethodTypeDesc type, boolean isSetter, boolean isVirtual) { + boolean isVoid = type.returnType().descriptorString().equals("V"); + int expectedParams = (isSetter ? 1 : 0) + (isVirtual ? 1 : 0); + if (isVoid != isSetter + || type.parameterCount() != expectedParams + || (isVirtual && type.parameterType(0).isPrimitive())) { + String expectedType = String.format("(%s%s)%s", (isVirtual ? "R" : ""), + (isSetter ? "T" : ""), (isSetter ? "V" : "T")); + throw new IllegalArgumentException(String.format("Expected type of %s for getter, found %s", expectedType, type)); + } + } + + private static void validateConstructor(MethodTypeDesc type) { + if (!type.returnType().descriptorString().equals("V")) { + throw new IllegalArgumentException(String.format("Expected type of (T*)V for constructor, found %s", type)); + } + } + + @Override + public Kind kind() { return kind; } + + @Override + public int refKind() { return kind.refKind; } + + @Override + public boolean isOwnerInterface() { return kind.isInterface; } + + @Override + public ClassDesc owner() { + return owner; + } + + @Override + public String methodName() { + return name; + } + + @Override + public MethodTypeDesc invocationType() { + return invocationType; + } + + @Override + public String lookupDescriptor() { + switch (kind) { + case VIRTUAL: + case SPECIAL: + case INTERFACE_VIRTUAL: + case INTERFACE_SPECIAL: + return invocationType.dropParameterTypes(0, 1).descriptorString(); + case STATIC: + case INTERFACE_STATIC: + return invocationType.descriptorString(); + case CONSTRUCTOR: + return invocationType.changeReturnType(CD_void).descriptorString(); + case GETTER: + case STATIC_GETTER: + return invocationType.returnType().descriptorString(); + case SETTER: + return invocationType.parameterType(1).descriptorString(); + case STATIC_SETTER: + return invocationType.parameterType(0).descriptorString(); + default: + throw new IllegalStateException(kind.toString()); + } + } + + public MethodHandle resolveConstantDesc(MethodHandles.Lookup lookup) + throws ReflectiveOperationException { + Class resolvedOwner = (Class) owner.resolveConstantDesc(lookup); + MethodType invocationType = (MethodType) this.invocationType().resolveConstantDesc(lookup); + switch (kind) { + case STATIC: + case INTERFACE_STATIC: + return lookup.findStatic(resolvedOwner, name, invocationType); + case INTERFACE_VIRTUAL: + case VIRTUAL: + return lookup.findVirtual(resolvedOwner, name, invocationType.dropParameterTypes(0, 1)); + case SPECIAL: + case INTERFACE_SPECIAL: + return lookup.findSpecial(resolvedOwner, name, invocationType.dropParameterTypes(0, 1), + lookup.lookupClass()); + case CONSTRUCTOR: + return lookup.findConstructor(resolvedOwner, invocationType.changeReturnType(void.class)); + case GETTER: + return lookup.findGetter(resolvedOwner, name, invocationType.returnType()); + case STATIC_GETTER: + return lookup.findStaticGetter(resolvedOwner, name, invocationType.returnType()); + case SETTER: + return lookup.findSetter(resolvedOwner, name, invocationType.parameterType(1)); + case STATIC_SETTER: + return lookup.findStaticSetter(resolvedOwner, name, invocationType.parameterType(0)); + default: + throw new IllegalStateException(kind.name()); + } + } + + /** + * Returns {@code true} if this {@linkplain DirectMethodHandleDescImpl} is + * equal to another {@linkplain DirectMethodHandleDescImpl}. Equality is + * determined by the two descriptors having equal kind, owner, name, and type + * descriptor. + * @param o a {@code DirectMethodHandleDescImpl} to compare to this + * {@code DirectMethodHandleDescImpl} + * @return {@code true} if the specified {@code DirectMethodHandleDescImpl} is + * equals to this {@code DirectMethodHandleDescImpl}. + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DirectMethodHandleDescImpl desc = (DirectMethodHandleDescImpl) o; + return kind == desc.kind && + Objects.equals(owner, desc.owner) && + Objects.equals(name, desc.name) && + Objects.equals(invocationType, desc.invocationType); + } + + @Override + public int hashCode() { + return Objects.hash(kind, owner, name, invocationType); + } + + @Override + public String toString() { + return String.format("MethodHandleDesc[%s/%s::%s%s]", kind, owner.displayName(), name, invocationType.displayDescriptor()); + } +} diff --git a/src/java.base/share/classes/java/lang/constant/DynamicCallSiteDesc.java b/src/java.base/share/classes/java/lang/constant/DynamicCallSiteDesc.java new file mode 100644 index 00000000000..e8548dad60c --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/DynamicCallSiteDesc.java @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.invoke.CallSite; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.util.Arrays; +import java.util.Objects; +import java.util.stream.Stream; + +import static java.lang.constant.ConstantDescs.CD_String; +import static java.lang.constant.ConstantUtils.EMPTY_CONSTANTDESC; +import static java.lang.constant.ConstantUtils.validateMemberName; +import static java.util.Objects.requireNonNull; +import static java.util.stream.Collectors.joining; + +/** + * A nominal descriptor for an + * {@code invokedynamic} call site. + * + *

    Concrete subtypes of {@linkplain DynamicCallSiteDesc} must be + * value-based. + * + * @since 12 + */ +public class DynamicCallSiteDesc { + + private final DirectMethodHandleDesc bootstrapMethod; + private final ConstantDesc[] bootstrapArgs; + private final String invocationName; + private final MethodTypeDesc invocationType; + + /** + * Creates a nominal descriptor for an {@code invokedynamic} call site. + * + * @param bootstrapMethod a {@link DirectMethodHandleDesc} describing the + * bootstrap method for the {@code invokedynamic} + * @param invocationName The unqualified name that would appear in the {@code NameAndType} + * operand of the {@code invokedynamic} + * @param invocationType a {@link MethodTypeDesc} describing the invocation + * type that would appear in the {@code NameAndType} + * operand of the {@code invokedynamic} + * @param bootstrapArgs {@link ConstantDesc}s describing the static arguments + * to the bootstrap, that would appear in the + * {@code BootstrapMethods} attribute + * @throws NullPointerException if any parameter is null + * @throws IllegalArgumentException if the invocation name has the incorrect + * format + * @jvms 4.2.2 Unqualified Names + */ + private DynamicCallSiteDesc(DirectMethodHandleDesc bootstrapMethod, + String invocationName, + MethodTypeDesc invocationType, + ConstantDesc[] bootstrapArgs) { + this.invocationName = validateMemberName(requireNonNull(invocationName)); + this.invocationType = requireNonNull(invocationType); + this.bootstrapMethod = requireNonNull(bootstrapMethod); + this.bootstrapArgs = requireNonNull(bootstrapArgs.clone()); + if (invocationName.length() == 0) + throw new IllegalArgumentException("Illegal invocation name: " + invocationName); + } + + /** + * Creates a nominal descriptor for an {@code invokedynamic} call site. + * + * @param bootstrapMethod a {@link DirectMethodHandleDesc} describing the + * bootstrap method for the {@code invokedynamic} + * @param invocationName The unqualified name that would appear in the {@code NameAndType} + * operand of the {@code invokedynamic} + * @param invocationType a {@link MethodTypeDesc} describing the invocation + * type that would appear in the {@code NameAndType} + * operand of the {@code invokedynamic} + * @param bootstrapArgs {@link ConstantDesc}s describing the static arguments + * to the bootstrap, that would appear in the + * {@code BootstrapMethods} attribute + * @return the nominal descriptor + * @throws NullPointerException if any parameter is null + * @throws IllegalArgumentException if the invocation name has the incorrect + * format + * @jvms 4.2.2 Unqualified Names + */ + public static DynamicCallSiteDesc of(DirectMethodHandleDesc bootstrapMethod, + String invocationName, + MethodTypeDesc invocationType, + ConstantDesc... bootstrapArgs) { + return new DynamicCallSiteDesc(bootstrapMethod, invocationName, invocationType, bootstrapArgs); + } + + /** + * Creates a nominal descriptor for an {@code invokedynamic} call site whose + * bootstrap method has no static arguments. + * + * @param bootstrapMethod The bootstrap method for the {@code invokedynamic} + * @param invocationName The invocationName that would appear in the + * {@code NameAndType} operand of the {@code invokedynamic} + * @param invocationType The invocation invocationType that would appear + * in the {@code NameAndType} operand of the {@code invokedynamic} + * @return the nominal descriptor + * @throws NullPointerException if any parameter is null + * @throws IllegalArgumentException if the invocation name has the incorrect + * format + */ + public static DynamicCallSiteDesc of(DirectMethodHandleDesc bootstrapMethod, + String invocationName, + MethodTypeDesc invocationType) { + return new DynamicCallSiteDesc(bootstrapMethod, invocationName, invocationType, EMPTY_CONSTANTDESC); + } + + /** + * Creates a nominal descriptor for an {@code invokedynamic} call site whose + * bootstrap method has no static arguments and for which the name parameter + * is {@link ConstantDescs#DEFAULT_NAME}. + * + * @param bootstrapMethod a {@link DirectMethodHandleDesc} describing the + * bootstrap method for the {@code invokedynamic} + * @param invocationType a {@link MethodTypeDesc} describing the invocation + * type that would appear in the {@code NameAndType} + * operand of the {@code invokedynamic} + * @return the nominal descriptor + * @throws NullPointerException if any parameter is null + */ + public static DynamicCallSiteDesc of(DirectMethodHandleDesc bootstrapMethod, + MethodTypeDesc invocationType) { + return of(bootstrapMethod, ConstantDescs.DEFAULT_NAME, invocationType); + } + + /** + * Returns a nominal descriptor for an {@code invokedynamic} call site whose + * bootstrap method, name, and invocation type are the same as this one, but + * with the specified bootstrap arguments. + * + * @param bootstrapArgs {@link ConstantDesc}s describing the static arguments + * to the bootstrap, that would appear in the + * {@code BootstrapMethods} attribute + * @return the nominal descriptor + * @throws NullPointerException if any parameter is null + */ + public DynamicCallSiteDesc withArgs(ConstantDesc... bootstrapArgs) { + return new DynamicCallSiteDesc(bootstrapMethod, invocationName, invocationType, bootstrapArgs); + } + + /** + * Returns a nominal descriptor for an {@code invokedynamic} call site whose + * bootstrap and bootstrap arguments are the same as this one, but with the + * specified invocationName and invocation invocationType + * + * @param invocationName The unqualified name that would appear in the {@code NameAndType} + * operand of the {@code invokedynamic} + * @param invocationType a {@link MethodTypeDesc} describing the invocation + * type that would appear in the {@code NameAndType} + * operand of the {@code invokedynamic} + * @return the nominal descriptor + * @throws NullPointerException if any parameter is null + * @throws IllegalArgumentException if the invocation name has the incorrect + * format + * @jvms 4.2.2 Unqualified Names + */ + public DynamicCallSiteDesc withNameAndType(String invocationName, + MethodTypeDesc invocationType) { + return new DynamicCallSiteDesc(bootstrapMethod, invocationName, invocationType, bootstrapArgs); + } + + /** + * Returns the invocation name that would appear in the {@code NameAndType} + * operand of the {@code invokedynamic}. + * + * @return the invocation name + */ + public String invocationName() { + return invocationName; + } + + /** + * Returns a {@link MethodTypeDesc} describing the invocation type that + * would appear in the {@code NameAndType} operand of the {@code invokedynamic}. + * + * @return the invocation type + */ + public MethodTypeDesc invocationType() { + return invocationType; + } + + /** + * Returns a {@link MethodHandleDesc} describing the bootstrap method for + * the {@code invokedynamic}. + * + * @return the bootstrap method for the {@code invokedynamic} + */ + public MethodHandleDesc bootstrapMethod() { return bootstrapMethod; } + + /** + * Returns {@link ConstantDesc}s describing the bootstrap arguments for the + * {@code invokedynamic}. The returned array is always non-null. A zero + * length array is returned if this {@linkplain DynamicCallSiteDesc} has no + * bootstrap arguments. + * + * @return the bootstrap arguments for the {@code invokedynamic} + */ + public ConstantDesc[] bootstrapArgs() { return bootstrapArgs.clone(); } + + /** + * Reflectively invokes the bootstrap method with the specified arguments, + * and return the resulting {@link CallSite} + * + * @param lookup The {@link MethodHandles.Lookup} used to resolve class names + * @return the {@link CallSite} + * @throws Throwable if any exception is thrown by the bootstrap method + */ + public CallSite resolveCallSiteDesc(MethodHandles.Lookup lookup) throws Throwable { + assert bootstrapMethod.invocationType().parameterType(1).equals(CD_String); + MethodHandle bsm = (MethodHandle) bootstrapMethod.resolveConstantDesc(lookup); + Object[] args = new Object[bootstrapArgs.length + 3]; + args[0] = lookup; + args[1] = invocationName; + args[2] = invocationType.resolveConstantDesc(lookup); + System.arraycopy(bootstrapArgs, 0, args, 3, bootstrapArgs.length); + return (CallSite) bsm.invokeWithArguments(args); + } + + /** + * Compares the specified object with this descriptor for equality. Returns + * {@code true} if and only if the specified object is also a + * {@linkplain DynamicCallSiteDesc}, and both descriptors have equal + * bootstrap methods, bootstrap argument lists, invocation name, and + * invocation type. + * + * @param o the {@code DynamicCallSiteDesc} to compare to this + * {@code DynamicCallSiteDesc} + * @return {@code true} if the specified {@code DynamicCallSiteDesc} is + * equals to this {@code DynamicCallSiteDesc}. + */ + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DynamicCallSiteDesc specifier = (DynamicCallSiteDesc) o; + return Objects.equals(bootstrapMethod, specifier.bootstrapMethod) && + Arrays.equals(bootstrapArgs, specifier.bootstrapArgs) && + Objects.equals(invocationName, specifier.invocationName) && + Objects.equals(invocationType, specifier.invocationType); + } + + @Override + public final int hashCode() { + int result = Objects.hash(bootstrapMethod, invocationName, invocationType); + result = 31 * result + Arrays.hashCode(bootstrapArgs); + return result; + } + + /** + * Returns a compact textual description of this call site description, + * including the bootstrap method, the invocation name and type, and + * the static bootstrap arguments. + * + * @return A compact textual description of this call site descriptor + */ + @Override + public String toString() { + return String.format("DynamicCallSiteDesc[%s::%s(%s%s):%s]", + bootstrapMethod.owner().displayName(), + bootstrapMethod.methodName(), + invocationName.equals(ConstantDescs.DEFAULT_NAME) ? "" : invocationName + "/", + Stream.of(bootstrapArgs).map(Object::toString).collect(joining(",")), + invocationType.displayDescriptor()); + } +} diff --git a/src/java.base/share/classes/java/lang/constant/DynamicConstantDesc.java b/src/java.base/share/classes/java/lang/constant/DynamicConstantDesc.java new file mode 100644 index 00000000000..d9ed29c0258 --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/DynamicConstantDesc.java @@ -0,0 +1,397 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.Enum.EnumDesc; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.lang.invoke.VarHandle.VarHandleDesc; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Stream; + +import static java.lang.constant.ConstantDescs.CD_Class; +import static java.lang.constant.ConstantDescs.CD_VarHandle; +import static java.lang.constant.ConstantDescs.DEFAULT_NAME; +import static java.lang.constant.ConstantUtils.EMPTY_CONSTANTDESC; +import static java.lang.constant.ConstantUtils.validateMemberName; +import static java.util.Objects.requireNonNull; +import static java.util.stream.Collectors.joining; + +/** + * A nominal descriptor for a + * dynamic constant (one described in the constant pool with + * {@code Constant_Dynamic_info}.) + * + *

    Concrete subtypes of {@linkplain DynamicConstantDesc} must be + * value-based. + * + * @param the type of the dynamic constant + * + * @since 12 + */ +public abstract class DynamicConstantDesc + implements ConstantDesc { + + private final DirectMethodHandleDesc bootstrapMethod; + private final ConstantDesc[] bootstrapArgs; + private final String constantName; + private final ClassDesc constantType; + + private static final Map, ConstantDesc>> canonicalMap + = Map.ofEntries(Map.entry(ConstantDescs.BSM_PRIMITIVE_CLASS, DynamicConstantDesc::canonicalizePrimitiveClass), + Map.entry(ConstantDescs.BSM_ENUM_CONSTANT, DynamicConstantDesc::canonicalizeEnum), + Map.entry(ConstantDescs.BSM_NULL_CONSTANT, DynamicConstantDesc::canonicalizeNull), + Map.entry(ConstantDescs.BSM_VARHANDLE_STATIC_FIELD, DynamicConstantDesc::canonicalizeStaticFieldVarHandle), + Map.entry(ConstantDescs.BSM_VARHANDLE_FIELD, DynamicConstantDesc::canonicalizeFieldVarHandle), + Map.entry(ConstantDescs.BSM_VARHANDLE_ARRAY, DynamicConstantDesc::canonicalizeArrayVarHandle) + ); + + /** + * Creates a nominal descriptor for a dynamic constant. + * + * @param bootstrapMethod a {@link DirectMethodHandleDesc} describing the + * bootstrap method for the constant + * @param constantName The unqualified name that would appear in the {@code NameAndType} + * operand of the {@code LDC} for this constant + * @param constantType a {@link ClassDesc} describing the type + * that would appear in the {@code NameAndType} operand + * of the {@code LDC} for this constant + * @param bootstrapArgs {@link ConstantDesc}s describing the static arguments + * to the bootstrap, that would appear in the + * {@code BootstrapMethods} attribute + * @throws NullPointerException if any argument is null + * @throws IllegalArgumentException if the {@code name} has the incorrect + * format + * @jvms 4.2.2 Unqualified Names + */ + protected DynamicConstantDesc(DirectMethodHandleDesc bootstrapMethod, + String constantName, + ClassDesc constantType, + ConstantDesc... bootstrapArgs) { + this.bootstrapMethod = requireNonNull(bootstrapMethod); + this.constantName = validateMemberName(requireNonNull(constantName)); + this.constantType = requireNonNull(constantType); + this.bootstrapArgs = requireNonNull(bootstrapArgs).clone(); + + if (constantName.length() == 0) + throw new IllegalArgumentException("Illegal invocation name: " + constantName); + } + + /** + * Returns a nominal descriptor for a dynamic constant, transforming it into + * a more specific type if the constant bootstrap is a well-known one and a + * more specific nominal descriptor type (e.g., ClassDesc) is available. + * + *

    Classes whose {@link Constable#describeConstable()} method produce + * a {@linkplain DynamicConstantDesc} with a well-known bootstrap including + * {@link Class} (for instances describing primitive types), {@link Enum}, + * and {@link VarHandle}. + * + *

    Bytecode-reading APIs that process the constant pool and wish to expose + * entries as {@link ConstantDesc} to their callers should generally use this + * method in preference to {@link #ofNamed(DirectMethodHandleDesc, String, ClassDesc, ConstantDesc...)} + * because this may result in a more specific type that can be provided to + * callers. + * + * @param the type of the dynamic constant + * @param bootstrapMethod a {@link DirectMethodHandleDesc} describing the + * bootstrap method for the constant + * @param constantName The unqualified name that would appear in the {@code NameAndType} + * operand of the {@code LDC} for this constant + * @param constantType a {@link ClassDesc} describing the type + * that would appear in the {@code NameAndType} operand + * of the {@code LDC} for this constant + * @param bootstrapArgs {@link ConstantDesc}s describing the static arguments + * to the bootstrap, that would appear in the + * {@code BootstrapMethods} attribute + * @return the nominal descriptor + * @throws NullPointerException if any argument is null + * @throws IllegalArgumentException if the {@code name} has the incorrect + * format + * @jvms 4.2.2 Unqualified Names + */ + public static ConstantDesc ofCanonical(DirectMethodHandleDesc bootstrapMethod, + String constantName, + ClassDesc constantType, + ConstantDesc[] bootstrapArgs) { + return DynamicConstantDesc.ofNamed(bootstrapMethod, constantName, constantType, bootstrapArgs) + .tryCanonicalize(); + } + + /** + * Returns a nominal descriptor for a dynamic constant. + * + * @param the type of the dynamic constant + * @param bootstrapMethod a {@link DirectMethodHandleDesc} describing the + * bootstrap method for the constant + * @param constantName The unqualified name that would appear in the {@code NameAndType} + * operand of the {@code LDC} for this constant + * @param constantType a {@link ClassDesc} describing the type + * that would appear in the {@code NameAndType} operand + * of the {@code LDC} for this constant + * @param bootstrapArgs {@link ConstantDesc}s describing the static arguments + * to the bootstrap, that would appear in the + * {@code BootstrapMethods} attribute + * @return the nominal descriptor + * @throws NullPointerException if any argument is null + * @throws IllegalArgumentException if the {@code name} has the incorrect + * format + * @jvms 4.2.2 Unqualified Names + */ + + public static DynamicConstantDesc ofNamed(DirectMethodHandleDesc bootstrapMethod, + String constantName, + ClassDesc constantType, + ConstantDesc... bootstrapArgs) { + return new AnonymousDynamicConstantDesc<>(bootstrapMethod, constantName, constantType, bootstrapArgs); + } + + /** + * Returns a nominal descriptor for a dynamic constant whose name parameter + * is {@link ConstantDescs#DEFAULT_NAME}, and whose type parameter is always + * the same as the bootstrap method return type. + * + * @param the type of the dynamic constant + * @param bootstrapMethod a {@link DirectMethodHandleDesc} describing the + * bootstrap method for the constant + * @param bootstrapArgs {@link ConstantDesc}s describing the static arguments + * to the bootstrap, that would appear in the + * {@code BootstrapMethods} attribute + * @return the nominal descriptor + * @throws NullPointerException if any argument is null + * @jvms 4.2.2 Unqualified Names + */ + public static DynamicConstantDesc of(DirectMethodHandleDesc bootstrapMethod, + ConstantDesc... bootstrapArgs) { + return ofNamed(bootstrapMethod, DEFAULT_NAME, bootstrapMethod.invocationType().returnType(), bootstrapArgs); + } + + /** + * Returns a nominal descriptor for a dynamic constant whose bootstrap has + * no static arguments, whose name parameter is {@link ConstantDescs#DEFAULT_NAME}, + * and whose type parameter is always the same as the bootstrap method return type. + * + * @param the type of the dynamic constant + * @param bootstrapMethod a {@link DirectMethodHandleDesc} describing the + * bootstrap method for the constant + * @return the nominal descriptor + * @throws NullPointerException if any argument is null + */ + public static DynamicConstantDesc of(DirectMethodHandleDesc bootstrapMethod) { + return of(bootstrapMethod, EMPTY_CONSTANTDESC); + } + + /** + * Returns the name that would appear in the {@code NameAndType} operand + * of the {@code LDC} for this constant. + * + * @return the constant name + */ + public String constantName() { + return constantName; + } + + /** + * Returns a {@link ClassDesc} describing the type that would appear in the + * {@code NameAndType} operand of the {@code LDC} for this constant. + * + * @return the constant type + */ + public ClassDesc constantType() { + return constantType; + } + + /** + * Returns a {@link MethodHandleDesc} describing the bootstrap method for + * this constant. + * + * @return the bootstrap method + */ + public DirectMethodHandleDesc bootstrapMethod() { + return bootstrapMethod; + } + + /** + * Returns the bootstrap arguments for this constant. + * + * @return the bootstrap arguments + */ + public ConstantDesc[] bootstrapArgs() { + return bootstrapArgs.clone(); + } + + /** + * Returns the bootstrap arguments for this constant as an immutable {@link List}. + * + * @return a {@link List} of the bootstrap arguments + */ + public List bootstrapArgsList() { + return List.of(bootstrapArgs); + } + + @SuppressWarnings("unchecked") + public T resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException { + try { + MethodHandle bsm = (MethodHandle) bootstrapMethod.resolveConstantDesc(lookup); + if (bsm.type().parameterCount() < 2 || + !MethodHandles.Lookup.class.isAssignableFrom(bsm.type().parameterType(0))) { + throw new BootstrapMethodError( + "Invalid bootstrap method declared for resolving a dynamic constant: " + bootstrapMethod); + } + Object[] bsmArgs = new Object[3 + bootstrapArgs.length]; + bsmArgs[0] = lookup; + bsmArgs[1] = constantName; + bsmArgs[2] = constantType.resolveConstantDesc(lookup); + for (int i = 0; i < bootstrapArgs.length; i++) + bsmArgs[3 + i] = bootstrapArgs[i].resolveConstantDesc(lookup); + + return (T) bsm.invokeWithArguments(bsmArgs); + } catch (Error e) { + throw e; + } catch (Throwable t) { + throw new BootstrapMethodError(t); + } + } + + private ConstantDesc tryCanonicalize() { + Function, ConstantDesc> f = canonicalMap.get(bootstrapMethod); + if (f != null) { + try { + return f.apply(this); + } + catch (Throwable t) { + return this; + } + } + return this; + } + + private static ConstantDesc canonicalizeNull(DynamicConstantDesc desc) { + if (desc.bootstrapArgs.length != 0) + return desc; + return ConstantDescs.NULL; + } + + private static ConstantDesc canonicalizeEnum(DynamicConstantDesc desc) { + if (desc.bootstrapArgs.length != 0 + || desc.constantName == null) + return desc; + return EnumDesc.of(desc.constantType, desc.constantName); + } + + private static ConstantDesc canonicalizePrimitiveClass(DynamicConstantDesc desc) { + if (desc.bootstrapArgs.length != 0 + || !desc.constantType().equals(CD_Class) + || desc.constantName == null) + return desc; + return ClassDesc.ofDescriptor(desc.constantName); + } + + private static ConstantDesc canonicalizeStaticFieldVarHandle(DynamicConstantDesc desc) { + if (desc.bootstrapArgs.length != 2 + || !desc.constantType().equals(CD_VarHandle)) + return desc; + return VarHandleDesc.ofStaticField((ClassDesc) desc.bootstrapArgs[0], + desc.constantName, + (ClassDesc) desc.bootstrapArgs[1]); + } + + private static ConstantDesc canonicalizeFieldVarHandle(DynamicConstantDesc desc) { + if (desc.bootstrapArgs.length != 2 + || !desc.constantType().equals(CD_VarHandle)) + return desc; + return VarHandleDesc.ofField((ClassDesc) desc.bootstrapArgs[0], + desc.constantName, + (ClassDesc) desc.bootstrapArgs[1]); + } + + private static ConstantDesc canonicalizeArrayVarHandle(DynamicConstantDesc desc) { + if (desc.bootstrapArgs.length != 1 + || !desc.constantType().equals(CD_VarHandle)) + return desc; + return VarHandleDesc.ofArray((ClassDesc) desc.bootstrapArgs[0]); + } + + // @@@ To eventually support in canonicalization: DCR with BSM=MHR_METHODHANDLEDESC_ASTYPE becomes AsTypeMHDesc + + /** + * Compares the specified object with this descriptor for equality. Returns + * {@code true} if and only if the specified object is also a + * {@linkplain DynamicConstantDesc}, and both descriptors have equal + * bootstrap methods, bootstrap argument lists, constant name, and + * constant type. + * + * @param o the {@code DynamicConstantDesc} to compare to this + * {@code DynamicConstantDesc} + * @return {@code true} if the specified {@code DynamicConstantDesc} is + * equals to this {@code DynamicConstantDesc}. + * + */ + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DynamicConstantDesc)) return false; + DynamicConstantDesc desc = (DynamicConstantDesc) o; + return Objects.equals(bootstrapMethod, desc.bootstrapMethod) && + Arrays.equals(bootstrapArgs, desc.bootstrapArgs) && + Objects.equals(constantName, desc.constantName) && + Objects.equals(constantType, desc.constantType); + } + + @Override + public final int hashCode() { + int result = Objects.hash(bootstrapMethod, constantName, constantType); + result = 31 * result + Arrays.hashCode(bootstrapArgs); + return result; + } + + /** + * Returns a compact textual description of this constant description, + * including the bootstrap method, the constant name and type, and + * the static bootstrap arguments. + * + * @return A compact textual description of this call site descriptor + */ + @Override + public String toString() { + return String.format("DynamicConstantDesc[%s::%s(%s%s)%s]", + bootstrapMethod.owner().displayName(), + bootstrapMethod.methodName(), + constantName.equals(ConstantDescs.DEFAULT_NAME) ? "" : constantName + "/", + Stream.of(bootstrapArgs).map(Object::toString).collect(joining(",")), + constantType.displayName()); + } + + private static class AnonymousDynamicConstantDesc extends DynamicConstantDesc { + AnonymousDynamicConstantDesc(DirectMethodHandleDesc bootstrapMethod, String constantName, ClassDesc constantType, ConstantDesc... bootstrapArgs) { + super(bootstrapMethod, constantName, constantType, bootstrapArgs); + } + } +} diff --git a/src/java.base/share/classes/java/lang/constant/MethodHandleDesc.java b/src/java.base/share/classes/java/lang/constant/MethodHandleDesc.java new file mode 100644 index 00000000000..f2d0eda96d3 --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/MethodHandleDesc.java @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +import static java.lang.constant.ConstantDescs.CD_void; +import static java.lang.constant.DirectMethodHandleDesc.Kind.CONSTRUCTOR; + +/** + * A nominal descriptor for a + * {@link MethodHandle} constant. + * + * @apiNote In the future, if the Java language permits, {@linkplain MethodHandleDesc} + * may become a {@code sealed} interface, which would prohibit subclassing except + * by explicitly permitted types. Non-platform classes should not implement + * {@linkplain MethodHandleDesc} directly. + * + * @since 12 + */ +public interface MethodHandleDesc + extends ConstantDesc { + + /** + * Creates a {@linkplain MethodHandleDesc} corresponding to an invocation of a + * declared method, invocation of a constructor, or access to a field. + * + *

    The lookup descriptor string has the same format as for the various + * variants of {@code CONSTANT_MethodHandle_info} and for the lookup + * methods on {@link MethodHandles.Lookup}. For a method or constructor + * invocation, it is interpreted as a method type descriptor; for field + * access, it is interpreted as a field descriptor. If {@code kind} is + * {@code CONSTRUCTOR}, the {@code name} parameter is ignored and the return + * type of the lookup descriptor must be {@code void}. If {@code kind} + * corresponds to a virtual method invocation, the lookup type includes the + * method parameters but not the receiver type. + * + * @param kind The kind of method handle to be described + * @param owner a {@link ClassDesc} describing the class containing the + * method, constructor, or field + * @param name the unqualified name of the method or field (ignored if + * {@code kind} is {@code CONSTRUCTOR}) + * @param lookupDescriptor a method descriptor string the lookup type, + * if the request is for a method invocation, or + * describing the invocation type, if the request is + * for a field or constructor + * @return the {@linkplain MethodHandleDesc} + * @throws NullPointerException if any of the non-ignored arguments are null + * @jvms 4.4.8 The CONSTANT_MethodHandle_info Structure + * @jvms 4.2.2 Unqualified Names + * @jvms 4.3.2 Field Descriptors + * @jvms 4.3.3 Method Descriptors + */ + static DirectMethodHandleDesc of(DirectMethodHandleDesc.Kind kind, + ClassDesc owner, + String name, + String lookupDescriptor) { + switch (kind) { + case GETTER: + case SETTER: + case STATIC_GETTER: + case STATIC_SETTER: + return ofField(kind, owner, name, ClassDesc.ofDescriptor(lookupDescriptor)); + default: + return new DirectMethodHandleDescImpl(kind, owner, name, MethodTypeDesc.ofDescriptor(lookupDescriptor)); + } + } + + /** + * Creates a {@linkplain MethodHandleDesc} corresponding to an invocation of a + * declared method or constructor. + * + *

    The lookup descriptor string has the same format as for the lookup + * methods on {@link MethodHandles.Lookup}. If {@code kind} is + * {@code CONSTRUCTOR}, the name is ignored and the return type of the lookup + * type must be {@code void}. If {@code kind} corresponds to a virtual method + * invocation, the lookup type includes the method parameters but not the + * receiver type. + * + * @param kind The kind of method handle to be described; must be one of + * {@code SPECIAL, VIRTUAL, STATIC, INTERFACE_SPECIAL, + * INTERFACE_VIRTUAL, INTERFACE_STATIC, CONSTRUCTOR} + * @param owner a {@link ClassDesc} describing the class containing the + * method or constructor + * @param name the unqualified name of the method (ignored if {@code kind} + * is {@code CONSTRUCTOR}) + * @param lookupMethodType a {@link MethodTypeDesc} describing the lookup type + * @return the {@linkplain MethodHandleDesc} + * @throws NullPointerException if any non-ignored arguments are null + * @throws IllegalArgumentException if the {@code name} has the incorrect + * format, or the kind is invalid + * @jvms 4.2.2 Unqualified Names + */ + static DirectMethodHandleDesc ofMethod(DirectMethodHandleDesc.Kind kind, + ClassDesc owner, + String name, + MethodTypeDesc lookupMethodType) { + switch (kind) { + case GETTER: + case SETTER: + case STATIC_GETTER: + case STATIC_SETTER: + throw new IllegalArgumentException(kind.toString()); + case VIRTUAL: + case SPECIAL: + case INTERFACE_VIRTUAL: + case INTERFACE_SPECIAL: + case INTERFACE_STATIC: + case STATIC: + case CONSTRUCTOR: + return new DirectMethodHandleDescImpl(kind, owner, name, lookupMethodType); + default: + throw new IllegalArgumentException(kind.toString()); + } + } + + /** + * Creates a {@linkplain MethodHandleDesc} corresponding to a method handle + * that accesses a field. + * + * @param kind the kind of the method handle to be described; must be one of {@code GETTER}, + * {@code SETTER}, {@code STATIC_GETTER}, or {@code STATIC_SETTER} + * @param owner a {@link ClassDesc} describing the class containing the field + * @param fieldName the unqualified name of the field + * @param fieldType a {@link ClassDesc} describing the type of the field + * @return the {@linkplain MethodHandleDesc} + * @throws NullPointerException if any of the arguments are null + * @throws IllegalArgumentException if the {@code kind} is not one of the + * valid values or if the field name is not valid + * @jvms 4.2.2 Unqualified Names + */ + static DirectMethodHandleDesc ofField(DirectMethodHandleDesc.Kind kind, + ClassDesc owner, + String fieldName, + ClassDesc fieldType) { + MethodTypeDesc mtr; + switch (kind) { + case GETTER: mtr = MethodTypeDesc.of(fieldType, owner); break; + case SETTER: mtr = MethodTypeDesc.of(CD_void, owner, fieldType); break; + case STATIC_GETTER: mtr = MethodTypeDesc.of(fieldType); break; + case STATIC_SETTER: mtr = MethodTypeDesc.of(CD_void, fieldType); break; + default: + throw new IllegalArgumentException(kind.toString()); + } + return new DirectMethodHandleDescImpl(kind, owner, fieldName, mtr); + } + + /** + * Returns a {@linkplain MethodHandleDesc} corresponding to invocation of a constructor + * + * @param owner a {@link ClassDesc} describing the class containing the + * constructor + * @param paramTypes {@link ClassDesc}s describing the parameter types of + * the constructor + * @return the {@linkplain MethodHandleDesc} + * @throws NullPointerException if any of the arguments are null + */ + static DirectMethodHandleDesc ofConstructor(ClassDesc owner, + ClassDesc... paramTypes) { + return MethodHandleDesc.ofMethod(CONSTRUCTOR, owner, ConstantDescs.DEFAULT_NAME, + MethodTypeDesc.of(CD_void, paramTypes)); + } + + /** + * Returns a {@linkplain MethodHandleDesc} that describes this method handle + * adapted to a different type, as if by {@link MethodHandle#asType(MethodType)}. + * + * @param type a {@link MethodHandleDesc} describing the new method type + * @return a {@linkplain MethodHandleDesc} for the adapted method handle + */ + default MethodHandleDesc asType(MethodTypeDesc type) { + return (invocationType().equals(type)) ? this : new AsTypeMethodHandleDesc(this, type); + } + + /** + * Returns a {@link MethodTypeDesc} describing the invocation type of the + * method handle described by this nominal descriptor. The invocation type + * describes the full set of stack values that are consumed by the invocation + * (including the receiver, if any). + * + * @return a {@linkplain MethodHandleDesc} describing the method handle type + */ + MethodTypeDesc invocationType(); + + /** + * Compares the specified object with this descriptor for equality. Returns + * {@code true} if and only if the specified object is also a + * {@linkplain MethodHandleDesc}, and both encode the same nominal description + * of a method handle. + * + * @param o the other object + * @return whether this descriptor is equal to the other object + */ + boolean equals(Object o); +} diff --git a/src/java.base/share/classes/java/lang/constant/MethodTypeDesc.java b/src/java.base/share/classes/java/lang/constant/MethodTypeDesc.java new file mode 100644 index 00000000000..128ae33e27f --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/MethodTypeDesc.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.invoke.MethodType; +import java.lang.invoke.TypeDescriptor; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * A nominal descriptor for a + * {@linkplain MethodType} constant. + * + * @apiNote In the future, if the Java language permits, {@linkplain MethodTypeDesc} + * may become a {@code sealed} interface, which would prohibit subclassing except + * by explicitly permitted types. Non-platform classes should not implement + * {@linkplain MethodTypeDesc} directly. + * + * @since 12 + */ +public interface MethodTypeDesc + extends ConstantDesc, + TypeDescriptor.OfMethod { + /** + * Creates a {@linkplain MethodTypeDesc} given a method descriptor string. + * + * @param descriptor a method descriptor string + * @return a {@linkplain MethodTypeDesc} describing the desired method type + * @throws NullPointerException if any argument is {@code null} + * @throws IllegalArgumentException if the descriptor string is not a valid + * method descriptor + * @jvms 4.3.3 Method Descriptors + */ + static MethodTypeDesc ofDescriptor(String descriptor) { + return MethodTypeDescImpl.ofDescriptor(descriptor); + } + + /** + * Returns a {@linkplain MethodTypeDesc} given the return type and parameter + * types. + * + * @param returnDesc a {@linkplain ClassDesc} describing the return type + * @param paramDescs {@linkplain ClassDesc}s describing the argument types + * @return a {@linkplain MethodTypeDesc} describing the desired method type + * @throws NullPointerException if any argument is {@code null} + */ + static MethodTypeDesc of(ClassDesc returnDesc, ClassDesc... paramDescs) { + return new MethodTypeDescImpl(returnDesc, paramDescs); + } + + /** + * Gets the return type of the method type described by this {@linkplain MethodTypeDesc}. + * + * @return a {@link ClassDesc} describing the return type of the method type + */ + ClassDesc returnType(); + + /** + * Returns the number of parameters of the method type described by + * this {@linkplain MethodTypeDesc}. + * @return the number of parameters + */ + int parameterCount(); + + /** + * Returns the parameter type of the {@code index}'th parameter of the method type + * described by this {@linkplain MethodTypeDesc}. + * + * @param index the index of the parameter to retrieve + * @return a {@link ClassDesc} describing the desired parameter type + * @throws IndexOutOfBoundsException if the index is outside the half-open + * range {[0, parameterCount())} + */ + ClassDesc parameterType(int index); + + /** + * Returns the parameter types as an immutable {@link List}. + * + * @return a {@link List} of {@link ClassDesc} describing the parameter types + */ + List parameterList(); + + /** + * Returns the parameter types as an array. + * + * @return an array of {@link ClassDesc} describing the parameter types + */ + ClassDesc[] parameterArray(); + + /** + * Returns a {@linkplain MethodTypeDesc} that is identical to + * this one, except with the specified return type. + * + * @param returnType a {@link ClassDesc} describing the new return type + * @return a {@linkplain MethodTypeDesc} describing the desired method type + * @throws NullPointerException if any argument is {@code null} + */ + MethodTypeDesc changeReturnType(ClassDesc returnType); + + /** + * Returns a {@linkplain MethodTypeDesc} that is identical to this one, + * except that a single parameter type has been changed to the specified type. + * + * @param index the index of the parameter to change + * @param paramType a {@link ClassDesc} describing the new parameter type + * @return a {@linkplain MethodTypeDesc} describing the desired method type + * @throws NullPointerException if any argument is {@code null} + * @throws IndexOutOfBoundsException if the index is outside the half-open + * range {[0, parameterCount)} + */ + MethodTypeDesc changeParameterType(int index, ClassDesc paramType); + + /** + * Returns a {@linkplain MethodTypeDesc} that is identical to this one, + * except that a range of parameter types have been removed. + * + * @param start the index of the first parameter to remove + * @param end the index after the last parameter to remove + * @return a {@linkplain MethodTypeDesc} describing the desired method type + * @throws IndexOutOfBoundsException if {@code start} is outside the half-open + * range {[0, parameterCount)}, or {@code end} is outside the closed range + * {@code [0, parameterCount]} + */ + MethodTypeDesc dropParameterTypes(int start, int end); + + /** + * Returns a {@linkplain MethodTypeDesc} that is identical to this one, + * except that a range of additional parameter types have been inserted. + * + * @param pos the index at which to insert the first inserted parameter + * @param paramTypes {@link ClassDesc}s describing the new parameter types + * to insert + * @return a {@linkplain MethodTypeDesc} describing the desired method type + * @throws NullPointerException if any argument is {@code null} + * @throws IndexOutOfBoundsException if {@code pos} is outside the closed + * range {[0, parameterCount]} + */ + MethodTypeDesc insertParameterTypes(int pos, ClassDesc... paramTypes); + + /** + * Returns the method type descriptor string. + * + * @return the method type descriptor string + * @jvms 4.3.3 Method Descriptors + */ + default String descriptorString() { + return String.format("(%s)%s", + Stream.of(parameterArray()) + .map(ClassDesc::descriptorString) + .collect(Collectors.joining()), + returnType().descriptorString()); + } + + /** + * Returns a human-readable descriptor for this method type, using the + * canonical names for parameter and return types. + * + * @return the human-readable descriptor for this method type + */ + default String displayDescriptor() { + return String.format("(%s)%s", + Stream.of(parameterArray()) + .map(ClassDesc::displayName) + .collect(Collectors.joining(",")), + returnType().displayName()); + } + + /** + * Compares the specified object with this descriptor for equality. Returns + * {@code true} if and only if the specified object is also a + * {@linkplain MethodTypeDesc} both have the same arity, their return types + * are equal, and each pair of corresponding parameter types are equal. + * + * @param o the other object + * @return whether this descriptor is equal to the other object + */ + boolean equals(Object o); +} diff --git a/src/java.base/share/classes/java/lang/constant/MethodTypeDescImpl.java b/src/java.base/share/classes/java/lang/constant/MethodTypeDescImpl.java new file mode 100644 index 00000000000..37c2f2b2cd8 --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/MethodTypeDescImpl.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.Arrays; +import java.util.List; + +import static java.util.Objects.requireNonNull; + +/** + * A nominal descriptor for a + * {@link MethodType}. A {@linkplain MethodTypeDescImpl} corresponds to a + * {@code Constant_MethodType_info} entry in the constant pool of a classfile. + */ +final class MethodTypeDescImpl implements MethodTypeDesc { + private final ClassDesc returnType; + private final ClassDesc[] argTypes; + + /** + * Constructs a {@linkplain MethodTypeDesc} with the specified return type + * and parameter types + * + * @param returnType a {@link ClassDesc} describing the return type + * @param argTypes {@link ClassDesc}s describing the parameter types + */ + MethodTypeDescImpl(ClassDesc returnType, ClassDesc[] argTypes) { + this.returnType = requireNonNull(returnType); + this.argTypes = requireNonNull(argTypes); + + for (ClassDesc cr : argTypes) + if (cr.isPrimitive() && cr.descriptorString().equals("V")) + throw new IllegalArgumentException("Void parameters not permitted"); + } + + /** + * Creates a {@linkplain MethodTypeDescImpl} given a method descriptor string. + * + * @param descriptor the method descriptor string + * @return a {@linkplain MethodTypeDescImpl} describing the desired method type + * @throws IllegalArgumentException if the descriptor string is not a valid + * method descriptor + * @jvms 4.3.3 Method Descriptors + */ + static MethodTypeDescImpl ofDescriptor(String descriptor) { + requireNonNull(descriptor); + List types = ConstantUtils.parseMethodDescriptor(descriptor); + ClassDesc[] paramTypes = types.stream().skip(1).map(ClassDesc::ofDescriptor).toArray(ClassDesc[]::new); + return new MethodTypeDescImpl(ClassDesc.ofDescriptor(types.get(0)), paramTypes); + } + + @Override + public ClassDesc returnType() { + return returnType; + } + + @Override + public int parameterCount() { + return argTypes.length; + } + + @Override + public ClassDesc parameterType(int index) { + return argTypes[index]; + } + + @Override + public List parameterList() { + return List.of(argTypes); + } + + @Override + public ClassDesc[] parameterArray() { + return argTypes.clone(); + } + + @Override + public MethodTypeDesc changeReturnType(ClassDesc returnType) { + return MethodTypeDesc.of(returnType, argTypes); + } + + @Override + public MethodTypeDesc changeParameterType(int index, ClassDesc paramType) { + ClassDesc[] newArgs = argTypes.clone(); + newArgs[index] = paramType; + return MethodTypeDesc.of(returnType, newArgs); + } + + @Override + public MethodTypeDesc dropParameterTypes(int start, int end) { + if (start < 0 || start >= argTypes.length || end < 0 || end > argTypes.length) + throw new IndexOutOfBoundsException(); + else if (start > end) + throw new IllegalArgumentException(String.format("Range (%d, %d) not valid for size %d", start, end, argTypes.length)); + ClassDesc[] newArgs = new ClassDesc[argTypes.length - (end - start)]; + System.arraycopy(argTypes, 0, newArgs, 0, start); + System.arraycopy(argTypes, end, newArgs, start, argTypes.length - end); + return MethodTypeDesc.of(returnType, newArgs); + } + + @Override + public MethodTypeDesc insertParameterTypes(int pos, ClassDesc... paramTypes) { + if (pos < 0 || pos > argTypes.length) + throw new IndexOutOfBoundsException(pos); + ClassDesc[] newArgs = new ClassDesc[argTypes.length + paramTypes.length]; + System.arraycopy(argTypes, 0, newArgs, 0, pos); + System.arraycopy(paramTypes, 0, newArgs, pos, paramTypes.length); + System.arraycopy(argTypes, pos, newArgs, pos+paramTypes.length, argTypes.length - pos); + return MethodTypeDesc.of(returnType, newArgs); + } + + @Override + public MethodType resolveConstantDesc(MethodHandles.Lookup lookup) { + return MethodType.fromMethodDescriptorString(descriptorString(), lookup.lookupClass().getClassLoader()); + } + + /** + * Returns {@code true} if this {@linkplain MethodTypeDescImpl} is + * equal to another {@linkplain MethodTypeDescImpl}. Equality is + * determined by the two descriptors having equal return types and argument + * types. + * + * @param o the {@code MethodTypeDescImpl} to compare to this + * {@code MethodTypeDescImpl} + * @return {@code true} if the specified {@code MethodTypeDescImpl} is + * equals to this {@code MethodTypeDescImpl}. + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + MethodTypeDescImpl constant = (MethodTypeDescImpl) o; + + return returnType.equals(constant.returnType) + && Arrays.equals(argTypes, constant.argTypes); + } + + @Override + public int hashCode() { + int result = returnType.hashCode(); + result = 31 * result + Arrays.hashCode(argTypes); + return result; + } + + @Override + public String toString() { + return String.format("MethodTypeDesc[%s]", displayDescriptor()); + } +} diff --git a/src/java.base/share/classes/java/lang/constant/PrimitiveClassDescImpl.java b/src/java.base/share/classes/java/lang/constant/PrimitiveClassDescImpl.java new file mode 100644 index 00000000000..0478fbe3bba --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/PrimitiveClassDescImpl.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.invoke.MethodHandles; + +import sun.invoke.util.Wrapper; + +import static java.util.Objects.requireNonNull; + +/** + * A nominal descriptor for the class + * constant corresponding to a primitive type (e.g., {@code int.class}). + */ +final class PrimitiveClassDescImpl + extends DynamicConstantDesc> implements ClassDesc { + + private final String descriptor; + + /** + * Creates a {@linkplain ClassDesc} given a descriptor string for a primitive + * type. + * + * @param descriptor the descriptor string, which must be a one-character + * string corresponding to one of the nine base types + * @throws IllegalArgumentException if the descriptor string does not + * describe a valid primitive type + * @jvms 4.3 Descriptors + */ + PrimitiveClassDescImpl(String descriptor) { + super(ConstantDescs.BSM_PRIMITIVE_CLASS, requireNonNull(descriptor), ConstantDescs.CD_Class); + if (descriptor.length() != 1 + || "VIJCSBFDZ".indexOf(descriptor.charAt(0)) < 0) + throw new IllegalArgumentException(String.format("not a valid primitive type descriptor: %s", descriptor)); + this.descriptor = descriptor; + } + + @Override + public String descriptorString() { + return descriptor; + } + + @Override + public Class resolveConstantDesc(MethodHandles.Lookup lookup) { + return Wrapper.forBasicType(descriptorString().charAt(0)).primitiveType(); + } + + @Override + public String toString() { + return String.format("PrimitiveClassDesc[%s]", displayName()); + } +} diff --git a/src/java.base/share/classes/java/lang/constant/ReferenceClassDescImpl.java b/src/java.base/share/classes/java/lang/constant/ReferenceClassDescImpl.java new file mode 100644 index 00000000000..96ff2509309 --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/ReferenceClassDescImpl.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.constant; + +import java.lang.invoke.MethodHandles; + +import static java.lang.constant.ConstantUtils.dropFirstAndLastChar; +import static java.lang.constant.ConstantUtils.internalToBinary; +import static java.util.Objects.requireNonNull; + +/** + * A nominal descriptor for a class, + * interface, or array type. A {@linkplain ReferenceClassDescImpl} corresponds to a + * {@code Constant_Class_info} entry in the constant pool of a classfile. + */ +final class ReferenceClassDescImpl implements ClassDesc { + private final String descriptor; + + /** + * Creates a {@linkplain ClassDesc} from a descriptor string for a class or + * interface type + * + * @param descriptor a field descriptor string for a class or interface type + * @throws IllegalArgumentException if the descriptor string is not a valid + * field descriptor string, or does not describe a class or interface type + * @jvms 4.3.2 Field Descriptors + */ + ReferenceClassDescImpl(String descriptor) { + requireNonNull(descriptor); + int len = ConstantUtils.matchSig(descriptor, 0, descriptor.length()); + if (len == 0 || len == 1 + || len != descriptor.length()) + throw new IllegalArgumentException(String.format("not a valid reference type descriptor: %s", descriptor)); + this.descriptor = descriptor; + } + + @Override + public String descriptorString() { + return descriptor; + } + + @Override + public Class resolveConstantDesc(MethodHandles.Lookup lookup) + throws ReflectiveOperationException { + ClassDesc c = this; + int depth = ConstantUtils.arrayDepth(descriptorString()); + for (int i=0; i clazz = lookup.findClass(internalToBinary(dropFirstAndLastChar(c.descriptorString()))); + for (int i = 0; i < depth; i++) + clazz = clazz.arrayType(); + return clazz; + } + } + + /** + * Returns {@code true} if this {@linkplain ReferenceClassDescImpl} is + * equal to another {@linkplain ReferenceClassDescImpl}. Equality is + * determined by the two class descriptors having equal class descriptor + * strings. + * + * @param o the {@code ClassDesc} to compare to this + * {@code ClassDesc} + * @return {@code true} if the specified {@code ClassDesc} is + * equals to this {@code ClassDesc}. + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ClassDesc constant = (ClassDesc) o; + return descriptor.equals(constant.descriptorString()); + } + + @Override + public int hashCode() { + return descriptor.hashCode(); + } + + @Override + public String toString() { + return String.format("ClassDesc[%s]", displayName()); + } +} diff --git a/src/java.base/share/classes/java/lang/constant/package-info.java b/src/java.base/share/classes/java/lang/constant/package-info.java new file mode 100644 index 00000000000..f786e643085 --- /dev/null +++ b/src/java.base/share/classes/java/lang/constant/package-info.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * Classes and interfaces to represent nominal descriptors for run-time + * entities such as classes or method handles, and classfile entities such as + * constant pool entries or {@code invokedynamic} call sites. These classes + * are suitable for use in bytecode reading and writing APIs, {@code invokedynamic} + * bootstraps, bytecode intrinsic APIs, and compile-time or link-time program + * analysis tools. + * + *

    Every API that reads and writes bytecode instructions needs to model the + * operands to these instructions and other classfile structures (such as entries + * in the bootstrap methods table or stack maps, which frequently reference + * entries in the classfile constant pool.) Such entries can denote values of + * fundamental types, such as strings or integers; parts of a program, such as + * classes or method handles; or values of arbitrary user-defined types. The + * {@link java.lang.constant.ConstantDesc} hierarchy provides a representation of + * constant pool entries in nominal form that is convenient for APIs to model + * operands of bytecode instructions. + * + *

    Nominal Descriptors

    + * + *

    A {@link java.lang.constant.ConstantDesc} is a description of a constant + * value. Such a description is the nominal form of the constant value; + * it is not the value itself, but rather a "recipe" for describing the value, + * storing the value in a constant pool entry, or reconstituting the value given + * a class loading context. Every {@link java.lang.constant.ConstantDesc} + * knows how to resolve itself -- compute the value that it describes -- + * via {@link java.lang.constant.ConstantDesc#resolveConstantDesc(java.lang.invoke.MethodHandles.Lookup)}. + * This allows an API which accepts {@link java.lang.constant.ConstantDesc} + * objects to evaluate them reflectively, provided that the classes and methods + * referenced in their nominal description are present and accessible. + * + *

    The subtypes of {@link java.lang.constant.ConstantDesc} describe various kinds + * of constant values. For each type of loadable constant pool entry defined in JVMS 4.4, + * there is a corresponding subtype of {@link java.lang.constant.ConstantDesc}: + * {@link java.lang.constant.ClassDesc}, {@link java.lang.constant.MethodTypeDesc}, + * {@link java.lang.constant.DirectMethodHandleDesc}, {@link java.lang.String}, + * {@link java.lang.Integer}, {@link java.lang.Long}, {@link java.lang.Float}, + * {@link java.lang.Double}, and {@link java.lang.constant.DynamicConstantDesc}. These classes + * provide type-specific accessor methods to extract the nominal information for + * that kind of constant. When a bytecode-writing API encounters a {@link java.lang.constant.ConstantDesc}, + * it should examine it to see which of these types it is, cast it, extract + * its nominal information, and generate the corresponding entry to the constant pool. + * When a bytecode-reading API encounters a constant pool entry, it can + * convert it to the appropriate type of nominal descriptor. For dynamic + * constants, bytecode-reading APIs may wish to use the factory + * {@link java.lang.constant.DynamicConstantDesc#ofCanonical(DirectMethodHandleDesc, java.lang.String, ClassDesc, ConstantDesc[])}, + * which will inspect the bootstrap and, for well-known bootstraps, return + * a more specific subtype of {@link java.lang.constant.DynamicConstantDesc}, such as + * {@link java.lang.Enum.EnumDesc}. + * + *

    Another way to obtain the nominal description of a value is to ask the value + * itself. A {@link java.lang.constant.Constable} is a type whose values + * can describe themselves in nominal form as a {@link java.lang.constant.ConstantDesc}. + * Fundamental types such as {@link java.lang.String} and {@link java.lang.Class} + * implement {@link java.lang.constant.Constable}, as can user-defined + * classes. Entities that generate classfiles (such as compilers) can introspect + * over constable objects to obtain a more efficient way to represent their values + * in classfiles. + * + *

    This package also includes {@link java.lang.constant.DynamicCallSiteDesc}, + * which represents a (non-loadable) {@code Constant_InvokeDynamic_info} constant + * pool entry. It describes the bootstrap method, invocation name and type, + * and bootstrap arguments associated with an {@code invokedynamic} instruction. + * It is also suitable for describing {@code invokedynamic} call sites in bytecode + * reading and writing APIs. + * + * @jvms 4.4 The Constant Pool + * + * @since 12 + */ +package java.lang.constant; diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandle.java b/src/java.base/share/classes/java/lang/invoke/MethodHandle.java index dda3859f303..95b14c5d5e8 100644 --- a/src/java.base/share/classes/java/lang/invoke/MethodHandle.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandle.java @@ -28,10 +28,19 @@ package java.lang.invoke; import jdk.internal.HotSpotIntrinsicCandidate; +import java.lang.constant.ClassDesc; +import java.lang.constant.Constable; +import java.lang.constant.ConstantDesc; +import java.lang.constant.DirectMethodHandleDesc; +import java.lang.constant.MethodHandleDesc; +import java.lang.constant.MethodTypeDesc; import java.util.Arrays; import java.util.Objects; +import java.util.Optional; +import static java.lang.invoke.MethodHandleInfo.*; import static java.lang.invoke.MethodHandleStatics.*; +import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; /** * A method handle is a typed, directly executable reference to an underlying method, @@ -428,7 +437,7 @@ mh.invokeExact(System.out, "Hello, world."); * @author John Rose, JSR 292 EG * @since 1.7 */ -public abstract class MethodHandle { +public abstract class MethodHandle implements Constable { /** * Internal marker interface which distinguishes (to the Java compiler) @@ -1511,6 +1520,60 @@ assertEquals("[three, thee, tee]", asListFix.invoke((Object)argv).toString()); return bindArgumentL(0, x); } + /** + * Return a nominal descriptor for this instance, if one can be + * constructed, or an empty {@link Optional} if one cannot be. + * + * @return An {@link Optional} containing the resulting nominal descriptor, + * or an empty {@link Optional} if one cannot be constructed. + * @since 12 + */ + @Override + public Optional describeConstable() { + MethodHandleInfo info; + ClassDesc owner; + String name; + MethodTypeDesc type; + boolean isInterface; + try { + info = IMPL_LOOKUP.revealDirect(this); + isInterface = info.getDeclaringClass().isInterface(); + owner = info.getDeclaringClass().describeConstable().orElseThrow(); + type = info.getMethodType().describeConstable().orElseThrow(); + name = info.getName(); + } + catch (Exception e) { + return Optional.empty(); + } + + switch (info.getReferenceKind()) { + case REF_getField: + return Optional.of(MethodHandleDesc.ofField(DirectMethodHandleDesc.Kind.GETTER, owner, name, type.returnType())); + case REF_putField: + return Optional.of(MethodHandleDesc.ofField(DirectMethodHandleDesc.Kind.SETTER, owner, name, type.parameterType(0))); + case REF_getStatic: + return Optional.of(MethodHandleDesc.ofField(DirectMethodHandleDesc.Kind.STATIC_GETTER, owner, name, type.returnType())); + case REF_putStatic: + return Optional.of(MethodHandleDesc.ofField(DirectMethodHandleDesc.Kind.STATIC_SETTER, owner, name, type.parameterType(0))); + case REF_invokeVirtual: + return Optional.of(MethodHandleDesc.ofMethod(DirectMethodHandleDesc.Kind.VIRTUAL, owner, name, type)); + case REF_invokeStatic: + return isInterface ? + Optional.of(MethodHandleDesc.ofMethod(DirectMethodHandleDesc.Kind.INTERFACE_STATIC, owner, name, type)) : + Optional.of(MethodHandleDesc.ofMethod(DirectMethodHandleDesc.Kind.STATIC, owner, name, type)); + case REF_invokeSpecial: + return isInterface ? + Optional.of(MethodHandleDesc.ofMethod(DirectMethodHandleDesc.Kind.INTERFACE_SPECIAL, owner, name, type)) : + Optional.of(MethodHandleDesc.ofMethod(DirectMethodHandleDesc.Kind.SPECIAL, owner, name, type)); + case REF_invokeInterface: + return Optional.of(MethodHandleDesc.ofMethod(DirectMethodHandleDesc.Kind.INTERFACE_VIRTUAL, owner, name, type)); + case REF_newInvokeSpecial: + return Optional.of(MethodHandleDesc.ofMethod(DirectMethodHandleDesc.Kind.CONSTRUCTOR, owner, name, type)); + default: + return Optional.empty(); + } + } + /** * Returns a string representation of the method handle, * starting with the string {@code "MethodHandle"} and diff --git a/src/java.base/share/classes/java/lang/invoke/MethodType.java b/src/java.base/share/classes/java/lang/invoke/MethodType.java index 1edfabdad3e..0946434af50 100644 --- a/src/java.base/share/classes/java/lang/invoke/MethodType.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,21 +25,30 @@ package java.lang.invoke; -import jdk.internal.vm.annotation.Stable; -import sun.invoke.util.Wrapper; -import java.lang.ref.WeakReference; +import java.lang.constant.ClassDesc; +import java.lang.constant.Constable; +import java.lang.constant.MethodTypeDesc; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; +import java.lang.ref.WeakReference; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Optional; import java.util.StringJoiner; -import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.stream.Stream; + +import jdk.internal.vm.annotation.Stable; import sun.invoke.util.BytecodeDescriptor; -import static java.lang.invoke.MethodHandleStatics.*; import sun.invoke.util.VerifyType; +import sun.invoke.util.Wrapper; + +import static java.lang.invoke.MethodHandleStatics.UNSAFE; +import static java.lang.invoke.MethodHandleStatics.newIllegalArgumentException; /** * A method type represents the arguments and return type accepted and @@ -91,7 +100,10 @@ import sun.invoke.util.VerifyType; * @since 1.7 */ public final -class MethodType implements java.io.Serializable { +class MethodType + implements Constable, + TypeDescriptor.OfMethod, MethodType>, + java.io.Serializable { private static final long serialVersionUID = 292L; // {rtype, {ptype...}} // The rtype and ptypes fields define the structural identity of the method type: @@ -1175,10 +1187,43 @@ class MethodType implements java.io.Serializable { return desc; } + /** + * Return a field type descriptor string for this type + * + * @return the descriptor string + * @jvms 4.3.2 Field Descriptors + * @since 12 + */ + @Override + public String descriptorString() { + return toMethodDescriptorString(); + } + /*non-public*/ static String toFieldDescriptorString(Class cls) { return BytecodeDescriptor.unparse(cls); } + /** + * Return a nominal descriptor for this instance, if one can be + * constructed, or an empty {@link Optional} if one cannot be. + * + * @return An {@link Optional} containing the resulting nominal descriptor, + * or an empty {@link Optional} if one cannot be constructed. + * @since 12 + */ + @Override + public Optional describeConstable() { + try { + return Optional.of(MethodTypeDesc.of(returnType().describeConstable().orElseThrow(), + Stream.of(parameterArray()) + .map(p -> p.describeConstable().orElseThrow()) + .toArray(ClassDesc[]::new))); + } + catch (NoSuchElementException e) { + return Optional.empty(); + } + } + /// Serialization. /** diff --git a/src/java.base/share/classes/java/lang/invoke/TypeDescriptor.java b/src/java.base/share/classes/java/lang/invoke/TypeDescriptor.java new file mode 100644 index 00000000000..5caf622bf6f --- /dev/null +++ b/src/java.base/share/classes/java/lang/invoke/TypeDescriptor.java @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.lang.invoke; + +import java.util.List; + +/** + * An entity that has a field or method type descriptor + * + * @jvms 4.3.2 Field Descriptors + * @jvms 4.3.3 Method Descriptors + * + * @since 12 + */ +public interface TypeDescriptor { + /** + * Return the type descriptor string for this instance, which must be either + * a field type descriptor (JVMS 4.3.2) or method type descriptor (JVMS 4.3.3). + * + * @return the type descriptor + * @jvms 4.3.2 Field Descriptors + * @jvms 4.3.3 Method Descriptors + */ + String descriptorString(); + + + /** + * An entity that has a field type descriptor + * + * @param the class implementing {@linkplain TypeDescriptor.OfField} + * @jvms 4.3.2 Field Descriptors + * @since 12 + */ + interface OfField> extends TypeDescriptor { + /** + * Does this field descriptor describe an array type? + * @return whether this field descriptor describes an array type + */ + boolean isArray(); + + /** + * Does this field descriptor describe a primitive type? + * @return whether this field descriptor describes a primitive type + */ + boolean isPrimitive(); + + /** + * If this field descriptor describes an array type, return + * a descriptor for its component type, otherwise return {@code null}. + * @return the component type, or {@code null} if this field descriptor does + * not describe an array type + */ + F componentType(); + + /** + * Return a descriptor for the array type whose component type is described by this + * descriptor + * @return the descriptor for the array type + */ + F arrayType(); + } + + + /** + * An entity that has a method type descriptor + * + * @param the type representing field type descriptors + * @param the class implementing {@linkplain TypeDescriptor.OfMethod} + * @jvms 4.3.2 Field Descriptors + * @jvms 4.3.3 Method Descriptors + * @since 12 + */ + interface OfMethod, M extends TypeDescriptor.OfMethod> + extends TypeDescriptor { + + /** + * Return the number of parameters in the method type + * @return the number of parameters + */ + int parameterCount(); + + /** + * Return a field descriptor describing the requested parameter of the method type + * described by this descriptor + * @param i the index of the parameter + * @return a field descriptor for the requested parameter type + * @throws IndexOutOfBoundsException if the index is outside the half-open + * range {[0, parameterCount)} + */ + F parameterType(int i); + + /** + * Return a field descriptor describing the return type of the method type described + * by this descriptor + * @return a field descriptor for the return type + */ + F returnType(); + + /** + * Return an array of field descriptors for the parameter types of the method type + * described by this descriptor + * @return field descriptors for the parameter types + */ + F[] parameterArray(); + + /** + * Return an immutable list of field descriptors for the parameter types of the method type + * described by this descriptor + * @return field descriptors for the parameter types + */ + List parameterList(); + + /** + * Return a method descriptor that is identical to this one, except that the return + * type has been changed to the specified type + * + * @param newReturn a field descriptor for the new return type + * @throws NullPointerException if any argument is {@code null} + * @return the new method descriptor + */ + M changeReturnType(F newReturn); + + /** + * Return a method descriptor that is identical to this one, + * except that a single parameter type has been changed to the specified type. + * + * @param index the index of the parameter to change + * @param paramType a field descriptor describing the new parameter type + * @return the new method descriptor + * @throws NullPointerException if any argument is {@code null} + * @throws IndexOutOfBoundsException if the index is outside the half-open + * range {[0, parameterCount)} + */ + M changeParameterType(int index, F paramType); + + /** + * Return a method descriptor that is identical to this one, + * except that a range of parameter types have been removed. + * + * @param start the index of the first parameter to remove + * @param end the index after the last parameter to remove + * @return the new method descriptor + * + * @throws IndexOutOfBoundsException if {@code start} is outside the half-open + * range {@code [0, parameterCount)}, or {@code end} is outside the closed range + * {@code [0, parameterCount]}, or if {@code start > end} + */ + M dropParameterTypes(int start, int end); + + /** + * Return a method descriptor that is identical to this one, + * except that a range of additional parameter types have been inserted. + * + * @param pos the index at which to insert the first inserted parameter + * @param paramTypes field descriptors describing the new parameter types + * to insert + * @return the new method descriptor + * @throws NullPointerException if any argument is {@code null} + * @throws IndexOutOfBoundsException if {@code pos} is outside the closed + * range {[0, parameterCount]} + */ + @SuppressWarnings("unchecked") + M insertParameterTypes(int pos, F... paramTypes); + } +} diff --git a/src/java.base/share/classes/java/lang/invoke/VarHandle.java b/src/java.base/share/classes/java/lang/invoke/VarHandle.java index 2f2af8cf659..f647448e9bc 100644 --- a/src/java.base/share/classes/java/lang/invoke/VarHandle.java +++ b/src/java.base/share/classes/java/lang/invoke/VarHandle.java @@ -25,19 +25,26 @@ package java.lang.invoke; +import java.lang.constant.ClassDesc; +import java.lang.constant.Constable; +import java.lang.constant.ConstantDesc; +import java.lang.constant.ConstantDescs; +import java.lang.constant.DirectMethodHandleDesc; +import java.lang.constant.DynamicConstantDesc; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.function.BiFunction; +import java.util.function.Function; + import jdk.internal.HotSpotIntrinsicCandidate; import jdk.internal.util.Preconditions; import jdk.internal.vm.annotation.ForceInline; import jdk.internal.vm.annotation.Stable; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; -import java.util.function.Function; - import static java.lang.invoke.MethodHandleStatics.UNSAFE; -import static java.lang.invoke.MethodHandleStatics.newInternalError; /** * A VarHandle is a dynamically strongly typed reference to a variable, or to a @@ -437,7 +444,7 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError; * @see MethodType * @since 9 */ -public abstract class VarHandle { +public abstract class VarHandle implements Constable { final VarForm vform; VarHandle(VarForm vform) { @@ -1857,6 +1864,32 @@ public abstract class VarHandle { } } + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + VarHandle that = (VarHandle) o; + return accessModeType(AccessMode.GET).equals(that.accessModeType(AccessMode.GET)) && + internalEquals(that); + } + + abstract boolean internalEquals(VarHandle vh); + + @Override + public final int hashCode() { + return 31 * accessModeType(AccessMode.GET).hashCode() + internalHashCode(); + } + + abstract int internalHashCode(); + + @Override + public final String toString() { + return String.format("VarHandle[varType=%s, coord=%s]", + varType().getName(), + coordinateTypes()); + } + /** * Returns the variable type of variables referenced by this VarHandle. * @@ -1951,6 +1984,20 @@ public abstract class VarHandle { } } + /** + * Return a nominal descriptor for this instance, if one can be + * constructed, or an empty {@link Optional} if one cannot be. + * + * @return An {@link Optional} containing the resulting nominal descriptor, + * or an empty {@link Optional} if one cannot be constructed. + * @since 12 + */ + @Override + public Optional describeConstable() { + // partial function for field and array only + return Optional.empty(); + } + @Stable TypesAndInvokers typesAndInvokers; @@ -2082,4 +2129,163 @@ public abstract class VarHandle { public static void storeStoreFence() { UNSAFE.storeStoreFence(); } + + /** + * A nominal descriptor for a + * {@link VarHandle} constant. + * + * @since 12 + */ + public static final class VarHandleDesc extends DynamicConstantDesc { + + /** + * Kinds of variable handle descs + */ + private enum Kind { + FIELD(ConstantDescs.BSM_VARHANDLE_FIELD), + STATIC_FIELD(ConstantDescs.BSM_VARHANDLE_STATIC_FIELD), + ARRAY(ConstantDescs.BSM_VARHANDLE_ARRAY); + + final DirectMethodHandleDesc bootstrapMethod; + + Kind(DirectMethodHandleDesc bootstrapMethod) { + this.bootstrapMethod = bootstrapMethod; + } + + ConstantDesc[] toBSMArgs(ClassDesc declaringClass, ClassDesc varType) { + switch (this) { + case FIELD: + case STATIC_FIELD: + return new ConstantDesc[] {declaringClass, varType }; + case ARRAY: + return new ConstantDesc[] {declaringClass }; + default: + throw new InternalError("Cannot reach here"); + } + } + } + + private final Kind kind; + private final ClassDesc declaringClass; + private final ClassDesc varType; + + /** + * Construct a {@linkplain VarHandleDesc} given a kind, name, and declaring + * class. + * + * @param kind the kind of of the var handle + * @param name the unqualified name of the field, for field var handles; otherwise ignored + * @param declaringClass a {@link ClassDesc} describing the declaring class, + * for field var handles + * @param varType a {@link ClassDesc} describing the type of the variable + * @throws NullPointerException if any required argument is null + * @jvms 4.2.2 Unqualified Names + */ + private VarHandleDesc(Kind kind, String name, ClassDesc declaringClass, ClassDesc varType) { + super(kind.bootstrapMethod, name, + ConstantDescs.CD_VarHandle, + kind.toBSMArgs(declaringClass, varType)); + this.kind = kind; + this.declaringClass = declaringClass; + this.varType = varType; + } + + /** + * Returns a {@linkplain VarHandleDesc} corresponding to a {@link VarHandle} + * for an instance field. + * + * @param name the unqualifed name of the field + * @param declaringClass a {@link ClassDesc} describing the declaring class, + * for field var handles + * @param fieldType a {@link ClassDesc} describing the type of the field + * @return the {@linkplain VarHandleDesc} + * @throws NullPointerException if any of the arguments are null + * @jvms 4.2.2 Unqualified Names + */ + public static VarHandleDesc ofField(ClassDesc declaringClass, String name, ClassDesc fieldType) { + Objects.requireNonNull(declaringClass); + Objects.requireNonNull(name); + Objects.requireNonNull(fieldType); + return new VarHandleDesc(Kind.FIELD, name, declaringClass, fieldType); + } + + /** + * Returns a {@linkplain VarHandleDesc} corresponding to a {@link VarHandle} + * for a static field. + * + * @param name the unqualified name of the field + * @param declaringClass a {@link ClassDesc} describing the declaring class, + * for field var handles + * @param fieldType a {@link ClassDesc} describing the type of the field + * @return the {@linkplain VarHandleDesc} + * @throws NullPointerException if any of the arguments are null + * @jvms 4.2.2 Unqualified Names + */ + public static VarHandleDesc ofStaticField(ClassDesc declaringClass, String name, ClassDesc fieldType) { + Objects.requireNonNull(declaringClass); + Objects.requireNonNull(name); + Objects.requireNonNull(fieldType); + return new VarHandleDesc(Kind.STATIC_FIELD, name, declaringClass, fieldType); + } + + /** + * Returns a {@linkplain VarHandleDesc} corresponding to a {@link VarHandle} + * for for an array type. + * + * @param arrayClass a {@link ClassDesc} describing the type of the array + * @return the {@linkplain VarHandleDesc} + * @throws NullPointerException if any of the arguments are null + */ + public static VarHandleDesc ofArray(ClassDesc arrayClass) { + Objects.requireNonNull(arrayClass); + if (!arrayClass.isArray()) + throw new IllegalArgumentException("Array class argument not an array: " + arrayClass); + return new VarHandleDesc(Kind.ARRAY, ConstantDescs.DEFAULT_NAME, arrayClass, arrayClass.componentType()); + } + + /** + * Returns a {@link ClassDesc} describing the type of the variable described + * by this descriptor. + * + * @return the variable type + */ + public ClassDesc varType() { + return varType; + } + + @Override + public VarHandle resolveConstantDesc(MethodHandles.Lookup lookup) + throws ReflectiveOperationException { + switch (kind) { + case FIELD: + return lookup.findVarHandle((Class) declaringClass.resolveConstantDesc(lookup), + constantName(), + (Class) varType.resolveConstantDesc(lookup)); + case STATIC_FIELD: + return lookup.findStaticVarHandle((Class) declaringClass.resolveConstantDesc(lookup), + constantName(), + (Class) varType.resolveConstantDesc(lookup)); + case ARRAY: + return MethodHandles.arrayElementVarHandle((Class) declaringClass.resolveConstantDesc(lookup)); + default: + throw new InternalError("Cannot reach here"); + } + } + + @Override + public String toString() { + switch (kind) { + case FIELD: + case STATIC_FIELD: + return String.format("VarHandleDesc[%s%s.%s:%s]", + (kind == Kind.STATIC_FIELD) ? "static " : "", + declaringClass.displayName(), constantName(), varType.displayName()); + case ARRAY: + return String.format("VarHandleDesc[%s[]]", declaringClass.displayName()); + default: + throw new InternalError("Cannot reach here"); + } + } + } + } diff --git a/src/java.base/share/classes/java/lang/invoke/VarHandles.java b/src/java.base/share/classes/java/lang/invoke/VarHandles.java index 5477f956caf..232daf76fcc 100644 --- a/src/java.base/share/classes/java/lang/invoke/VarHandles.java +++ b/src/java.base/share/classes/java/lang/invoke/VarHandles.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,9 @@ package java.lang.invoke; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + import static java.lang.invoke.MethodHandleStatics.UNSAFE; final class VarHandles { @@ -144,6 +147,38 @@ final class VarHandles { } } + // Required by instance field handles + static Field getFieldFromReceiverAndOffset(Class receiverType, + long offset, + Class fieldType) { + for (Field f : receiverType.getDeclaredFields()) { + if (Modifier.isStatic(f.getModifiers())) continue; + + if (offset == UNSAFE.objectFieldOffset(f)) { + assert f.getType() == fieldType; + return f; + } + } + throw new InternalError("Field not found at offset"); + } + + // Required by instance static field handles + static Field getStaticFieldFromBaseAndOffset(Object base, + long offset, + Class fieldType) { + // @@@ This is a little fragile assuming the base is the class + Class receiverType = (Class) base; + for (Field f : receiverType.getDeclaredFields()) { + if (!Modifier.isStatic(f.getModifiers())) continue; + + if (offset == UNSAFE.staticFieldOffset(f)) { + assert f.getType() == fieldType; + return f; + } + } + throw new InternalError("Static field not found at offset"); + } + static VarHandle makeArrayElementHandle(Class arrayClass) { if (!arrayClass.isArray()) throw new IllegalArgumentException("not an array: " + arrayClass); diff --git a/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template b/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template index 505a8dad470..11a362be293 100644 --- a/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template +++ b/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,9 @@ package java.lang.invoke; import jdk.internal.util.Preconditions; import jdk.internal.vm.annotation.ForceInline; +import java.lang.invoke.VarHandle.VarHandleDesc; import java.util.Objects; +import java.util.Optional; import static java.lang.invoke.MethodHandleStatics.UNSAFE; @@ -61,6 +63,30 @@ final class VarHandle$Type$s { return accessMode.at.accessModeType(receiverType, {#if[Object]?fieldType:$type$.class}); } + @Override + final boolean internalEquals(VarHandle vh) { + FieldInstanceReadOnly that = (FieldInstanceReadOnly) vh; + return fieldOffset == that.fieldOffset; + } + + @Override + final int internalHashCode() { + return Long.hashCode(fieldOffset); + } + + @Override + public Optional describeConstable() { + var receiverTypeRef = receiverType.describeConstable(); + var fieldTypeRef = {#if[Object]?fieldType:$type$.class}.describeConstable(); + if (!receiverTypeRef.isPresent() || !fieldTypeRef.isPresent()) + return Optional.empty(); + + // Reflect on this VarHandle to extract the field name + String name = VarHandles.getFieldFromReceiverAndOffset( + receiverType, fieldOffset, {#if[Object]?fieldType:$type$.class}).getName(); + return Optional.of(VarHandleDesc.ofField(receiverTypeRef.get(), name, fieldTypeRef.get())); + } + @ForceInline static $type$ get(FieldInstanceReadOnly handle, Object holder) { return UNSAFE.get$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), @@ -323,6 +349,32 @@ final class VarHandle$Type$s { #end[Object] } + @Override + final boolean internalEquals(VarHandle vh) { + FieldStaticReadOnly that = (FieldStaticReadOnly) vh; + return base == that.base && fieldOffset == that.fieldOffset; + } + + @Override + final int internalHashCode() { + return 31 * Long.hashCode(fieldOffset) + base.hashCode(); + } + + @Override + public Optional describeConstable() { + var fieldTypeRef = {#if[Object]?fieldType:$type$.class}.describeConstable(); + if (!fieldTypeRef.isPresent()) + return Optional.empty(); + + // Reflect on this VarHandle to extract the field name + var staticField = VarHandles.getStaticFieldFromBaseAndOffset( + base, fieldOffset, {#if[Object]?fieldType:$type$.class}); + var receiverTypeRef = staticField.getDeclaringClass().describeConstable(); + if (!receiverTypeRef.isPresent()) + return Optional.empty(); + return Optional.of(VarHandleDesc.ofStaticField(receiverTypeRef.get(), staticField.getName(), fieldTypeRef.get())); + } + @Override final MethodType accessModeTypeUncached(AccessMode accessMode) { return accessMode.at.accessModeType(null, {#if[Object]?fieldType:$type$.class}); @@ -587,6 +639,29 @@ final class VarHandle$Type$s { #end[Object] } + @Override + final boolean internalEquals(VarHandle vh) { + // Equality of access mode types of AccessMode.GET is sufficient for + // equality checks + return true; + } + + @Override + final int internalHashCode() { + // The hash code of the access mode types of AccessMode.GET is + // sufficient for hash code generation + return 0; + } + + @Override + public Optional describeConstable() { + var arrayTypeRef = {#if[Object]?arrayType:$type$[].class}.describeConstable(); + if (!arrayTypeRef.isPresent()) + return Optional.empty(); + + return Optional.of(VarHandleDesc.ofArray(arrayTypeRef.get())); + } + @Override final MethodType accessModeTypeUncached(AccessMode accessMode) { return accessMode.at.accessModeType({#if[Object]?arrayType:$type$[].class}, {#if[Object]?arrayType.getComponentType():$type$.class}, int.class); diff --git a/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template b/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template index ac8fd6708c0..40c5dc710ff 100644 --- a/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template +++ b/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template @@ -67,6 +67,17 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { super(form); this.be = be; } + + @Override + final boolean internalEquals(VarHandle vh) { + ByteArrayViewVarHandle that = (ByteArrayViewVarHandle) vh; + return be == that.be; + } + + @Override + final int internalHashCode() { + return Boolean.hashCode(be); + } } static final class ArrayHandle extends ByteArrayViewVarHandle { diff --git a/src/java.base/share/classes/java/lang/reflect/Parameter.java b/src/java.base/share/classes/java/lang/reflect/Parameter.java index 005f0ddf5f3..ef8fc90bcc5 100644 --- a/src/java.base/share/classes/java/lang/reflect/Parameter.java +++ b/src/java.base/share/classes/java/lang/reflect/Parameter.java @@ -174,9 +174,9 @@ public final class Parameter implements AnnotatedElement { */ public String getName() { // Note: empty strings as parameter names are now outlawed. - // The .equals("") is for compatibility with current JVM + // The .isEmpty() is for compatibility with current JVM // behavior. It may be removed at some point. - if(name == null || name.equals("")) + if(name == null || name.isEmpty()) return "arg" + index; else return name; diff --git a/src/java.base/share/classes/java/net/HostPortrange.java b/src/java.base/share/classes/java/net/HostPortrange.java index 56bf21e466d..1b97f6ed7ac 100644 --- a/src/java.base/share/classes/java/net/HostPortrange.java +++ b/src/java.base/share/classes/java/net/HostPortrange.java @@ -241,7 +241,7 @@ class HostPortrange { int[] parsePort(String port) { - if (port == null || port.equals("")) { + if (port == null || port.isEmpty()) { return defaultPort(); } @@ -260,13 +260,13 @@ class HostPortrange { String high = port.substring(dash+1); int l,h; - if (low.equals("")) { + if (low.isEmpty()) { l = PORT_MIN; } else { l = Integer.parseInt(low); } - if (high.equals("")) { + if (high.isEmpty()) { h = PORT_MAX; } else { h = Integer.parseInt(high); diff --git a/src/java.base/share/classes/java/net/InetAddress.java b/src/java.base/share/classes/java/net/InetAddress.java index 5d9ae2ae1ad..0741e625174 100644 --- a/src/java.base/share/classes/java/net/InetAddress.java +++ b/src/java.base/share/classes/java/net/InetAddress.java @@ -1009,7 +1009,7 @@ class InetAddress implements java.io.Serializable { + " not found "); } - if ((host == null) || (host.equals("")) || (host.equals(" "))) { + if ((host == null) || (host.isEmpty()) || (host.equals(" "))) { throw new UnknownHostException("Requested address " + addrString + " resolves to an invalid entry in hosts file " @@ -1046,7 +1046,7 @@ class InetAddress implements java.io.Serializable { hostEntry = removeComments(hostEntry); if (hostEntry.contains(host)) { addrStr = extractHostAddr(hostEntry, host); - if ((addrStr != null) && (!addrStr.equals(""))) { + if ((addrStr != null) && (!addrStr.isEmpty())) { addr = createAddressByteArray(addrStr); if (inetAddresses == null) { inetAddresses = new ArrayList<>(1); diff --git a/src/java.base/share/classes/java/net/SocketPermission.java b/src/java.base/share/classes/java/net/SocketPermission.java index c1ff962c051..d0bc09470d9 100644 --- a/src/java.base/share/classes/java/net/SocketPermission.java +++ b/src/java.base/share/classes/java/net/SocketPermission.java @@ -305,7 +305,7 @@ public final class SocketPermission extends Permission } private static String getHost(String host) { - if (host.equals("")) { + if (host.isEmpty()) { return "localhost"; } else { /* IPv6 literal address used in this context should follow @@ -344,7 +344,7 @@ public final class SocketPermission extends Permission throws Exception { - if (port == null || port.equals("") || port.equals("*")) { + if (port == null || port.isEmpty() || port.equals("*")) { return new int[] {PORT_MIN, PORT_MAX}; } @@ -358,13 +358,13 @@ public final class SocketPermission extends Permission String high = port.substring(dash+1); int l,h; - if (low.equals("")) { + if (low.isEmpty()) { l = PORT_MIN; } else { l = Integer.parseInt(low); } - if (high.equals("")) { + if (high.isEmpty()) { h = PORT_MAX; } else { h = Integer.parseInt(high); @@ -496,7 +496,7 @@ public final class SocketPermission extends Permission throw new NullPointerException("action can't be null"); } - if (action.equals("")) { + if (action.isEmpty()) { throw new IllegalArgumentException("action can't be empty"); } diff --git a/src/java.base/share/classes/java/net/URLPermission.java b/src/java.base/share/classes/java/net/URLPermission.java index 56c066838a2..5d2e3605230 100644 --- a/src/java.base/share/classes/java/net/URLPermission.java +++ b/src/java.base/share/classes/java/net/URLPermission.java @@ -533,11 +533,11 @@ public final class URLPermission extends Permission { String thishost = this.p.hostname(); String thathost = that.p.hostname(); - if (p.wildcard() && thishost.equals("")) { + if (p.wildcard() && thishost.isEmpty()) { // this "*" implies all others return true; } - if (that.p.wildcard() && thathost.equals("")) { + if (that.p.wildcard() && thathost.isEmpty()) { // that "*" can only be implied by this "*" return false; } diff --git a/src/java.base/share/classes/java/net/URLStreamHandler.java b/src/java.base/share/classes/java/net/URLStreamHandler.java index 9319cb07f71..4a45a69a294 100644 --- a/src/java.base/share/classes/java/net/URLStreamHandler.java +++ b/src/java.base/share/classes/java/net/URLStreamHandler.java @@ -437,7 +437,7 @@ public abstract class URLStreamHandler { return u.hostAddress; String host = u.getHost(); - if (host == null || host.equals("")) { + if (host == null || host.isEmpty()) { return null; } else { try { diff --git a/src/java.base/share/classes/java/text/CompactNumberFormat.java b/src/java.base/share/classes/java/text/CompactNumberFormat.java new file mode 100644 index 00000000000..4094dac389a --- /dev/null +++ b/src/java.base/share/classes/java/text/CompactNumberFormat.java @@ -0,0 +1,2130 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.text; + +import java.io.IOException; +import java.io.InvalidObjectException; +import java.io.ObjectInputStream; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + + +/** + *

    + * {@code CompactNumberFormat} is a concrete subclass of {@code NumberFormat} + * that formats a decimal number in its compact form. + * + * The compact number formatting is designed for the environment where the space + * is limited, and the formatted string can be displayed in that limited space. + * It is defined by LDML's specification for + * + * Compact Number Formats. A compact number formatting refers + * to the representation of a number in a shorter form, based on the patterns + * provided for a given locale. + * + *

    + * For example: + *
    In the {@link java.util.Locale#US US locale}, {@code 1000} can be formatted + * as {@code "1K"}, and {@code 1000000} as {@code "1M"}, depending upon the + * style used. + *
    In the {@code "hi_IN"} locale, {@code 1000} can be formatted as + * "1 \u0939\u091C\u093C\u093E\u0930", and {@code 50000000} as "5 \u0915.", + * depending upon the style used. + * + *

    + * To obtain a {@code CompactNumberFormat} for a locale, use one + * of the factory methods given by {@code NumberFormat} for compact number + * formatting. For example, + * {@link NumberFormat#getCompactNumberInstance(Locale, Style)}. + * + *

    + * NumberFormat fmt = NumberFormat.getCompactNumberInstance(
    + *                             new Locale("hi", "IN"), NumberFormat.Style.SHORT);
    + * String result = fmt.format(1000);
    + * 
    + * + *

    Style

    + *

    + * A number can be formatted in the compact forms with two different + * styles, {@link NumberFormat.Style#SHORT SHORT} + * and {@link NumberFormat.Style#LONG LONG}. Use + * {@link NumberFormat#getCompactNumberInstance(Locale, Style)} for formatting and + * parsing a number in {@link NumberFormat.Style#SHORT SHORT} or + * {@link NumberFormat.Style#LONG LONG} compact form, + * where the given {@code Style} parameter requests the desired + * format. A {@link NumberFormat.Style#SHORT SHORT} style + * compact number instance in the {@link java.util.Locale#US US locale} formats + * {@code 10000} as {@code "10K"}. However, a + * {@link NumberFormat.Style#LONG LONG} style instance in same locale + * formats {@code 10000} as {@code "10 thousand"}. + * + *

    Compact Number Patterns

    + *

    + * The compact number patterns are represented in a series of patterns where each + * pattern is used to format a range of numbers. An example of + * {@link NumberFormat.Style#SHORT SHORT} styled compact number patterns + * for the {@link java.util.Locale#US US locale} is {@code {"", "", "", "0K", + * "00K", "000K", "0M", "00M", "000M", "0B", "00B", "000B", "0T", "00T", "000T"}}, + * ranging from {@code 10}{@code 0} to {@code 10}{@code 14}. + * There can be any number of patterns and they are + * strictly index based starting from the range {@code 10}{@code 0}. + * For example, in the above patterns, pattern at index 3 + * ({@code "0K"}) is used for formatting {@code number >= 1000 and number < 10000}, + * pattern at index 4 ({@code "00K"}) is used for formatting + * {@code number >= 10000 and number < 100000} and so on. In most of the locales, + * patterns with the range + * {@code 10}{@code 0}-{@code 10}{@code 2} are empty + * strings, which implicitly means a special pattern {@code "0"}. + * A special pattern {@code "0"} is used for any range which does not contain + * a compact pattern. This special pattern can appear explicitly for any specific + * range, or considered as a default pattern for an empty string. + *

    + * A compact pattern has the following syntax: + *

    + * Pattern:
    + *         PositivePattern
    + *         PositivePattern [; NegativePattern]optional
    + * PositivePattern:
    + *         Prefixoptional MinimumInteger Suffixoptional
    + * NegativePattern:
    + *        Prefixoptional MinimumInteger Suffixoptional
    + * Prefix:
    + *      Any Unicode characters except \uFFFE, \uFFFF, and
    + *      special characters
    + * Suffix:
    + *      Any Unicode characters except \uFFFE, \uFFFF, and
    + *      special characters
    + * MinimumInteger:
    + *      0
    + *      0 MinimumInteger
    + * 
    + * + * A compact pattern contains a positive and negative subpattern + * separated by a subpattern boundary character {@code ';' (U+003B)}, + * for example, {@code "0K;-0K"}. Each subpattern has a prefix, + * minimum integer digits, and suffix. The negative subpattern + * is optional, if absent, then the positive subpattern prefixed with the + * minus sign ({@code '-' U+002D HYPHEN-MINUS}) is used as the negative + * subpattern. That is, {@code "0K"} alone is equivalent to {@code "0K;-0K"}. + * If there is an explicit negative subpattern, it serves only to specify + * the negative prefix and suffix. The number of minimum integer digits, + * and other characteristics are all the same as the positive pattern. + * That means that {@code "0K;-00K"} produces precisely the same behavior + * as {@code "0K;-0K"}. + * + *

    + * Many characters in a compact pattern are taken literally, they are matched + * during parsing and output unchanged during formatting. + * Special characters, + * on the other hand, stand for other characters, strings, or classes of + * characters. They must be quoted, using single quote {@code ' (U+0027)} + * unless noted otherwise, if they are to appear in the prefix or suffix + * as literals. For example, 0\u0915'.'. + * + *

    Formatting

    + * The default formatting behavior returns a formatted string with no fractional + * digits, however users can use the {@link #setMinimumFractionDigits(int)} + * method to include the fractional part. + * The number {@code 1000.0} or {@code 1000} is formatted as {@code "1K"} + * not {@code "1.00K"} (in the {@link java.util.Locale#US US locale}). For this + * reason, the patterns provided for formatting contain only the minimum + * integer digits, prefix and/or suffix, but no fractional part. + * For example, patterns used are {@code {"", "", "", 0K, 00K, ...}}. If the pattern + * selected for formatting a number is {@code "0"} (special pattern), + * either explicit or defaulted, then the general number formatting provided by + * {@link java.text.DecimalFormat DecimalFormat} + * for the specified locale is used. + * + *

    Parsing

    + * The default parsing behavior does not allow a grouping separator until + * grouping used is set to {@code true} by using + * {@link #setGroupingUsed(boolean)}. The parsing of the fractional part + * depends on the {@link #isParseIntegerOnly()}. For example, if the + * parse integer only is set to true, then the fractional part is skipped. + * + *

    Rounding

    + * {@code CompactNumberFormat} provides rounding modes defined in + * {@link java.math.RoundingMode} for formatting. By default, it uses + * {@link java.math.RoundingMode#HALF_EVEN RoundingMode.HALF_EVEN}. + * + * @see CompactNumberFormat.Style + * @see NumberFormat + * @see DecimalFormat + * @since 12 + */ +public final class CompactNumberFormat extends NumberFormat { + + private static final long serialVersionUID = 7128367218649234678L; + + /** + * The patterns for compact form of numbers for this + * {@code CompactNumberFormat}. A possible example is + * {@code {"", "", "", "0K", "00K", "000K", "0M", "00M", "000M", "0B", + * "00B", "000B", "0T", "00T", "000T"}} ranging from + * {@code 10}{@code 0}-{@code 10}{@code 14}, + * where each pattern is used to format a range of numbers. + * For example, {@code "0K"} is used for formatting + * {@code number >= 1000 and number < 10000}, {@code "00K"} is used for + * formatting {@code number >= 10000 and number < 100000} and so on. + * This field must not be {@code null}. + * + * @serial + */ + private String[] compactPatterns; + + /** + * List of positive prefix patterns of this formatter's + * compact number patterns. + */ + private transient List positivePrefixPatterns; + + /** + * List of negative prefix patterns of this formatter's + * compact number patterns. + */ + private transient List negativePrefixPatterns; + + /** + * List of positive suffix patterns of this formatter's + * compact number patterns. + */ + private transient List positiveSuffixPatterns; + + /** + * List of negative suffix patterns of this formatter's + * compact number patterns. + */ + private transient List negativeSuffixPatterns; + + /** + * List of divisors of this formatter's compact number patterns. + * Divisor can be either Long or BigInteger (if the divisor value goes + * beyond long boundary) + */ + private transient List divisors; + + /** + * The {@code DecimalFormatSymbols} object used by this format. + * It contains the symbols used to format numbers. For example, + * the grouping separator, decimal separator, and so on. + * This field must not be {@code null}. + * + * @serial + * @see DecimalFormatSymbols + */ + private DecimalFormatSymbols symbols; + + /** + * The decimal pattern which is used for formatting the numbers + * matching special pattern "0". This field must not be {@code null}. + * + * @serial + * @see DecimalFormat + */ + private final String decimalPattern; + + /** + * A {@code DecimalFormat} used by this format for getting corresponding + * general number formatting behavior for compact numbers. + * + */ + private transient DecimalFormat decimalFormat; + + /** + * A {@code DecimalFormat} used by this format for getting general number + * formatting behavior for the numbers which can't be represented as compact + * numbers. For example, number matching the special pattern "0" are + * formatted through general number format pattern provided by + * {@link java.text.DecimalFormat DecimalFormat} + * for the specified locale. + * + */ + private transient DecimalFormat defaultDecimalFormat; + + /** + * The number of digits between grouping separators in the integer portion + * of a compact number. For the grouping to work while formatting, this + * field needs to be greater than 0 with grouping used set as true. + * This field must not be negative. + * + * @serial + */ + private byte groupingSize = 0; + + /** + * Returns whether the {@link #parse(String, ParsePosition)} + * method returns {@code BigDecimal}. + * + * @serial + */ + private boolean parseBigDecimal = false; + + /** + * The {@code RoundingMode} used in this compact number format. + * This field must not be {@code null}. + * + * @serial + */ + private RoundingMode roundingMode = RoundingMode.HALF_EVEN; + + /** + * Special pattern used for compact numbers + */ + private static final String SPECIAL_PATTERN = "0"; + + /** + * Multiplier for compact pattern range. In + * the list compact patterns each compact pattern + * specify the range with the multiplication factor of 10 + * of its previous compact pattern range. + * For example, 10^0, 10^1, 10^2, 10^3, 10^4... + * + */ + private static final int RANGE_MULTIPLIER = 10; + + /** + * Creates a {@code CompactNumberFormat} using the given decimal pattern, + * decimal format symbols and compact patterns. + * To obtain the instance of {@code CompactNumberFormat} with the standard + * compact patterns for a {@code Locale} and {@code Style}, + * it is recommended to use the factory methods given by + * {@code NumberFormat} for compact number formatting. For example, + * {@link NumberFormat#getCompactNumberInstance(Locale, Style)}. + * + * @param decimalPattern a decimal pattern for general number formatting + * @param symbols the set of symbols to be used + * @param compactPatterns an array of + * + * compact number patterns + * @throws NullPointerException if any of the given arguments is + * {@code null} + * @throws IllegalArgumentException if the given {@code decimalPattern} or the + * {@code compactPatterns} array contains an invalid pattern + * or if a {@code null} appears in the array of compact + * patterns + * @see DecimalFormat#DecimalFormat(java.lang.String, DecimalFormatSymbols) + * @see DecimalFormatSymbols + */ + public CompactNumberFormat(String decimalPattern, + DecimalFormatSymbols symbols, String[] compactPatterns) { + + Objects.requireNonNull(decimalPattern, "decimalPattern"); + Objects.requireNonNull(symbols, "symbols"); + Objects.requireNonNull(compactPatterns, "compactPatterns"); + + this.symbols = symbols; + // Instantiating the DecimalFormat with "0" pattern; this acts just as a + // basic pattern; the properties (For example, prefix/suffix) + // are later computed based on the compact number formatting process. + decimalFormat = new DecimalFormat(SPECIAL_PATTERN, this.symbols); + + // Initializing the super class state with the decimalFormat values + // to represent this CompactNumberFormat. + // For setting the digits counts, use overridden setXXX methods of this + // CompactNumberFormat, as it performs check with the max range allowed + // for compact number formatting + setMaximumIntegerDigits(decimalFormat.getMaximumIntegerDigits()); + setMinimumIntegerDigits(decimalFormat.getMinimumIntegerDigits()); + setMaximumFractionDigits(decimalFormat.getMaximumFractionDigits()); + setMinimumFractionDigits(decimalFormat.getMinimumFractionDigits()); + + super.setGroupingUsed(decimalFormat.isGroupingUsed()); + super.setParseIntegerOnly(decimalFormat.isParseIntegerOnly()); + + this.compactPatterns = compactPatterns; + + // DecimalFormat used for formatting numbers with special pattern "0". + // Formatting is delegated to the DecimalFormat's number formatting + // with no fraction digits + this.decimalPattern = decimalPattern; + defaultDecimalFormat = new DecimalFormat(this.decimalPattern, + this.symbols); + defaultDecimalFormat.setMaximumFractionDigits(0); + // Process compact patterns to extract the prefixes, suffixes and + // divisors + processCompactPatterns(); + } + + /** + * Formats a number to produce a string representing its compact form. + * The number can be of any subclass of {@link java.lang.Number}. + * @param number the number to format + * @param toAppendTo the {@code StringBuffer} to which the formatted + * text is to be appended + * @param fieldPosition keeps track on the position of the field within + * the returned string. For example, for formatting + * a number {@code 123456789} in the + * {@link java.util.Locale#US US locale}, + * if the given {@code fieldPosition} is + * {@link NumberFormat#INTEGER_FIELD}, the begin + * index and end index of {@code fieldPosition} + * will be set to 0 and 3, respectively for the + * output string {@code 123M}. Similarly, positions + * of the prefix and the suffix fields can be + * obtained using {@link NumberFormat.Field#PREFIX} + * and {@link NumberFormat.Field#SUFFIX} respectively. + * @return the {@code StringBuffer} passed in as {@code toAppendTo} + * @throws IllegalArgumentException if {@code number} is + * {@code null} or not an instance of {@code Number} + * @throws NullPointerException if {@code toAppendTo} or + * {@code fieldPosition} is {@code null} + * @throws ArithmeticException if rounding is needed with rounding + * mode being set to {@code RoundingMode.UNNECESSARY} + * @see FieldPosition + */ + @Override + public final StringBuffer format(Object number, + StringBuffer toAppendTo, + FieldPosition fieldPosition) { + if (number instanceof Long || number instanceof Integer + || number instanceof Short || number instanceof Byte + || number instanceof AtomicInteger + || number instanceof AtomicLong + || (number instanceof BigInteger + && ((BigInteger) number).bitLength() < 64)) { + return format(((Number) number).longValue(), toAppendTo, + fieldPosition); + } else if (number instanceof BigDecimal) { + return format((BigDecimal) number, toAppendTo, fieldPosition); + } else if (number instanceof BigInteger) { + return format((BigInteger) number, toAppendTo, fieldPosition); + } else if (number instanceof Number) { + return format(((Number) number).doubleValue(), toAppendTo, fieldPosition); + } else { + throw new IllegalArgumentException("Cannot format " + + number.getClass().getName() + " as a number"); + } + } + + /** + * Formats a double to produce a string representing its compact form. + * @param number the double number to format + * @param result where the text is to be appended + * @param fieldPosition keeps track on the position of the field within + * the returned string. For example, to format + * a number {@code 1234567.89} in the + * {@link java.util.Locale#US US locale} + * if the given {@code fieldPosition} is + * {@link NumberFormat#INTEGER_FIELD}, the begin + * index and end index of {@code fieldPosition} + * will be set to 0 and 1, respectively for the + * output string {@code 1M}. Similarly, positions + * of the prefix and the suffix fields can be + * obtained using {@link NumberFormat.Field#PREFIX} + * and {@link NumberFormat.Field#SUFFIX} respectively. + * @return the {@code StringBuffer} passed in as {@code result} + * @throws NullPointerException if {@code result} or + * {@code fieldPosition} is {@code null} + * @throws ArithmeticException if rounding is needed with rounding + * mode being set to {@code RoundingMode.UNNECESSARY} + * @see FieldPosition + */ + @Override + public StringBuffer format(double number, StringBuffer result, + FieldPosition fieldPosition) { + + fieldPosition.setBeginIndex(0); + fieldPosition.setEndIndex(0); + return format(number, result, fieldPosition.getFieldDelegate()); + } + + private StringBuffer format(double number, StringBuffer result, + FieldDelegate delegate) { + + boolean nanOrInfinity = decimalFormat.handleNaN(number, result, delegate); + if (nanOrInfinity) { + return result; + } + + boolean isNegative = ((number < 0.0) + || (number == 0.0 && 1 / number < 0.0)); + + nanOrInfinity = decimalFormat.handleInfinity(number, result, delegate, isNegative); + if (nanOrInfinity) { + return result; + } + + // Round the double value with min fraction digits, the integer + // part of the rounded value is used for matching the compact + // number pattern + // For example, if roundingMode is HALF_UP with min fraction + // digits = 0, the number 999.6 should round up + // to 1000 and outputs 1K/thousand in "en_US" locale + DigitList dList = new DigitList(); + dList.setRoundingMode(getRoundingMode()); + number = isNegative ? -number : number; + dList.set(isNegative, number, getMinimumFractionDigits()); + + double roundedNumber = dList.getDouble(); + int compactDataIndex = selectCompactPattern((long) roundedNumber); + if (compactDataIndex != -1) { + String prefix = isNegative ? negativePrefixPatterns.get(compactDataIndex) + : positivePrefixPatterns.get(compactDataIndex); + String suffix = isNegative ? negativeSuffixPatterns.get(compactDataIndex) + : positiveSuffixPatterns.get(compactDataIndex); + + if (!prefix.isEmpty() || !suffix.isEmpty()) { + appendPrefix(result, prefix, delegate); + long divisor = (Long) divisors.get(compactDataIndex); + roundedNumber = roundedNumber / divisor; + decimalFormat.setDigitList(roundedNumber, isNegative, getMaximumFractionDigits()); + decimalFormat.subformatNumber(result, delegate, isNegative, + false, getMaximumIntegerDigits(), getMinimumIntegerDigits(), + getMaximumFractionDigits(), getMinimumFractionDigits()); + appendSuffix(result, suffix, delegate); + } else { + defaultDecimalFormat.doubleSubformat(number, result, delegate, isNegative); + } + } else { + defaultDecimalFormat.doubleSubformat(number, result, delegate, isNegative); + } + return result; + } + + /** + * Formats a long to produce a string representing its compact form. + * @param number the long number to format + * @param result where the text is to be appended + * @param fieldPosition keeps track on the position of the field within + * the returned string. For example, to format + * a number {@code 123456789} in the + * {@link java.util.Locale#US US locale}, + * if the given {@code fieldPosition} is + * {@link NumberFormat#INTEGER_FIELD}, the begin + * index and end index of {@code fieldPosition} + * will be set to 0 and 3, respectively for the + * output string {@code 123M}. Similarly, positions + * of the prefix and the suffix fields can be + * obtained using {@link NumberFormat.Field#PREFIX} + * and {@link NumberFormat.Field#SUFFIX} respectively. + * @return the {@code StringBuffer} passed in as {@code result} + * @throws NullPointerException if {@code result} or + * {@code fieldPosition} is {@code null} + * @throws ArithmeticException if rounding is needed with rounding + * mode being set to {@code RoundingMode.UNNECESSARY} + * @see FieldPosition + */ + @Override + public StringBuffer format(long number, StringBuffer result, + FieldPosition fieldPosition) { + + fieldPosition.setBeginIndex(0); + fieldPosition.setEndIndex(0); + return format(number, result, fieldPosition.getFieldDelegate()); + } + + private StringBuffer format(long number, StringBuffer result, FieldDelegate delegate) { + boolean isNegative = (number < 0); + if (isNegative) { + number = -number; + } + + if (number < 0) { // LONG_MIN + BigInteger bigIntegerValue = BigInteger.valueOf(number); + return format(bigIntegerValue, result, delegate, true); + } + + int compactDataIndex = selectCompactPattern(number); + if (compactDataIndex != -1) { + String prefix = isNegative ? negativePrefixPatterns.get(compactDataIndex) + : positivePrefixPatterns.get(compactDataIndex); + String suffix = isNegative ? negativeSuffixPatterns.get(compactDataIndex) + : positiveSuffixPatterns.get(compactDataIndex); + if (!prefix.isEmpty() || !suffix.isEmpty()) { + appendPrefix(result, prefix, delegate); + long divisor = (Long) divisors.get(compactDataIndex); + if ((number % divisor == 0)) { + number = number / divisor; + decimalFormat.setDigitList(number, isNegative, 0); + decimalFormat.subformatNumber(result, delegate, + isNegative, true, getMaximumIntegerDigits(), + getMinimumIntegerDigits(), getMaximumFractionDigits(), + getMinimumFractionDigits()); + } else { + // To avoid truncation of fractional part store + // the value in double and follow double path instead of + // long path + double dNumber = (double) number / divisor; + decimalFormat.setDigitList(dNumber, isNegative, getMaximumFractionDigits()); + decimalFormat.subformatNumber(result, delegate, + isNegative, false, getMaximumIntegerDigits(), + getMinimumIntegerDigits(), getMaximumFractionDigits(), + getMinimumFractionDigits()); + } + appendSuffix(result, suffix, delegate); + } else { + number = isNegative ? -number : number; + defaultDecimalFormat.format(number, result, delegate); + } + } else { + number = isNegative ? -number : number; + defaultDecimalFormat.format(number, result, delegate); + } + return result; + } + + /** + * Formats a BigDecimal to produce a string representing its compact form. + * @param number the BigDecimal number to format + * @param result where the text is to be appended + * @param fieldPosition keeps track on the position of the field within + * the returned string. For example, to format + * a number {@code 1234567.89} in the + * {@link java.util.Locale#US US locale}, + * if the given {@code fieldPosition} is + * {@link NumberFormat#INTEGER_FIELD}, the begin + * index and end index of {@code fieldPosition} + * will be set to 0 and 1, respectively for the + * output string {@code 1M}. Similarly, positions + * of the prefix and the suffix fields can be + * obtained using {@link NumberFormat.Field#PREFIX} + * and {@link NumberFormat.Field#SUFFIX} respectively. + * @return the {@code StringBuffer} passed in as {@code result} + * @throws ArithmeticException if rounding is needed with rounding + * mode being set to {@code RoundingMode.UNNECESSARY} + * @throws NullPointerException if any of the given parameter + * is {@code null} + * @see FieldPosition + */ + private StringBuffer format(BigDecimal number, StringBuffer result, + FieldPosition fieldPosition) { + + Objects.requireNonNull(number); + fieldPosition.setBeginIndex(0); + fieldPosition.setEndIndex(0); + return format(number, result, fieldPosition.getFieldDelegate()); + } + + private StringBuffer format(BigDecimal number, StringBuffer result, + FieldDelegate delegate) { + + boolean isNegative = number.signum() == -1; + if (isNegative) { + number = number.negate(); + } + + // Round the value with min fraction digits, the integer + // part of the rounded value is used for matching the compact + // number pattern + // For example, If roundingMode is HALF_UP with min fraction digits = 0, + // the number 999.6 should round up + // to 1000 and outputs 1K/thousand in "en_US" locale + number = number.setScale(getMinimumFractionDigits(), getRoundingMode()); + + int compactDataIndex; + if (number.toBigInteger().bitLength() < 64) { + compactDataIndex = selectCompactPattern(number.toBigInteger().longValue()); + } else { + compactDataIndex = selectCompactPattern(number.toBigInteger()); + } + + if (compactDataIndex != -1) { + String prefix = isNegative ? negativePrefixPatterns.get(compactDataIndex) + : positivePrefixPatterns.get(compactDataIndex); + String suffix = isNegative ? negativeSuffixPatterns.get(compactDataIndex) + : positiveSuffixPatterns.get(compactDataIndex); + if (!prefix.isEmpty() || !suffix.isEmpty()) { + appendPrefix(result, prefix, delegate); + Number divisor = divisors.get(compactDataIndex); + number = number.divide(new BigDecimal(divisor.toString()), getRoundingMode()); + decimalFormat.setDigitList(number, isNegative, getMaximumFractionDigits()); + decimalFormat.subformatNumber(result, delegate, isNegative, + false, getMaximumIntegerDigits(), getMinimumIntegerDigits(), + getMaximumFractionDigits(), getMinimumFractionDigits()); + appendSuffix(result, suffix, delegate); + } else { + number = isNegative ? number.negate() : number; + defaultDecimalFormat.format(number, result, delegate); + } + } else { + number = isNegative ? number.negate() : number; + defaultDecimalFormat.format(number, result, delegate); + } + return result; + } + + /** + * Formats a BigInteger to produce a string representing its compact form. + * @param number the BigInteger number to format + * @param result where the text is to be appended + * @param fieldPosition keeps track on the position of the field within + * the returned string. For example, to format + * a number {@code 123456789} in the + * {@link java.util.Locale#US US locale}, + * if the given {@code fieldPosition} is + * {@link NumberFormat#INTEGER_FIELD}, the begin index + * and end index of {@code fieldPosition} will be set + * to 0 and 3, respectively for the output string + * {@code 123M}. Similarly, positions of the + * prefix and the suffix fields can be obtained + * using {@link NumberFormat.Field#PREFIX} and + * {@link NumberFormat.Field#SUFFIX} respectively. + * @return the {@code StringBuffer} passed in as {@code result} + * @throws ArithmeticException if rounding is needed with rounding + * mode being set to {@code RoundingMode.UNNECESSARY} + * @throws NullPointerException if any of the given parameter + * is {@code null} + * @see FieldPosition + */ + private StringBuffer format(BigInteger number, StringBuffer result, + FieldPosition fieldPosition) { + + Objects.requireNonNull(number); + fieldPosition.setBeginIndex(0); + fieldPosition.setEndIndex(0); + return format(number, result, fieldPosition.getFieldDelegate(), false); + } + + private StringBuffer format(BigInteger number, StringBuffer result, + FieldDelegate delegate, boolean formatLong) { + + boolean isNegative = number.signum() == -1; + if (isNegative) { + number = number.negate(); + } + + int compactDataIndex = selectCompactPattern(number); + if (compactDataIndex != -1) { + String prefix = isNegative ? negativePrefixPatterns.get(compactDataIndex) + : positivePrefixPatterns.get(compactDataIndex); + String suffix = isNegative ? negativeSuffixPatterns.get(compactDataIndex) + : positiveSuffixPatterns.get(compactDataIndex); + if (!prefix.isEmpty() || !suffix.isEmpty()) { + appendPrefix(result, prefix, delegate); + Number divisor = divisors.get(compactDataIndex); + if (number.mod(new BigInteger(divisor.toString())) + .compareTo(BigInteger.ZERO) == 0) { + number = number.divide(new BigInteger(divisor.toString())); + + decimalFormat.setDigitList(number, isNegative, 0); + decimalFormat.subformatNumber(result, delegate, + isNegative, true, getMaximumIntegerDigits(), + getMinimumIntegerDigits(), getMaximumFractionDigits(), + getMinimumFractionDigits()); + } else { + // To avoid truncation of fractional part store the value in + // BigDecimal and follow BigDecimal path instead of + // BigInteger path + BigDecimal nDecimal = new BigDecimal(number) + .divide(new BigDecimal(divisor.toString()), getRoundingMode()); + decimalFormat.setDigitList(nDecimal, isNegative, getMaximumFractionDigits()); + decimalFormat.subformatNumber(result, delegate, + isNegative, false, getMaximumIntegerDigits(), + getMinimumIntegerDigits(), getMaximumFractionDigits(), + getMinimumFractionDigits()); + } + appendSuffix(result, suffix, delegate); + } else { + number = isNegative ? number.negate() : number; + defaultDecimalFormat.format(number, result, delegate, formatLong); + } + } else { + number = isNegative ? number.negate() : number; + defaultDecimalFormat.format(number, result, delegate, formatLong); + } + return result; + } + + /** + * Appends the {@code prefix} to the {@code result} and also set the + * {@code NumberFormat.Field.SIGN} and {@code NumberFormat.Field.PREFIX} + * field positions. + * @param result the resulting string, where the pefix is to be appended + * @param prefix prefix to append + * @param delegate notified of the locations of + * {@code NumberFormat.Field.SIGN} and + * {@code NumberFormat.Field.PREFIX} fields + */ + private void appendPrefix(StringBuffer result, String prefix, + FieldDelegate delegate) { + append(result, expandAffix(prefix), delegate, + getFieldPositions(prefix, NumberFormat.Field.PREFIX)); + } + + /** + * Appends {@code suffix} to the {@code result} and also set the + * {@code NumberFormat.Field.SIGN} and {@code NumberFormat.Field.SUFFIX} + * field positions. + * @param result the resulting string, where the suffix is to be appended + * @param suffix suffix to append + * @param delegate notified of the locations of + * {@code NumberFormat.Field.SIGN} and + * {@code NumberFormat.Field.SUFFIX} fields + */ + private void appendSuffix(StringBuffer result, String suffix, + FieldDelegate delegate) { + append(result, expandAffix(suffix), delegate, + getFieldPositions(suffix, NumberFormat.Field.SUFFIX)); + } + + /** + * Appends the {@code string} to the {@code result}. + * {@code delegate} is notified of SIGN, PREFIX and/or SUFFIX + * field positions. + * @param result the resulting string, where the text is to be appended + * @param string the text to append + * @param delegate notified of the locations of sub fields + * @param positions a list of {@code FieldPostion} in the given + * string + */ + private void append(StringBuffer result, String string, + FieldDelegate delegate, List positions) { + if (string.length() > 0) { + int start = result.length(); + result.append(string); + for (int counter = 0; counter < positions.size(); counter++) { + FieldPosition fp = positions.get(counter); + Format.Field attribute = fp.getFieldAttribute(); + delegate.formatted(attribute, attribute, + start + fp.getBeginIndex(), + start + fp.getEndIndex(), result); + } + } + } + + /** + * Expands an affix {@code pattern} into a string of literals. + * All characters in the pattern are literals unless prefixed by QUOTE. + * The character prefixed by QUOTE is replaced with its respective + * localized literal. + * @param pattern a compact number pattern affix + * @return an expanded affix + */ + private String expandAffix(String pattern) { + // Return if no quoted character exists + if (pattern.indexOf(QUOTE) < 0) { + return pattern; + } + StringBuilder sb = new StringBuilder(); + for (int index = 0; index < pattern.length();) { + char ch = pattern.charAt(index++); + if (ch == QUOTE) { + ch = pattern.charAt(index++); + if (ch == MINUS_SIGN) { + ch = symbols.getMinusSign(); + } + } + sb.append(ch); + } + return sb.toString(); + } + + /** + * Returns a list of {@code FieldPostion} in the given {@code pattern}. + * @param pattern the pattern to be parsed for {@code FieldPosition} + * @param field whether a PREFIX or SUFFIX field + * @return a list of {@code FieldPostion} + */ + private List getFieldPositions(String pattern, Field field) { + List positions = new ArrayList<>(); + StringBuilder affix = new StringBuilder(); + int stringIndex = 0; + for (int index = 0; index < pattern.length();) { + char ch = pattern.charAt(index++); + if (ch == QUOTE) { + ch = pattern.charAt(index++); + if (ch == MINUS_SIGN) { + ch = symbols.getMinusSign(); + FieldPosition fp = new FieldPosition(NumberFormat.Field.SIGN); + fp.setBeginIndex(stringIndex); + fp.setEndIndex(stringIndex + 1); + positions.add(fp); + } + } + stringIndex++; + affix.append(ch); + } + if (affix.length() != 0) { + FieldPosition fp = new FieldPosition(field); + fp.setBeginIndex(0); + fp.setEndIndex(affix.length()); + positions.add(fp); + } + return positions; + } + + /** + * Select the index of the matched compact number pattern for + * the given {@code long} {@code number}. + * + * @param number number to be formatted + * @return index of matched compact pattern; + * -1 if no compact patterns specified + */ + private int selectCompactPattern(long number) { + + if (compactPatterns.length == 0) { + return -1; + } + + // Minimum index can be "0", max index can be "size - 1" + int dataIndex = number <= 1 ? 0 : (int) Math.log10(number); + dataIndex = Math.min(dataIndex, compactPatterns.length - 1); + return dataIndex; + } + + /** + * Select the index of the matched compact number + * pattern for the given {@code BigInteger} {@code number}. + * + * @param number number to be formatted + * @return index of matched compact pattern; + * -1 if no compact patterns specified + */ + private int selectCompactPattern(BigInteger number) { + + int matchedIndex = -1; + if (compactPatterns.length == 0) { + return matchedIndex; + } + + BigInteger currentValue = BigInteger.ONE; + + // For formatting a number, the greatest type less than + // or equal to number is used + for (int index = 0; index < compactPatterns.length; index++) { + if (number.compareTo(currentValue) > 0) { + // Input number is greater than current type; try matching with + // the next + matchedIndex = index; + currentValue = currentValue.multiply(BigInteger.valueOf(RANGE_MULTIPLIER)); + continue; + } + if (number.compareTo(currentValue) < 0) { + // Current type is greater than the input number; + // take the previous pattern + break; + } else { + // Equal + matchedIndex = index; + break; + } + } + return matchedIndex; + } + + /** + * Formats an Object producing an {@code AttributedCharacterIterator}. + * The returned {@code AttributedCharacterIterator} can be used + * to build the resulting string, as well as to determine information + * about the resulting string. + *

    + * Each attribute key of the {@code AttributedCharacterIterator} will + * be of type {@code NumberFormat.Field}, with the attribute value + * being the same as the attribute key. The prefix and the suffix + * parts of the returned iterator (if present) are represented by + * the attributes {@link NumberFormat.Field#PREFIX} and + * {@link NumberFormat.Field#SUFFIX} respectively. + * + * + * @throws NullPointerException if obj is null + * @throws IllegalArgumentException when the Format cannot format the + * given object + * @throws ArithmeticException if rounding is needed with rounding + * mode being set to {@code RoundingMode.UNNECESSARY} + * @param obj The object to format + * @return an {@code AttributedCharacterIterator} describing the + * formatted value + */ + @Override + public AttributedCharacterIterator formatToCharacterIterator(Object obj) { + CharacterIteratorFieldDelegate delegate + = new CharacterIteratorFieldDelegate(); + StringBuffer sb = new StringBuffer(); + + if (obj instanceof Double || obj instanceof Float) { + format(((Number) obj).doubleValue(), sb, delegate); + } else if (obj instanceof Long || obj instanceof Integer + || obj instanceof Short || obj instanceof Byte + || obj instanceof AtomicInteger || obj instanceof AtomicLong) { + format(((Number) obj).longValue(), sb, delegate); + } else if (obj instanceof BigDecimal) { + format((BigDecimal) obj, sb, delegate); + } else if (obj instanceof BigInteger) { + format((BigInteger) obj, sb, delegate, false); + } else if (obj == null) { + throw new NullPointerException( + "formatToCharacterIterator must be passed non-null object"); + } else { + throw new IllegalArgumentException( + "Cannot format given Object as a Number"); + } + return delegate.getIterator(sb.toString()); + } + + /** + * Computes the divisor using minimum integer digits and + * matched pattern index. + * @param minIntDigits string of 0s in compact pattern + * @param patternIndex index of matched compact pattern + * @return divisor value for the number matching the compact + * pattern at given {@code patternIndex} + */ + private Number computeDivisor(String minIntDigits, int patternIndex) { + int count = minIntDigits.length() - 1; + Number matchedValue; + // The divisor value can go above long range, if the compact patterns + // goes above index 18, divisor may need to be stored as BigInteger, + // since long can't store numbers >= 10^19, + if (patternIndex < 19) { + matchedValue = (long) Math.pow(RANGE_MULTIPLIER, patternIndex); + } else { + matchedValue = BigInteger.valueOf(RANGE_MULTIPLIER).pow(patternIndex); + } + Number divisor = matchedValue; + if (count != 0) { + if (matchedValue instanceof BigInteger) { + BigInteger bigValue = (BigInteger) matchedValue; + if (bigValue.compareTo(BigInteger.valueOf((long) Math.pow(RANGE_MULTIPLIER, count))) < 0) { + throw new IllegalArgumentException("Invalid Pattern" + + " [" + compactPatterns[patternIndex] + + "]: min integer digits specified exceeds the limit" + + " for the index " + patternIndex); + } + divisor = bigValue.divide(BigInteger.valueOf((long) Math.pow(RANGE_MULTIPLIER, count))); + } else { + long longValue = (long) matchedValue; + if (longValue < (long) Math.pow(RANGE_MULTIPLIER, count)) { + throw new IllegalArgumentException("Invalid Pattern" + + " [" + compactPatterns[patternIndex] + + "]: min integer digits specified exceeds the limit" + + " for the index " + patternIndex); + } + divisor = longValue / (long) Math.pow(RANGE_MULTIPLIER, count); + } + } + return divisor; + } + + /** + * Process the series of compact patterns to compute the + * series of prefixes, suffixes and their respective divisor + * value. + * + */ + private void processCompactPatterns() { + int size = compactPatterns.length; + positivePrefixPatterns = new ArrayList<>(size); + negativePrefixPatterns = new ArrayList<>(size); + positiveSuffixPatterns = new ArrayList<>(size); + negativeSuffixPatterns = new ArrayList<>(size); + divisors = new ArrayList<>(size); + + for (int index = 0; index < size; index++) { + applyPattern(compactPatterns[index], index); + } + } + + /** + * Process a compact pattern at a specific {@code index} + * @param pattern the compact pattern to be processed + * @param index index in the array of compact patterns + * + */ + private void applyPattern(String pattern, int index) { + + int start = 0; + boolean gotNegative = false; + + String positivePrefix = ""; + String positiveSuffix = ""; + String negativePrefix = ""; + String negativeSuffix = ""; + String zeros = ""; + for (int j = 1; j >= 0 && start < pattern.length(); --j) { + + StringBuffer prefix = new StringBuffer(); + StringBuffer suffix = new StringBuffer(); + boolean inQuote = false; + // The phase ranges from 0 to 2. Phase 0 is the prefix. Phase 1 is + // the section of the pattern with digits. Phase 2 is the suffix. + // The separation of the characters into phases is + // strictly enforced; if phase 1 characters are to appear in the + // suffix, for example, they must be quoted. + int phase = 0; + + // The affix is either the prefix or the suffix. + StringBuffer affix = prefix; + + for (int pos = start; pos < pattern.length(); ++pos) { + char ch = pattern.charAt(pos); + switch (phase) { + case 0: + case 2: + // Process the prefix / suffix characters + if (inQuote) { + // A quote within quotes indicates either the closing + // quote or two quotes, which is a quote literal. That + // is, we have the second quote in 'do' or 'don''t'. + if (ch == QUOTE) { + if ((pos + 1) < pattern.length() + && pattern.charAt(pos + 1) == QUOTE) { + ++pos; + affix.append("''"); // 'don''t' + } else { + inQuote = false; // 'do' + } + continue; + } + } else { + // Process unquoted characters seen in prefix or suffix + // phase. + switch (ch) { + case ZERO_DIGIT: + phase = 1; + --pos; // Reprocess this character + continue; + case QUOTE: + // A quote outside quotes indicates either the + // opening quote or two quotes, which is a quote + // literal. That is, we have the first quote in 'do' + // or o''clock. + if ((pos + 1) < pattern.length() + && pattern.charAt(pos + 1) == QUOTE) { + ++pos; + affix.append("''"); // o''clock + } else { + inQuote = true; // 'do' + } + continue; + case SEPARATOR: + // Don't allow separators before we see digit + // characters of phase 1, and don't allow separators + // in the second pattern (j == 0). + if (phase == 0 || j == 0) { + throw new IllegalArgumentException( + "Unquoted special character '" + + ch + "' in pattern \"" + pattern + "\""); + } + start = pos + 1; + pos = pattern.length(); + continue; + case MINUS_SIGN: + affix.append("'-"); + continue; + case DECIMAL_SEPARATOR: + case GROUPING_SEPARATOR: + case DIGIT: + case PERCENT: + case PER_MILLE: + case CURRENCY_SIGN: + throw new IllegalArgumentException( + "Unquoted special character '" + ch + + "' in pattern \"" + pattern + "\""); + default: + break; + } + } + // Note that if we are within quotes, or if this is an + // unquoted, non-special character, then we usually fall + // through to here. + affix.append(ch); + break; + + case 1: + // The negative subpattern (j = 0) serves only to specify the + // negative prefix and suffix, so all the phase 1 characters, + // for example, digits, zeroDigit, groupingSeparator, + // decimalSeparator, exponent are ignored + if (j == 0) { + while (pos < pattern.length()) { + char negPatternChar = pattern.charAt(pos); + if (negPatternChar == ZERO_DIGIT) { + ++pos; + } else { + // Not a phase 1 character, consider it as + // suffix and parse it in phase 2 + --pos; //process it again in outer loop + phase = 2; + affix = suffix; + break; + } + } + continue; + } + // Consider only '0' as valid pattern char which can appear + // in number part, rest can be either suffix or prefix + if (ch == ZERO_DIGIT) { + zeros = zeros + "0"; + } else { + phase = 2; + affix = suffix; + --pos; + } + break; + } + } + + if (inQuote) { + throw new IllegalArgumentException("Invalid single quote" + + " in pattern \"" + pattern + "\""); + } + + if (j == 1) { + positivePrefix = prefix.toString(); + positiveSuffix = suffix.toString(); + negativePrefix = positivePrefix; + negativeSuffix = positiveSuffix; + } else { + negativePrefix = prefix.toString(); + negativeSuffix = suffix.toString(); + gotNegative = true; + } + + // If there is no negative pattern, or if the negative pattern is + // identical to the positive pattern, then prepend the minus sign to + // the positive pattern to form the negative pattern. + if (!gotNegative + || (negativePrefix.equals(positivePrefix) + && negativeSuffix.equals(positiveSuffix))) { + negativeSuffix = positiveSuffix; + negativePrefix = "'-" + positivePrefix; + } + } + + // If no 0s are specified in a non empty pattern, it is invalid + if (pattern.length() != 0 && zeros.isEmpty()) { + throw new IllegalArgumentException("Invalid pattern" + + " [" + pattern + "]: all patterns must include digit" + + " placement 0s"); + } + + // Only if positive affix exists; else put empty strings + if (!positivePrefix.isEmpty() || !positiveSuffix.isEmpty()) { + positivePrefixPatterns.add(positivePrefix); + negativePrefixPatterns.add(negativePrefix); + positiveSuffixPatterns.add(positiveSuffix); + negativeSuffixPatterns.add(negativeSuffix); + divisors.add(computeDivisor(zeros, index)); + } else { + positivePrefixPatterns.add(""); + negativePrefixPatterns.add(""); + positiveSuffixPatterns.add(""); + negativeSuffixPatterns.add(""); + divisors.add(1L); + } + } + + private final transient DigitList digitList = new DigitList(); + private static final int STATUS_INFINITE = 0; + private static final int STATUS_POSITIVE = 1; + private static final int STATUS_LENGTH = 2; + + private static final char ZERO_DIGIT = '0'; + private static final char DIGIT = '#'; + private static final char DECIMAL_SEPARATOR = '.'; + private static final char GROUPING_SEPARATOR = ','; + private static final char MINUS_SIGN = '-'; + private static final char PERCENT = '%'; + private static final char PER_MILLE = '\u2030'; + private static final char SEPARATOR = ';'; + private static final char CURRENCY_SIGN = '\u00A4'; + private static final char QUOTE = '\''; + + // Expanded form of positive/negative prefix/suffix, + // the expanded form contains special characters in + // its localized form, which are used for matching + // while parsing a string to number + private transient List positivePrefixes; + private transient List negativePrefixes; + private transient List positiveSuffixes; + private transient List negativeSuffixes; + + private void expandAffixPatterns() { + positivePrefixes = new ArrayList<>(compactPatterns.length); + negativePrefixes = new ArrayList<>(compactPatterns.length); + positiveSuffixes = new ArrayList<>(compactPatterns.length); + negativeSuffixes = new ArrayList<>(compactPatterns.length); + for (int index = 0; index < compactPatterns.length; index++) { + positivePrefixes.add(expandAffix(positivePrefixPatterns.get(index))); + negativePrefixes.add(expandAffix(negativePrefixPatterns.get(index))); + positiveSuffixes.add(expandAffix(positiveSuffixPatterns.get(index))); + negativeSuffixes.add(expandAffix(negativeSuffixPatterns.get(index))); + } + } + + /** + * Parses a compact number from a string to produce a {@code Number}. + *

    + * The method attempts to parse text starting at the index given by + * {@code pos}. + * If parsing succeeds, then the index of {@code pos} is updated + * to the index after the last character used (parsing does not necessarily + * use all characters up to the end of the string), and the parsed + * number is returned. The updated {@code pos} can be used to + * indicate the starting point for the next call to this method. + * If an error occurs, then the index of {@code pos} is not + * changed, the error index of {@code pos} is set to the index of + * the character where the error occurred, and {@code null} is returned. + *

    + * The value is the numeric part in the given text multiplied + * by the numeric equivalent of the affix attached + * (For example, "K" = 1000 in {@link java.util.Locale#US US locale}). + * The subclass returned depends on the value of + * {@link #isParseBigDecimal}. + *

      + *
    • If {@link #isParseBigDecimal()} is false (the default), + * most integer values are returned as {@code Long} + * objects, no matter how they are written: {@code "17K"} and + * {@code "17.000K"} both parse to {@code Long.valueOf(17000)}. + * If the value cannot fit into {@code Long}, then the result is + * returned as {@code Double}. This includes values with a + * fractional part, infinite values, {@code NaN}, + * and the value -0.0. + *

      + * Callers may use the {@code Number} methods {@code doubleValue}, + * {@code longValue}, etc., to obtain the type they want. + * + *

    • If {@link #isParseBigDecimal()} is true, values are returned + * as {@code BigDecimal} objects. The special cases negative + * and positive infinity and NaN are returned as {@code Double} + * instances holding the values of the corresponding + * {@code Double} constants. + *
    + *

    + * {@code CompactNumberFormat} parses all Unicode characters that represent + * decimal digits, as defined by {@code Character.digit()}. In + * addition, {@code CompactNumberFormat} also recognizes as digits the ten + * consecutive characters starting with the localized zero digit defined in + * the {@code DecimalFormatSymbols} object. + *

    + * {@code CompactNumberFormat} parse does not allow parsing scientific + * notations. For example, parsing a string {@code "1.05E4K"} in + * {@link java.util.Locale#US US locale} breaks at character 'E' + * and returns 1.05. + * + * @param text the string to be parsed + * @param pos a {@code ParsePosition} object with index and error + * index information as described above + * @return the parsed value, or {@code null} if the parse fails + * @exception NullPointerException if {@code text} or + * {@code pos} is null + * + */ + @Override + public Number parse(String text, ParsePosition pos) { + + Objects.requireNonNull(text); + Objects.requireNonNull(pos); + + // Lazily expanding the affix patterns, on the first parse + // call on this instance + // If not initialized, expand and load all affixes + if (positivePrefixes == null) { + expandAffixPatterns(); + } + + // The compact number multiplier for parsed string. + // Its value is set on parsing prefix and suffix. For example, + // in the {@link java.util.Locale#US US locale} parsing {@code "1K"} + // sets its value to 1000, as K (thousand) is abbreviated form of 1000. + Number cnfMultiplier = 1L; + + // Special case NaN + if (text.regionMatches(pos.index, symbols.getNaN(), + 0, symbols.getNaN().length())) { + pos.index = pos.index + symbols.getNaN().length(); + return Double.NaN; + } + + int position = pos.index; + int oldStart = pos.index; + boolean gotPositive = false; + boolean gotNegative = false; + int matchedPosIndex = -1; + int matchedNegIndex = -1; + String matchedPosPrefix = ""; + String matchedNegPrefix = ""; + String defaultPosPrefix = defaultDecimalFormat.getPositivePrefix(); + String defaultNegPrefix = defaultDecimalFormat.getNegativePrefix(); + // Prefix matching + for (int compactIndex = 0; compactIndex < compactPatterns.length; compactIndex++) { + String positivePrefix = positivePrefixes.get(compactIndex); + String negativePrefix = negativePrefixes.get(compactIndex); + + // Do not break if a match occur; there is a possibility that the + // subsequent affixes may match the longer subsequence in the given + // string. + // For example, matching "Mdx 3" with "M", "Md" as prefix should + // match with "Md" + boolean match = matchAffix(text, position, positivePrefix, + defaultPosPrefix, matchedPosPrefix); + if (match) { + matchedPosIndex = compactIndex; + matchedPosPrefix = positivePrefix; + gotPositive = true; + } + + match = matchAffix(text, position, negativePrefix, + defaultNegPrefix, matchedNegPrefix); + if (match) { + matchedNegIndex = compactIndex; + matchedNegPrefix = negativePrefix; + gotNegative = true; + } + } + + // Given text does not match the non empty valid compact prefixes + // check with the default prefixes + if (!gotPositive && !gotNegative) { + if (text.regionMatches(pos.index, defaultPosPrefix, 0, + defaultPosPrefix.length())) { + // Matches the default positive prefix + matchedPosPrefix = defaultPosPrefix; + gotPositive = true; + } + if (text.regionMatches(pos.index, defaultNegPrefix, 0, + defaultNegPrefix.length())) { + // Matches the default negative prefix + matchedNegPrefix = defaultNegPrefix; + gotNegative = true; + } + } + + // If both match, take the longest one + if (gotPositive && gotNegative) { + if (matchedPosPrefix.length() > matchedNegPrefix.length()) { + gotNegative = false; + } else if (matchedPosPrefix.length() < matchedNegPrefix.length()) { + gotPositive = false; + } + } + + // Update the position and take compact multiplier + // only if it matches the compact prefix, not the default + // prefix; else multiplier should be 1 + if (gotPositive) { + position += matchedPosPrefix.length(); + cnfMultiplier = matchedPosIndex != -1 + ? divisors.get(matchedPosIndex) : 1L; + } else if (gotNegative) { + position += matchedNegPrefix.length(); + cnfMultiplier = matchedNegIndex != -1 + ? divisors.get(matchedNegIndex) : 1L; + } + + digitList.setRoundingMode(getRoundingMode()); + boolean[] status = new boolean[STATUS_LENGTH]; + + // Call DecimalFormat.subparseNumber() method to parse the + // number part of the input text + position = decimalFormat.subparseNumber(text, position, + digitList, false, false, status); + + if (position == -1) { + // Unable to parse the number successfully + pos.index = oldStart; + pos.errorIndex = oldStart; + return null; + } + + // If parse integer only is true and the parsing is broken at + // decimal point, then pass/ignore all digits and move pointer + // at the start of suffix, to process the suffix part + if (isParseIntegerOnly() + && text.charAt(position) == symbols.getDecimalSeparator()) { + position++; // Pass decimal character + for (; position < text.length(); ++position) { + char ch = text.charAt(position); + int digit = ch - symbols.getZeroDigit(); + if (digit < 0 || digit > 9) { + digit = Character.digit(ch, 10); + // Parse all digit characters + if (!(digit >= 0 && digit <= 9)) { + break; + } + } + } + } + + // Number parsed successfully; match prefix and + // suffix to obtain multiplier + pos.index = position; + Number multiplier = computeParseMultiplier(text, pos, + gotPositive ? matchedPosPrefix : matchedNegPrefix, + status, gotPositive, gotNegative); + + if (multiplier.longValue() == -1L) { + return null; + } else if (multiplier.longValue() != 1L) { + cnfMultiplier = multiplier; + } + + // Special case INFINITY + if (status[STATUS_INFINITE]) { + if (status[STATUS_POSITIVE]) { + return Double.POSITIVE_INFINITY; + } else { + return Double.NEGATIVE_INFINITY; + } + } + + if (isParseBigDecimal()) { + BigDecimal bigDecimalResult = digitList.getBigDecimal(); + + if (cnfMultiplier.longValue() != 1) { + bigDecimalResult = bigDecimalResult + .multiply(new BigDecimal(cnfMultiplier.toString())); + } + if (!status[STATUS_POSITIVE]) { + bigDecimalResult = bigDecimalResult.negate(); + } + return bigDecimalResult; + } else { + Number cnfResult; + if (digitList.fitsIntoLong(status[STATUS_POSITIVE], isParseIntegerOnly())) { + long longResult = digitList.getLong(); + cnfResult = generateParseResult(longResult, false, + longResult < 0, status, cnfMultiplier); + } else { + cnfResult = generateParseResult(digitList.getDouble(), + true, false, status, cnfMultiplier); + } + return cnfResult; + } + } + + /** + * Returns the parsed result by multiplying the parsed number + * with the multiplier representing the prefix and suffix. + * + * @param number parsed number component + * @param gotDouble whether the parsed number contains decimal + * @param gotLongMin whether the parsed number is Long.MIN + * @param status boolean status flags indicating whether the + * value is infinite and whether it is positive + * @param cnfMultiplier compact number multiplier + * @return parsed result + */ + private Number generateParseResult(Number number, boolean gotDouble, + boolean gotLongMin, boolean[] status, Number cnfMultiplier) { + + if (gotDouble) { + if (cnfMultiplier.longValue() != 1L) { + double doubleResult = number.doubleValue() * cnfMultiplier.doubleValue(); + doubleResult = (double) convertIfNegative(doubleResult, status, gotLongMin); + // Check if a double can be represeneted as a long + long longResult = (long) doubleResult; + gotDouble = ((doubleResult != (double) longResult) + || (doubleResult == 0.0 && 1 / doubleResult < 0.0)); + return gotDouble ? (Number) doubleResult : (Number) longResult; + } + } else { + if (cnfMultiplier.longValue() != 1L) { + Number result; + if ((cnfMultiplier instanceof Long) && !gotLongMin) { + long longMultiplier = (long) cnfMultiplier; + try { + result = Math.multiplyExact(number.longValue(), + longMultiplier); + } catch (ArithmeticException ex) { + // If number * longMultiplier can not be represented + // as long return as double + result = number.doubleValue() * cnfMultiplier.doubleValue(); + } + } else { + // cnfMultiplier can not be stored into long or the number + // part is Long.MIN, return as double + result = number.doubleValue() * cnfMultiplier.doubleValue(); + } + return convertIfNegative(result, status, gotLongMin); + } + } + + // Default number + return convertIfNegative(number, status, gotLongMin); + } + + /** + * Negate the parsed value if the positive status flag is false + * and the value is not a Long.MIN + * @param number parsed value + * @param status boolean status flags indicating whether the + * value is infinite and whether it is positive + * @param gotLongMin whether the parsed number is Long.MIN + * @return the resulting value + */ + private Number convertIfNegative(Number number, boolean[] status, + boolean gotLongMin) { + + if (!status[STATUS_POSITIVE] && !gotLongMin) { + if (number instanceof Long) { + return -(long) number; + } else { + return -(double) number; + } + } else { + return number; + } + } + + /** + * Attempts to match the given {@code affix} in the + * specified {@code text}. + */ + private boolean matchAffix(String text, int position, String affix, + String defaultAffix, String matchedAffix) { + + // Check with the compact affixes which are non empty and + // do not match with default affix + if (!affix.isEmpty() && !affix.equals(defaultAffix)) { + // Look ahead only for the longer match than the previous match + if (matchedAffix.length() < affix.length()) { + if (text.regionMatches(position, affix, 0, affix.length())) { + return true; + } + } + } + return false; + } + + /** + * Attempts to match given {@code prefix} and {@code suffix} in + * the specified {@code text}. + */ + private boolean matchPrefixAndSuffix(String text, int position, String prefix, + String matchedPrefix, String defaultPrefix, String suffix, + String matchedSuffix, String defaultSuffix) { + + // Check the compact pattern suffix only if there is a + // compact prefix match or a default prefix match + // because the compact prefix and suffix should match at the same + // index to obtain the multiplier. + // The prefix match is required because of the possibility of + // same prefix at multiple index, in which case matching the suffix + // is used to obtain the single match + + if (prefix.equals(matchedPrefix) + || matchedPrefix.equals(defaultPrefix)) { + return matchAffix(text, position, suffix, defaultSuffix, matchedSuffix); + } + return false; + } + + /** + * Computes multiplier by matching the given {@code matchedPrefix} + * and suffix in the specified {@code text} from the lists of + * prefixes and suffixes extracted from compact patterns. + * + * @param text the string to parse + * @param parsePosition the {@code ParsePosition} object representing the + * index and error index of the parse string + * @param matchedPrefix prefix extracted which needs to be matched to + * obtain the multiplier + * @param status upon return contains boolean status flags indicating + * whether the value is positive + * @param gotPositive based on the prefix parsed; whether the number is positive + * @param gotNegative based on the prefix parsed; whether the number is negative + * @return the multiplier matching the prefix and suffix; -1 otherwise + */ + private Number computeParseMultiplier(String text, ParsePosition parsePosition, + String matchedPrefix, boolean[] status, boolean gotPositive, + boolean gotNegative) { + + int position = parsePosition.index; + boolean gotPos = false; + boolean gotNeg = false; + int matchedPosIndex = -1; + int matchedNegIndex = -1; + String matchedPosSuffix = ""; + String matchedNegSuffix = ""; + for (int compactIndex = 0; compactIndex < compactPatterns.length; compactIndex++) { + String positivePrefix = positivePrefixes.get(compactIndex); + String negativePrefix = negativePrefixes.get(compactIndex); + String positiveSuffix = positiveSuffixes.get(compactIndex); + String negativeSuffix = negativeSuffixes.get(compactIndex); + + // Do not break if a match occur; there is a possibility that the + // subsequent affixes may match the longer subsequence in the given + // string. + // For example, matching "3Mdx" with "M", "Md" should match with "Md" + boolean match = matchPrefixAndSuffix(text, position, positivePrefix, matchedPrefix, + defaultDecimalFormat.getPositivePrefix(), positiveSuffix, + matchedPosSuffix, defaultDecimalFormat.getPositiveSuffix()); + if (match) { + matchedPosIndex = compactIndex; + matchedPosSuffix = positiveSuffix; + gotPos = true; + } + + match = matchPrefixAndSuffix(text, position, negativePrefix, matchedPrefix, + defaultDecimalFormat.getNegativePrefix(), negativeSuffix, + matchedNegSuffix, defaultDecimalFormat.getNegativeSuffix()); + if (match) { + matchedNegIndex = compactIndex; + matchedNegSuffix = negativeSuffix; + gotNeg = true; + } + } + + // Suffix in the given text does not match with the compact + // patterns suffixes; match with the default suffix + if (!gotPos && !gotNeg) { + String positiveSuffix = defaultDecimalFormat.getPositiveSuffix(); + String negativeSuffix = defaultDecimalFormat.getNegativeSuffix(); + if (text.regionMatches(position, positiveSuffix, 0, + positiveSuffix.length())) { + // Matches the default positive prefix + matchedPosSuffix = positiveSuffix; + gotPos = true; + } + if (text.regionMatches(position, negativeSuffix, 0, + negativeSuffix.length())) { + // Matches the default negative suffix + matchedNegSuffix = negativeSuffix; + gotNeg = true; + } + } + + // If both matches, take the longest one + if (gotPos && gotNeg) { + if (matchedPosSuffix.length() > matchedNegSuffix.length()) { + gotNeg = false; + } else if (matchedPosSuffix.length() < matchedNegSuffix.length()) { + gotPos = false; + } else { + // If longest comparison fails; take the positive and negative + // sign of matching prefix + gotPos = gotPositive; + gotNeg = gotNegative; + } + } + + // Fail if neither or both + if (gotPos == gotNeg) { + parsePosition.errorIndex = position; + return -1L; + } + + Number cnfMultiplier; + // Update the parse position index and take compact multiplier + // only if it matches the compact suffix, not the default + // suffix; else multiplier should be 1 + if (gotPos) { + parsePosition.index = position + matchedPosSuffix.length(); + cnfMultiplier = matchedPosIndex != -1 + ? divisors.get(matchedPosIndex) : 1L; + } else { + parsePosition.index = position + matchedNegSuffix.length(); + cnfMultiplier = matchedNegIndex != -1 + ? divisors.get(matchedNegIndex) : 1L; + } + status[STATUS_POSITIVE] = gotPos; + return cnfMultiplier; + } + + /** + * Reconstitutes this {@code CompactNumberFormat} from a stream + * (that is, deserializes it) after performing some validations. + * This method throws InvalidObjectException, if the stream data is invalid + * because of the following reasons, + *

      + *
    • If any of the {@code decimalPattern}, {@code compactPatterns}, + * {@code symbols} or {@code roundingMode} is {@code null}. + *
    • If the {@code decimalPattern} or the {@code compactPatterns} array + * contains an invalid pattern or if a {@code null} appears in the array of + * compact patterns. + *
    • If the {@code minimumIntegerDigits} is greater than the + * {@code maximumIntegerDigits} or the {@code minimumFractionDigits} is + * greater than the {@code maximumFractionDigits}. This check is performed + * by superclass's Object. + *
    • If any of the minimum/maximum integer/fraction digit count is + * negative. This check is performed by superclass's readObject. + *
    • If the minimum or maximum integer digit count is larger than 309 or + * if the minimum or maximum fraction digit count is larger than 340. + *
    • If the grouping size is negative or larger than 127. + *
    + * + * @param inStream the stream + * @throws IOException if an I/O error occurs + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + */ + private void readObject(ObjectInputStream inStream) throws IOException, + ClassNotFoundException { + + inStream.defaultReadObject(); + if (decimalPattern == null || compactPatterns == null + || symbols == null || roundingMode == null) { + throw new InvalidObjectException("One of the 'decimalPattern'," + + " 'compactPatterns', 'symbols' or 'roundingMode'" + + " is null"); + } + + // Check only the maximum counts because NumberFormat.readObject has + // already ensured that the maximum is greater than the minimum count. + if (getMaximumIntegerDigits() > DecimalFormat.DOUBLE_INTEGER_DIGITS + || getMaximumFractionDigits() > DecimalFormat.DOUBLE_FRACTION_DIGITS) { + throw new InvalidObjectException("Digit count out of range"); + } + + // Check if the grouping size is negative, on an attempt to + // put value > 127, it wraps around, so check just negative value + if (groupingSize < 0) { + throw new InvalidObjectException("Grouping size is negative"); + } + + try { + processCompactPatterns(); + } catch (IllegalArgumentException ex) { + throw new InvalidObjectException(ex.getMessage()); + } + + decimalFormat = new DecimalFormat(SPECIAL_PATTERN, symbols); + decimalFormat.setMaximumFractionDigits(getMaximumFractionDigits()); + decimalFormat.setMinimumFractionDigits(getMinimumFractionDigits()); + decimalFormat.setMaximumIntegerDigits(getMaximumIntegerDigits()); + decimalFormat.setMinimumIntegerDigits(getMinimumIntegerDigits()); + decimalFormat.setRoundingMode(getRoundingMode()); + decimalFormat.setGroupingSize(getGroupingSize()); + decimalFormat.setGroupingUsed(isGroupingUsed()); + decimalFormat.setParseIntegerOnly(isParseIntegerOnly()); + + try { + defaultDecimalFormat = new DecimalFormat(decimalPattern, symbols); + defaultDecimalFormat.setMaximumFractionDigits(0); + } catch (IllegalArgumentException ex) { + throw new InvalidObjectException(ex.getMessage()); + } + + } + + /** + * Sets the maximum number of digits allowed in the integer portion of a + * number. + * The maximum allowed integer range is 309, if the {@code newValue} > 309, + * then the maximum integer digits count is set to 309. Negative input + * values are replaced with 0. + * + * @param newValue the maximum number of integer digits to be shown + * @see #getMaximumIntegerDigits() + */ + @Override + public void setMaximumIntegerDigits(int newValue) { + // The maximum integer digits is checked with the allowed range before calling + // the DecimalFormat.setMaximumIntegerDigits, which performs the negative check + // on the given newValue while setting it as max integer digits. + // For example, if a negative value is specified, it is replaced with 0 + decimalFormat.setMaximumIntegerDigits(Math.min(newValue, + DecimalFormat.DOUBLE_INTEGER_DIGITS)); + super.setMaximumIntegerDigits(decimalFormat.getMaximumIntegerDigits()); + if (decimalFormat.getMinimumIntegerDigits() > decimalFormat.getMaximumIntegerDigits()) { + decimalFormat.setMinimumIntegerDigits(decimalFormat.getMaximumIntegerDigits()); + super.setMinimumIntegerDigits(decimalFormat.getMinimumIntegerDigits()); + } + } + + /** + * Sets the minimum number of digits allowed in the integer portion of a + * number. + * The maximum allowed integer range is 309, if the {@code newValue} > 309, + * then the minimum integer digits count is set to 309. Negative input + * values are replaced with 0. + * + * @param newValue the minimum number of integer digits to be shown + * @see #getMinimumIntegerDigits() + */ + @Override + public void setMinimumIntegerDigits(int newValue) { + // The minimum integer digits is checked with the allowed range before calling + // the DecimalFormat.setMinimumIntegerDigits, which performs check on the given + // newValue while setting it as min integer digits. For example, if a negative + // value is specified, it is replaced with 0 + decimalFormat.setMinimumIntegerDigits(Math.min(newValue, + DecimalFormat.DOUBLE_INTEGER_DIGITS)); + super.setMinimumIntegerDigits(decimalFormat.getMinimumIntegerDigits()); + if (decimalFormat.getMinimumIntegerDigits() > decimalFormat.getMaximumIntegerDigits()) { + decimalFormat.setMaximumIntegerDigits(decimalFormat.getMinimumIntegerDigits()); + super.setMaximumIntegerDigits(decimalFormat.getMaximumIntegerDigits()); + } + } + + /** + * Sets the minimum number of digits allowed in the fraction portion of a + * number. + * The maximum allowed fraction range is 340, if the {@code newValue} > 340, + * then the minimum fraction digits count is set to 340. Negative input + * values are replaced with 0. + * + * @param newValue the minimum number of fraction digits to be shown + * @see #getMinimumFractionDigits() + */ + @Override + public void setMinimumFractionDigits(int newValue) { + // The minimum fraction digits is checked with the allowed range before + // calling the DecimalFormat.setMinimumFractionDigits, which performs + // check on the given newValue while setting it as min fraction + // digits. For example, if a negative value is specified, it is + // replaced with 0 + decimalFormat.setMinimumFractionDigits(Math.min(newValue, + DecimalFormat.DOUBLE_FRACTION_DIGITS)); + super.setMinimumFractionDigits(decimalFormat.getMinimumFractionDigits()); + if (decimalFormat.getMinimumFractionDigits() > decimalFormat.getMaximumFractionDigits()) { + decimalFormat.setMaximumFractionDigits(decimalFormat.getMinimumFractionDigits()); + super.setMaximumFractionDigits(decimalFormat.getMaximumFractionDigits()); + } + } + + /** + * Sets the maximum number of digits allowed in the fraction portion of a + * number. + * The maximum allowed fraction range is 340, if the {@code newValue} > 340, + * then the maximum fraction digits count is set to 340. Negative input + * values are replaced with 0. + * + * @param newValue the maximum number of fraction digits to be shown + * @see #getMaximumFractionDigits() + */ + @Override + public void setMaximumFractionDigits(int newValue) { + // The maximum fraction digits is checked with the allowed range before + // calling the DecimalFormat.setMaximumFractionDigits, which performs + // check on the given newValue while setting it as max fraction digits. + // For example, if a negative value is specified, it is replaced with 0 + decimalFormat.setMaximumFractionDigits(Math.min(newValue, + DecimalFormat.DOUBLE_FRACTION_DIGITS)); + super.setMaximumFractionDigits(decimalFormat.getMaximumFractionDigits()); + if (decimalFormat.getMinimumFractionDigits() > decimalFormat.getMaximumFractionDigits()) { + decimalFormat.setMinimumFractionDigits(decimalFormat.getMaximumFractionDigits()); + super.setMinimumFractionDigits(decimalFormat.getMinimumFractionDigits()); + } + } + + /** + * Gets the {@link java.math.RoundingMode} used in this + * {@code CompactNumberFormat}. + * + * @return the {@code RoundingMode} used for this + * {@code CompactNumberFormat} + * @see #setRoundingMode(RoundingMode) + */ + @Override + public RoundingMode getRoundingMode() { + return roundingMode; + } + + /** + * Sets the {@link java.math.RoundingMode} used in this + * {@code CompactNumberFormat}. + * + * @param roundingMode the {@code RoundingMode} to be used + * @see #getRoundingMode() + * @throws NullPointerException if {@code roundingMode} is {@code null} + */ + @Override + public void setRoundingMode(RoundingMode roundingMode) { + decimalFormat.setRoundingMode(roundingMode); + this.roundingMode = roundingMode; + } + + /** + * Returns the grouping size. Grouping size is the number of digits between + * grouping separators in the integer portion of a number. For example, + * in the compact number {@code "12,347 trillion"} for the + * {@link java.util.Locale#US US locale}, the grouping size is 3. + * + * @return the grouping size + * @see #setGroupingSize + * @see java.text.NumberFormat#isGroupingUsed + * @see java.text.DecimalFormatSymbols#getGroupingSeparator + */ + public int getGroupingSize() { + return groupingSize; + } + + /** + * Sets the grouping size. Grouping size is the number of digits between + * grouping separators in the integer portion of a number. For example, + * in the compact number {@code "12,347 trillion"} for the + * {@link java.util.Locale#US US locale}, the grouping size is 3. The grouping + * size must be greater than or equal to zero and less than or equal to 127. + * + * @param newValue the new grouping size + * @see #getGroupingSize + * @see java.text.NumberFormat#setGroupingUsed + * @see java.text.DecimalFormatSymbols#setGroupingSeparator + * @throws IllegalArgumentException if {@code newValue} is negative or + * larger than 127 + */ + public void setGroupingSize(int newValue) { + if (newValue < 0 || newValue > 127) { + throw new IllegalArgumentException( + "The value passed is negative or larger than 127"); + } + groupingSize = (byte) newValue; + decimalFormat.setGroupingSize(groupingSize); + } + + /** + * Returns true if grouping is used in this format. For example, with + * grouping on and grouping size set to 3, the number {@code 12346567890987654} + * can be formatted as {@code "12,347 trillion"} in the + * {@link java.util.Locale#US US locale}. + * The grouping separator is locale dependent. + * + * @return {@code true} if grouping is used; + * {@code false} otherwise + * @see #setGroupingUsed + */ + @Override + public boolean isGroupingUsed() { + return super.isGroupingUsed(); + } + + /** + * Sets whether or not grouping will be used in this format. + * + * @param newValue {@code true} if grouping is used; + * {@code false} otherwise + * @see #isGroupingUsed + */ + @Override + public void setGroupingUsed(boolean newValue) { + decimalFormat.setGroupingUsed(newValue); + super.setGroupingUsed(newValue); + } + + /** + * Returns true if this format parses only an integer from the number + * component of a compact number. + * Parsing an integer means that only an integer is considered from the + * number component, prefix/suffix is still considered to compute the + * resulting output. + * For example, in the {@link java.util.Locale#US US locale}, if this method + * returns {@code true}, the string {@code "1234.78 thousand"} would be + * parsed as the value {@code 1234000} (1234 (integer part) * 1000 + * (thousand)) and the fractional part would be skipped. + * The exact format accepted by the parse operation is locale dependent. + * + * @return {@code true} if compact numbers should be parsed as integers + * only; {@code false} otherwise + */ + @Override + public boolean isParseIntegerOnly() { + return super.isParseIntegerOnly(); + } + + /** + * Sets whether or not this format parses only an integer from the number + * component of a compact number. + * + * @param value {@code true} if compact numbers should be parsed as + * integers only; {@code false} otherwise + * @see #isParseIntegerOnly + */ + @Override + public void setParseIntegerOnly(boolean value) { + decimalFormat.setParseIntegerOnly(value); + super.setParseIntegerOnly(value); + } + + /** + * Returns whether the {@link #parse(String, ParsePosition)} + * method returns {@code BigDecimal}. The default value is false. + * + * @return {@code true} if the parse method returns BigDecimal; + * {@code false} otherwise + * @see #setParseBigDecimal + * + */ + public boolean isParseBigDecimal() { + return parseBigDecimal; + } + + /** + * Sets whether the {@link #parse(String, ParsePosition)} + * method returns {@code BigDecimal}. + * + * @param newValue {@code true} if the parse method returns BigDecimal; + * {@code false} otherwise + * @see #isParseBigDecimal + * + */ + public void setParseBigDecimal(boolean newValue) { + parseBigDecimal = newValue; + } + + /** + * Checks if this {@code CompactNumberFormat} is equal to the + * specified {@code obj}. The objects of type {@code CompactNumberFormat} + * are compared, other types return false; obeys the general contract of + * {@link java.lang.Object#equals(java.lang.Object) Object.equals}. + * + * @param obj the object to compare with + * @return true if this is equal to the other {@code CompactNumberFormat} + */ + @Override + public boolean equals(Object obj) { + + if (!super.equals(obj)) { + return false; + } + + CompactNumberFormat other = (CompactNumberFormat) obj; + return decimalPattern.equals(other.decimalPattern) + && symbols.equals(other.symbols) + && Arrays.equals(compactPatterns, other.compactPatterns) + && roundingMode.equals(other.roundingMode) + && groupingSize == other.groupingSize + && parseBigDecimal == other.parseBigDecimal; + } + + /** + * Returns the hash code for this {@code CompactNumberFormat} instance. + * + * @return hash code for this {@code CompactNumberFormat} + */ + @Override + public int hashCode() { + return 31 * super.hashCode() + + Objects.hash(decimalPattern, symbols, roundingMode) + + Arrays.hashCode(compactPatterns) + groupingSize + + Boolean.hashCode(parseBigDecimal); + } + + /** + * Creates and returns a copy of this {@code CompactNumberFormat} + * instance. + * + * @return a clone of this instance + */ + @Override + public CompactNumberFormat clone() { + CompactNumberFormat other = (CompactNumberFormat) super.clone(); + other.compactPatterns = compactPatterns.clone(); + other.symbols = (DecimalFormatSymbols) symbols.clone(); + return other; + } + +} + diff --git a/src/java.base/share/classes/java/text/DecimalFormat.java b/src/java.base/share/classes/java/text/DecimalFormat.java index 3cc1e0a8018..47bc79aa43e 100644 --- a/src/java.base/share/classes/java/text/DecimalFormat.java +++ b/src/java.base/share/classes/java/text/DecimalFormat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,9 +48,6 @@ import java.text.spi.NumberFormatProvider; import java.util.ArrayList; import java.util.Currency; import java.util.Locale; -import java.util.ResourceBundle; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import sun.util.locale.provider.LocaleProviderAdapter; @@ -157,7 +154,7 @@ import sun.util.locale.provider.ResourceBundleBasedAdapter; * used. So "#,##,###,####" == "######,####" == * "##,####,####". * - *

    Special Pattern Characters

    + *

    Special Pattern Characters

    * *

    Many characters in a pattern are taken literally; they are matched during * parsing and output unchanged during formatting. Special characters, on the @@ -572,14 +569,11 @@ public class DecimalFormat extends NumberFormat { * mode being set to RoundingMode.UNNECESSARY * @return The formatted number string */ - private StringBuffer format(double number, StringBuffer result, + StringBuffer format(double number, StringBuffer result, FieldDelegate delegate) { - if (Double.isNaN(number) || - (Double.isInfinite(number) && multiplier == 0)) { - int iFieldStart = result.length(); - result.append(symbols.getNaN()); - delegate.formatted(INTEGER_FIELD, Field.INTEGER, Field.INTEGER, - iFieldStart, result.length(), result); + + boolean nanOrInfinity = handleNaN(number, result, delegate); + if (nanOrInfinity) { return result; } @@ -599,6 +593,56 @@ public class DecimalFormat extends NumberFormat { number *= multiplier; } + nanOrInfinity = handleInfinity(number, result, delegate, isNegative); + if (nanOrInfinity) { + return result; + } + + if (isNegative) { + number = -number; + } + + // at this point we are guaranteed a nonnegative finite number. + assert (number >= 0 && !Double.isInfinite(number)); + return doubleSubformat(number, result, delegate, isNegative); + } + + /** + * Checks if the given {@code number} is {@code Double.NaN}. if yes; + * appends the NaN symbol to the result string. The NaN string is + * determined by the DecimalFormatSymbols object. + * @param number the double number to format + * @param result where the text is to be appended + * @param delegate notified of locations of sub fields + * @return true, if number is a NaN; false otherwise + */ + boolean handleNaN(double number, StringBuffer result, + FieldDelegate delegate) { + if (Double.isNaN(number) + || (Double.isInfinite(number) && multiplier == 0)) { + int iFieldStart = result.length(); + result.append(symbols.getNaN()); + delegate.formatted(INTEGER_FIELD, Field.INTEGER, Field.INTEGER, + iFieldStart, result.length(), result); + return true; + } + return false; + } + + /** + * Checks if the given {@code number} is {@code Double.NEGATIVE_INFINITY} + * or {@code Double.POSITIVE_INFINITY}. if yes; + * appends the infinity string to the result string. The infinity string is + * determined by the DecimalFormatSymbols object. + * @param number the double number to format + * @param result where the text is to be appended + * @param delegate notified of locations of sub fields + * @param isNegative whether the given {@code number} is negative + * @return true, if number is a {@code Double.NEGATIVE_INFINITY} or + * {@code Double.POSITIVE_INFINITY}; false otherwise + */ + boolean handleInfinity(double number, StringBuffer result, + FieldDelegate delegate, boolean isNegative) { if (Double.isInfinite(number)) { if (isNegative) { append(result, negativePrefix, delegate, @@ -621,27 +665,24 @@ public class DecimalFormat extends NumberFormat { getPositiveSuffixFieldPositions(), Field.SIGN); } - return result; + return true; } + return false; + } - if (isNegative) { - number = -number; - } - - // at this point we are guaranteed a nonnegative finite number. - assert(number >= 0 && !Double.isInfinite(number)); - - synchronized(digitList) { + StringBuffer doubleSubformat(double number, StringBuffer result, + FieldDelegate delegate, boolean isNegative) { + synchronized (digitList) { int maxIntDigits = super.getMaximumIntegerDigits(); int minIntDigits = super.getMinimumIntegerDigits(); int maxFraDigits = super.getMaximumFractionDigits(); int minFraDigits = super.getMinimumFractionDigits(); - digitList.set(isNegative, number, useExponentialNotation ? - maxIntDigits + maxFraDigits : maxFraDigits, - !useExponentialNotation); + digitList.set(isNegative, number, useExponentialNotation + ? maxIntDigits + maxFraDigits : maxFraDigits, + !useExponentialNotation); return subformat(result, delegate, isNegative, false, - maxIntDigits, minIntDigits, maxFraDigits, minFraDigits); + maxIntDigits, minIntDigits, maxFraDigits, minFraDigits); } } @@ -683,7 +724,7 @@ public class DecimalFormat extends NumberFormat { * mode being set to RoundingMode.UNNECESSARY * @see java.text.FieldPosition */ - private StringBuffer format(long number, StringBuffer result, + StringBuffer format(long number, StringBuffer result, FieldDelegate delegate) { boolean isNegative = (number < 0); if (isNegative) { @@ -774,7 +815,7 @@ public class DecimalFormat extends NumberFormat { * mode being set to RoundingMode.UNNECESSARY * @return The formatted number string */ - private StringBuffer format(BigDecimal number, StringBuffer result, + StringBuffer format(BigDecimal number, StringBuffer result, FieldDelegate delegate) { if (multiplier != 1) { number = number.multiply(getBigDecimalMultiplier()); @@ -835,7 +876,7 @@ public class DecimalFormat extends NumberFormat { * mode being set to RoundingMode.UNNECESSARY * @see java.text.FieldPosition */ - private StringBuffer format(BigInteger number, StringBuffer result, + StringBuffer format(BigInteger number, StringBuffer result, FieldDelegate delegate, boolean formatLong) { if (multiplier != 1) { number = number.multiply(getBigIntegerMultiplier()); @@ -917,7 +958,7 @@ public class DecimalFormat extends NumberFormat { return delegate.getIterator(sb.toString()); } - // ==== Begin fast-path formating logic for double ========================= + // ==== Begin fast-path formatting logic for double ========================= /* Fast-path formatting will be used for format(double ...) methods iff a * number of conditions are met (see checkAndSetFastPathStatus()): @@ -1662,6 +1703,26 @@ public class DecimalFormat extends NumberFormat { } + /** + * Sets the {@code DigitList} used by this {@code DecimalFormat} + * instance. + * @param number the number to format + * @param isNegative true, if the number is negative; false otherwise + * @param maxDigits the max digits + */ + void setDigitList(Number number, boolean isNegative, int maxDigits) { + + if (number instanceof Double) { + digitList.set(isNegative, (Double) number, maxDigits, true); + } else if (number instanceof BigDecimal) { + digitList.set(isNegative, (BigDecimal) number, maxDigits, true); + } else if (number instanceof Long) { + digitList.set(isNegative, (Long) number, maxDigits); + } else if (number instanceof BigInteger) { + digitList.set(isNegative, (BigInteger) number, maxDigits); + } + } + // ======== End fast-path formating logic for double ========================= /** @@ -1669,29 +1730,59 @@ public class DecimalFormat extends NumberFormat { * be filled in with the correct digits. */ private StringBuffer subformat(StringBuffer result, FieldDelegate delegate, - boolean isNegative, boolean isInteger, - int maxIntDigits, int minIntDigits, - int maxFraDigits, int minFraDigits) { - // NOTE: This isn't required anymore because DigitList takes care of this. - // - // // The negative of the exponent represents the number of leading - // // zeros between the decimal and the first non-zero digit, for - // // a value < 0.1 (e.g., for 0.00123, -fExponent == 2). If this - // // is more than the maximum fraction digits, then we have an underflow - // // for the printed representation. We recognize this here and set - // // the DigitList representation to zero in this situation. - // - // if (-digitList.decimalAt >= getMaximumFractionDigits()) - // { - // digitList.count = 0; - // } + boolean isNegative, boolean isInteger, + int maxIntDigits, int minIntDigits, + int maxFraDigits, int minFraDigits) { + // Process prefix + if (isNegative) { + append(result, negativePrefix, delegate, + getNegativePrefixFieldPositions(), Field.SIGN); + } else { + append(result, positivePrefix, delegate, + getPositivePrefixFieldPositions(), Field.SIGN); + } + + // Process number + subformatNumber(result, delegate, isNegative, isInteger, + maxIntDigits, minIntDigits, maxFraDigits, minFraDigits); + + // Process suffix + if (isNegative) { + append(result, negativeSuffix, delegate, + getNegativeSuffixFieldPositions(), Field.SIGN); + } else { + append(result, positiveSuffix, delegate, + getPositiveSuffixFieldPositions(), Field.SIGN); + } + + return result; + } + + /** + * Subformats number part using the {@code DigitList} of this + * {@code DecimalFormat} instance. + * @param result where the text is to be appended + * @param delegate notified of the location of sub fields + * @param isNegative true, if the number is negative; false otherwise + * @param isInteger true, if the number is an integer; false otherwise + * @param maxIntDigits maximum integer digits + * @param minIntDigits minimum integer digits + * @param maxFraDigits maximum fraction digits + * @param minFraDigits minimum fraction digits + */ + void subformatNumber(StringBuffer result, FieldDelegate delegate, + boolean isNegative, boolean isInteger, + int maxIntDigits, int minIntDigits, + int maxFraDigits, int minFraDigits) { + + char grouping = symbols.getGroupingSeparator(); char zero = symbols.getZeroDigit(); int zeroDelta = zero - '0'; // '0' is the DigitList representation of zero - char grouping = symbols.getGroupingSeparator(); + char decimal = isCurrencyFormat ? - symbols.getMonetaryDecimalSeparator() : - symbols.getDecimalSeparator(); + symbols.getMonetaryDecimalSeparator() : + symbols.getDecimalSeparator(); /* Per bug 4147706, DecimalFormat must respect the sign of numbers which * format as zero. This allows sensible computations and preserves @@ -1703,14 +1794,6 @@ public class DecimalFormat extends NumberFormat { digitList.decimalAt = 0; // Normalize } - if (isNegative) { - append(result, negativePrefix, delegate, - getNegativePrefixFieldPositions(), Field.SIGN); - } else { - append(result, positivePrefix, delegate, - getPositivePrefixFieldPositions(), Field.SIGN); - } - if (useExponentialNotation) { int iFieldStart = result.length(); int iFieldEnd = -1; @@ -1719,7 +1802,6 @@ public class DecimalFormat extends NumberFormat { // Minimum integer digits are handled in exponential format by // adjusting the exponent. For example, 0.01234 with 3 minimum // integer digits is "123.4E-4". - // Maximum integer digits are interpreted as indicating the // repeating range. This is useful for engineering notation, in // which the exponent is restricted to a multiple of 3. For @@ -1782,8 +1864,8 @@ public class DecimalFormat extends NumberFormat { fFieldStart = result.length(); } result.append((i < digitList.count) ? - (char)(digitList.digits[i] + zeroDelta) : - zero); + (char)(digitList.digits[i] + zeroDelta) : + zero); } if (decimalSeparatorAlwaysShown && totalDigits == integerDigits) { @@ -1802,17 +1884,17 @@ public class DecimalFormat extends NumberFormat { iFieldEnd = result.length(); } delegate.formatted(INTEGER_FIELD, Field.INTEGER, Field.INTEGER, - iFieldStart, iFieldEnd, result); + iFieldStart, iFieldEnd, result); if (addedDecimalSeparator) { delegate.formatted(Field.DECIMAL_SEPARATOR, - Field.DECIMAL_SEPARATOR, - iFieldEnd, fFieldStart, result); + Field.DECIMAL_SEPARATOR, + iFieldEnd, fFieldStart, result); } if (fFieldStart == -1) { fFieldStart = result.length(); } delegate.formatted(FRACTION_FIELD, Field.FRACTION, Field.FRACTION, - fFieldStart, result.length(), result); + fFieldStart, result.length(), result); // The exponent is output using the pattern-specified minimum // exponent digits. There is no maximum limit to the exponent @@ -1823,7 +1905,7 @@ public class DecimalFormat extends NumberFormat { result.append(symbols.getExponentSeparator()); delegate.formatted(Field.EXPONENT_SYMBOL, Field.EXPONENT_SYMBOL, - fieldStart, result.length(), result); + fieldStart, result.length(), result); // For zero values, we force the exponent to zero. We // must do this here, and not earlier, because the value @@ -1838,7 +1920,7 @@ public class DecimalFormat extends NumberFormat { fieldStart = result.length(); result.append(symbols.getMinusSign()); delegate.formatted(Field.EXPONENT_SIGN, Field.EXPONENT_SIGN, - fieldStart, result.length(), result); + fieldStart, result.length(), result); } digitList.set(negativeExponent, exponent); @@ -1849,10 +1931,10 @@ public class DecimalFormat extends NumberFormat { } for (int i=0; i0 && (groupingSize != 0) && - (i % groupingSize == 0)) { + (i % groupingSize == 0)) { int gStart = result.length(); result.append(grouping); delegate.formatted(Field.GROUPING_SEPARATOR, - Field.GROUPING_SEPARATOR, gStart, - result.length(), result); + Field.GROUPING_SEPARATOR, gStart, + result.length(), result); } } // Determine whether or not there are any printable fractional // digits. If we've used up the digits we know there aren't. boolean fractionPresent = (minFraDigits > 0) || - (!isInteger && digitIndex < digitList.count); + (!isInteger && digitIndex < digitList.count); // If there is no fraction present, and we haven't printed any // integer digits, then print a zero. Otherwise we won't print @@ -1911,7 +1993,7 @@ public class DecimalFormat extends NumberFormat { } delegate.formatted(INTEGER_FIELD, Field.INTEGER, Field.INTEGER, - iFieldStart, result.length(), result); + iFieldStart, result.length(), result); // Output the decimal separator if we always do so. int sStart = result.length(); @@ -1921,8 +2003,8 @@ public class DecimalFormat extends NumberFormat { if (sStart != result.length()) { delegate.formatted(Field.DECIMAL_SEPARATOR, - Field.DECIMAL_SEPARATOR, - sStart, result.length(), result); + Field.DECIMAL_SEPARATOR, + sStart, result.length(), result); } int fFieldStart = result.length(); @@ -1934,7 +2016,7 @@ public class DecimalFormat extends NumberFormat { // we have an integer, so there is no fractional stuff to // display, or we're out of significant digits. if (i >= minFraDigits && - (isInteger || digitIndex >= digitList.count)) { + (isInteger || digitIndex >= digitList.count)) { break; } @@ -1957,18 +2039,8 @@ public class DecimalFormat extends NumberFormat { // Record field information for caller. delegate.formatted(FRACTION_FIELD, Field.FRACTION, Field.FRACTION, - fFieldStart, result.length(), result); + fFieldStart, result.length(), result); } - - if (isNegative) { - append(result, negativeSuffix, delegate, - getNegativeSuffixFieldPositions(), Field.SIGN); - } else { - append(result, positiveSuffix, delegate, - getPositiveSuffixFieldPositions(), Field.SIGN); - } - - return result; } /** @@ -2209,19 +2281,18 @@ public class DecimalFormat extends NumberFormat { * whether the value was infinite and whether it was positive. */ private final boolean subparse(String text, ParsePosition parsePosition, - String positivePrefix, String negativePrefix, - DigitList digits, boolean isExponent, - boolean status[]) { + String positivePrefix, String negativePrefix, + DigitList digits, boolean isExponent, + boolean status[]) { int position = parsePosition.index; int oldStart = parsePosition.index; - int backup; boolean gotPositive, gotNegative; // check for positivePrefix; take longest gotPositive = text.regionMatches(position, positivePrefix, 0, - positivePrefix.length()); + positivePrefix.length()); gotNegative = text.regionMatches(position, negativePrefix, 0, - negativePrefix.length()); + negativePrefix.length()); if (gotPositive && gotNegative) { if (positivePrefix.length() > negativePrefix.length()) { @@ -2240,10 +2311,75 @@ public class DecimalFormat extends NumberFormat { return false; } + position = subparseNumber(text, position, digits, true, isExponent, status); + if (position == -1) { + parsePosition.index = oldStart; + parsePosition.errorIndex = oldStart; + return false; + } + + // Check for suffix + if (!isExponent) { + if (gotPositive) { + gotPositive = text.regionMatches(position,positiveSuffix,0, + positiveSuffix.length()); + } + if (gotNegative) { + gotNegative = text.regionMatches(position,negativeSuffix,0, + negativeSuffix.length()); + } + + // If both match, take longest + if (gotPositive && gotNegative) { + if (positiveSuffix.length() > negativeSuffix.length()) { + gotNegative = false; + } else if (positiveSuffix.length() < negativeSuffix.length()) { + gotPositive = false; + } + } + + // Fail if neither or both + if (gotPositive == gotNegative) { + parsePosition.errorIndex = position; + return false; + } + + parsePosition.index = position + + (gotPositive ? positiveSuffix.length() : negativeSuffix.length()); // mark success! + } else { + parsePosition.index = position; + } + + status[STATUS_POSITIVE] = gotPositive; + if (parsePosition.index == oldStart) { + parsePosition.errorIndex = position; + return false; + } + return true; + } + + /** + * Parses a number from the given {@code text}. The text is parsed + * beginning at position, until an unparseable character is seen. + * + * @param text the string to parse + * @param position the position at which parsing begins + * @param digits the DigitList to set to the parsed value + * @param checkExponent whether to check for exponential number + * @param isExponent if the exponential part is encountered + * @param status upon return contains boolean status flags indicating + * whether the value is infinite and whether it is + * positive + * @return returns the position of the first unparseable character or + * -1 in case of no valid number parsed + */ + int subparseNumber(String text, int position, + DigitList digits, boolean checkExponent, + boolean isExponent, boolean status[]) { // process digits or Inf, find decimal position status[STATUS_INFINITE] = false; if (!isExponent && text.regionMatches(position,symbols.getInfinity(),0, - symbols.getInfinity().length())) { + symbols.getInfinity().length())) { position += symbols.getInfinity().length(); status[STATUS_INFINITE] = true; } else { @@ -2257,8 +2393,8 @@ public class DecimalFormat extends NumberFormat { digits.decimalAt = digits.count = 0; char zero = symbols.getZeroDigit(); char decimal = isCurrencyFormat ? - symbols.getMonetaryDecimalSeparator() : - symbols.getDecimalSeparator(); + symbols.getMonetaryDecimalSeparator() : + symbols.getDecimalSeparator(); char grouping = symbols.getGroupingSeparator(); String exponentString = symbols.getExponentSeparator(); boolean sawDecimal = false; @@ -2270,7 +2406,7 @@ public class DecimalFormat extends NumberFormat { // pin when the maximum allowable digits is reached. int digitCount = 0; - backup = -1; + int backup = -1; for (; position < text.length(); ++position) { char ch = text.charAt(position); @@ -2334,15 +2470,15 @@ public class DecimalFormat extends NumberFormat { // require that they be followed by a digit. Otherwise // we backup and reprocess them. backup = position; - } else if (!isExponent && text.regionMatches(position, exponentString, 0, exponentString.length()) - && !sawExponent) { + } else if (checkExponent && !isExponent && text.regionMatches(position, exponentString, 0, exponentString.length()) + && !sawExponent) { // Process the exponent by recursively calling this method. - ParsePosition pos = new ParsePosition(position + exponentString.length()); + ParsePosition pos = new ParsePosition(position + exponentString.length()); boolean[] stat = new boolean[STATUS_LENGTH]; DigitList exponentDigits = new DigitList(); if (subparse(text, pos, "", Character.toString(symbols.getMinusSign()), exponentDigits, true, stat) && - exponentDigits.fitsIntoLong(stat[STATUS_POSITIVE], true)) { + exponentDigits.fitsIntoLong(stat[STATUS_POSITIVE], true)) { position = pos.index; // Advance past the exponent exponent = (int)exponentDigits.getLong(); if (!stat[STATUS_POSITIVE]) { @@ -2373,50 +2509,11 @@ public class DecimalFormat extends NumberFormat { // parse "$" with pattern "$#0.00". (return index 0 and error // index 1). if (!sawDigit && digitCount == 0) { - parsePosition.index = oldStart; - parsePosition.errorIndex = oldStart; - return false; + return -1; } } + return position; - // check for suffix - if (!isExponent) { - if (gotPositive) { - gotPositive = text.regionMatches(position,positiveSuffix,0, - positiveSuffix.length()); - } - if (gotNegative) { - gotNegative = text.regionMatches(position,negativeSuffix,0, - negativeSuffix.length()); - } - - // if both match, take longest - if (gotPositive && gotNegative) { - if (positiveSuffix.length() > negativeSuffix.length()) { - gotNegative = false; - } else if (positiveSuffix.length() < negativeSuffix.length()) { - gotPositive = false; - } - } - - // fail if neither or both - if (gotPositive == gotNegative) { - parsePosition.errorIndex = position; - return false; - } - - parsePosition.index = position + - (gotPositive ? positiveSuffix.length() : negativeSuffix.length()); // mark success! - } else { - parsePosition.index = position; - } - - status[STATUS_POSITIVE] = gotPositive; - if (parsePosition.index == oldStart) { - parsePosition.errorIndex = position; - return false; - } - return true; } /** diff --git a/src/java.base/share/classes/java/text/NumberFormat.java b/src/java.base/share/classes/java/text/NumberFormat.java index a1de3fe8f2f..c6aa4c79508 100644 --- a/src/java.base/share/classes/java/text/NumberFormat.java +++ b/src/java.base/share/classes/java/text/NumberFormat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,13 +47,11 @@ import java.math.RoundingMode; import java.text.spi.NumberFormatProvider; import java.util.Currency; import java.util.HashMap; -import java.util.Hashtable; import java.util.Locale; import java.util.Map; -import java.util.ResourceBundle; +import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import java.util.spi.LocaleServiceProvider; import sun.util.locale.provider.LocaleProviderAdapter; import sun.util.locale.provider.LocaleServiceProviderPool; @@ -112,9 +110,12 @@ import sun.util.locale.provider.LocaleServiceProviderPool; * Use getInstance or getNumberInstance to get the * normal number format. Use getIntegerInstance to get an * integer number format. Use getCurrencyInstance to get the - * currency number format. And use getPercentInstance to get a - * format for displaying percentages. With this format, a fraction like - * 0.53 is displayed as 53%. + * currency number format. Use {@code getCompactNumberInstance} to get the + * compact number format to format a number in shorter form. For example, + * {@code 2000} can be formatted as {@code "2K"} in + * {@link java.util.Locale#US US locale}. Use getPercentInstance + * to get a format for displaying percentages. With this format, a fraction + * like 0.53 is displayed as 53%. * *

    * You can also control the display of numbers with such methods as @@ -122,9 +123,10 @@ import sun.util.locale.provider.LocaleServiceProviderPool; * If you want even more control over the format or parsing, * or want to give your users more control, * you can try casting the NumberFormat you get from the factory methods - * to a DecimalFormat. This will work for the vast majority - * of locales; just remember to put it in a try block in case you - * encounter an unusual one. + * to a {@code DecimalFormat} or {@code CompactNumberFormat} depending on + * the factory method used. This will work for the vast majority of locales; + * just remember to put it in a try block in case you encounter + * an unusual one. * *

    * NumberFormat and DecimalFormat are designed such that some controls @@ -201,6 +203,7 @@ import sun.util.locale.provider.LocaleServiceProviderPool; * * @see DecimalFormat * @see ChoiceFormat + * @see CompactNumberFormat * @author Mark Davis * @author Helena Shih * @since 1.1 @@ -472,7 +475,7 @@ public abstract class NumberFormat extends Format { * formatting */ public static final NumberFormat getInstance() { - return getInstance(Locale.getDefault(Locale.Category.FORMAT), NUMBERSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), null, NUMBERSTYLE); } /** @@ -485,7 +488,7 @@ public abstract class NumberFormat extends Format { * formatting */ public static NumberFormat getInstance(Locale inLocale) { - return getInstance(inLocale, NUMBERSTYLE); + return getInstance(inLocale, null, NUMBERSTYLE); } /** @@ -501,7 +504,7 @@ public abstract class NumberFormat extends Format { * @see java.util.Locale.Category#FORMAT */ public static final NumberFormat getNumberInstance() { - return getInstance(Locale.getDefault(Locale.Category.FORMAT), NUMBERSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), null, NUMBERSTYLE); } /** @@ -512,7 +515,7 @@ public abstract class NumberFormat extends Format { * formatting */ public static NumberFormat getNumberInstance(Locale inLocale) { - return getInstance(inLocale, NUMBERSTYLE); + return getInstance(inLocale, null, NUMBERSTYLE); } /** @@ -534,7 +537,7 @@ public abstract class NumberFormat extends Format { * @since 1.4 */ public static final NumberFormat getIntegerInstance() { - return getInstance(Locale.getDefault(Locale.Category.FORMAT), INTEGERSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), null, INTEGERSTYLE); } /** @@ -551,7 +554,7 @@ public abstract class NumberFormat extends Format { * @since 1.4 */ public static NumberFormat getIntegerInstance(Locale inLocale) { - return getInstance(inLocale, INTEGERSTYLE); + return getInstance(inLocale, null, INTEGERSTYLE); } /** @@ -566,7 +569,7 @@ public abstract class NumberFormat extends Format { * @see java.util.Locale.Category#FORMAT */ public static final NumberFormat getCurrencyInstance() { - return getInstance(Locale.getDefault(Locale.Category.FORMAT), CURRENCYSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), null, CURRENCYSTYLE); } /** @@ -576,7 +579,7 @@ public abstract class NumberFormat extends Format { * @return the {@code NumberFormat} instance for currency formatting */ public static NumberFormat getCurrencyInstance(Locale inLocale) { - return getInstance(inLocale, CURRENCYSTYLE); + return getInstance(inLocale, null, CURRENCYSTYLE); } /** @@ -591,7 +594,7 @@ public abstract class NumberFormat extends Format { * @see java.util.Locale.Category#FORMAT */ public static final NumberFormat getPercentInstance() { - return getInstance(Locale.getDefault(Locale.Category.FORMAT), PERCENTSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), null, PERCENTSTYLE); } /** @@ -601,14 +604,14 @@ public abstract class NumberFormat extends Format { * @return the {@code NumberFormat} instance for percentage formatting */ public static NumberFormat getPercentInstance(Locale inLocale) { - return getInstance(inLocale, PERCENTSTYLE); + return getInstance(inLocale, null, PERCENTSTYLE); } /** * Returns a scientific format for the current default locale. */ /*public*/ final static NumberFormat getScientificInstance() { - return getInstance(Locale.getDefault(Locale.Category.FORMAT), SCIENTIFICSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), null, SCIENTIFICSTYLE); } /** @@ -617,7 +620,50 @@ public abstract class NumberFormat extends Format { * @param inLocale the desired locale */ /*public*/ static NumberFormat getScientificInstance(Locale inLocale) { - return getInstance(inLocale, SCIENTIFICSTYLE); + return getInstance(inLocale, null, SCIENTIFICSTYLE); + } + + /** + * Returns a compact number format for the default + * {@link java.util.Locale.Category#FORMAT FORMAT} locale with + * {@link NumberFormat.Style#SHORT "SHORT"} format style. + * + * @return A {@code NumberFormat} instance for compact number + * formatting + * + * @see CompactNumberFormat + * @see NumberFormat.Style + * @see java.util.Locale#getDefault(java.util.Locale.Category) + * @see java.util.Locale.Category#FORMAT + * @since 12 + */ + public static NumberFormat getCompactNumberInstance() { + return getInstance(Locale.getDefault( + Locale.Category.FORMAT), NumberFormat.Style.SHORT, COMPACTSTYLE); + } + + /** + * Returns a compact number format for the specified {@link java.util.Locale locale} + * and {@link NumberFormat.Style formatStyle}. + * + * @param locale the desired locale + * @param formatStyle the style for formatting a number + * @return A {@code NumberFormat} instance for compact number + * formatting + * @throws NullPointerException if {@code locale} or {@code formatStyle} + * is {@code null} + * + * @see CompactNumberFormat + * @see NumberFormat.Style + * @see java.util.Locale + * @since 12 + */ + public static NumberFormat getCompactNumberInstance(Locale locale, + NumberFormat.Style formatStyle) { + + Objects.requireNonNull(locale); + Objects.requireNonNull(formatStyle); + return getInstance(locale, formatStyle, COMPACTSTYLE); } /** @@ -900,20 +946,22 @@ public abstract class NumberFormat extends Format { // =======================privates=============================== private static NumberFormat getInstance(Locale desiredLocale, - int choice) { + Style formatStyle, int choice) { LocaleProviderAdapter adapter; adapter = LocaleProviderAdapter.getAdapter(NumberFormatProvider.class, - desiredLocale); - NumberFormat numberFormat = getInstance(adapter, desiredLocale, choice); + desiredLocale); + NumberFormat numberFormat = getInstance(adapter, desiredLocale, + formatStyle, choice); if (numberFormat == null) { numberFormat = getInstance(LocaleProviderAdapter.forJRE(), - desiredLocale, choice); + desiredLocale, formatStyle, choice); } return numberFormat; } private static NumberFormat getInstance(LocaleProviderAdapter adapter, - Locale locale, int choice) { + Locale locale, Style formatStyle, + int choice) { NumberFormatProvider provider = adapter.getNumberFormatProvider(); NumberFormat numberFormat = null; switch (choice) { @@ -929,6 +977,9 @@ public abstract class NumberFormat extends Format { case INTEGERSTYLE: numberFormat = provider.getIntegerInstance(locale); break; + case COMPACTSTYLE: + numberFormat = provider.getCompactNumberInstance(locale, formatStyle); + break; } return numberFormat; } @@ -1001,6 +1052,7 @@ public abstract class NumberFormat extends Format { private static final int PERCENTSTYLE = 2; private static final int SCIENTIFICSTYLE = 3; private static final int INTEGERSTYLE = 4; + private static final int COMPACTSTYLE = 5; /** * True if the grouping (i.e. thousands) separator is used when @@ -1276,5 +1328,43 @@ public abstract class NumberFormat extends Format { * Constant identifying the exponent sign field. */ public static final Field EXPONENT_SIGN = new Field("exponent sign"); + + /** + * Constant identifying the prefix field. + * + * @since 12 + */ + public static final Field PREFIX = new Field("prefix"); + + /** + * Constant identifying the suffix field. + * + * @since 12 + */ + public static final Field SUFFIX = new Field("suffix"); + } + + /** + * A number format style. + *

    + * {@code Style} is an enum which represents the style for formatting + * a number within a given {@code NumberFormat} instance. + * + * @see CompactNumberFormat + * @see NumberFormat#getCompactNumberInstance(Locale, Style) + * @since 12 + */ + public enum Style { + + /** + * The {@code SHORT} number format style. + */ + SHORT, + + /** + * The {@code LONG} number format style. + */ + LONG + } } diff --git a/src/java.base/share/classes/java/text/spi/NumberFormatProvider.java b/src/java.base/share/classes/java/text/spi/NumberFormatProvider.java index a375b69f485..9698bd22206 100644 --- a/src/java.base/share/classes/java/text/spi/NumberFormatProvider.java +++ b/src/java.base/share/classes/java/text/spi/NumberFormatProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -110,4 +110,37 @@ public abstract class NumberFormatProvider extends LocaleServiceProvider { * @see java.text.NumberFormat#getPercentInstance(java.util.Locale) */ public abstract NumberFormat getPercentInstance(Locale locale); + + /** + * Returns a new {@code NumberFormat} instance which formats + * a number in its compact form for the specified + * {@code locale} and {@code formatStyle}. + * + * @implSpec The default implementation of this method throws + * {@code UnSupportedOperationException}. Overriding the implementation + * of this method returns the compact number formatter instance + * of the given {@code locale} with specified {@code formatStyle}. + * + * @param locale the desired locale + * @param formatStyle the style for formatting a number + * @throws NullPointerException if {@code locale} or {@code formatStyle} + * is {@code null} + * @throws IllegalArgumentException if {@code locale} is not + * one of the locales returned from + * {@link java.util.spi.LocaleServiceProvider#getAvailableLocales() + * getAvailableLocales()}. + * @return a compact number formatter + * + * @see java.text.NumberFormat#getCompactNumberInstance(Locale, + * NumberFormat.Style) + * @since 12 + */ + public NumberFormat getCompactNumberInstance(Locale locale, + NumberFormat.Style formatStyle) { + throw new UnsupportedOperationException( + "The " + this.getClass().getName() + " should override this" + + " method to return compact number format instance of " + + locale + " locale and " + formatStyle + " style."); + } + } diff --git a/src/java.base/share/classes/java/util/EnumSet.java b/src/java.base/share/classes/java/util/EnumSet.java index 3b61a4b0b54..882b90135c4 100644 --- a/src/java.base/share/classes/java/util/EnumSet.java +++ b/src/java.base/share/classes/java/util/EnumSet.java @@ -463,7 +463,7 @@ public abstract class EnumSet> extends AbstractSet /** * Returns a - * + * * SerializationProxy * representing the state of this instance. * diff --git a/src/java.base/share/classes/java/util/ImmutableCollections.java b/src/java.base/share/classes/java/util/ImmutableCollections.java index c352972b89f..5a5a3de090d 100644 --- a/src/java.base/share/classes/java/util/ImmutableCollections.java +++ b/src/java.base/share/classes/java/util/ImmutableCollections.java @@ -1091,9 +1091,9 @@ final class CollSer implements Serializable { * Creates and returns an immutable collection from this proxy class. * The instance returned is created as if by calling one of the * static factory methods for - * List, - * Map, or - * Set. + * List, + * Map, or + * Set. * This proxy class is the serial form for all immutable collection instances, * regardless of implementation type. This is necessary to ensure that the * existence of any particular implementation type is kept out of the diff --git a/src/java.base/share/classes/java/util/Locale.java b/src/java.base/share/classes/java/util/Locale.java index 50f92e2ec14..d1f27f9df41 100644 --- a/src/java.base/share/classes/java/util/Locale.java +++ b/src/java.base/share/classes/java/util/Locale.java @@ -2226,10 +2226,10 @@ public final class Locale implements Cloneable, Serializable { default: return Arrays.stream(stringList).reduce("", (s1, s2) -> { - if (s1.equals("")) { + if (s1.isEmpty()) { return s2; } - if (s2.equals("")) { + if (s2.isEmpty()) { return s1; } return MessageFormat.format(pattern, s1, s2); @@ -3069,7 +3069,7 @@ public final class Locale implements Cloneable, Serializable { private static boolean isSubtagIllFormed(String subtag, boolean isFirstSubtag) { - if (subtag.equals("") || subtag.length() > 8) { + if (subtag.isEmpty() || subtag.length() > 8) { return true; } else if (subtag.equals("*")) { return false; diff --git a/src/java.base/share/classes/java/util/jar/Pack200.java b/src/java.base/share/classes/java/util/jar/Pack200.java index 63ea27621d3..571035caeb9 100644 --- a/src/java.base/share/classes/java/util/jar/Pack200.java +++ b/src/java.base/share/classes/java/util/jar/Pack200.java @@ -704,7 +704,7 @@ public abstract class Pack200 { if (impl == null) { // The first time, we must decide which class to use. implName = GetPropertyAction.privilegedGetProperty(prop,""); - if (implName != null && !implName.equals("")) + if (implName != null && !implName.isEmpty()) impl = Class.forName(implName); else if (PACK_PROVIDER.equals(prop)) impl = com.sun.java.util.jar.pack.PackerImpl.class; diff --git a/src/java.base/share/classes/java/util/regex/Pattern.java b/src/java.base/share/classes/java/util/regex/Pattern.java index 50e9be8415c..153303c7f99 100644 --- a/src/java.base/share/classes/java/util/regex/Pattern.java +++ b/src/java.base/share/classes/java/util/regex/Pattern.java @@ -1290,7 +1290,7 @@ public final class Pattern // Construct result int resultSize = matchList.size(); if (limit == 0) - while (resultSize > 0 && matchList.get(resultSize-1).equals("")) + while (resultSize > 0 && matchList.get(resultSize-1).isEmpty()) resultSize--; String[] result = new String[resultSize]; return matchList.subList(0, resultSize).toArray(result); diff --git a/src/java.base/share/classes/javax/crypto/Cipher.java b/src/java.base/share/classes/javax/crypto/Cipher.java index 8340bc344b2..cafd629cc27 100644 --- a/src/java.base/share/classes/javax/crypto/Cipher.java +++ b/src/java.base/share/classes/javax/crypto/Cipher.java @@ -531,7 +531,7 @@ public class Cipher { public static final Cipher getInstance(String transformation) throws NoSuchAlgorithmException, NoSuchPaddingException { - if ((transformation == null) || transformation.equals("")) { + if ((transformation == null) || transformation.isEmpty()) { throw new NoSuchAlgorithmException("Null or empty transformation"); } List transforms = getTransforms(transformation); @@ -631,7 +631,7 @@ public class Cipher { throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException { - if ((transformation == null) || transformation.equals("")) { + if ((transformation == null) || transformation.isEmpty()) { throw new NoSuchAlgorithmException("Null or empty transformation"); } if ((provider == null) || (provider.length() == 0)) { @@ -698,7 +698,7 @@ public class Cipher { Provider provider) throws NoSuchAlgorithmException, NoSuchPaddingException { - if ((transformation == null) || transformation.equals("")) { + if ((transformation == null) || transformation.isEmpty()) { throw new NoSuchAlgorithmException("Null or empty transformation"); } if (provider == null) { @@ -2840,4 +2840,4 @@ public class Cipher { sb.append(", algorithm from: ").append(getProviderName()); return sb.toString(); } -} \ No newline at end of file +} diff --git a/src/java.base/share/classes/javax/net/ssl/SSLParameters.java b/src/java.base/share/classes/javax/net/ssl/SSLParameters.java index 1c3c947035e..5df0d7becdd 100644 --- a/src/java.base/share/classes/javax/net/ssl/SSLParameters.java +++ b/src/java.base/share/classes/javax/net/ssl/SSLParameters.java @@ -668,7 +668,7 @@ public class SSLParameters { String[] tempProtocols = protocols.clone(); for (String p : tempProtocols) { - if (p == null || p.equals("")) { + if (p == null || p.isEmpty()) { throw new IllegalArgumentException( "An element of protocols was null/empty"); } diff --git a/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java b/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java index d544e4c0deb..6a75ff53112 100644 --- a/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java +++ b/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystem.java @@ -105,14 +105,6 @@ class JrtFileSystem extends FileSystem { cleanup(); } - @Override - @SuppressWarnings("deprecation") - protected void finalize() throws Throwable { - try { - cleanup(); - } catch (IOException ignored) {} - } - @Override public FileSystemProvider provider() { return provider; diff --git a/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java b/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java index ff1fa0f2ddb..1dc4acd65b7 100644 --- a/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java +++ b/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java @@ -97,10 +97,10 @@ public class URLClassPath { JAVA_VERSION = props.getProperty("java.version"); DEBUG = (props.getProperty("sun.misc.URLClassPath.debug") != null); String p = props.getProperty("sun.misc.URLClassPath.disableJarChecking"); - DISABLE_JAR_CHECKING = p != null ? p.equals("true") || p.equals("") : false; + DISABLE_JAR_CHECKING = p != null ? p.equals("true") || p.isEmpty() : false; p = props.getProperty("jdk.net.URLClassPath.disableRestrictedPermissions"); - DISABLE_ACC_CHECKING = p != null ? p.equals("true") || p.equals("") : false; + DISABLE_ACC_CHECKING = p != null ? p.equals("true") || p.isEmpty() : false; // This property will be removed in a later release p = props.getProperty("jdk.net.URLClassPath.disableClassPathURLCheck", "true"); @@ -805,7 +805,7 @@ public class URLClassPath { private JarFile getJarFile(URL url) throws IOException { // Optimize case where url refers to a local jar file if (isOptimizable(url)) { - FileURLMapper p = new FileURLMapper (url); + FileURLMapper p = new FileURLMapper(url); if (!p.exists()) { throw new FileNotFoundException(p.getPath()); } diff --git a/src/java.base/share/classes/jdk/internal/module/ArchivedModuleGraph.java b/src/java.base/share/classes/jdk/internal/module/ArchivedModuleGraph.java index e433d85c5b7..6a92f052400 100644 --- a/src/java.base/share/classes/jdk/internal/module/ArchivedModuleGraph.java +++ b/src/java.base/share/classes/jdk/internal/module/ArchivedModuleGraph.java @@ -27,32 +27,40 @@ package jdk.internal.module; import java.lang.module.Configuration; import java.lang.module.ModuleFinder; +import java.util.Map; import java.util.Objects; +import java.util.Set; + import jdk.internal.misc.VM; /** * Used by ModuleBootstrap to obtain the archived system modules and finder. */ final class ArchivedModuleGraph { - private static String archivedMainModule; - private static SystemModules archivedSystemModules; - private static ModuleFinder archivedModuleFinder; - private static Configuration archivedConfiguration; + private static ArchivedModuleGraph archivedModuleGraph; - private final SystemModules systemModules; + private final String mainModule; + private final boolean hasSplitPackages; + private final boolean hasIncubatorModules; private final ModuleFinder finder; private final Configuration configuration; + private final Map> concealedPackagesToOpen; + private final Map> exportedPackagesToOpen; - private ArchivedModuleGraph(SystemModules modules, + private ArchivedModuleGraph(String mainModule, + boolean hasSplitPackages, + boolean hasIncubatorModules, ModuleFinder finder, - Configuration configuration) { - this.systemModules = modules; + Configuration configuration, + Map> concealedPackagesToOpen, + Map> exportedPackagesToOpen) { + this.mainModule = mainModule; + this.hasSplitPackages = hasSplitPackages; + this.hasIncubatorModules = hasIncubatorModules; this.finder = finder; this.configuration = configuration; - } - - SystemModules systemModules() { - return systemModules; + this.concealedPackagesToOpen = concealedPackagesToOpen; + this.exportedPackagesToOpen = exportedPackagesToOpen; } ModuleFinder finder() { @@ -63,32 +71,54 @@ final class ArchivedModuleGraph { return configuration; } - // A factory method that ModuleBootstrap can use to obtain the - // ArchivedModuleGraph. + Map> concealedPackagesToOpen() { + return concealedPackagesToOpen; + } + + Map> exportedPackagesToOpen() { + return exportedPackagesToOpen; + } + + boolean hasSplitPackages() { + return hasSplitPackages; + } + + boolean hasIncubatorModules() { + return hasIncubatorModules; + } + + /** + * Returns the ArchivedModuleGraph for the given initial module. + */ static ArchivedModuleGraph get(String mainModule) { - if (Objects.equals(mainModule, archivedMainModule) - && archivedSystemModules != null - && archivedModuleFinder != null - && archivedConfiguration != null) { - return new ArchivedModuleGraph(archivedSystemModules, - archivedModuleFinder, - archivedConfiguration); + ArchivedModuleGraph graph = archivedModuleGraph; + if (graph != null && Objects.equals(mainModule, graph.mainModule)) { + return graph; } else { return null; } } - // Used at CDS dump time + /** + * Archive the module graph for the given initial module. + */ static void archive(String mainModule, - SystemModules systemModules, + boolean hasSplitPackages, + boolean hasIncubatorModules, ModuleFinder finder, - Configuration configuration) { - if (archivedMainModule != null) + Configuration configuration, + Map> concealedPackagesToOpen, + Map> exportedPackagesToOpen) { + if (mainModule != null) { throw new UnsupportedOperationException(); - archivedMainModule = mainModule; - archivedSystemModules = systemModules; - archivedModuleFinder = finder; - archivedConfiguration = configuration; + } + archivedModuleGraph = new ArchivedModuleGraph(mainModule, + hasSplitPackages, + hasIncubatorModules, + finder, + configuration, + concealedPackagesToOpen, + exportedPackagesToOpen); } static { diff --git a/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java b/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java index 89c998cb1d2..b9138935435 100644 --- a/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java +++ b/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java @@ -172,6 +172,8 @@ public final class ModuleBootstrap { boolean haveModulePath = (appModulePath != null || upgradeModulePath != null); boolean needResolution = true; boolean canArchive = false; + boolean hasSplitPackages; + boolean hasIncubatorModules; // If the java heap was archived at CDS dump time and the environment // at dump time matches the current environment then use the archived @@ -182,8 +184,9 @@ public final class ModuleBootstrap { && addModules.isEmpty() && limitModules.isEmpty() && !isPatched) { - systemModules = archivedModuleGraph.systemModules(); systemModuleFinder = archivedModuleGraph.finder(); + hasSplitPackages = archivedModuleGraph.hasSplitPackages(); + hasIncubatorModules = archivedModuleGraph.hasIncubatorModules(); needResolution = (traceOutput != null); } else { if (!haveModulePath && addModules.isEmpty() && limitModules.isEmpty()) { @@ -205,6 +208,11 @@ public final class ModuleBootstrap { systemModules = new ExplodedSystemModules(); systemModuleFinder = SystemModuleFinders.ofSystem(); } + + hasSplitPackages = systemModules.hasSplitPackages(); + hasIncubatorModules = systemModules.hasIncubatorModules(); + // not using the archived module graph - avoid accidental use + archivedModuleGraph = null; } Counters.add("jdk.module.boot.1.systemModulesTime", t1); @@ -395,7 +403,7 @@ public final class ModuleBootstrap { } // check for split packages in the modules mapped to the built-in loaders - if (systemModules.hasSplitPackages() || isPatched || haveModulePath) { + if (hasSplitPackages || isPatched || haveModulePath) { checkSplitPackages(cf, clf); } @@ -415,7 +423,7 @@ public final class ModuleBootstrap { // Step 7: Miscellaneous // check incubating status - if (systemModules.hasIncubatorModules() || haveModulePath) { + if (hasIncubatorModules || haveModulePath) { checkIncubatingStatus(cf); } @@ -423,7 +431,21 @@ public final class ModuleBootstrap { long t7 = System.nanoTime(); addExtraReads(bootLayer); boolean extraExportsOrOpens = addExtraExportsAndOpens(bootLayer); - addIllegalAccess(upgradeModulePath, systemModules, bootLayer, extraExportsOrOpens); + + Map> concealedPackagesToOpen; + Map> exportedPackagesToOpen; + if (archivedModuleGraph != null) { + concealedPackagesToOpen = archivedModuleGraph.concealedPackagesToOpen(); + exportedPackagesToOpen = archivedModuleGraph.exportedPackagesToOpen(); + } else { + concealedPackagesToOpen = systemModules.concealedPackagesToOpen(); + exportedPackagesToOpen = systemModules.exportedPackagesToOpen(); + } + addIllegalAccess(upgradeModulePath, + concealedPackagesToOpen, + exportedPackagesToOpen, + bootLayer, + extraExportsOrOpens); Counters.add("jdk.module.boot.7.adjustModulesTime", t7); // save module finders for later use @@ -436,8 +458,13 @@ public final class ModuleBootstrap { // Module graph can be archived at CDS dump time. Only allow the // unnamed module case for now. if (canArchive && (mainModule == null)) { - ArchivedModuleGraph.archive(mainModule, systemModules, - systemModuleFinder, cf); + ArchivedModuleGraph.archive(mainModule, + hasSplitPackages, + hasIncubatorModules, + systemModuleFinder, + cf, + concealedPackagesToOpen, + exportedPackagesToOpen); } // total time to initialize @@ -738,7 +765,8 @@ public final class ModuleBootstrap { * of system modules in the boot layer to code in unnamed modules. */ private static void addIllegalAccess(ModuleFinder upgradeModulePath, - SystemModules systemModules, + Map> concealedPackagesToOpen, + Map> exportedPackagesToOpen, ModuleLayer bootLayer, boolean extraExportsOrOpens) { String value = getAndRemoveProperty("jdk.module.illegalAccess"); @@ -764,13 +792,11 @@ public final class ModuleBootstrap { IllegalAccessLogger.Builder builder = new IllegalAccessLogger.Builder(mode, System.err); - Map> map1 = systemModules.concealedPackagesToOpen(); - Map> map2 = systemModules.exportedPackagesToOpen(); - if (map1.isEmpty() && map2.isEmpty()) { + if (concealedPackagesToOpen.isEmpty() && exportedPackagesToOpen.isEmpty()) { // need to generate (exploded build) IllegalAccessMaps maps = IllegalAccessMaps.generate(limitedFinder()); - map1 = maps.concealedPackagesToOpen(); - map2 = maps.exportedPackagesToOpen(); + concealedPackagesToOpen = maps.concealedPackagesToOpen(); + exportedPackagesToOpen = maps.exportedPackagesToOpen(); } // open specific packages in the system modules @@ -789,8 +815,8 @@ public final class ModuleBootstrap { continue; } - Set concealedPackages = map1.getOrDefault(name, Set.of()); - Set exportedPackages = map2.getOrDefault(name, Set.of()); + Set concealedPackages = concealedPackagesToOpen.getOrDefault(name, Set.of()); + Set exportedPackages = exportedPackagesToOpen.getOrDefault(name, Set.of()); // refresh the set of concealed and exported packages if needed if (extraExportsOrOpens) { diff --git a/src/java.base/share/classes/jdk/internal/util/SystemProps.java b/src/java.base/share/classes/jdk/internal/util/SystemProps.java index 24f8d1f0d8a..6209529007e 100644 --- a/src/java.base/share/classes/jdk/internal/util/SystemProps.java +++ b/src/java.base/share/classes/jdk/internal/util/SystemProps.java @@ -151,16 +151,18 @@ public final class SystemProps { String format) { // Do not override command line setting String baseValue = cmdProps.getProperty(base); - if (baseValue == null) { - // Not overridden on the command line; define the properties if there are platform defined values - baseValue = display; - } if (baseValue != null) { - cmdProps.put(base, baseValue); + return; // Do not override value from the command line + } + + // Not overridden on the command line; define the properties if there are platform defined values + if (display != null) { + cmdProps.put(base, display); + baseValue = display; } /* user.xxx.display property */ - String disp = base + ".display"; + String disp = base.concat(".display"); String dispValue = cmdProps.getProperty(disp); if (dispValue == null && display != null && !display.equals(baseValue)) { // Create the property only if different from the base property @@ -168,7 +170,7 @@ public final class SystemProps { } /* user.xxx.format property */ - String fmt = base + ".format"; + String fmt = base.concat(".format"); String fmtValue = cmdProps.getProperty(fmt); if (fmtValue == null && format != null && !format.equals(baseValue)) { // Create the property only if different than the base property diff --git a/src/java.base/share/classes/module-info.java b/src/java.base/share/classes/module-info.java index 19e9ba8c5ce..15e7dcd3343 100644 --- a/src/java.base/share/classes/module-info.java +++ b/src/java.base/share/classes/module-info.java @@ -79,6 +79,7 @@ module java.base { exports java.io; exports java.lang; exports java.lang.annotation; + exports java.lang.constant; exports java.lang.invoke; exports java.lang.module; exports java.lang.ref; diff --git a/src/java.base/share/classes/sun/invoke/util/Wrapper.java b/src/java.base/share/classes/sun/invoke/util/Wrapper.java index a9005ed421d..484b347550b 100644 --- a/src/java.base/share/classes/sun/invoke/util/Wrapper.java +++ b/src/java.base/share/classes/sun/invoke/util/Wrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,6 +47,7 @@ public enum Wrapper { private final Class wrapperType; private final Class primitiveType; private final char basicTypeChar; + private final String basicTypeString; private final Object emptyArray; private final int format; private final String wrapperSimpleName; @@ -56,6 +57,7 @@ public enum Wrapper { this.wrapperType = wtype; this.primitiveType = ptype; this.basicTypeChar = tchar; + this.basicTypeString = new String(new char[] {this.basicTypeChar}); this.emptyArray = emptyArray; this.format = format; this.wrapperSimpleName = wtypeName; @@ -459,6 +461,11 @@ public enum Wrapper { */ public char basicTypeChar() { return basicTypeChar; } + /** What is the bytecode signature string for this wrapper's + * primitive type? + */ + public String basicTypeString() { return basicTypeString; } + /** What is the simple name of the wrapper type? */ public String wrapperSimpleName() { return wrapperSimpleName; } @@ -581,9 +588,8 @@ public enum Wrapper { * Returns null for {@code VOID}. */ public Object wrap(int x) { - if (basicTypeChar == 'L') return (Integer)x; switch (basicTypeChar) { - case 'L': throw newIllegalArgumentException("cannot wrap to object type"); + case 'L': return (Integer)x; case 'V': return null; case 'I': return Integer.valueOf(x); case 'J': return Long.valueOf(x); diff --git a/src/java.base/share/classes/sun/net/www/protocol/jar/URLJarFile.java b/src/java.base/share/classes/sun/net/www/protocol/jar/URLJarFile.java index a320045ba75..de276174659 100644 --- a/src/java.base/share/classes/sun/net/www/protocol/jar/URLJarFile.java +++ b/src/java.base/share/classes/sun/net/www/protocol/jar/URLJarFile.java @@ -111,7 +111,7 @@ public class URLJarFile extends JarFile { * 'file:' URLs can be accessible through ftp. */ String host = url.getHost(); - if (host == null || host.equals("") || host.equals("~") || + if (host == null || host.isEmpty() || host.equals("~") || host.equalsIgnoreCase("localhost")) return true; } diff --git a/src/java.base/share/classes/sun/net/www/protocol/mailto/Handler.java b/src/java.base/share/classes/sun/net/www/protocol/mailto/Handler.java index 7207d5d0dbe..e9052397483 100644 --- a/src/java.base/share/classes/sun/net/www/protocol/mailto/Handler.java +++ b/src/java.base/share/classes/sun/net/www/protocol/mailto/Handler.java @@ -127,7 +127,7 @@ public class Handler extends URLStreamHandler { * Let's just make sure we DO have an Email address in the URL. */ boolean nogood = false; - if (file == null || file.equals("")) + if (file == null || file.isEmpty()) nogood = true; else { boolean allwhites = true; diff --git a/src/java.base/share/classes/sun/security/provider/PolicyFile.java b/src/java.base/share/classes/sun/security/provider/PolicyFile.java index c319964cd36..9bdc674fee3 100644 --- a/src/java.base/share/classes/sun/security/provider/PolicyFile.java +++ b/src/java.base/share/classes/sun/security/provider/PolicyFile.java @@ -1608,7 +1608,7 @@ public class PolicyFile extends java.security.Policy { if (u.getProtocol().equals("file")) { boolean isLocalFile = false; String host = u.getHost(); - isLocalFile = (host == null || host.equals("") || + isLocalFile = (host == null || host.isEmpty() || host.equals("~") || host.equalsIgnoreCase("localhost")); if (isLocalFile) { diff --git a/src/java.base/share/classes/sun/security/ssl/HandshakeHash.java b/src/java.base/share/classes/sun/security/ssl/HandshakeHash.java index 7e7731f27a8..9b485a5269f 100644 --- a/src/java.base/share/classes/sun/security/ssl/HandshakeHash.java +++ b/src/java.base/share/classes/sun/security/ssl/HandshakeHash.java @@ -518,10 +518,10 @@ final class HandshakeHash { JsseJce.getMessageDigest(cipherSuite.hashAlg.name); if (md instanceof Cloneable) { transcriptHash = new CloneableHash(md); - this.baos = null; + this.baos = new ByteArrayOutputStream(); } else { transcriptHash = new NonCloneableHash(md); - this.baos = new ByteArrayOutputStream(); + this.baos = null; } } @@ -550,26 +550,20 @@ final class HandshakeHash { static final class T13HandshakeHash implements TranscriptHash { private final TranscriptHash transcriptHash; - private final ByteArrayOutputStream baos; T13HandshakeHash(CipherSuite cipherSuite) { MessageDigest md = JsseJce.getMessageDigest(cipherSuite.hashAlg.name); if (md instanceof Cloneable) { transcriptHash = new CloneableHash(md); - this.baos = null; } else { transcriptHash = new NonCloneableHash(md); - this.baos = new ByteArrayOutputStream(); } } @Override public void update(byte[] input, int offset, int length) { transcriptHash.update(input, offset, length); - if (baos != null) { - baos.write(input, offset, length); - } } @Override @@ -579,13 +573,9 @@ final class HandshakeHash { @Override public byte[] archived() { - if (baos != null) { - return baos.toByteArray(); - } else { - return transcriptHash.archived(); - } - - // throw new UnsupportedOperationException("Not supported yet."); + // This method is not necessary in T13 + throw new UnsupportedOperationException( + "TLS 1.3 does not require archived."); } } diff --git a/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java b/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java index 37f475cedf9..dfce0220eb1 100644 --- a/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java +++ b/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java @@ -176,7 +176,11 @@ final class SSLSessionImpl extends ExtendedSSLSession { /* * Record a new session, using a given cipher spec, session ID, - * and creation time + * and creation time. + * Note: For the unmodifiable collections and lists we are creating new + * collections as inputs to avoid potential deep nesting of + * unmodifiable collections that can cause StackOverflowErrors + * (see JDK-6323374). */ SSLSessionImpl(HandshakeContext hc, CipherSuite cipherSuite, SessionId id, long creationTime) { @@ -187,10 +191,11 @@ final class SSLSessionImpl extends ExtendedSSLSession { this.port = hc.conContext.transport.getPeerPort(); this.localSupportedSignAlgs = hc.localSupportedSignAlgs == null ? Collections.emptySet() : - Collections.unmodifiableCollection(hc.localSupportedSignAlgs); + Collections.unmodifiableCollection( + new ArrayList<>(hc.localSupportedSignAlgs)); this.serverNameIndication = hc.negotiatedServerName; - this.requestedServerNames = Collections.unmodifiableList( - hc.getRequestedServerNames()); + this.requestedServerNames = Collections.unmodifiableList( + new ArrayList<>(hc.getRequestedServerNames())); if (hc.sslConfig.isClientMode) { this.useExtendedMasterSecret = (hc.handshakeExtensions.get( @@ -219,10 +224,8 @@ final class SSLSessionImpl extends ExtendedSSLSession { this.host = baseSession.getPeerHost(); this.port = baseSession.getPeerPort(); this.localSupportedSignAlgs = - baseSession.localSupportedSignAlgs == null ? - Collections.emptySet() : - Collections.unmodifiableCollection( - baseSession.localSupportedSignAlgs); + baseSession.localSupportedSignAlgs == null ? + Collections.emptySet() : baseSession.localSupportedSignAlgs; this.peerSupportedSignAlgs = baseSession.getPeerSupportedSignatureAlgorithms(); this.serverNameIndication = baseSession.serverNameIndication; diff --git a/src/java.base/share/classes/sun/security/ssl/ServerNameExtension.java b/src/java.base/share/classes/sun/security/ssl/ServerNameExtension.java index f14508b26d6..aae5f933b63 100644 --- a/src/java.base/share/classes/sun/security/ssl/ServerNameExtension.java +++ b/src/java.base/share/classes/sun/security/ssl/ServerNameExtension.java @@ -82,9 +82,15 @@ final class ServerNameExtension { // +2: Name length final List serverNames; + /* + * Note: For the unmodifiable collection we are creating new + * collections as inputs to avoid potential deep nesting of + * unmodifiable collections that can cause StackOverflowErrors + * (see JDK-6323374). + */ private CHServerNamesSpec(List serverNames) { - this.serverNames = - Collections.unmodifiableList(serverNames); + this.serverNames = Collections.unmodifiableList( + new ArrayList<>(serverNames)); } private CHServerNamesSpec(ByteBuffer buffer) throws IOException { diff --git a/src/java.base/share/classes/sun/security/util/ConsoleCallbackHandler.java b/src/java.base/share/classes/sun/security/util/ConsoleCallbackHandler.java index e29e0b15127..b5c1c0eb86d 100644 --- a/src/java.base/share/classes/sun/security/util/ConsoleCallbackHandler.java +++ b/src/java.base/share/classes/sun/security/util/ConsoleCallbackHandler.java @@ -103,7 +103,7 @@ public class ConsoleCallbackHandler implements CallbackHandler { System.err.flush(); String result = readLine(); - if (result.equals("")) { + if (result.isEmpty()) { result = nc.getDefaultName(); } @@ -212,7 +212,7 @@ public class ConsoleCallbackHandler implements CallbackHandler { prompt = ""; } prompt = prefix + prompt; - if (!prompt.equals("")) { + if (!prompt.isEmpty()) { System.err.println(prompt); } diff --git a/src/java.base/share/classes/sun/security/util/DomainName.java b/src/java.base/share/classes/sun/security/util/DomainName.java index 3f563cb8ea9..ee40ecb4aa2 100644 --- a/src/java.base/share/classes/sun/security/util/DomainName.java +++ b/src/java.base/share/classes/sun/security/util/DomainName.java @@ -363,7 +363,7 @@ class DomainName { } private static int numLabels(String rule) { - if (rule.equals("")) { + if (rule.isEmpty()) { return 0; } int len = rule.length(); diff --git a/src/java.base/share/classes/sun/security/x509/DNSName.java b/src/java.base/share/classes/sun/security/x509/DNSName.java index c9aa54aa73e..f0b8c27576a 100644 --- a/src/java.base/share/classes/sun/security/x509/DNSName.java +++ b/src/java.base/share/classes/sun/security/x509/DNSName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,16 +34,17 @@ import sun.security.util.*; * This class implements the DNSName as required by the GeneralNames * ASN.1 object. *

    - * [RFC2459] When the subjectAltName extension contains a domain name service + * [RFC5280] When the subjectAltName extension contains a domain name system * label, the domain name MUST be stored in the dNSName (an IA5String). - * The name MUST be in the "preferred name syntax," as specified by RFC - * 1034 [RFC 1034]. Note that while upper and lower case letters are - * allowed in domain names, no signifigance is attached to the case. In + * The name MUST be in the "preferred name syntax", as specified by + * Section 3.5 of [RFC1034] and as modified by Section 2.1 of + * [RFC1123]. Note that while uppercase and lowercase letters are + * allowed in domain names, no significance is attached to the case. In * addition, while the string " " is a legal domain name, subjectAltName - * extensions with a dNSName " " are not permitted. Finally, the use of - * the DNS representation for Internet mail addresses (wpolk.nist.gov - * instead of wpolk@nist.gov) is not permitted; such identities are to - * be encoded as rfc822Name. + * extensions with a dNSName of " " MUST NOT be used. Finally, the use + * of the DNS representation for Internet mail addresses + * (subscriber.example.com instead of subscriber@example.com) MUST NOT + * be used; such identities are to be encoded as rfc822Name. * * @author Amit Kapoor * @author Hemma Prafullchandra @@ -51,9 +52,8 @@ import sun.security.util.*; public class DNSName implements GeneralNameInterface { private String name; - private static final String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - private static final String digitsAndHyphen = "0123456789-"; - private static final String alphaDigitsAndHyphen = alpha + digitsAndHyphen; + private static final String alphaDigits = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; /** * Create the DNSName object from the passed encoded Der value. @@ -73,35 +73,38 @@ public class DNSName implements GeneralNameInterface { */ public DNSName(String name) throws IOException { if (name == null || name.length() == 0) - throw new IOException("DNS name must not be null"); - if (name.indexOf(' ') != -1) - throw new IOException("DNS names or NameConstraints with blank components are not permitted"); - if (name.charAt(0) == '.' || name.charAt(name.length() -1) == '.') - throw new IOException("DNS names or NameConstraints may not begin or end with a ."); - //Name will consist of label components separated by "." - //startIndex is the index of the first character of a component - //endIndex is the index of the last character of a component plus 1 - for (int endIndex,startIndex=0; startIndex < name.length(); startIndex = endIndex+1) { + throw new IOException("DNSName must not be null or empty"); + if (name.contains(" ")) + throw new IOException("DNSName with blank components is not permitted"); + if (name.startsWith(".") || name.endsWith(".")) + throw new IOException("DNSName may not begin or end with a ."); + /* + * Name will consist of label components separated by "." + * startIndex is the index of the first character of a component + * endIndex is the index of the last character of a component plus 1 + */ + for (int endIndex,startIndex = 0; startIndex < name.length(); startIndex = endIndex+1) { endIndex = name.indexOf('.', startIndex); if (endIndex < 0) { endIndex = name.length(); } - if ((endIndex-startIndex) < 1) - throw new IOException("DNSName SubjectAltNames with empty components are not permitted"); + if (endIndex - startIndex < 1) + throw new IOException("DNSName with empty components are not permitted"); - //DNSName components must begin with a letter A-Z or a-z - if (alpha.indexOf(name.charAt(startIndex)) < 0) - throw new IOException("DNSName components must begin with a letter"); + // RFC 1123: DNSName components must begin with a letter or digit + if (alphaDigits.indexOf(name.charAt(startIndex)) < 0) + throw new IOException("DNSName components must begin with a letter or digit"); //nonStartIndex: index for characters in the component beyond the first one for (int nonStartIndex=startIndex+1; nonStartIndex < endIndex; nonStartIndex++) { char x = name.charAt(nonStartIndex); - if ((alphaDigitsAndHyphen).indexOf(x) < 0) + if ((alphaDigits).indexOf(x) < 0 && x != '-') throw new IOException("DNSName components must consist of letters, digits, and hyphens"); } } this.name = name; } + /** * Return the type of the GeneralName. */ @@ -117,7 +120,7 @@ public class DNSName implements GeneralNameInterface { } /** - * Encode the DNS name into the DerOutputStream. + * Encode the DNSName into the DerOutputStream. * * @param out the DER stream to encode the DNSName to. * @exception IOException on encoding errors. @@ -137,7 +140,7 @@ public class DNSName implements GeneralNameInterface { * Compares this name with another, for equality. * * @return true iff the names are equivalent - * according to RFC2459. + * according to RFC5280. */ public boolean equals(Object obj) { if (this == obj) @@ -148,7 +151,7 @@ public class DNSName implements GeneralNameInterface { DNSName other = (DNSName)obj; - // RFC2459 mandates that these names are + // RFC5280 mandates that these names are // not case-sensitive return name.equalsIgnoreCase(other.name); } @@ -172,12 +175,14 @@ public class DNSName implements GeneralNameInterface { * . These results are used in checking NameConstraints during * certification path verification. *

    - * RFC2459: DNS name restrictions are expressed as foo.bar.com. Any subdomain - * satisfies the name constraint. For example, www.foo.bar.com would - * satisfy the constraint but bigfoo.bar.com would not. + * RFC5280: DNS name restrictions are expressed as host.example.com. + * Any DNS name that can be constructed by simply adding zero or more + * labels to the left-hand side of the name satisfies the name constraint. + * For example, www.host.example.com would satisfy the constraint but + * host1.example.com would not. *

    - * draft-ietf-pkix-new-part1-00.txt: DNS name restrictions are expressed as foo.bar.com. - * Any DNS name that + * draft-ietf-pkix-new-part1-00.txt: DNSName restrictions are expressed as foo.bar.com. + * Any DNSName that * can be constructed by simply adding to the left hand side of the name * satisfies the name constraint. For example, www.foo.bar.com would * satisfy the constraint but foo1.bar.com would not. diff --git a/src/java.base/share/classes/sun/security/x509/GeneralName.java b/src/java.base/share/classes/sun/security/x509/GeneralName.java index 1cc95ce79e6..996645434bb 100644 --- a/src/java.base/share/classes/sun/security/x509/GeneralName.java +++ b/src/java.base/share/classes/sun/security/x509/GeneralName.java @@ -112,7 +112,7 @@ public class GeneralName { encName.resetTag(DerValue.tag_IA5String); name = new DNSName(encName); } else { - throw new IOException("Invalid encoding of DNS name"); + throw new IOException("Invalid encoding of DNSName"); } break; diff --git a/src/java.base/share/classes/sun/security/x509/RFC822Name.java b/src/java.base/share/classes/sun/security/x509/RFC822Name.java index 57d5ffdd8a2..8644254e5b5 100644 --- a/src/java.base/share/classes/sun/security/x509/RFC822Name.java +++ b/src/java.base/share/classes/sun/security/x509/RFC822Name.java @@ -246,7 +246,7 @@ public class RFC822Name implements GeneralNameInterface subtree=subtree.substring(atNdx+1); } - /* count dots in dnsname, adding one if dnsname preceded by @ */ + /* count dots in DNSName, adding one if DNSName preceded by @ */ for (; subtree.lastIndexOf('.') >= 0; i++) { subtree=subtree.substring(0,subtree.lastIndexOf('.')); } diff --git a/src/java.base/share/classes/sun/security/x509/URIName.java b/src/java.base/share/classes/sun/security/x509/URIName.java index 878d745a881..4820de87e11 100644 --- a/src/java.base/share/classes/sun/security/x509/URIName.java +++ b/src/java.base/share/classes/sun/security/x509/URIName.java @@ -131,13 +131,13 @@ public class URIName implements GeneralNameInterface { try { hostDNS = new DNSName(host); } catch (IOException ioe) { - // Not a valid DNS Name; see if it is a valid IPv4 + // Not a valid DNSName; see if it is a valid IPv4 // IPAddressName try { hostIP = new IPAddressName(host); } catch (Exception ioe2) { throw new IOException("invalid URI name (host " + - "portion is not a valid DNS name, IPv4 address," + + "portion is not a valid DNSName, IPv4 address," + " or IPv6 address):" + name); } } @@ -339,7 +339,7 @@ public class URIName implements GeneralNameInterface { // If one (or both) is an IP address, only same type constraintType = NAME_SAME_TYPE; } else { - // Both host portions are DNS names. Are they domains? + // Both host portions are DNSNames. Are they domains? boolean thisDomain = (host.charAt(0) == '.'); boolean otherDomain = (otherHost.charAt(0) == '.'); DNSName otherDNS = (DNSName) otherHostObject; diff --git a/src/java.base/share/classes/sun/security/x509/X500Name.java b/src/java.base/share/classes/sun/security/x509/X500Name.java index 07f0aedf8e8..6d5bf78cd9d 100644 --- a/src/java.base/share/classes/sun/security/x509/X500Name.java +++ b/src/java.base/share/classes/sun/security/x509/X500Name.java @@ -1213,7 +1213,7 @@ public class X500Name implements GeneralNameInterface, Principal { */ /* - * OID for "DC=" domain component attributes, used with DNS names in DN + * OID for "DC=" domain component attributes, used with DNSNames in DN * format */ DOMAIN_COMPONENT_OID = diff --git a/src/java.base/share/classes/sun/text/resources/FormatData.java b/src/java.base/share/classes/sun/text/resources/FormatData.java index 27228bff699..e93183ff9d0 100644 --- a/src/java.base/share/classes/sun/text/resources/FormatData.java +++ b/src/java.base/share/classes/sun/text/resources/FormatData.java @@ -796,6 +796,44 @@ public class FormatData extends ParallelListResourceBundle { "NaN", } }, + { "short.CompactNumberPatterns", + new String[] { + "", + "", + "", + "0K", + "00K", + "000K", + "0M", + "00M", + "000M", + "0B", + "00B", + "000B", + "0T", + "00T", + "000T", + } + }, + { "long.CompactNumberPatterns", + new String[] { + "", + "", + "", + "0 thousand", + "00 thousand", + "000 thousand", + "0 million", + "00 million", + "000 million", + "0 billion", + "00 billion", + "000 billion", + "0 trillion", + "00 trillion", + "000 trillion", + } + }, { "TimePatterns", new String[] { "h:mm:ss a z", // full time pattern diff --git a/src/java.base/share/classes/sun/util/locale/provider/LocaleResources.java b/src/java.base/share/classes/sun/util/locale/provider/LocaleResources.java index 5646d6d16aa..5b9c75e7765 100644 --- a/src/java.base/share/classes/sun/util/locale/provider/LocaleResources.java +++ b/src/java.base/share/classes/sun/util/locale/provider/LocaleResources.java @@ -43,6 +43,7 @@ package sun.util.locale.provider; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.text.MessageFormat; +import java.text.NumberFormat; import java.util.Calendar; import java.util.HashSet; import java.util.LinkedHashSet; @@ -88,6 +89,7 @@ public class LocaleResources { private static final String ZONE_IDS_CACHEKEY = "ZID"; private static final String CALENDAR_NAMES = "CALN."; private static final String NUMBER_PATTERNS_CACHEKEY = "NP"; + private static final String COMPACT_NUMBER_PATTERNS_CACHEKEY = "CNP"; private static final String DATE_TIME_PATTERN = "DTP."; // TimeZoneNamesBundle exemplar city prefix @@ -478,6 +480,32 @@ public class LocaleResources { return numberPatterns; } + /** + * Returns the compact number format patterns. + * @param formatStyle the style for formatting a number + * @return an array of compact number patterns + */ + @SuppressWarnings("unchecked") + public String[] getCNPatterns(NumberFormat.Style formatStyle) { + + Objects.requireNonNull(formatStyle); + String[] compactNumberPatterns = null; + removeEmptyReferences(); + String width = (formatStyle == NumberFormat.Style.LONG) ? "long" : "short"; + String cacheKey = width + "." + COMPACT_NUMBER_PATTERNS_CACHEKEY; + ResourceReference data = cache.get(cacheKey); + if (data == null || ((compactNumberPatterns + = (String[]) data.get()) == null)) { + ResourceBundle resource = localeData.getNumberFormatData(locale); + compactNumberPatterns = (String[]) resource + .getObject(width + ".CompactNumberPatterns"); + cache.put(cacheKey, new ResourceReference(cacheKey, + (Object) compactNumberPatterns, referenceQueue)); + } + return compactNumberPatterns; + } + + /** * Returns the FormatData resource bundle of this LocaleResources. * The FormatData should be used only for accessing extra diff --git a/src/java.base/share/classes/sun/util/locale/provider/NumberFormatProviderImpl.java b/src/java.base/share/classes/sun/util/locale/provider/NumberFormatProviderImpl.java index c2f6e593338..94d76f618c2 100644 --- a/src/java.base/share/classes/sun/util/locale/provider/NumberFormatProviderImpl.java +++ b/src/java.base/share/classes/sun/util/locale/provider/NumberFormatProviderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,12 +40,14 @@ package sun.util.locale.provider; +import java.text.CompactNumberFormat; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.NumberFormat; import java.text.spi.NumberFormatProvider; import java.util.Currency; import java.util.Locale; +import java.util.Objects; import java.util.Set; /** @@ -225,6 +227,49 @@ public class NumberFormatProviderImpl extends NumberFormatProvider implements Av } } + /** + * Returns a new {@code NumberFormat} instance which formats + * a number in its compact form for the specified + * {@code locale} and {@code formatStyle}. + * + * @param locale the desired locale + * @param formatStyle the style for formatting a number + * @throws NullPointerException if {@code locale} or {@code formatStyle} + * is {@code null} + * @throws IllegalArgumentException if {@code locale} isn't + * one of the locales returned from + * {@link java.util.spi.LocaleServiceProvider#getAvailableLocales() + * getAvailableLocales()}. + * @return a compact number formatter + * + * @see java.text.NumberFormat#getCompactNumberInstance(Locale, + * NumberFormat.Style) + * @since 12 + */ + @Override + public NumberFormat getCompactNumberInstance(Locale locale, + NumberFormat.Style formatStyle) { + + Objects.requireNonNull(locale); + Objects.requireNonNull(formatStyle); + + // Check for region override + Locale override = locale.getUnicodeLocaleType("nu") == null + ? CalendarDataUtility.findRegionOverride(locale) + : locale; + + LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type); + LocaleResources resource = adapter.getLocaleResources(override); + + String[] numberPatterns = resource.getNumberPatterns(); + DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(override); + String[] cnPatterns = resource.getCNPatterns(formatStyle); + + CompactNumberFormat format = new CompactNumberFormat(numberPatterns[0], + symbols, cnPatterns); + return format; + } + @Override public Set getAvailableLanguageTags() { return langtags; diff --git a/src/java.base/share/man/java.1 b/src/java.base/share/man/java.1 index e41945fc9c4..56da5dc8865 100644 --- a/src/java.base/share/man/java.1 +++ b/src/java.base/share/man/java.1 @@ -1396,11 +1396,6 @@ Enables printing of collected native memory tracking data at JVM exit when nativ \fB\-XX:NativeMemoryTracking\fR)\&. By default, this option is disabled and native memory tracking data is not printed\&. .RE .PP -\-XX:+RelaxAccessControlCheck -.RS 4 -Decreases the amount of access control checks in the verifier\&. By default, this option is disabled, and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. -.RE -.PP \-XX:+ShowMessageBoxOnError .RS 4 Enables displaying of a dialog box when the JVM experiences an irrecoverable error\&. This prevents the JVM from exiting and keeps the process active so that you can attach a debugger to it to investigate the cause of the error\&. By default, this option is disabled\&. diff --git a/src/java.base/share/native/libjimage/imageFile.cpp b/src/java.base/share/native/libjimage/imageFile.cpp index a52576dfe10..90ca70d694f 100644 --- a/src/java.base/share/native/libjimage/imageFile.cpp +++ b/src/java.base/share/native/libjimage/imageFile.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -428,7 +428,7 @@ bool ImageFileReader::open() { void ImageFileReader::close() { // Deallocate the index. if (_index_data) { - osSupport::unmap_memory((char*)_index_data, _index_size); + osSupport::unmap_memory((char*)_index_data, (size_t)map_size()); _index_data = NULL; } // Close file. diff --git a/src/java.base/unix/classes/java/io/UnixFileSystem.java b/src/java.base/unix/classes/java/io/UnixFileSystem.java index 05615d6d081..47c4601ec8e 100644 --- a/src/java.base/unix/classes/java/io/UnixFileSystem.java +++ b/src/java.base/unix/classes/java/io/UnixFileSystem.java @@ -103,7 +103,7 @@ class UnixFileSystem extends FileSystem { } public String resolve(String parent, String child) { - if (child.equals("")) return parent; + if (child.isEmpty()) return parent; if (child.charAt(0) == '/') { if (parent.equals("/")) return child; return parent + child; diff --git a/src/java.base/unix/classes/sun/net/www/protocol/file/Handler.java b/src/java.base/unix/classes/sun/net/www/protocol/file/Handler.java index 18706ac4b9a..6336256aa79 100644 --- a/src/java.base/unix/classes/sun/net/www/protocol/file/Handler.java +++ b/src/java.base/unix/classes/sun/net/www/protocol/file/Handler.java @@ -75,7 +75,7 @@ public class Handler extends URLStreamHandler { public synchronized URLConnection openConnection(URL u, Proxy p) throws IOException { String host = u.getHost(); - if (host == null || host.equals("") || host.equals("~") || + if (host == null || host.isEmpty() || host.equals("~") || host.equalsIgnoreCase("localhost")) { File file = new File(ParseUtil.decode(u.getPath())); return createFileURLConnection(u, file); diff --git a/src/java.base/windows/classes/jdk/internal/loader/FileURLMapper.java b/src/java.base/windows/classes/jdk/internal/loader/FileURLMapper.java index 8c22db1c46e..0053cf70e9d 100644 --- a/src/java.base/windows/classes/jdk/internal/loader/FileURLMapper.java +++ b/src/java.base/windows/classes/jdk/internal/loader/FileURLMapper.java @@ -55,7 +55,7 @@ public class FileURLMapper { return file; } String host = url.getHost(); - if (host != null && !host.equals("") && + if (host != null && !host.isEmpty() && !"localhost".equalsIgnoreCase(host)) { String rest = url.getFile(); String s = host + ParseUtil.decode (url.getFile()); diff --git a/src/java.base/windows/classes/sun/net/www/protocol/file/Handler.java b/src/java.base/windows/classes/sun/net/www/protocol/file/Handler.java index 534721ad7a0..abdf791a9d6 100644 --- a/src/java.base/windows/classes/sun/net/www/protocol/file/Handler.java +++ b/src/java.base/windows/classes/sun/net/www/protocol/file/Handler.java @@ -83,7 +83,7 @@ public class Handler extends URLStreamHandler { path = path.replace('/', '\\'); path = path.replace('|', ':'); - if ((host == null) || host.equals("") || + if ((host == null) || host.isEmpty() || host.equalsIgnoreCase("localhost") || host.equals("~")) { return createFileURLConnection(url, new File(path)); diff --git a/src/java.base/windows/classes/sun/net/www/protocol/jar/JarFileFactory.java b/src/java.base/windows/classes/sun/net/www/protocol/jar/JarFileFactory.java index 91bf5388460..1bb35fc22b4 100644 --- a/src/java.base/windows/classes/sun/net/www/protocol/jar/JarFileFactory.java +++ b/src/java.base/windows/classes/sun/net/www/protocol/jar/JarFileFactory.java @@ -76,7 +76,7 @@ class JarFileFactory implements URLJarFile.URLJarFileCloseController { // Deal with UNC pathnames specially. See 4180841 String host = url.getHost(); - if (host != null && !host.equals("") && + if (host != null && !host.isEmpty() && !host.equalsIgnoreCase("localhost")) { url = new URL("file", "", "//" + host + url.getPath()); diff --git a/src/java.base/windows/classes/sun/nio/fs/WindowsUriSupport.java b/src/java.base/windows/classes/sun/nio/fs/WindowsUriSupport.java index f95a913f448..6355d96a9e4 100644 --- a/src/java.base/windows/classes/sun/nio/fs/WindowsUriSupport.java +++ b/src/java.base/windows/classes/sun/nio/fs/WindowsUriSupport.java @@ -128,12 +128,12 @@ class WindowsUriSupport { if (uri.getRawQuery() != null) throw new IllegalArgumentException("URI has a query component"); String path = uri.getPath(); - if (path.equals("")) + if (path.isEmpty()) throw new IllegalArgumentException("URI path component is empty"); // UNC String auth = uri.getRawAuthority(); - if (auth != null && !auth.equals("")) { + if (auth != null && !auth.isEmpty()) { String host = uri.getHost(); if (host == null) throw new IllegalArgumentException("URI authority component has undefined host"); diff --git a/src/java.logging/share/classes/java/util/logging/LogManager.java b/src/java.logging/share/classes/java/util/logging/LogManager.java index fdcf73b6ce5..f6846cd477f 100644 --- a/src/java.logging/share/classes/java/util/logging/LogManager.java +++ b/src/java.logging/share/classes/java/util/logging/LogManager.java @@ -890,7 +890,7 @@ public class LogManager { // Gets a node in our tree of logger nodes. // If necessary, create it. LogNode getNode(String name) { - if (name == null || name.equals("")) { + if (name == null || name.isEmpty()) { return root; } LogNode node = root; @@ -1486,7 +1486,7 @@ public class LogManager { // Reset Logger level String name = logger.getName(); - if (name != null && name.equals("")) { + if (name != null && name.isEmpty()) { // This is the root logger. logger.setLevel(defaultLevel); } else { diff --git a/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectorServer.java b/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectorServer.java index c3b9a9fdbe9..34654ec1437 100644 --- a/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectorServer.java +++ b/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectorServer.java @@ -289,7 +289,7 @@ public class RMIConnectorServer extends JMXConnectorServer { throw new MalformedURLException(msg); } final String urlPath = url.getURLPath(); - if (!urlPath.equals("") + if (!urlPath.isEmpty() && !urlPath.equals("/") && !urlPath.startsWith("/jndi/")) { final String msg = "URL path must be empty or start with " + @@ -746,7 +746,7 @@ public class RMIConnectorServer extends JMXConnectorServer { port = 0; } else { protocol = address.getProtocol(); - host = (address.getHost().equals("")) ? null : address.getHost(); + host = (address.getHost().isEmpty()) ? null : address.getHost(); port = address.getPort(); } diff --git a/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java b/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java index bb335b0dfe6..3ec2d787a58 100644 --- a/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java +++ b/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java @@ -114,7 +114,7 @@ public class ServerNotifForwarder { // 6238731: set the default domain if no domain is set. ObjectName nn = name; - if (name.getDomain() == null || name.getDomain().equals("")) { + if (name.getDomain() == null || name.getDomain().isEmpty()) { try { nn = ObjectName.getInstance(mbeanServer.getDefaultDomain(), name.getKeyPropertyList()); diff --git a/src/java.management/share/classes/javax/management/ImmutableDescriptor.java b/src/java.management/share/classes/javax/management/ImmutableDescriptor.java index eb0a02d41dd..64764a55e39 100644 --- a/src/java.management/share/classes/javax/management/ImmutableDescriptor.java +++ b/src/java.management/share/classes/javax/management/ImmutableDescriptor.java @@ -110,7 +110,7 @@ public class ImmutableDescriptor implements Descriptor { new TreeMap(String.CASE_INSENSITIVE_ORDER); for (Map.Entry entry : fields.entrySet()) { String name = entry.getKey(); - if (name == null || name.equals("")) + if (name == null || name.isEmpty()) throw new IllegalArgumentException("Empty or null field name"); if (map.containsKey(name)) throw new IllegalArgumentException("Duplicate name: " + name); @@ -166,7 +166,7 @@ public class ImmutableDescriptor implements Descriptor { new TreeMap(String.CASE_INSENSITIVE_ORDER); for (int i = 0; i < fieldNames.length; i++) { String name = fieldNames[i]; - if (name == null || name.equals("")) + if (name == null || name.isEmpty()) throw new IllegalArgumentException("Empty or null field name"); Object old = map.put(name, fieldValues[i]); if (old != null) { @@ -333,7 +333,7 @@ public class ImmutableDescriptor implements Descriptor { Object[] result = new Object[fieldNames.length]; for (int i = 0; i < fieldNames.length; i++) { String name = fieldNames[i]; - if (name != null && !name.equals("")) + if (name != null && !name.isEmpty()) result[i] = getFieldValue(name); } return result; @@ -543,7 +543,7 @@ public class ImmutableDescriptor implements Descriptor { } private static void checkIllegalFieldName(String name) { - if (name == null || name.equals("")) + if (name == null || name.isEmpty()) illegal("Null or empty field name"); } diff --git a/src/java.management/share/classes/javax/management/MBeanPermission.java b/src/java.management/share/classes/javax/management/MBeanPermission.java index c134ac5ef56..467715ae512 100644 --- a/src/java.management/share/classes/javax/management/MBeanPermission.java +++ b/src/java.management/share/classes/javax/management/MBeanPermission.java @@ -256,7 +256,7 @@ public class MBeanPermission extends Permission { if (actions == null) throw new IllegalArgumentException("MBeanPermission: " + "actions can't be null"); - if (actions.equals("")) + if (actions.isEmpty()) throw new IllegalArgumentException("MBeanPermission: " + "actions can't be empty"); @@ -279,7 +279,7 @@ public class MBeanPermission extends Permission { throw new IllegalArgumentException("MBeanPermission name " + "cannot be null"); - if (name.equals("")) + if (name.isEmpty()) throw new IllegalArgumentException("MBeanPermission name " + "cannot be empty"); @@ -310,7 +310,7 @@ public class MBeanPermission extends Permission { // String on = name.substring(openingBracket + 1, name.length() - 1); - if (on.equals("")) + if (on.isEmpty()) objectName = ObjectName.WILDCARD; else if (on.equals("-")) objectName = null; @@ -359,7 +359,7 @@ public class MBeanPermission extends Permission { if (className == null || className.equals("-")) { classNamePrefix = null; classNameExactMatch = false; - } else if (className.equals("") || className.equals("*")) { + } else if (className.isEmpty() || className.equals("*")) { classNamePrefix = ""; classNameExactMatch = false; } else if (className.endsWith(".*")) { @@ -375,7 +375,7 @@ public class MBeanPermission extends Permission { private void setMember(String member) { if (member == null || member.equals("-")) this.member = null; - else if (member.equals("")) + else if (member.isEmpty()) this.member = "*"; else this.member = member; diff --git a/src/java.management/share/classes/javax/management/modelmbean/DescriptorSupport.java b/src/java.management/share/classes/javax/management/modelmbean/DescriptorSupport.java index 769a6159d1d..2ec075a86aa 100644 --- a/src/java.management/share/classes/javax/management/modelmbean/DescriptorSupport.java +++ b/src/java.management/share/classes/javax/management/modelmbean/DescriptorSupport.java @@ -443,7 +443,7 @@ public class DescriptorSupport init(null); for (int i=0; i < fields.length; i++) { - if ((fields[i] == null) || (fields[i].equals(""))) { + if ((fields[i] == null) || (fields[i].isEmpty())) { continue; } int eq_separator = fields[i].indexOf('='); @@ -467,7 +467,7 @@ public class DescriptorSupport fieldValue = fields[i].substring(eq_separator+1); } - if (fieldName.equals("")) { + if (fieldName.isEmpty()) { if (MODELMBEAN_LOGGER.isLoggable(Level.TRACE)) { MODELMBEAN_LOGGER.log(Level.TRACE, "Descriptor(String... fields) " + @@ -500,7 +500,7 @@ public class DescriptorSupport public synchronized Object getFieldValue(String fieldName) throws RuntimeOperationsException { - if ((fieldName == null) || (fieldName.equals(""))) { + if ((fieldName == null) || (fieldName.isEmpty())) { if (MODELMBEAN_LOGGER.isLoggable(Level.TRACE)) { MODELMBEAN_LOGGER.log(Level.TRACE, "Illegal arguments: null field name"); @@ -522,7 +522,7 @@ public class DescriptorSupport throws RuntimeOperationsException { // field name cannot be null or empty - if ((fieldName == null) || (fieldName.equals(""))) { + if ((fieldName == null) || (fieldName.isEmpty())) { if (MODELMBEAN_LOGGER.isLoggable(Level.TRACE)) { MODELMBEAN_LOGGER.log(Level.TRACE, "Illegal arguments: null or empty field name"); @@ -664,7 +664,7 @@ public class DescriptorSupport responseFields[i++] = value; } else { for (i=0; i < fieldNames.length; i++) { - if ((fieldNames[i] == null) || (fieldNames[i].equals(""))) { + if ((fieldNames[i] == null) || (fieldNames[i].isEmpty())) { responseFields[i] = null; } else { responseFields[i] = getFieldValue(fieldNames[i]); @@ -700,7 +700,7 @@ public class DescriptorSupport } for (int i=0; i < fieldNames.length; i++) { - if (( fieldNames[i] == null) || (fieldNames[i].equals(""))) { + if (( fieldNames[i] == null) || (fieldNames[i].isEmpty())) { if (MODELMBEAN_LOGGER.isLoggable(Level.TRACE)) { MODELMBEAN_LOGGER.log(Level.TRACE, "Null field name encountered at element " + i); @@ -733,7 +733,7 @@ public class DescriptorSupport } public synchronized void removeField(String fieldName) { - if ((fieldName == null) || (fieldName.equals(""))) { + if ((fieldName == null) || (fieldName.isEmpty())) { return; } @@ -862,7 +862,7 @@ public class DescriptorSupport String thisDescType = (String)(getFieldValue("descriptorType")); if ((thisName == null) || (thisDescType == null) || - (thisName.equals("")) || (thisDescType.equals(""))) { + (thisName.isEmpty()) || (thisDescType.isEmpty())) { return false; } @@ -912,7 +912,7 @@ public class DescriptorSupport private boolean validateField(String fldName, Object fldValue) { - if ((fldName == null) || (fldName.equals(""))) + if ((fldName == null) || (fldName.isEmpty())) return false; String SfldValue = ""; boolean isAString = false; @@ -931,7 +931,7 @@ public class DescriptorSupport fldName.equalsIgnoreCase("Class")) { if (fldValue == null || !isAString) return false; - if (nameOrDescriptorType && SfldValue.equals("")) + if (nameOrDescriptorType && SfldValue.isEmpty()) return false; return true; } else if (fldName.equalsIgnoreCase("visibility")) { diff --git a/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanInfoSupport.java b/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanInfoSupport.java index b5ae6ca08b9..4a244d9ef8b 100644 --- a/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanInfoSupport.java +++ b/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanInfoSupport.java @@ -367,7 +367,7 @@ public class ModelMBeanInfoSupport extends MBeanInfo implements ModelMBeanInfo { MODELMBEAN_LOGGER.log(Level.TRACE, "Entry"); } - if ((inDescriptorType == null) || (inDescriptorType.equals(""))) { + if ((inDescriptorType == null) || (inDescriptorType.isEmpty())) { inDescriptorType = "all"; } @@ -600,7 +600,7 @@ public class ModelMBeanInfoSupport extends MBeanInfo implements ModelMBeanInfo { inDescriptor = new DescriptorSupport(); } - if ((inDescriptorType == null) || (inDescriptorType.equals(""))) { + if ((inDescriptorType == null) || (inDescriptorType.isEmpty())) { inDescriptorType = (String) inDescriptor.getFieldValue("descriptorType"); diff --git a/src/java.management/share/classes/javax/management/openmbean/CompositeType.java b/src/java.management/share/classes/javax/management/openmbean/CompositeType.java index 8c802f2c8ad..9ee21fa2f54 100644 --- a/src/java.management/share/classes/javax/management/openmbean/CompositeType.java +++ b/src/java.management/share/classes/javax/management/openmbean/CompositeType.java @@ -171,7 +171,7 @@ public class CompositeType extends OpenType { private static void checkForEmptyString(String[] arg, String argName) { for (int i=0; i implements Serializable { /* Return argValue.trim() provided argValue is neither null nor empty; otherwise throw IllegalArgumentException. */ private static String valid(String argName, String argValue) { - if (argValue == null || (argValue = argValue.trim()).equals("")) + if (argValue == null || (argValue = argValue.trim()).isEmpty()) throw new IllegalArgumentException("Argument " + argName + " cannot be null or empty"); return argValue; diff --git a/src/java.management/share/classes/javax/management/openmbean/TabularType.java b/src/java.management/share/classes/javax/management/openmbean/TabularType.java index 17710478f67..bb72d228e06 100644 --- a/src/java.management/share/classes/javax/management/openmbean/TabularType.java +++ b/src/java.management/share/classes/javax/management/openmbean/TabularType.java @@ -165,7 +165,7 @@ public class TabularType extends OpenType { */ private static void checkForEmptyString(String[] arg, String argName) { for (int i=0; i 0 || type == void.class || rest.equals("Class")) { diff --git a/src/java.naming/share/classes/com/sun/jndi/ldap/Filter.java b/src/java.naming/share/classes/com/sun/jndi/ldap/Filter.java index 0a4bba567cc..6a3b6db0446 100644 --- a/src/java.naming/share/classes/com/sun/jndi/ldap/Filter.java +++ b/src/java.naming/share/classes/com/sun/jndi/ldap/Filter.java @@ -53,7 +53,7 @@ final class Filter { static void encodeFilterString(BerEncoder ber, String filterStr, boolean isLdapv3) throws IOException, NamingException { - if ((filterStr == null) || (filterStr.equals(""))) { + if ((filterStr == null) || (filterStr.isEmpty())) { throw new InvalidSearchFilterException("Empty filter"); } byte[] filter; diff --git a/src/java.naming/share/classes/com/sun/jndi/ldap/LdapCtx.java b/src/java.naming/share/classes/com/sun/jndi/ldap/LdapCtx.java index 88185a06d2b..0275d4ffa6e 100644 --- a/src/java.naming/share/classes/com/sun/jndi/ldap/LdapCtx.java +++ b/src/java.naming/share/classes/com/sun/jndi/ldap/LdapCtx.java @@ -915,7 +915,7 @@ final public class LdapCtx extends ComponentDirContext boolean directUpdate) throws NamingException { // Handle the empty name - if (dn.equals("")) { + if (dn.isEmpty()) { return attrs; } @@ -1271,7 +1271,7 @@ final public class LdapCtx extends ComponentDirContext int prefixLast = prefix.size() - 1; if (name.isEmpty() || prefix.isEmpty() || - name.get(0).equals("") || prefix.get(prefixLast).equals("")) { + name.get(0).isEmpty() || prefix.get(prefixLast).isEmpty()) { return super.composeName(name, prefix); } @@ -1300,9 +1300,9 @@ final public class LdapCtx extends ComponentDirContext // used by LdapSearchEnumeration private static String concatNames(String lesser, String greater) { - if (lesser == null || lesser.equals("")) { + if (lesser == null || lesser.isEmpty()) { return greater; - } else if (greater == null || greater.equals("")) { + } else if (greater == null || greater.isEmpty()) { return lesser; } else { return (lesser + "," + greater); @@ -3036,7 +3036,7 @@ final public class LdapCtx extends ComponentDirContext } // extract SLAPD-style referrals from errorMessage - if ((res.errorMessage != null) && (!res.errorMessage.equals(""))) { + if ((res.errorMessage != null) && (!res.errorMessage.isEmpty())) { res.referrals = extractURLs(res.errorMessage); } else { e = new PartialResultException(msg); diff --git a/src/java.naming/share/classes/com/sun/jndi/ldap/LdapReferralContext.java b/src/java.naming/share/classes/com/sun/jndi/ldap/LdapReferralContext.java index 6f642607500..e7058cd3ec3 100644 --- a/src/java.naming/share/classes/com/sun/jndi/ldap/LdapReferralContext.java +++ b/src/java.naming/share/classes/com/sun/jndi/ldap/LdapReferralContext.java @@ -182,7 +182,7 @@ final class LdapReferralContext implements DirContext, LdapContext { if (urlString == null) { urlName = null; } else { - urlName = urlString.equals("") ? new CompositeName() : + urlName = urlString.isEmpty() ? new CompositeName() : new CompositeName().add(urlString); } } @@ -888,7 +888,7 @@ final class LdapReferralContext implements DirContext, LdapContext { // ---------------------- Private methods --------------------- private Name toName(String name) throws InvalidNameException { - return name.equals("") ? new CompositeName() : + return name.isEmpty() ? new CompositeName() : new CompositeName().add(name); } diff --git a/src/java.naming/share/classes/com/sun/jndi/ldap/LdapSearchEnumeration.java b/src/java.naming/share/classes/com/sun/jndi/ldap/LdapSearchEnumeration.java index 43d040a1c44..b3b2593a566 100644 --- a/src/java.naming/share/classes/com/sun/jndi/ldap/LdapSearchEnumeration.java +++ b/src/java.naming/share/classes/com/sun/jndi/ldap/LdapSearchEnumeration.java @@ -97,13 +97,13 @@ final class LdapSearchEnumeration // Name relative to search context CompositeName cn = new CompositeName(); - if (!relStart.equals("")) { + if (!relStart.isEmpty()) { cn.add(relStart); } // Name relative to homeCtx CompositeName rcn = new CompositeName(); - if (!relHome.equals("")) { + if (!relHome.isEmpty()) { rcn.add(relHome); } //System.err.println("relStart: " + cn); diff --git a/src/java.naming/share/classes/com/sun/jndi/ldap/LdapURL.java b/src/java.naming/share/classes/com/sun/jndi/ldap/LdapURL.java index 5abbc9de0e8..c807379ab4b 100644 --- a/src/java.naming/share/classes/com/sun/jndi/ldap/LdapURL.java +++ b/src/java.naming/share/classes/com/sun/jndi/ldap/LdapURL.java @@ -197,7 +197,7 @@ final public class LdapURL extends Uri { // path begins with a '/' or is empty - if (path.equals("")) { + if (path.isEmpty()) { return; } diff --git a/src/java.naming/share/classes/com/sun/jndi/ldap/NamingEventNotifier.java b/src/java.naming/share/classes/com/sun/jndi/ldap/NamingEventNotifier.java index 20794f8e502..f37e9b32f4e 100644 --- a/src/java.naming/share/classes/com/sun/jndi/ldap/NamingEventNotifier.java +++ b/src/java.naming/share/classes/com/sun/jndi/ldap/NamingEventNotifier.java @@ -115,7 +115,7 @@ final class NamingEventNotifier implements Runnable { try { Continuation cont = new Continuation(); cont.setError(this, info.name); - Name nm = (info.name == null || info.name.equals("")) ? + Name nm = (info.name == null || info.name.isEmpty()) ? new CompositeName() : new CompositeName().add(info.name); results = context.searchAux(nm, info.filter, info.controls, diff --git a/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/AtomicContext.java b/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/AtomicContext.java index 3be067b9491..894b0c617b4 100644 --- a/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/AtomicContext.java +++ b/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/AtomicContext.java @@ -243,7 +243,7 @@ public abstract class AtomicContext extends ComponentContext { protected boolean isEmpty(String name) { - return name == null || name.equals(""); + return name == null || name.isEmpty(); } // ------ implementations of c_ and c_*_nns methods using @@ -510,7 +510,7 @@ public abstract class AtomicContext extends ComponentContext { */ protected void a_processJunction_nns(String name, Continuation cont) throws NamingException { - if (name.equals("")) { + if (name.isEmpty()) { NameNotFoundException e = new NameNotFoundException(); cont.setErrorNNS(this, name); throw cont.fillInException(e); diff --git a/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/ComponentContext.java b/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/ComponentContext.java index 24e65fa104a..ddd0428afe7 100644 --- a/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/ComponentContext.java +++ b/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/ComponentContext.java @@ -105,7 +105,7 @@ public abstract class ComponentContext extends PartialCompositeContext { throws NamingException { int separator; // if no name to parse, or if we're already at boundary - if (name.isEmpty() || name.get(0).equals("")) { + if (name.isEmpty() || name.get(0).isEmpty()) { separator = 0; } else { separator = 1; @@ -379,7 +379,7 @@ public abstract class ComponentContext extends PartialCompositeContext { if (tail == null || tail.isEmpty()) { //System.out.println("terminal : " + head); ret = TERMINAL_COMPONENT; - } else if (!tail.get(0).equals("")) { + } else if (!tail.get(0).isEmpty()) { // tail does not begin with "/" /* if (head.isEmpty()) { @@ -468,7 +468,7 @@ public abstract class ComponentContext extends PartialCompositeContext { void checkAndAdjustRemainingName(Name rname) throws InvalidNameException { int count; if (rname != null && (count=rname.size()) > 1 && - rname.get(count-1).equals("")) { + rname.get(count-1).isEmpty()) { rname.remove(count-1); } } @@ -477,7 +477,7 @@ public abstract class ComponentContext extends PartialCompositeContext { protected boolean isAllEmpty(Name n) { int count = n.size(); for (int i =0; i < count; i++ ) { - if (!n.get(i).equals("")) { + if (!n.get(i).isEmpty()) { return false; } } diff --git a/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java b/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java index 595f9303e72..f90d25643aa 100644 --- a/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java +++ b/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java @@ -203,7 +203,7 @@ public class Continuation extends ResolveResult { public void setErrorNNS(Object resObj, String remain) { CompositeName rname = new CompositeName(); try { - if (remain != null && !remain.equals("")) + if (remain != null && !remain.isEmpty()) rname.add(remain); rname.add(""); @@ -247,7 +247,7 @@ public class Continuation extends ResolveResult { */ public void setError(Object resObj, String remain) { CompositeName rname = new CompositeName(); - if (remain != null && !remain.equals("")) { + if (remain != null && !remain.isEmpty()) { try { rname.add(remain); } catch (InvalidNameException e) { @@ -375,14 +375,14 @@ public class Continuation extends ResolveResult { public void setContinue(Object obj, String relResName, Context currCtx, String remain) { CompositeName relname = new CompositeName(); - if (!relResName.equals("")) { + if (!relResName.isEmpty()) { try { relname.add(relResName); } catch (NamingException e){} } CompositeName rname = new CompositeName(); - if (!remain.equals("")) { + if (!remain.isEmpty()) { try { rname.add(remain); } catch (NamingException e) { diff --git a/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/PartialCompositeContext.java b/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/PartialCompositeContext.java index e2d9d4ae2ad..19b8eb21588 100644 --- a/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/PartialCompositeContext.java +++ b/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/PartialCompositeContext.java @@ -477,9 +477,9 @@ public abstract class PartialCompositeContext implements Context, Resolver { int len = prefix.size(); if (!allEmpty(prefix) && !allEmpty(name)) { - if (res.get(len - 1).equals("")) { + if (res.get(len - 1).isEmpty()) { res.remove(len - 1); - } else if (res.get(len).equals("")) { + } else if (res.get(len).isEmpty()) { res.remove(len); } } diff --git a/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/ContextEnumerator.java b/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/ContextEnumerator.java index 176e3392b02..36b51741476 100644 --- a/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/ContextEnumerator.java +++ b/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/ContextEnumerator.java @@ -138,7 +138,7 @@ public class ContextEnumerator implements NamingEnumeration { // if the name is relative, we need to add it to the name of this // context to keep it relative w.r.t. the root context we are // enumerating - if(oldBinding.isRelative() && !contextName.equals("")) { + if(oldBinding.isRelative() && !contextName.isEmpty()) { NameParser parser = root.getNameParser(""); Name newName = parser.parse(contextName); newName.add(oldBinding.getName()); diff --git a/src/java.naming/share/classes/com/sun/jndi/toolkit/url/GenericURLContext.java b/src/java.naming/share/classes/com/sun/jndi/toolkit/url/GenericURLContext.java index 3fbd5eb9782..1f48dcbe58e 100644 --- a/src/java.naming/share/classes/com/sun/jndi/toolkit/url/GenericURLContext.java +++ b/src/java.naming/share/classes/com/sun/jndi/toolkit/url/GenericURLContext.java @@ -476,9 +476,9 @@ abstract public class GenericURLContext implements Context { public String composeName(String name, String prefix) throws NamingException { - if (prefix.equals("")) { + if (prefix.isEmpty()) { return name; - } else if (name.equals("")) { + } else if (name.isEmpty()) { return prefix; } else { return (prefix + "/" + name); diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/Http1Request.java b/src/java.net.http/share/classes/jdk/internal/net/http/Http1Request.java index 85d1141603c..ad452918d14 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/Http1Request.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/Http1Request.java @@ -201,13 +201,13 @@ class Http1Request { private String getPathAndQuery(URI uri) { String path = uri.getRawPath(); String query = uri.getRawQuery(); - if (path == null || path.equals("")) { + if (path == null || path.isEmpty()) { path = "/"; } if (query == null) { query = ""; } - if (query.equals("")) { + if (query.isEmpty()) { return Utils.encode(path); } else { return Utils.encode(path + "?" + query); diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/HttpRequestBuilderImpl.java b/src/java.net.http/share/classes/jdk/internal/net/http/HttpRequestBuilderImpl.java index 737c718ca69..d11a18f7c58 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/HttpRequestBuilderImpl.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/HttpRequestBuilderImpl.java @@ -190,7 +190,7 @@ public class HttpRequestBuilderImpl implements HttpRequest.Builder { @Override public HttpRequest.Builder method(String method, BodyPublisher body) { requireNonNull(method); - if (method.equals("")) + if (method.isEmpty()) throw newIAE("illegal method "); if (method.equals("CONNECT")) throw newIAE("method CONNECT is not supported"); @@ -205,7 +205,7 @@ public class HttpRequestBuilderImpl implements HttpRequest.Builder { private HttpRequest.Builder method0(String method, BodyPublisher body) { assert method != null; - assert !method.equals(""); + assert !method.isEmpty(); this.method = method; this.bodyPublisher = body; return this; diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/ResponseContent.java b/src/java.net.http/share/classes/jdk/internal/net/http/ResponseContent.java index b8dab248d54..c48245cc0c3 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/ResponseContent.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/ResponseContent.java @@ -84,7 +84,7 @@ class ResponseContent { if (contentLength == -1) { String tc = headers.firstValue("Transfer-Encoding") .orElse(""); - if (!tc.equals("")) { + if (!tc.isEmpty()) { if (tc.equalsIgnoreCase("chunked")) { chunkedContent = true; } else { diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/common/SSLFlowDelegate.java b/src/java.net.http/share/classes/jdk/internal/net/http/common/SSLFlowDelegate.java index 5445ff2873f..e82cc03c5bb 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/common/SSLFlowDelegate.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/common/SSLFlowDelegate.java @@ -97,7 +97,7 @@ public class SSLFlowDelegate { private static final ByteBuffer NOTHING = ByteBuffer.allocate(0); private static final String monProp = Utils.getProperty("jdk.internal.httpclient.monitorFlowDelegate"); private static final boolean isMonitored = - monProp != null && (monProp.equals("") || monProp.equalsIgnoreCase("true")); + monProp != null && (monProp.isEmpty() || monProp.equalsIgnoreCase("true")); final Executor exec; final Reader reader; diff --git a/src/java.prefs/share/classes/java/util/prefs/AbstractPreferences.java b/src/java.prefs/share/classes/java/util/prefs/AbstractPreferences.java index 74f7d9e94b2..e3ac7dfd0ba 100644 --- a/src/java.prefs/share/classes/java/util/prefs/AbstractPreferences.java +++ b/src/java.prefs/share/classes/java/util/prefs/AbstractPreferences.java @@ -203,7 +203,7 @@ public abstract class AbstractPreferences extends Preferences { */ protected AbstractPreferences(AbstractPreferences parent, String name) { if (parent==null) { - if (!name.equals("")) + if (!name.isEmpty()) throw new IllegalArgumentException("Root name '"+name+ "' must be \"\""); this.absolutePath = "/"; @@ -212,7 +212,7 @@ public abstract class AbstractPreferences extends Preferences { if (name.indexOf('/') != -1) throw new IllegalArgumentException("Name '" + name + "' contains '/'"); - if (name.equals("")) + if (name.isEmpty()) throw new IllegalArgumentException("Illegal name: empty string"); root = parent.root; @@ -848,7 +848,7 @@ public abstract class AbstractPreferences extends Preferences { synchronized(lock) { if (removed) throw new IllegalStateException("Node has been removed."); - if (path.equals("")) + if (path.isEmpty()) return this; if (path.equals("/")) return root; @@ -911,7 +911,7 @@ public abstract class AbstractPreferences extends Preferences { throws BackingStoreException { synchronized(lock) { - if (path.equals("")) + if (path.isEmpty()) return !removed; if (removed) throw new IllegalStateException("Node has been removed."); diff --git a/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java b/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java index 587915877e4..d1be71107c2 100644 --- a/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java +++ b/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java @@ -189,7 +189,7 @@ public final class ExecOptionPermission extends Permission if (name == null) throw new NullPointerException("name can't be null"); - if (name.equals("")) { + if (name.isEmpty()) { throw new IllegalArgumentException("name can't be empty"); } diff --git a/src/java.rmi/share/classes/java/rmi/Naming.java b/src/java.rmi/share/classes/java/rmi/Naming.java index 01ffa8813f5..0db7022c6ba 100644 --- a/src/java.rmi/share/classes/java/rmi/Naming.java +++ b/src/java.rmi/share/classes/java/rmi/Naming.java @@ -199,7 +199,7 @@ public final class Naming { Registry registry = getRegistry(parsed); String prefix = ""; - if (parsed.port > 0 || !parsed.host.equals("")) + if (parsed.port > 0 || !parsed.host.isEmpty()) prefix += "//" + parsed.host; if (parsed.port > 0) prefix += ":" + parsed.port; diff --git a/src/java.rmi/share/classes/sun/rmi/server/ActivatableRef.java b/src/java.rmi/share/classes/sun/rmi/server/ActivatableRef.java index 22e6976a1ef..6a2ccf0b311 100644 --- a/src/java.rmi/share/classes/sun/rmi/server/ActivatableRef.java +++ b/src/java.rmi/share/classes/sun/rmi/server/ActivatableRef.java @@ -370,7 +370,7 @@ public class ActivatableRef implements RemoteRef { ref = null; String className = in.readUTF(); - if (className.equals("")) return; + if (className.isEmpty()) return; try { Class refClass = Class.forName(RemoteRef.packagePrefix + "." + diff --git a/src/java.rmi/share/classes/sun/rmi/server/Activation.java b/src/java.rmi/share/classes/sun/rmi/server/Activation.java index 6c60f46c603..595a06c882c 100644 --- a/src/java.rmi/share/classes/sun/rmi/server/Activation.java +++ b/src/java.rmi/share/classes/sun/rmi/server/Activation.java @@ -1857,7 +1857,7 @@ public class Activation implements Serializable { checkPermission(perms, new ExecOptionPermission(option)); } catch (AccessControlException e) { - if (value.equals("")) { + if (value.isEmpty()) { checkPermission(perms, new ExecOptionPermission("-D" + name)); } else { @@ -2101,7 +2101,7 @@ public class Activation implements Serializable { * Initialize method for activation exec policy. */ if (!execPolicyClassName.equals("none")) { - if (execPolicyClassName.equals("") || + if (execPolicyClassName.isEmpty() || execPolicyClassName.equals("default")) { execPolicyClassName = DefaultExecPolicy.class.getName(); diff --git a/src/java.rmi/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java b/src/java.rmi/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java index 2370eb1a843..3483a5435db 100644 --- a/src/java.rmi/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java +++ b/src/java.rmi/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java @@ -738,7 +738,7 @@ public class TCPEndpoint implements Endpoint { } hostName = f.getHost(); - if ((hostName == null) || (hostName.equals("")) + if ((hostName == null) || (hostName.isEmpty()) || (hostName.indexOf('.') < 0 )) { hostName = hostAddress; diff --git a/src/java.scripting/share/classes/com/sun/tools/script/shell/Main.java b/src/java.scripting/share/classes/com/sun/tools/script/shell/Main.java index 646aab4cffd..b928aa6e5f9 100644 --- a/src/java.scripting/share/classes/com/sun/tools/script/shell/Main.java +++ b/src/java.scripting/share/classes/com/sun/tools/script/shell/Main.java @@ -114,7 +114,7 @@ public class Main { System.setProperty(value.substring(0, eq), value.substring(eq + 1)); } else { - if (!value.equals("")) { + if (!value.isEmpty()) { System.setProperty(value, ""); } else { // do not allow empty property name diff --git a/src/java.sql.rowset/share/classes/com/sun/rowset/CachedRowSetImpl.java b/src/java.sql.rowset/share/classes/com/sun/rowset/CachedRowSetImpl.java index 37d7f8d4f3f..5fd907ec022 100644 --- a/src/java.sql.rowset/share/classes/com/sun/rowset/CachedRowSetImpl.java +++ b/src/java.sql.rowset/share/classes/com/sun/rowset/CachedRowSetImpl.java @@ -593,7 +593,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern super.setCommand(cmd); - if(!buildTableName(cmd).equals("")) { + if(!buildTableName(cmd).isEmpty()) { this.setTableName(buildTableName(cmd)); } } @@ -7069,7 +7069,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern public void setMatchColumn(String[] columnNames) throws SQLException { for(int j = 0; j < columnNames.length; j++) { - if( columnNames[j] == null || columnNames[j].equals("")) { + if( columnNames[j] == null || columnNames[j].isEmpty()) { throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols2").toString()); } } @@ -7124,7 +7124,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern */ public void setMatchColumn(String columnName) throws SQLException { // validate, if col is ok to be set - if(columnName == null || (columnName= columnName.trim()).equals("") ) { + if(columnName == null || (columnName= columnName.trim()).isEmpty() ) { throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols2").toString()); } else { // set strMatchColumn diff --git a/src/java.sql.rowset/share/classes/com/sun/rowset/JdbcRowSetImpl.java b/src/java.sql.rowset/share/classes/com/sun/rowset/JdbcRowSetImpl.java index 7e4cce214ae..2cfaaed5886 100644 --- a/src/java.sql.rowset/share/classes/com/sun/rowset/JdbcRowSetImpl.java +++ b/src/java.sql.rowset/share/classes/com/sun/rowset/JdbcRowSetImpl.java @@ -624,7 +624,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { (getDataSourceName()); //return ds.getConnection(getUsername(),getPassword()); - if(getUsername() != null && !getUsername().equals("")) { + if(getUsername() != null && !getUsername().isEmpty()) { return ds.getConnection(getUsername(),getPassword()); } else { return ds.getConnection(); @@ -3873,7 +3873,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { public void setMatchColumn(String[] columnNames) throws SQLException { for(int j = 0; j < columnNames.length; j++) { - if( columnNames[j] == null || columnNames[j].equals("")) { + if( columnNames[j] == null || columnNames[j].isEmpty()) { throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols2").toString()); } } @@ -3928,7 +3928,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { */ public void setMatchColumn(String columnName) throws SQLException { // validate, if col is ok to be set - if(columnName == null || (columnName= columnName.trim()).equals("")) { + if(columnName == null || (columnName= columnName.trim()).isEmpty()) { throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols2").toString()); } else { // set strMatchColumn diff --git a/src/java.sql.rowset/share/classes/com/sun/rowset/internal/WebRowSetXmlWriter.java b/src/java.sql.rowset/share/classes/com/sun/rowset/internal/WebRowSetXmlWriter.java index 46c95869d37..a252a272d27 100644 --- a/src/java.sql.rowset/share/classes/com/sun/rowset/internal/WebRowSetXmlWriter.java +++ b/src/java.sql.rowset/share/classes/com/sun/rowset/internal/WebRowSetXmlWriter.java @@ -537,7 +537,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable { private void writeStringData(String s) throws java.io.IOException { if (s == null) { writeNull(); - } else if (s.equals("")) { + } else if (s.isEmpty()) { writeEmptyString(); } else { diff --git a/src/java.sql.rowset/share/classes/javax/sql/rowset/BaseRowSet.java b/src/java.sql.rowset/share/classes/javax/sql/rowset/BaseRowSet.java index b86e5be0fb7..df98cbc4557 100644 --- a/src/java.sql.rowset/share/classes/javax/sql/rowset/BaseRowSet.java +++ b/src/java.sql.rowset/share/classes/javax/sql/rowset/BaseRowSet.java @@ -852,7 +852,7 @@ public abstract class BaseRowSet implements Serializable, Cloneable { if (name == null) { dataSource = null; - } else if (name.equals("")) { + } else if (name.isEmpty()) { throw new SQLException("DataSource name cannot be empty string"); } else { dataSource = name; diff --git a/src/java.sql/share/classes/java/sql/DriverManager.java b/src/java.sql/share/classes/java/sql/DriverManager.java index 3b8f1b20c02..201e293358a 100644 --- a/src/java.sql/share/classes/java/sql/DriverManager.java +++ b/src/java.sql/share/classes/java/sql/DriverManager.java @@ -622,7 +622,7 @@ public class DriverManager { println("DriverManager.initialize: jdbc.drivers = " + drivers); - if (drivers != null && !drivers.equals("")) { + if (drivers != null && !drivers.isEmpty()) { String[] driversList = drivers.split(":"); println("number of Drivers:" + driversList.length); for (String aDriver : driversList) { diff --git a/src/java.xml/share/classes/com/sun/xml/internal/stream/events/AttributeImpl.java b/src/java.xml/share/classes/com/sun/xml/internal/stream/events/AttributeImpl.java index 372b2cef19f..a35e69f09aa 100644 --- a/src/java.xml/share/classes/com/sun/xml/internal/stream/events/AttributeImpl.java +++ b/src/java.xml/share/classes/com/sun/xml/internal/stream/events/AttributeImpl.java @@ -85,7 +85,7 @@ public class AttributeImpl extends DummyEvent implements Attribute init(); fQName = qname ; fValue = value ; - if(type != null && !type.equals("")) + if(type != null && !type.isEmpty()) fAttributeType = type; fNonNormalizedvalue = nonNormalizedvalue; diff --git a/src/java.xml/share/classes/com/sun/xml/internal/stream/events/StartDocumentEvent.java b/src/java.xml/share/classes/com/sun/xml/internal/stream/events/StartDocumentEvent.java index 0fd16b36679..50950f6410a 100644 --- a/src/java.xml/share/classes/com/sun/xml/internal/stream/events/StartDocumentEvent.java +++ b/src/java.xml/share/classes/com/sun/xml/internal/stream/events/StartDocumentEvent.java @@ -73,7 +73,7 @@ implements StartDocument { this.fEncodingScheam = encoding; this.fVersion = version; this.fStandalone = standalone; - if (encoding != null && !encoding.equals("")) + if (encoding != null && !encoding.isEmpty()) this.fEncodingSchemeSet = true; else { this.fEncodingSchemeSet = false; diff --git a/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLDOMWriterImpl.java b/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLDOMWriterImpl.java index cc4f6ebbdb7..9aef726f6dd 100644 --- a/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLDOMWriterImpl.java +++ b/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLDOMWriterImpl.java @@ -219,7 +219,7 @@ public class XMLDOMWriterImpl implements XMLStreamWriterBase { } String qualifiedName = null; - if(prefix.equals("")){ + if(prefix.isEmpty()){ qualifiedName = localName; }else{ qualifiedName = getQName(prefix,localName); @@ -254,7 +254,7 @@ public class XMLDOMWriterImpl implements XMLStreamWriterBase { throw new XMLStreamException("prefix cannot be null"); } String qualifiedName = null; - if(prefix.equals("")){ + if(prefix.isEmpty()){ qualifiedName = localName; }else{ @@ -502,7 +502,7 @@ public class XMLDOMWriterImpl implements XMLStreamWriterBase { String qname = null; - if (prefix.equals("")) { + if (prefix.isEmpty()) { qname = XMLConstants.XMLNS_ATTRIBUTE; } else { qname = getQName(XMLConstants.XMLNS_ATTRIBUTE,prefix); @@ -669,7 +669,7 @@ public class XMLDOMWriterImpl implements XMLStreamWriterBase { throw new XMLStreamException("Prefix cannot be null"); } - if(prefix.equals("")){ + if(prefix.isEmpty()){ qname = localName; }else{ qname = getQName(prefix,localName); diff --git a/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java b/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java index a3e906291bf..bc40e3ebe21 100644 --- a/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java +++ b/src/java.xml/share/classes/com/sun/xml/internal/stream/writers/XMLStreamWriterImpl.java @@ -628,8 +628,8 @@ public final class XMLStreamWriterImpl extends AbstractMap } if (!fIsRepairingNamespace) { - if (prefix == null || prefix.equals("")){ - if (!namespaceURI.equals("")) { + if (prefix == null || prefix.isEmpty()){ + if (!namespaceURI.isEmpty()) { throw new XMLStreamException("prefix cannot be null or empty"); } else { writeAttributeWithPrefix(null, localName, value); @@ -908,7 +908,7 @@ public final class XMLStreamWriterImpl extends AbstractMap } else { fWriter.write(OPEN_END_TAG); - if ((elem.prefix != null) && !(elem.prefix).equals("")) { + if ((elem.prefix != null) && !(elem.prefix).isEmpty()) { fWriter.write(elem.prefix); fWriter.write(":"); } @@ -945,7 +945,7 @@ public final class XMLStreamWriterImpl extends AbstractMap fWriter.write(OPEN_END_TAG); if ((currentElement.prefix != null) && - !(currentElement.prefix).equals("")) { + !(currentElement.prefix).isEmpty()) { fWriter.write(currentElement.prefix); fWriter.write(":"); } @@ -1180,19 +1180,19 @@ public final class XMLStreamWriterImpl extends AbstractMap } // Verify the encoding before writing anything - if (encoding != null && !encoding.equals("")) { + if (encoding != null && !encoding.isEmpty()) { verifyEncoding(encoding); } fWriter.write(" attr = fAttributeCache.get(j); if ((attr.prefix != null) && (attr.uri != null)) { - if (!attr.prefix.equals("") && !attr.uri.equals("") ) { + if (!attr.prefix.isEmpty() && !attr.uri.isEmpty() ) { String tmp = fInternalNamespaceContext.getPrefix(attr.uri); if ((tmp == null) || (!tmp.equals(attr.prefix))) { @@ -1765,7 +1765,7 @@ public final class XMLStreamWriterImpl extends AbstractMap for(int i=0 ; i< fAttributeCache.size();i++){ attr = fAttributeCache.get(i); - if((attr.prefix != null && !attr.prefix.equals("")) || (attr.uri != null && !attr.uri.equals(""))) { + if((attr.prefix != null && !attr.prefix.isEmpty()) || (attr.uri != null && !attr.uri.isEmpty())) { correctPrefix(currentElement,attr); } } @@ -1773,7 +1773,7 @@ public final class XMLStreamWriterImpl extends AbstractMap if (!isDeclared(currentElement)) { if ((currentElement.prefix != null) && (currentElement.uri != null)) { - if ((!currentElement.prefix.equals("")) && (!currentElement.uri.equals(""))) { + if ((!currentElement.prefix.isEmpty()) && (!currentElement.uri.isEmpty())) { fNamespaceDecls.add(currentElement); } } @@ -1798,7 +1798,7 @@ public final class XMLStreamWriterImpl extends AbstractMap /* If 'attr' is an attribute and it is in no namespace(which means that prefix="", uri=""), attr's namespace should not be redinded. See [http://www.w3.org/TR/REC-xml-names/#defaulting]. */ - if (attr.prefix != null && attr.prefix.equals("") && attr.uri != null && attr.uri.equals("")){ + if (attr.prefix != null && attr.prefix.isEmpty() && attr.uri != null && attr.uri.isEmpty()){ repairNamespaceDecl(attr); } } diff --git a/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java b/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java index b84949d9ce3..d6739cb4b80 100644 --- a/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java +++ b/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java @@ -619,13 +619,13 @@ public class CatalogFeatures { private boolean getSystemProperty(Feature cf, String sysPropertyName) { if (cf.hasSystemProperty()) { String value = SecuritySupport.getSystemProperty(sysPropertyName); - if (value != null && !value.equals("")) { + if (value != null && !value.isEmpty()) { setProperty(cf, State.SYSTEMPROPERTY, value); return true; } value = SecuritySupport.readJAXPProperty(sysPropertyName); - if (value != null && !value.equals("")) { + if (value != null && !value.isEmpty()) { setProperty(cf, State.JAXPDOTPROPERTIES, value); return true; } diff --git a/src/java.xml/share/classes/javax/xml/catalog/Util.java b/src/java.xml/share/classes/javax/xml/catalog/Util.java index 74e3d491e68..af84c3f825d 100644 --- a/src/java.xml/share/classes/javax/xml/catalog/Util.java +++ b/src/java.xml/share/classes/javax/xml/catalog/Util.java @@ -221,7 +221,7 @@ class Util { */ static String[] getCatalogFiles(String sysPropertyName) { String value = SecuritySupport.getJAXPSystemProperty(sysPropertyName); - if (value != null && !value.equals("")) { + if (value != null && !value.isEmpty()) { return value.split(";"); } return null; diff --git a/src/java.xml/share/classes/jdk/xml/internal/JdkXmlFeatures.java b/src/java.xml/share/classes/jdk/xml/internal/JdkXmlFeatures.java index 58f48bf0705..471c6e644dd 100644 --- a/src/java.xml/share/classes/jdk/xml/internal/JdkXmlFeatures.java +++ b/src/java.xml/share/classes/jdk/xml/internal/JdkXmlFeatures.java @@ -383,13 +383,13 @@ public class JdkXmlFeatures { private boolean getSystemProperty(XmlFeature feature, String sysPropertyName) { try { String value = SecuritySupport.getSystemProperty(sysPropertyName); - if (value != null && !value.equals("")) { + if (value != null && !value.isEmpty()) { setFeature(feature, State.SYSTEMPROPERTY, Boolean.parseBoolean(value)); return true; } value = SecuritySupport.readJAXPProperty(sysPropertyName); - if (value != null && !value.equals("")) { + if (value != null && !value.isEmpty()) { setFeature(feature, State.JAXPDOTPROPERTIES, Boolean.parseBoolean(value)); return true; } diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/ByteContainer.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/ByteContainer.java index 5549ddb81f0..9361c0d2e6a 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/ByteContainer.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/ByteContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/CodeContainer.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/CodeContainer.java index 386e3418a80..c3d41014851 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/CodeContainer.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/CodeContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Container.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Container.java index 67e11f45ae9..78a3dfc21de 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Container.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Container.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/GotSymbol.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/GotSymbol.java index 41265af0177..0796401f781 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/GotSymbol.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/GotSymbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/HeaderContainer.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/HeaderContainer.java index fba6ab1f2f2..859d5c132d5 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/HeaderContainer.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/HeaderContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/NativeSymbol.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/NativeSymbol.java index ebf4c4f3d45..909ce87e34f 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/NativeSymbol.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/NativeSymbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/ReadOnlyDataContainer.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/ReadOnlyDataContainer.java index 6ef02489757..0fd87f249a4 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/ReadOnlyDataContainer.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/ReadOnlyDataContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Relocation.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Relocation.java index 856bbd9089c..eab644a5b13 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Relocation.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Relocation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Symbol.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Symbol.java index bb3a02428d4..12eadfdf2d5 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Symbol.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Symbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/SymbolTable.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/SymbolTable.java index 971597621b9..ac27b1996ad 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/SymbolTable.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/SymbolTable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/AMD64JELFRelocObject.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/AMD64JELFRelocObject.java index 13769508bc9..a795587245a 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/AMD64JELFRelocObject.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/AMD64JELFRelocObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfByteBuffer.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfByteBuffer.java index 3ef862080d1..65384381b0d 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfByteBuffer.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfByteBuffer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfContainer.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfContainer.java index d67ed307cfa..f0a284cc0c9 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfContainer.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfHeader.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfHeader.java index da2e56ffeb6..ef71090f36a 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfHeader.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfHeader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocEntry.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocEntry.java index 80cde049df6..279befe1884 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocEntry.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocEntry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocTable.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocTable.java index a8089ae8213..27bcea89fc7 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocTable.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocTable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSection.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSection.java index c06b378e7ec..825d4c08e5e 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSection.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymbol.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymbol.java index 23662a95072..c811000a1ed 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymbol.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymtab.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymtab.java index 42d55ba7738..f5a2a811a1a 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymtab.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymtab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/JMachORelocObject.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/JMachORelocObject.java index 922a02ad84b..a27263d8d33 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/JMachORelocObject.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/JMachORelocObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachO.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachO.java index 4d218d443ee..06849b92216 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachO.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachO.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOByteBuffer.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOByteBuffer.java index a35d6a3a7eb..fcd4d3474cb 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOByteBuffer.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOByteBuffer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOContainer.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOContainer.java index 7627bc34692..9f8470727c5 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOContainer.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachODySymtab.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachODySymtab.java index af253f93b0f..98c50f399c3 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachODySymtab.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachODySymtab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOHeader.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOHeader.java index 22cc591a7b9..5822981aa74 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOHeader.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOHeader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocEntry.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocEntry.java index 8d34dc02500..648d5af918b 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocEntry.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocEntry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocTable.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocTable.java index e9dd44ce6cc..6e5161fa492 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocTable.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocTable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSection.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSection.java index ba66f59cd85..fdcddb55302 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSection.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSegment.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSegment.java index 040a9fb8f7e..8541bde57f6 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSegment.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSegment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymbol.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymbol.java index ecf2b9682f3..4ac0a9a3a2c 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymbol.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymtab.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymtab.java index c5da21db7c9..e5ad3432871 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymtab.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymtab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOTargetInfo.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOTargetInfo.java index 380796adc76..b6c31c4ae22 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOTargetInfo.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOTargetInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOVersion.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOVersion.java index a6b59985583..3cf24639b7f 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOVersion.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOVersion.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/JPECoffRelocObject.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/JPECoffRelocObject.java index a26b6bb9c7c..7c9a207fbe7 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/JPECoffRelocObject.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/JPECoffRelocObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoff.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoff.java index 5ca3872ffe8..b68f45af1ba 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoff.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoff.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffByteBuffer.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffByteBuffer.java index 2590c3546e9..af48d5d4a14 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffByteBuffer.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffByteBuffer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffContainer.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffContainer.java index ef8f3f9e93a..13ebf7fb9ff 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffContainer.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffHeader.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffHeader.java index 1e54cb0e590..30a2012fb6d 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffHeader.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffHeader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocEntry.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocEntry.java index a23572749ca..4e30748befa 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocEntry.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocEntry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocTable.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocTable.java index a136286c4fc..a65db6a12d5 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocTable.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocTable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSection.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSection.java index 6875610e602..952fa26778d 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSection.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymbol.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymbol.java index 852e28e88dd..f565204df02 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymbol.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymtab.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymtab.java index d6dc99a49f4..8d12aac2a87 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymtab.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymtab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffTargetInfo.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffTargetInfo.java index 06445e9b302..7f31f056114 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffTargetInfo.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffTargetInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/HelloWorld.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/HelloWorld.java index f905ed13c1b..9d3d6406cc3 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/HelloWorld.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/HelloWorld.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/NativeOrderOutputStreamTest.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/NativeOrderOutputStreamTest.java index 5e917424e74..4144efb24b0 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/NativeOrderOutputStreamTest.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/NativeOrderOutputStreamTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/ClassSearchTest.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/ClassSearchTest.java index 42076a9283c..ba27665e759 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/ClassSearchTest.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/ClassSearchTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/ClassSourceTest.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/ClassSourceTest.java index 50384492757..7cbb1ce412e 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/ClassSourceTest.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/ClassSourceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/FakeFileSupport.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/FakeFileSupport.java index 067662bf673..8ed7620413e 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/FakeFileSupport.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/FakeFileSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/FakeSearchPath.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/FakeSearchPath.java index 7e1293f1fab..eb2317d375d 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/FakeSearchPath.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/FakeSearchPath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/SearchPathTest.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/SearchPathTest.java index 8f145f90645..cb88e5cd7a5 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/SearchPathTest.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/SearchPathTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/Utils.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/Utils.java index a83ec81998d..c369d5f9fdb 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/Utils.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/Utils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/directory/DirectorySourceProviderTest.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/directory/DirectorySourceProviderTest.java index 3b1c4039887..531675f5cd7 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/directory/DirectorySourceProviderTest.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/directory/DirectorySourceProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/jar/JarSourceProviderTest.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/jar/JarSourceProviderTest.java index ecb38bac242..911b8668f42 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/jar/JarSourceProviderTest.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/jar/JarSourceProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/module/ModuleSourceProviderTest.java b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/module/ModuleSourceProviderTest.java index 3a47ef66650..531d9ae41ae 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/module/ModuleSourceProviderTest.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/module/ModuleSourceProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTBackend.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTBackend.java index 84abc3edeb7..2cbed27de63 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTBackend.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTBackend.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompilationTask.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompilationTask.java index 1161b8e3fd3..192e3ef863e 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompilationTask.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompilationTask.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiledClass.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiledClass.java index 9bd0b27fb06..d63115bd370 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiledClass.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiledClass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiler.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiler.java index 0f273fe26a7..9d1b789d38b 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiler.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTDynamicTypeStore.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTDynamicTypeStore.java index 5f5c57d5a0f..4117d12a5fd 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTDynamicTypeStore.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTDynamicTypeStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTHotSpotResolvedJavaMethod.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTHotSpotResolvedJavaMethod.java index d29ed7113c4..e8f643033af 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTHotSpotResolvedJavaMethod.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTHotSpotResolvedJavaMethod.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTStub.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTStub.java index 394beb0de9e..e5c6c476489 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTStub.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallInfo.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallInfo.java index ab53685e023..13f0a6903a4 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallInfo.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationInfo.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationInfo.java index 96a77e789fd..8e321710cff 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationInfo.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationSymbol.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationSymbol.java index 3f52e04467b..0e1f5a0dca4 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationSymbol.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationSymbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CodeOffsets.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CodeOffsets.java index d01c0230938..243c8b4da40 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CodeOffsets.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CodeOffsets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Collector.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Collector.java index 570b68b715f..36d06610e8b 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Collector.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Collector.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CompilationSpec.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CompilationSpec.java index 9c17e07a7f7..d817dff4009 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CompilationSpec.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CompilationSpec.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataBuilder.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataBuilder.java index 5dfbf69cc1c..1e0492c7be4 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataBuilder.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataPatchProcessor.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataPatchProcessor.java index 309a79f70c8..361c71b9804 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataPatchProcessor.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataPatchProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationInfo.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationInfo.java index fe8227dfbb0..064e4b68a6c 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationInfo.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationSymbol.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationSymbol.java index 9f1dd20b2e9..52d9dbdb96b 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationSymbol.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationSymbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignGotCallSiteRelocationSymbol.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignGotCallSiteRelocationSymbol.java index 8484c12f42b..519214a2dc5 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignGotCallSiteRelocationSymbol.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignGotCallSiteRelocationSymbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/GraalFilters.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/GraalFilters.java index c422c33d48e..57251132fa9 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/GraalFilters.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/GraalFilters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/InfopointProcessor.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/InfopointProcessor.java index 139cc75b10c..83e15884b70 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/InfopointProcessor.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/InfopointProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaCallSiteRelocationInfo.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaCallSiteRelocationInfo.java index f5900f969c8..1f88a13dc0b 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaCallSiteRelocationInfo.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaCallSiteRelocationInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaMethodInfo.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaMethodInfo.java index 091e37ada2d..2ac6fc30af1 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaMethodInfo.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaMethodInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LoadedClass.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LoadedClass.java index 5cbbcba2229..8ca983ef04c 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LoadedClass.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LoadedClass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LogPrinter.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LogPrinter.java index eef923badfd..f14eabb7df5 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LogPrinter.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LogPrinter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkId.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkId.java index b931b88cb99..0b44c11d711 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkId.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkId.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkProcessor.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkProcessor.java index 2ecab2abb8b..eef99a15e46 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkProcessor.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MetadataBuilder.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MetadataBuilder.java index 36407388efb..1af7c5699d6 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MetadataBuilder.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MetadataBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/StubDirectCallSiteRelocationSymbol.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/StubDirectCallSiteRelocationSymbol.java index 9b89aadec84..2628ffde0fe 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/StubDirectCallSiteRelocationSymbol.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/StubDirectCallSiteRelocationSymbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/StubInformation.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/StubInformation.java index 84381adbda6..6938299d2c4 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/StubInformation.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/StubInformation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Timer.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Timer.java index e4373426f41..d7217775abe 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Timer.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Timer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/aarch64/AArch64ELFMacroAssembler.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/aarch64/AArch64ELFMacroAssembler.java index 7f161a30826..5b9c244d767 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/aarch64/AArch64ELFMacroAssembler.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/aarch64/AArch64ELFMacroAssembler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/aarch64/AArch64InstructionDecoder.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/aarch64/AArch64InstructionDecoder.java index 2f3521695f3..4675b1daec2 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/aarch64/AArch64InstructionDecoder.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/aarch64/AArch64InstructionDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64ELFMacroAssembler.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64ELFMacroAssembler.java index a657f462c1b..877ffaa717c 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64ELFMacroAssembler.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64ELFMacroAssembler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64InstructionDecoder.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64InstructionDecoder.java index b7ee6a861b1..0b3316e9be8 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64InstructionDecoder.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64InstructionDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSearch.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSearch.java index 6bbecd156f3..51e45afc38f 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSearch.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSearch.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSource.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSource.java index 6a5ae022054..a60c19b722c 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSource.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSupport.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSupport.java index c894babc352..a51927499c8 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSupport.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSystemFinder.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSystemFinder.java index 50fb365b657..8b2a1a8945f 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSystemFinder.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSystemFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchFor.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchFor.java index 3746515897a..1be0280f902 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchFor.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchFor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchPath.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchPath.java index f3ea3f76e59..38b61a029ff 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchPath.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchPath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SourceProvider.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SourceProvider.java index fefeb399b40..a1f190f5b26 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SourceProvider.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SourceProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSource.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSource.java index 4b89866bd99..e2fec3db093 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSource.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSourceProvider.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSourceProvider.java index 0f990a4ac7e..5b4e12d2a9e 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSourceProvider.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSourceProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySource.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySource.java index d656eef60b5..80f7bdd53c2 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySource.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySourceProvider.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySourceProvider.java index 9904b8424ee..392f1cf8b1e 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySourceProvider.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySourceProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarFileSource.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarFileSource.java index a814922e7c7..07ca6cb30d2 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarFileSource.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarFileSource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarSourceProvider.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarSourceProvider.java index 90d0c9e7afa..fdae4b274eb 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarSourceProvider.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarSourceProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSource.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSource.java index 169e6dbc68c..2e09710c8ac 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSource.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSourceProvider.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSourceProvider.java index 6afc4b6f84e..65805c81299 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSourceProvider.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSourceProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/utils/NativeOrderOutputStream.java b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/utils/NativeOrderOutputStream.java index 2103d75fca8..bab913bd584 100644 --- a/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/utils/NativeOrderOutputStream.java +++ b/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/utils/NativeOrderOutputStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.charsets/share/classes/sun/nio/cs/ext/IBM33722.java b/src/jdk.charsets/share/classes/sun/nio/cs/ext/IBM33722.java index 93491c9d03a..6af1d2189c1 100644 --- a/src/jdk.charsets/share/classes/sun/nio/cs/ext/IBM33722.java +++ b/src/jdk.charsets/share/classes/sun/nio/cs/ext/IBM33722.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,7 @@ import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.nio.charset.CoderResult; import sun.nio.cs.HistoricallyNamedCharset; +import sun.nio.cs.*; public class IBM33722 extends Charset diff --git a/src/jdk.charsets/share/classes/sun/nio/cs/ext/IBM964.java b/src/jdk.charsets/share/classes/sun/nio/cs/ext/IBM964.java.template similarity index 99% rename from src/jdk.charsets/share/classes/sun/nio/cs/ext/IBM964.java rename to src/jdk.charsets/share/classes/sun/nio/cs/ext/IBM964.java.template index 0a947c5d783..b4cf94a2952 100644 --- a/src/jdk.charsets/share/classes/sun/nio/cs/ext/IBM964.java +++ b/src/jdk.charsets/share/classes/sun/nio/cs/ext/IBM964.java.template @@ -1,6 +1,6 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ /* */ -package sun.nio.cs.ext; +package $PACKAGE$; import java.nio.CharBuffer; import java.nio.ByteBuffer; @@ -43,7 +43,7 @@ public class IBM964 { public IBM964() { - super("x-IBM964", ExtendedCharsets.aliasesFor("x-IBM964")); + super("x-IBM964", $ALIASES$); } public String historicalName() { diff --git a/src/jdk.charsets/share/classes/sun/nio/cs/ext/SimpleEUCEncoder.java b/src/jdk.charsets/share/classes/sun/nio/cs/ext/SimpleEUCEncoder.java.template similarity index 99% rename from src/jdk.charsets/share/classes/sun/nio/cs/ext/SimpleEUCEncoder.java rename to src/jdk.charsets/share/classes/sun/nio/cs/ext/SimpleEUCEncoder.java.template index 80f41ac2c04..25ef479bd01 100644 --- a/src/jdk.charsets/share/classes/sun/nio/cs/ext/SimpleEUCEncoder.java +++ b/src/jdk.charsets/share/classes/sun/nio/cs/ext/SimpleEUCEncoder.java.template @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ /* */ -package sun.nio.cs.ext; +package $PACKAGE$; import java.nio.ByteBuffer; import java.nio.CharBuffer; diff --git a/src/jdk.compiler/share/classes/com/sun/tools/doclint/Checker.java b/src/jdk.compiler/share/classes/com/sun/tools/doclint/Checker.java index f3f63f295c4..4759a346d18 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/doclint/Checker.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/doclint/Checker.java @@ -884,8 +884,6 @@ public class Checker extends DocTreePathScanner { String sig = tree.getSignature(); if (sig.contains("<") || sig.contains(">")) { env.messages.error(REFERENCE, tree, "dc.type.arg.not.allowed"); - } else if (isArrayType(sig)) { - env.messages.error(REFERENCE, tree, "dc.array.type.not.allowed"); } else { Element e = env.trees.getElement(getCurrentPath()); if (e == null) @@ -975,12 +973,6 @@ public class Checker extends DocTreePathScanner { return scan(tree.getDescription(), ignore); } - private boolean isArrayType(String signature) { - int brackets = signature.indexOf('['); - int parens = signature.indexOf('('); - return brackets >= 0 && (parens < 0 || brackets < parens); - } - private boolean isThrowable(TypeMirror tm) { switch (tm.getKind()) { case DECLARED: diff --git a/src/jdk.compiler/share/classes/com/sun/tools/doclint/resources/doclint.properties b/src/jdk.compiler/share/classes/com/sun/tools/doclint/resources/doclint.properties index 56afea1aea4..221cb3573c8 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/doclint/resources/doclint.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/doclint/resources/doclint.properties @@ -25,7 +25,6 @@ dc.anchor.already.defined = anchor already defined: "{0}" dc.anchor.value.missing = no value given for anchor -dc.array.type.not.allowed = array type not allowed here dc.attr.lacks.value = attribute lacks value dc.attr.not.number = attribute value is not a number dc.attr.not.supported.html4 = attribute not supported in HTML4: {0} diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java index 13af71d65f4..b70d88f70c7 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java @@ -443,11 +443,7 @@ public class JavacTrees extends DocTrees { // we first check if qualifierExpression identifies a type, // and if not, then we check to see if it identifies a package. Type t = attr.attribType(ref.qualifierExpression, env); - - if (t.getKind() == TypeKind.ARRAY) { - // cannot refer to an array type - return null; - } else if (t.isErroneous()) { + if (t.isErroneous()) { JCCompilationUnit toplevel = treeMaker.TopLevel(List.nil()); final ModuleSymbol msym = modules.getDefaultModule(); @@ -478,7 +474,11 @@ public class JavacTrees extends DocTrees { } } } else { - tsym = t.tsym; + Type e = t; + // If this is an array type convert to element type + while (e instanceof ArrayType) + e = ((ArrayType)e).elemtype; + tsym = e.tsym; memberName = (Name) ref.memberName; } } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java index 7cfd46f932d..5d75401424a 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java @@ -2363,16 +2363,19 @@ public class LambdaToMethod extends TreeTranslator { List tl = tree.getDescriptorType(types).getParameterTypes(); for (; tl.nonEmpty(); tl = tl.tail) { Type pt = tl.head; - switch (pt.getKind()) { - case INTERSECTION: - case UNION: - return true; - case TYPEVAR: - TypeVar tv = (TypeVar) pt; - if (tv.bound.getKind() == TypeKind.INTERSECTION) { - return true; - } - } + return isIntersectionOrUnionType(pt); + } + return false; + } + + boolean isIntersectionOrUnionType(Type t) { + switch (t.getKind()) { + case INTERSECTION: + case UNION: + return true; + case TYPEVAR: + TypeVar tv = (TypeVar) t; + return isIntersectionOrUnionType(tv.bound); } return false; } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/CommandLine.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/CommandLine.java index 9e639871a85..de8d0376106 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/CommandLine.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/CommandLine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ package com.sun.tools.javac.main; import java.io.IOException; import java.io.Reader; +import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; @@ -125,7 +126,7 @@ public class CommandLine { } private static void loadCmdFile(String name, List args) throws IOException { - try (Reader r = Files.newBufferedReader(Paths.get(name))) { + try (Reader r = Files.newBufferedReader(Paths.get(name), Charset.defaultCharset())) { Tokenizer t = new Tokenizer(r); String s; while ((s = t.nextToken()) != null) { diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/Pretty.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/Pretty.java index 1954be1cf54..a88fa43281c 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/Pretty.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/Pretty.java @@ -1525,9 +1525,11 @@ public class Pretty extends JCTree.Visitor { try { print("@"); printExpr(tree.annotationType); - print("("); - printExprs(tree.args); - print(")"); + if (!tree.args.isEmpty()) { + print("("); + printExprs(tree.args); + print(")"); + } } catch (IOException e) { throw new UncheckedIOException(e); } diff --git a/src/jdk.dynalink/share/classes/jdk/dynalink/beans/AccessibleMembersLookup.java b/src/jdk.dynalink/share/classes/jdk/dynalink/beans/AccessibleMembersLookup.java index 22e15013c32..fbdeccb6424 100644 --- a/src/jdk.dynalink/share/classes/jdk/dynalink/beans/AccessibleMembersLookup.java +++ b/src/jdk.dynalink/share/classes/jdk/dynalink/beans/AccessibleMembersLookup.java @@ -216,7 +216,10 @@ class AccessibleMembersLookup { // were not yet loaded, they'll only get loaded in a non-resolved state; no static initializers for // them will trigger just by doing this. // Don't overwrite an inner class with an inherited inner class with the same name. - innerClasses.putIfAbsent(innerClass.getSimpleName(), innerClass); + Class previousClass = innerClasses.get(innerClass.getSimpleName()); + if (previousClass == null || previousClass.getDeclaringClass().isAssignableFrom(innerClass.getDeclaringClass())) { + innerClasses.put(innerClass.getSimpleName(), innerClass); + } } } else { searchSuperTypes = true; diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java index 5f4bc5206c4..30811504b88 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java @@ -36,6 +36,7 @@ import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.gc.epsilon.*; import sun.jvm.hotspot.gc.parallel.*; import sun.jvm.hotspot.gc.shared.*; +import sun.jvm.hotspot.gc.shenandoah.*; import sun.jvm.hotspot.gc.g1.*; import sun.jvm.hotspot.gc.z.*; import sun.jvm.hotspot.interpreter.*; @@ -1113,6 +1114,10 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener { } else if (collHeap instanceof EpsilonHeap) { anno = "Epsilon "; bad = false; + } else if (collHeap instanceof ShenandoahHeap) { + ShenandoahHeap heap = (ShenandoahHeap) collHeap; + anno = "ShenandoahHeap "; + bad = false; } else if (collHeap instanceof ZCollectedHeap) { ZCollectedHeap heap = (ZCollectedHeap) collHeap; anno = "ZHeap "; diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/CollectedHeapName.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/CollectedHeapName.java index 654bb5bc241..f6f63bd99ec 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/CollectedHeapName.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/CollectedHeapName.java @@ -37,6 +37,7 @@ public class CollectedHeapName { public static final CollectedHeapName G1 = new CollectedHeapName("G1"); public static final CollectedHeapName EPSILON = new CollectedHeapName("Epsilon"); public static final CollectedHeapName Z = new CollectedHeapName("Z"); + public static final CollectedHeapName SHENANDOAH = new CollectedHeapName("Shenandoah"); public String toString() { return name; diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GCCause.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GCCause.java index 9e3de41e606..7dba30b7b53 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GCCause.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GCCause.java @@ -67,6 +67,12 @@ public enum GCCause { _z_allocation_stall ("Allocation Stall"), _z_proactive ("Proactive"), + _shenandoah_allocation_failure_evac ("Allocation Failure During Evacuation"), + _shenandoah_stop_vm ("Stopping VM"), + _shenandoah_concurrent_gc ("Concurrent GC"), + _shenandoah_traversal_gc ("Traversal GC"), + _shenandoah_upgrade_to_full_gc ("Upgrade To Full GC"), + _last_gc_cause ("ILLEGAL VALUE - last gc cause - ILLEGAL VALUE"); private final String value; diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GCName.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GCName.java index 9bd81ff7a1d..ac5c9a6cfcf 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GCName.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GCName.java @@ -38,6 +38,7 @@ public enum GCName { G1Old ("G1Old"), G1Full ("G1Full"), Z ("Z"), + Shenandoah ("Shenandoah"), NA ("N/A"), GCNameEndSentinel ("GCNameEndSentinel"); diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeap.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeap.java new file mode 100644 index 00000000000..200633eedcc --- /dev/null +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeap.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +package sun.jvm.hotspot.gc.shenandoah; + +import sun.jvm.hotspot.gc.shared.CollectedHeap; +import sun.jvm.hotspot.gc.shared.CollectedHeapName; +import sun.jvm.hotspot.debugger.Address; +import sun.jvm.hotspot.runtime.VM; +import sun.jvm.hotspot.types.Type; +import sun.jvm.hotspot.types.TypeDataBase; +import sun.jvm.hotspot.memory.MemRegion; +import sun.jvm.hotspot.types.CIntegerField; +import java.io.PrintStream; +import java.util.Observable; +import java.util.Observer; + +public class ShenandoahHeap extends CollectedHeap { + static private CIntegerField numRegions; + static private CIntegerField used; + static private CIntegerField committed; + static { + VM.registerVMInitializedObserver(new Observer() { + public void update(Observable o, Object data) { + initialize(VM.getVM().getTypeDataBase()); + } + }); + } + + static private synchronized void initialize(TypeDataBase db) { + Type type = db.lookupType("ShenandoahHeap"); + numRegions = type.getCIntegerField("_num_regions"); + used = type.getCIntegerField("_used"); + committed = type.getCIntegerField("_committed"); + } + + @Override + public CollectedHeapName kind() { + return CollectedHeapName.SHENANDOAH; + } + + public long numOfRegions() { + return numRegions.getValue(addr); + } + + @Override + public long used() { + return used.getValue(addr); + } + + public long committed() { + return committed.getValue(addr); + } + + @Override + public void printOn(PrintStream tty) { + MemRegion mr = reservedRegion(); + tty.print("Shenandoah heap"); + tty.print(" [" + mr.start() + ", " + mr.end() + "]"); + tty.println(" region size " + ShenandoahHeapRegion.regionSizeBytes() / 1024 + " K"); + } + + public ShenandoahHeap(Address addr) { + super(addr); + } +} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeapRegion.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeapRegion.java new file mode 100644 index 00000000000..32347c97805 --- /dev/null +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeapRegion.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +package sun.jvm.hotspot.gc.shenandoah; + +import sun.jvm.hotspot.gc.shared.ContiguousSpace; +import sun.jvm.hotspot.types.CIntegerField; +import sun.jvm.hotspot.runtime.VM; +import sun.jvm.hotspot.types.Type; +import sun.jvm.hotspot.types.TypeDataBase; +import sun.jvm.hotspot.debugger.Address; + +import java.util.Observable; +import java.util.Observer; + + +public class ShenandoahHeapRegion extends ContiguousSpace { + private static CIntegerField RegionSizeBytes; + static { + VM.registerVMInitializedObserver(new Observer() { + public void update(Observable o, Object data) { + initialize(VM.getVM().getTypeDataBase()); + } + }); + } + + static private synchronized void initialize(TypeDataBase db) { + Type type = db.lookupType("ShenandoahHeapRegion"); + RegionSizeBytes = type.getCIntegerField("RegionSizeBytes"); + } + + public static long regionSizeBytes() { return RegionSizeBytes.getValue(); } + + public ShenandoahHeapRegion(Address addr) { + super(addr); + } +} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/Universe.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/Universe.java index f2a9a41d71e..8b59269b957 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/Universe.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/Universe.java @@ -36,6 +36,7 @@ import sun.jvm.hotspot.gc.g1.G1CollectedHeap; import sun.jvm.hotspot.gc.parallel.ParallelScavengeHeap; import sun.jvm.hotspot.gc.serial.SerialHeap; import sun.jvm.hotspot.gc.shared.CollectedHeap; +import sun.jvm.hotspot.gc.shenandoah.ShenandoahHeap; import sun.jvm.hotspot.gc.z.ZCollectedHeap; import sun.jvm.hotspot.oops.Oop; import sun.jvm.hotspot.runtime.BasicType; @@ -100,6 +101,7 @@ public class Universe { addHeapTypeIfInDB(db, G1CollectedHeap.class); addHeapTypeIfInDB(db, EpsilonHeap.class); addHeapTypeIfInDB(db, ZCollectedHeap.class); + addHeapTypeIfInDB(db, ShenandoahHeap.class); mainThreadGroupField = type.getOopField("_main_thread_group"); systemThreadGroupField = type.getOopField("_system_thread_group"); diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java index 18ad1f91e66..831f6d33285 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java @@ -36,6 +36,7 @@ import sun.jvm.hotspot.gc.cms.*; import sun.jvm.hotspot.gc.shared.*; import sun.jvm.hotspot.gc.epsilon.*; import sun.jvm.hotspot.gc.g1.*; +import sun.jvm.hotspot.gc.shenandoah.*; import sun.jvm.hotspot.gc.parallel.*; import sun.jvm.hotspot.gc.z.*; import sun.jvm.hotspot.memory.*; @@ -367,6 +368,10 @@ public class ObjectHeap { } else if (heap instanceof G1CollectedHeap) { G1CollectedHeap g1h = (G1CollectedHeap) heap; g1h.heapRegionIterate(lrc); + } else if (heap instanceof ShenandoahHeap) { + // Operation (currently) not supported with Shenandoah GC. Print + // a warning and leave the list of live regions empty. + System.err.println("Warning: Operation not supported with Shenandoah GC"); } else if (heap instanceof ZCollectedHeap) { // Operation (currently) not supported with ZGC. Print // a warning and leave the list of live regions empty. diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VMOps.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VMOps.java index d7530286f87..01d03cbf8d2 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VMOps.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VMOps.java @@ -50,13 +50,14 @@ public enum VMOps { GenCollectForAllocation, ParallelGCFailedAllocation, ParallelGCSystemGC, - CGC_Operation, CMS_Initial_Mark, CMS_Final_Remark, G1CollectFull, ZOperation, + ShenandoahOperation, G1CollectForAllocation, G1IncCollectionPause, + G1Concurrent, EnableBiasedLocking, RevokeBias, BulkRevokeBias, diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java index a4b17398a66..d3c3827b79a 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java @@ -29,6 +29,7 @@ import sun.jvm.hotspot.gc.epsilon.*; import sun.jvm.hotspot.gc.g1.*; import sun.jvm.hotspot.gc.parallel.*; import sun.jvm.hotspot.gc.serial.*; +import sun.jvm.hotspot.gc.shenandoah.*; import sun.jvm.hotspot.gc.shared.*; import sun.jvm.hotspot.gc.z.*; import sun.jvm.hotspot.debugger.JVMDebugger; @@ -83,7 +84,11 @@ public class HeapSummary extends Tool { printValMB("MetaspaceSize = ", getFlagValue("MetaspaceSize", flagMap)); printValMB("CompressedClassSpaceSize = ", getFlagValue("CompressedClassSpaceSize", flagMap)); printValMB("MaxMetaspaceSize = ", getFlagValue("MaxMetaspaceSize", flagMap)); - printValMB("G1HeapRegionSize = ", HeapRegion.grainBytes()); + if (heap instanceof ShenandoahHeap) { + printValMB("ShenandoahRegionSize = ", ShenandoahHeapRegion.regionSizeBytes()); + } else { + printValMB("G1HeapRegionSize = ", HeapRegion.grainBytes()); + } System.out.println(); System.out.println("Heap Usage:"); @@ -126,6 +131,14 @@ public class HeapSummary extends Tool { printValMB("used = ", oldGen.used()); printValMB("free = ", oldFree); System.out.println(alignment + (double)oldGen.used() * 100.0 / oldGen.capacity() + "% used"); + } else if (heap instanceof ShenandoahHeap) { + ShenandoahHeap sh = (ShenandoahHeap) heap; + long num_regions = sh.numOfRegions(); + System.out.println("Shenandoah Heap:"); + System.out.println(" regions = " + num_regions); + printValMB("capacity = ", num_regions * ShenandoahHeapRegion.regionSizeBytes()); + printValMB("used = ", sh.used()); + printValMB("committed = ", sh.committed()); } else if (heap instanceof EpsilonHeap) { EpsilonHeap eh = (EpsilonHeap) heap; printSpace(eh.space()); @@ -183,6 +196,14 @@ public class HeapSummary extends Tool { return; } + l = getFlagValue("UseShenandoahGC", flagMap); + if (l == 1L) { + System.out.print("Shenandoah GC "); + l = getFlagValue("ParallelGCThreads", flagMap); + System.out.println("with " + l + " thread(s)"); + return; + } + System.out.println("Mark Sweep Compact GC"); } diff --git a/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/HotSpotGraalManagement.java b/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/HotSpotGraalManagement.java index 047981465a9..a7636aac272 100644 --- a/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/HotSpotGraalManagement.java +++ b/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/HotSpotGraalManagement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/HotSpotGraalRuntimeMBean.java b/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/HotSpotGraalRuntimeMBean.java index fe8c890316f..11bc5c3ed72 100644 --- a/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/HotSpotGraalRuntimeMBean.java +++ b/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/HotSpotGraalRuntimeMBean.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/JMXServiceProvider.java b/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/JMXServiceProvider.java index 8fbc93e02c7..f815c2f2f30 100644 --- a/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/JMXServiceProvider.java +++ b/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/JMXServiceProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/package-info.java b/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/package-info.java index 349ffb67015..eee83128f21 100644 --- a/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/package-info.java +++ b/src/jdk.internal.vm.compiler.management/share/classes/org.graalvm.compiler.hotspot.management/src/org/graalvm/compiler/hotspot/management/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/jdk.internal.vm.compiler.word/src/jdk/internal/vm/compiler/word/package-info.java b/src/jdk.internal.vm.compiler/share/classes/jdk.internal.vm.compiler.word/src/jdk/internal/vm/compiler/word/package-info.java index 434fe356146..caecc6a078d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/jdk.internal.vm.compiler.word/src/jdk/internal/vm/compiler/word/package-info.java +++ b/src/jdk.internal.vm.compiler/share/classes/jdk.internal.vm.compiler.word/src/jdk/internal/vm/compiler/word/package-info.java @@ -49,4 +49,4 @@ -package jdk.internal.vm.compiler.word; \ No newline at end of file +package jdk.internal.vm.compiler.word; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/BlackholeDirectiveTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/BlackholeDirectiveTest.java index 19c2fa366db..d627edccdb6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/BlackholeDirectiveTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/BlackholeDirectiveTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ControlFlowAnchorDirectiveTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ControlFlowAnchorDirectiveTest.java index 52f04b217ce..6baf645102f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ControlFlowAnchorDirectiveTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ControlFlowAnchorDirectiveTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/DeoptimizeDirectiveTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/DeoptimizeDirectiveTest.java index b8b840a73ce..17ff02b2ece 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/DeoptimizeDirectiveTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/DeoptimizeDirectiveTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/IterationDirectiveTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/IterationDirectiveTest.java index 8a824d4bcd9..c98c3e7ab07 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/IterationDirectiveTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/IterationDirectiveTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/OpaqueDirectiveTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/OpaqueDirectiveTest.java index 7df5d621352..51230eb4fea 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/OpaqueDirectiveTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/OpaqueDirectiveTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ProbabilityDirectiveTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ProbabilityDirectiveTest.java index 4802402fc87..7474ad31172 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ProbabilityDirectiveTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ProbabilityDirectiveTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives/src/org/graalvm/compiler/api/directives/GraalDirectives.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives/src/org/graalvm/compiler/api/directives/GraalDirectives.java index d8bf34ea818..f81ebf69c14 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives/src/org/graalvm/compiler/api/directives/GraalDirectives.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives/src/org/graalvm/compiler/api/directives/GraalDirectives.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/ClassSubstitution.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/ClassSubstitution.java index 7ce523506e3..435648d3530 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/ClassSubstitution.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/ClassSubstitution.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/Fold.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/Fold.java index f902628b50d..aed237306b9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/Fold.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/Fold.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,8 @@ public @interface Fold { /** * Annotates a parameter to an {@link Fold}-annotated method. This parameter will be - * automatically injected by the compiler. The caller should always pass {@code null}. + * automatically injected by the compiler. A call from non-generated code must always pass + * {@code null} for an injected parameter. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/MethodSubstitution.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/MethodSubstitution.java index c4cb3e2f940..1b4d3e6a6db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/MethodSubstitution.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/MethodSubstitution.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/MethodSubstitutionRegistry.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/MethodSubstitutionRegistry.java index 58b01c0aa10..9f623fd06af 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/MethodSubstitutionRegistry.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/MethodSubstitutionRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/Snippet.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/Snippet.java index 2ff3cba7ed7..e07a876773f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/Snippet.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/Snippet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/SnippetReflectionProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/SnippetReflectionProvider.java index 5ffdf0229e9..1bf2a8291ca 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/SnippetReflectionProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/SnippetReflectionProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/SnippetTemplateCache.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/SnippetTemplateCache.java index cd60bb1c9da..484a51acfe5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/SnippetTemplateCache.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.replacements/src/org/graalvm/compiler/api/replacements/SnippetTemplateCache.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.runtime/src/org/graalvm/compiler/api/runtime/GraalJVMCICompiler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.runtime/src/org/graalvm/compiler/api/runtime/GraalJVMCICompiler.java index 95ba0e7a003..1e0358174ee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.runtime/src/org/graalvm/compiler/api/runtime/GraalJVMCICompiler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.runtime/src/org/graalvm/compiler/api/runtime/GraalJVMCICompiler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.runtime/src/org/graalvm/compiler/api/runtime/GraalRuntime.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.runtime/src/org/graalvm/compiler/api/runtime/GraalRuntime.java index 259e8a96e06..e79b99bead3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.runtime/src/org/graalvm/compiler/api/runtime/GraalRuntime.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.runtime/src/org/graalvm/compiler/api/runtime/GraalRuntime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.test/src/org/graalvm/compiler/api/test/Graal.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.test/src/org/graalvm/compiler/api/test/Graal.java index 961fcd33799..4e674b77e6c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.test/src/org/graalvm/compiler/api/test/Graal.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.test/src/org/graalvm/compiler/api/test/Graal.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.test/src/org/graalvm/compiler/api/test/GraalAPITest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.test/src/org/graalvm/compiler/api/test/GraalAPITest.java index 79dd53cc34c..75f85ddca5f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.test/src/org/graalvm/compiler/api/test/GraalAPITest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.test/src/org/graalvm/compiler/api/test/GraalAPITest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64.test/src/org/graalvm/compiler/asm/aarch64/test/AArch64MacroAssemblerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64.test/src/org/graalvm/compiler/asm/aarch64/test/AArch64MacroAssemblerTest.java index c3ec80804e0..93aafe23bfd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64.test/src/org/graalvm/compiler/asm/aarch64/test/AArch64MacroAssemblerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64.test/src/org/graalvm/compiler/asm/aarch64/test/AArch64MacroAssemblerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64.test/src/org/graalvm/compiler/asm/aarch64/test/TestProtectedAssembler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64.test/src/org/graalvm/compiler/asm/aarch64/test/TestProtectedAssembler.java index 03385645c96..eaec8f9390e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64.test/src/org/graalvm/compiler/asm/aarch64/test/TestProtectedAssembler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64.test/src/org/graalvm/compiler/asm/aarch64/test/TestProtectedAssembler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Address.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Address.java index 287a80de6cd..10cc6e0d632 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Address.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Address.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Assembler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Assembler.java index a8ccae24c92..79739b54800 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Assembler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Assembler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64MacroAssembler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64MacroAssembler.java index ce8ed452953..017a9d6e1c3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64MacroAssembler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64MacroAssembler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -504,8 +504,8 @@ public class AArch64MacroAssembler extends AArch64Assembler { * @param dst general purpose register. May not be null or stackpointer. * @param condition any condition. May not be null. */ - public void cset(Register dst, ConditionFlag condition) { - super.csinc(32, dst, zr, zr, condition.negate()); + public void cset(int size, Register dst, ConditionFlag condition) { + super.csinc(size, dst, zr, zr, condition.negate()); } /** @@ -737,6 +737,46 @@ public class AArch64MacroAssembler extends AArch64Assembler { super.madd(size, dst, src1, src2, zr); } + /** + * dst = src3 + src1 * src2. + * + * @param size register size. Has to be 32 or 64. + * @param dst general purpose register. May not be null or the stackpointer. + * @param src1 general purpose register. May not be null or the stackpointer. + * @param src2 general purpose register. May not be null or the stackpointer. + * @param src3 general purpose register. May not be null or the stackpointer. + */ + @Override + public void madd(int size, Register dst, Register src1, Register src2, Register src3) { + super.madd(size, dst, src1, src2, src3); + } + + /** + * dst = src3 - src1 * src2. + * + * @param size register size. Has to be 32 or 64. + * @param dst general purpose register. May not be null or the stackpointer. + * @param src1 general purpose register. May not be null or the stackpointer. + * @param src2 general purpose register. May not be null or the stackpointer. + * @param src3 general purpose register. May not be null or the stackpointer. + */ + @Override + public void msub(int size, Register dst, Register src1, Register src2, Register src3) { + super.msub(size, dst, src1, src2, src3); + } + + /** + * dst = 0 - src1 * src2. + * + * @param size register size. Has to be 32 or 64. + * @param dst general purpose register. May not be null or the stackpointer. + * @param src1 general purpose register. May not be null or the stackpointer. + * @param src2 general purpose register. May not be null or the stackpointer. + */ + public void mneg(int size, Register dst, Register src1, Register src2) { + super.msub(size, dst, src1, src2, zr); + } + /** * unsigned multiply high. dst = (src1 * src2) >> size * @@ -1011,6 +1051,95 @@ public class AArch64MacroAssembler extends AArch64Assembler { super.orn(size, dst, zr, src, ShiftType.LSL, 0); } + /** + * dst = src1 & shiftType(src2, imm). + * + * @param size register size. Has to be 32 or 64. + * @param dst general purpose register. May not be null or stackpointer. + * @param src1 general purpose register. May not be null or stackpointer. + * @param src2 general purpose register. May not be null or stackpointer. + * @param shiftType all types allowed, may not be null. + * @param shiftAmt must be in range 0 to size - 1. + */ + @Override + public void and(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) { + super.and(size, dst, src1, src2, shiftType, shiftAmt); + } + + /** + * dst = src1 ^ shiftType(src2, imm). + * + * @param size register size. Has to be 32 or 64. + * @param dst general purpose register. May not be null or stackpointer. + * @param src1 general purpose register. May not be null or stackpointer. + * @param src2 general purpose register. May not be null or stackpointer. + * @param shiftType all types allowed, may not be null. + * @param shiftAmt must be in range 0 to size - 1. + */ + @Override + public void eor(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) { + super.eor(size, dst, src1, src2, shiftType, shiftAmt); + } + + /** + * dst = src1 | shiftType(src2, imm). + * + * @param size register size. Has to be 32 or 64. + * @param dst general purpose register. May not be null or stackpointer. + * @param src1 general purpose register. May not be null or stackpointer. + * @param src2 general purpose register. May not be null or stackpointer. + * @param shiftType all types allowed, may not be null. + * @param shiftAmt must be in range 0 to size - 1. + */ + public void or(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) { + super.orr(size, dst, src1, src2, shiftType, shiftAmt); + } + + /** + * dst = src1 & ~(shiftType(src2, imm)). + * + * @param size register size. Has to be 32 or 64. + * @param dst general purpose register. May not be null or stackpointer. + * @param src1 general purpose register. May not be null or stackpointer. + * @param src2 general purpose register. May not be null or stackpointer. + * @param shiftType all types allowed, may not be null. + * @param shiftAmt must be in range 0 to size - 1. + */ + @Override + public void bic(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) { + super.bic(size, dst, src1, src2, shiftType, shiftAmt); + } + + /** + * dst = src1 ^ ~(shiftType(src2, imm)). + * + * @param size register size. Has to be 32 or 64. + * @param dst general purpose register. May not be null or stackpointer. + * @param src1 general purpose register. May not be null or stackpointer. + * @param src2 general purpose register. May not be null or stackpointer. + * @param shiftType all types allowed, may not be null. + * @param shiftAmt must be in range 0 to size - 1. + */ + @Override + public void eon(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) { + super.eon(size, dst, src1, src2, shiftType, shiftAmt); + } + + /** + * dst = src1 | ~(shiftType(src2, imm)). + * + * @param size register size. Has to be 32 or 64. + * @param dst general purpose register. May not be null or stackpointer. + * @param src1 general purpose register. May not be null or stackpointer. + * @param src2 general purpose register. May not be null or stackpointer. + * @param shiftType all types allowed, may not be null. + * @param shiftAmt must be in range 0 to size - 1. + */ + @Override + public void orn(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) { + super.orn(size, dst, src1, src2, shiftType, shiftAmt); + } + /** * Sign-extend value from src into dst. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/BitOpsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/BitOpsTest.java index 427ce6dd727..b2b87afa5f4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/BitOpsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/BitOpsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/IncrementDecrementMacroTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/IncrementDecrementMacroTest.java index 8f01d7e6a3b..a2a8e07e316 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/IncrementDecrementMacroTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/IncrementDecrementMacroTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/SimpleAssemblerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/SimpleAssemblerTest.java index 28a91d037fd..96d04a6c7c4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/SimpleAssemblerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64.test/src/org/graalvm/compiler/asm/amd64/test/SimpleAssemblerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64Address.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64Address.java index 534ca4dfa12..88ce0498b34 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64Address.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64Address.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64AsmOptions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64AsmOptions.java index b0ce0298942..8bf7c2e3cba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64AsmOptions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64AsmOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64BaseAssembler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64BaseAssembler.java index ae520e770ba..d550c5327d0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64BaseAssembler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64BaseAssembler.java @@ -721,6 +721,7 @@ public abstract class AMD64BaseAssembler extends Assembler { @Override public void simdPrefix(Register xreg, Register nds, AMD64Address adr, int sizePrefix, int opcodeEscapePrefix, boolean isRexW) { + assert (!nds.isValid()) || nds.equals(xreg); if (sizePrefix > 0) { emitByte(sizePrefix); } @@ -738,6 +739,7 @@ public abstract class AMD64BaseAssembler extends Assembler { @Override public void simdPrefix(Register dst, Register nds, Register src, int sizePrefix, int opcodeEscapePrefix, boolean isRexW) { + assert (!nds.isValid()) || nds.equals(dst) || nds.equals(src); if (sizePrefix > 0) { emitByte(sizePrefix); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc.test/src/org/graalvm/compiler/asm/sparc/test/BitSpecTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc.test/src/org/graalvm/compiler/asm/sparc/test/BitSpecTest.java index f908a50bd12..c53ac325c16 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc.test/src/org/graalvm/compiler/asm/sparc/test/BitSpecTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc.test/src/org/graalvm/compiler/asm/sparc/test/BitSpecTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc.test/src/org/graalvm/compiler/asm/sparc/test/SPARCAssemblerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc.test/src/org/graalvm/compiler/asm/sparc/test/SPARCAssemblerTest.java index 1367a4330be..84708b7fa52 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc.test/src/org/graalvm/compiler/asm/sparc/test/SPARCAssemblerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc.test/src/org/graalvm/compiler/asm/sparc/test/SPARCAssemblerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCAddress.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCAddress.java index a98d00974a5..285e7683160 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCAddress.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCAddress.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCAssembler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCAssembler.java index de219e7b3b1..393910c6ad1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCAssembler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCAssembler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCInstructionCounter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCInstructionCounter.java index 30f43954995..9df1ac19403 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCInstructionCounter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCInstructionCounter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCMacroAssembler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCMacroAssembler.java index 86a5a21f400..bbb91810273 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCMacroAssembler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.sparc/src/org/graalvm/compiler/asm/sparc/SPARCMacroAssembler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.test/src/org/graalvm/compiler/asm/test/AssemblerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.test/src/org/graalvm/compiler/asm/test/AssemblerTest.java index a30dfaf9cad..c1c39701a08 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.test/src/org/graalvm/compiler/asm/test/AssemblerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.test/src/org/graalvm/compiler/asm/test/AssemblerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/AbstractAddress.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/AbstractAddress.java index 455b07d34e4..8e5446f429b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/AbstractAddress.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/AbstractAddress.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/AsmOptions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/AsmOptions.java index 7cf22699eb0..93be335c38a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/AsmOptions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/AsmOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Assembler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Assembler.java index 9cf93907ccb..0fb047ebd9b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Assembler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Assembler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Buffer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Buffer.java index 5321683904d..9abd3c0d370 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Buffer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Buffer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Label.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Label.java index e949ca1a2d5..e54cf261705 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Label.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Label.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BridgeMethodUtils.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BridgeMethodUtils.java index 068f04a7ce4..a01a9fecb62 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BridgeMethodUtils.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BridgeMethodUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytecode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytecode.java index 53d82e1deb7..d7edf6ae951 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytecode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytecode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeDisassembler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeDisassembler.java index c54efd31d8c..ea29b517137 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeDisassembler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeDisassembler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeLookupSwitch.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeLookupSwitch.java index f89effc98ec..005df50aa6c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeLookupSwitch.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeLookupSwitch.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeProvider.java index d340b661c0a..dd7b76ec478 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeStream.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeStream.java index c4b53267dde..438559a7b35 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeStream.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeSwitch.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeSwitch.java index 925b7fcb5ba..33d95ccf560 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeSwitch.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeSwitch.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeTableSwitch.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeTableSwitch.java index 6b40ce8136a..2133bc00186 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeTableSwitch.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/BytecodeTableSwitch.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytecodes.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytecodes.java index a68be42b873..b6432be816b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytecodes.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytecodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytes.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytes.java index 25fdf3cfd10..53ddcd8f893 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytes.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/Bytes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/ResolvedJavaMethodBytecode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/ResolvedJavaMethodBytecode.java index a8d7bc25c34..09e387ee748 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/ResolvedJavaMethodBytecode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/ResolvedJavaMethodBytecode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/ResolvedJavaMethodBytecodeProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/ResolvedJavaMethodBytecodeProvider.java index 30ddeda23d3..5618c659e07 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/ResolvedJavaMethodBytecodeProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.bytecode/src/org/graalvm/compiler/bytecode/ResolvedJavaMethodBytecodeProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/CompilationResult.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/CompilationResult.java index 5c21814e3ad..cdbd465c254 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/CompilationResult.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/CompilationResult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/DataSection.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/DataSection.java index feb658d9315..9b49021df6b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/DataSection.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/DataSection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/DisassemblerProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/DisassemblerProvider.java index 9dcca2ced51..506eb620328 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/DisassemblerProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/DisassemblerProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/HexCodeFile.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/HexCodeFile.java index cad0c954827..e8803c64888 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/HexCodeFile.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/HexCodeFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/HexCodeFileDisassemblerProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/HexCodeFileDisassemblerProvider.java index f4ad117d8bb..190bd6e9621 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/HexCodeFileDisassemblerProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/HexCodeFileDisassemblerProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/SourceMapping.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/SourceMapping.java index 0d70b3ecccc..1a0702a63d6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/SourceMapping.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/SourceMapping.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/SourceStackTraceBailoutException.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/SourceStackTraceBailoutException.java index deacc0d8907..19647282774 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/SourceStackTraceBailoutException.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.code/src/org/graalvm/compiler/code/SourceStackTraceBailoutException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64AddSubShiftTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64AddSubShiftTest.java index 56f90fc6b78..ca0d5c973d0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64AddSubShiftTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64AddSubShiftTest.java @@ -26,11 +26,15 @@ package org.graalvm.compiler.core.aarch64.test; +import org.graalvm.compiler.lir.LIRInstruction; import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticOp; -import org.junit.Assert; import org.junit.Test; +import java.util.function.Predicate; + public class AArch64AddSubShiftTest extends AArch64MatchRuleTest { + private static final Predicate predicate = op -> (op instanceof AArch64ArithmeticOp.BinaryShiftOp); + /** * addSubShift match rule test for add operation with int type. */ @@ -55,7 +59,7 @@ public class AArch64AddSubShiftTest extends AArch64MatchRuleTest { return output; } - private static int addShiftInt(int input) { + public static int addShiftInt(int input) { return addLeftShiftInt(input) + addRightShiftInt(input) + addUnsignedRightShiftInt(input); } @@ -65,13 +69,8 @@ public class AArch64AddSubShiftTest extends AArch64MatchRuleTest { */ @Test public void testAddShiftInt() { - int expected = addShiftInt(123); - - Result result = executeActual(getResolvedJavaMethod("addShiftInt"), null, 123); - int actual = (int) result.returnValue; - Assert.assertEquals(expected, actual); - - checkLIR(AArch64ArithmeticOp.AddSubShiftOp.class, 6); + test("addShiftInt", 123); + checkLIR("addShiftInt", predicate, 6); } /** @@ -98,7 +97,7 @@ public class AArch64AddSubShiftTest extends AArch64MatchRuleTest { return output; } - private static long addShiftLong(long input) { + public static long addShiftLong(long input) { return addLeftShiftLong(input) + addRightShiftLong(input) + addUnsignedRightShiftLong(input); } @@ -108,13 +107,8 @@ public class AArch64AddSubShiftTest extends AArch64MatchRuleTest { */ @Test public void testAddShiftLong() { - long expected = addShiftLong(1234567); - - Result result = executeActual(getResolvedJavaMethod("addShiftLong"), null, (long) 1234567); - long actual = (long) result.returnValue; - Assert.assertEquals(expected, actual); - - checkLIR(AArch64ArithmeticOp.AddSubShiftOp.class, 6); + test("addShiftLong", 1234567L); + checkLIR("addShiftLong", predicate, 6); } /** @@ -132,7 +126,7 @@ public class AArch64AddSubShiftTest extends AArch64MatchRuleTest { return input0 - (input1 >>> 5); } - private static int subShiftInt(int input0, int input1) { + public static int subShiftInt(int input0, int input1) { return subLeftShiftInt(input0, input1) + subRightShiftInt(input0, input1) + subUnsignedRightShiftInt(input0, input1); } @@ -142,13 +136,8 @@ public class AArch64AddSubShiftTest extends AArch64MatchRuleTest { */ @Test public void testSubShiftInt() { - int expected = subShiftInt(123, 456); - - Result result = executeActual(getResolvedJavaMethod("subShiftInt"), null, 123, 456); - int actual = (int) result.returnValue; - Assert.assertEquals(expected, actual); - - checkLIR(AArch64ArithmeticOp.AddSubShiftOp.class, 3); + test("subShiftInt", 123, 456); + checkLIR("subShiftInt", predicate, 3); } /** @@ -166,7 +155,7 @@ public class AArch64AddSubShiftTest extends AArch64MatchRuleTest { return input0 - (input1 >>> 5); } - private static long subShiftLong(long input0, long input1) { + public static long subShiftLong(long input0, long input1) { return subLeftShiftLong(input0, input1) + subRightShiftLong(input0, input1) + subUnsignedRightShiftLong(input0, input1); } @@ -176,12 +165,7 @@ public class AArch64AddSubShiftTest extends AArch64MatchRuleTest { */ @Test public void testSubShiftLong() { - long expected = subShiftLong(1234567, 123); - - Result result = executeActual(getResolvedJavaMethod("subShiftLong"), null, (long) 1234567, (long) 123); - long actual = (long) result.returnValue; - Assert.assertEquals(expected, actual); - - checkLIR(AArch64ArithmeticOp.AddSubShiftOp.class, 3); + test("subShiftLong", 1234567L, 123L); + checkLIR("subShiftLong", predicate, 3); } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64ConditionalSetTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64ConditionalSetTest.java new file mode 100644 index 00000000000..0126c942623 --- /dev/null +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64ConditionalSetTest.java @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Arm Limited and affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + + +package org.graalvm.compiler.core.aarch64.test; + +import org.graalvm.compiler.core.common.calc.UnsignedMath; +import org.graalvm.compiler.lir.LIRInstruction; +import org.graalvm.compiler.lir.aarch64.AArch64ControlFlow; +import org.junit.Test; + +import java.util.function.Predicate; + +public class AArch64ConditionalSetTest extends AArch64MatchRuleTest { + private static final Predicate predicate = op -> (op instanceof AArch64ControlFlow.CondSetOp); + + /** + * conditionalSet test for integer tests condition. + */ + public static int conditionalSetEQZero(int m) { + if ((m & 2) == 0) { + return 1; + } + return 0; + } + + @Test + public void testConditionalSetEQZero() { + test("conditionalSetEQZero", 0); + test("conditionalSetEQZero", 2); + checkLIR("conditionalSetEQZero", predicate, 1); + } + + /** + * conditionalSet test for integer equals condition. + */ + public static int conditionalSetEQ(int m, int n) { + if (m == n) { + return 1; + } + return 0; + } + + @Test + public void testConditionalSetEQ() { + test("conditionalSetEQ", 1, 2); + test("conditionalSetEQ", 2, 2); + checkLIR("conditionalSetEQ", predicate, 1); + } + + /** + * conditionalSet test for integer less than condition. + */ + public static int conditionalSetLT(int m, int n) { + if (m < n) { + return 1; + } + return 0; + } + + @Test + public void testConditionalSetLT() { + test("conditionalSetLT", 1, 2); + test("conditionalSetLT", 3, 2); + checkLIR("conditionalSetLT", predicate, 1); + } + + /** + * conditionalSet test for integer below condition. + */ + public static boolean conditionalSetBT(int m, int n) { + return UnsignedMath.belowThan(m, n); + } + + @Test + public void testConditionalSetBT() { + test("conditionalSetBT", 1, 2); + test("conditionalSetBT", 3, 2); + checkLIR("conditionalSetBT", predicate, 1); + } + + /** + * conditionalSet test for float point equals condition. + */ + public static int conditionalSetFPEQ(float m, float n) { + if (m == n) { + return 1; + } + return 0; + } + + @Test + public void testConditionalSetFPEQ() { + test("conditionalSetFPEQ", 1.0f, 2.0f); + test("conditionalSetFPEQ", 2.0f, 2.0f); + checkLIR("conditionalSetFPEQ", predicate, 1); + } + + /** + * conditionalSet test for float point less than condition. + */ + public static int conditionalSetFPLT(float m, float n) { + if (m < n) { + return 1; + } + return 0; + } + + @Test + public void testConditionalSetFPLT() { + test("conditionalSetFPLT", 1.0f, 2.0f); + test("conditionalSetFPLT", 3.0f, 2.0f); + checkLIR("conditionalSetFPLT", predicate, 1); + } + + /** + * conditionalSet test for object equals condition. + */ + public static int conditionalSetObjectEQ(Integer m, Integer n) { + if (m == n) { + return 1; + } + return 0; + } + + @Test + public void testConditionalSetObjectEQ() { + test("conditionalSetObjectEQ", Integer.valueOf(1), Integer.valueOf(2)); + test("conditionalSetObjectEQ", Integer.valueOf(2), Integer.valueOf(2)); + checkLIR("conditionalSetObjectEQ", predicate, 1); + } + + /** + * conditionalSet test for null check condition. + */ + public static int conditionalSetIsNull(Object obj) { + if (obj == null) { + return 1; + } + return 0; + } + + @Test + public void testConditionalSetIsNull() { + Object obj = null; + test("conditionalSetIsNull", obj); + test("conditionalSetIsNull", Integer.valueOf(1)); + checkLIR("conditionalSetIsNull", predicate, 1); + } + + /** + * conditionalSet test when trueValue and falseValue need to be exchanged. + */ + public static int conditionalSetSwap(int m, int n) { + if (m == n) { + return 0; + } + return 1; + } + + @Test + public void testConditionalSetSwap() { + test("conditionalSetSwap", 1, 2); + test("conditionalSetSwap", 2, 2); + checkLIR("conditionalSetSwap", predicate, 1); + } + + /** + * conditionalSet test for result with long type. + */ + public static long conditionalSetLong(int m, int n) { + if (m == n) { + return 1; + } + return 0; + } + + @Test + public void testConditionalSetLong() { + test("conditionalSetLong", 1, 2); + test("conditionalSetLong", 2, 2); + checkLIR("conditionalSetLong", predicate, 1); + } +} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64LogicShiftTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64LogicShiftTest.java new file mode 100644 index 00000000000..1751bc03396 --- /dev/null +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64LogicShiftTest.java @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Arm Limited and affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + + +package org.graalvm.compiler.core.aarch64.test; + +import org.graalvm.compiler.lir.LIRInstruction; +import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticOp; +import org.junit.Test; + +import java.util.function.Predicate; + +public class AArch64LogicShiftTest extends AArch64MatchRuleTest { + private static final Predicate predicate = op -> (op instanceof AArch64ArithmeticOp.BinaryShiftOp); + + /** + * logicShift match rule test for instruction "and" with int type. + */ + public static int andShiftInt(int input0, int input1) { + int value = input0 & (input1 << 5); + value += input0 & (input1 >> 5); + value += input0 & (input1 >>> 5); + return value; + } + + @Test + public void testAndShiftInt() { + test("andShiftInt", 123, 425); + checkLIR("andShiftInt", predicate, 3); + } + + /** + * logicShift match rule test for instruction "and" with long type. + */ + public static long andShiftLong(long input0, long input1) { + long value = input0 & (input1 << 5); + value += input0 & (input1 >> 5); + value += input0 & (input1 >>> 5); + return value; + } + + @Test + public void testAndShiftLong() { + test("andShiftLong", 1234567L, 123L); + checkLIR("andShiftLong", predicate, 3); + } + + /** + * logicShift match rule test for instruction "orr" with int type. + */ + public static int orrShiftInt(int input0, int input1) { + int value = input0 | (input1 << 5); + value += input0 | (input1 >> 5); + value += input0 | (input1 >>> 5); + return value; + } + + @Test + public void testOrrShiftInt() { + test("orrShiftInt", 123, 425); + checkLIR("orrShiftInt", predicate, 3); + } + + /** + * logicShift match rule test for instruction "orr" with long type. + */ + public static long orrShiftLong(long input0, long input1) { + long value = input0 | (input1 << 5); + value += input0 | (input1 >> 5); + value += input0 | (input1 >>> 5); + return value; + } + + @Test + public void testOrrShiftLong() { + test("orrShiftLong", 1234567L, 123L); + checkLIR("orrShiftLong", predicate, 3); + } + + /** + * logicShift match rule test for instruction "eor" with int type. + */ + public static int eorShiftInt(int input0, int input1) { + int value = input0 ^ (input1 << 5); + value += input0 ^ (input1 >> 5); + value += input0 ^ (input1 >>> 5); + return value; + } + + @Test + public void testEorShiftInt() { + test("eorShiftInt", 123, 425); + checkLIR("eorShiftInt", predicate, 3); + } + + /** + * logicShift match rule test for instruction "eor" with long type. + */ + public static long eorShiftLong(long input0, long input1) { + long value = input0 ^ (input1 << 5); + value += input0 ^ (input1 >> 5); + value += input0 ^ (input1 >>> 5); + return value; + } + + @Test + public void testEorShiftLong() { + test("eorShiftLong", 1234567L, 123L); + checkLIR("eorShiftLong", predicate, 3); + } + + /** + * logicShift match rule test for instruction "bic" with int type. + */ + public static int bicShiftInt(int input0, int input1) { + int value = input0 & ~(input1 << 5); + value += input0 & ~(input1 >> 5); + value += input0 & ~(input1 >>> 5); + return value; + } + + @Test + public void testBicShiftInt() { + test("bicShiftInt", 123, 425); + checkLIR("bicShiftInt", predicate, 3); + } + + /** + * logicShift match rule test for instruction "bic" with long type. + */ + public static long bicShiftLong(long input0, long input1) { + long value = input0 & ~(input1 << 5); + value += input0 & ~(input1 >> 5); + value += input0 & ~(input1 >>> 5); + return value; + } + + @Test + public void testBicShiftLong() { + test("bicShiftLong", 1234567L, 123L); + checkLIR("bicShiftLong", predicate, 3); + } + + /** + * logicShift match rule test for instruction "orn" with int type. + */ + public static int ornShiftInt(int input0, int input1) { + int value = input0 | ~(input1 << 5); + value += input0 | ~(input1 >> 5); + value += input0 | ~(input1 >>> 5); + return value; + } + + @Test + public void testOrnShiftInt() { + test("ornShiftInt", 123, 425); + checkLIR("ornShiftInt", predicate, 3); + } + + /** + * logicShift match rule test for instruction "orn" with long type. + */ + public static long ornShiftLong(long input0, long input1) { + long value = input0 | ~(input1 << 5); + value += input0 | ~(input1 >> 5); + value += input0 | ~(input1 >>> 5); + return value; + } + + @Test + public void testOrnShiftLong() { + test("ornShiftLong", 1234567L, 123L); + checkLIR("ornShiftLong", predicate, 3); + } + + /** + * logicShift match rule test for instruction "eon" with int type. + */ + public static int eonShiftInt(int input0, int input1) { + int value = input0 ^ ~(input1 << 5); + value += input0 ^ ~(input1 >> 5); + value += input0 ^ ~(input1 >>> 5); + return value; + } + + @Test + public void testEonShiftInt() { + test("eonShiftInt", 123, 425); + checkLIR("eonShiftInt", predicate, 3); + } + + /** + * logicShift match rule test for instruction "eon" with long type. + */ + public static long eonShiftLong(long input0, long input1) { + long value = input0 ^ ~(input1 << 5); + value += input0 ^ ~(input1 >> 5); + value += input0 ^ ~(input1 >>> 5); + return value; + } + + @Test + public void testEonShiftLong() { + test("eonShiftLong", 1234567L, 123L); + checkLIR("eonShiftLong", predicate, 3); + } +} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64MNegTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64MNegTest.java new file mode 100644 index 00000000000..6e903381deb --- /dev/null +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64MNegTest.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Arm Limited and affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + + +package org.graalvm.compiler.core.aarch64.test; + +import java.util.function.Predicate; +import org.graalvm.compiler.lir.LIRInstruction; +import org.junit.Test; + +public class AArch64MNegTest extends AArch64MatchRuleTest { + private static final Predicate predicate = op -> (op.name().toUpperCase().equals("MNEG")); + + private void testAndCheckLIR(String methodName, int insCount, Object... args) { + assert args.length >= 2; + test(methodName, args); + checkLIR(methodName, predicate, insCount); + } + + /** + * mneg rule test with int type. + */ + private static int mulNegInt(int x, int y) { + return ((x + 1) * 2 + 3) * (-y); + } + + private static int mulZeroSubInt(int x, int y) { + return x * (0 - y); + } + + private static int mulSubZeroInt(int x, int y) { + return x * (y - 0); + } + + public static int multiplyNegateInt(int x, int y) { + return mulNegInt(x, y) | mulZeroSubInt(y, x) | mulSubZeroInt(x, y); + } + + @Test + public void testMultiplyNegateInt() { + testAndCheckLIR("multiplyNegateInt", 2, 7, -1); + } + + public static int negMulInt(int x, int y) { + return (-((x + 1) * y)); + } + + @Test + public void testNegateMultiplyInt() { + testAndCheckLIR("negMulInt", 1, 7, -1); + } + + /** + * mneg rule test with long type. + */ + private static long mulNegLong(long x, long y) { + return ((x + 1) * 2 + 3) * (-y); + } + + private static long mulZeroSubLong(long x, long y) { + return x * (0 - y); + } + + private static long mulSubZeroLong(long x, long y) { + return x * (y - 0); + } + + public static long multiplyNegateLong(long x, long y) { + return mulNegLong(x, y) | mulZeroSubLong(y, x) | mulSubZeroLong(x, y); + } + + @Test + public void testMultiplyNegateLong() { + testAndCheckLIR("multiplyNegateLong", 2, 7L, -1L); + } + + public static long negMulLong(long x, long y) { + return (-((x + 1) * y)); + } + + @Test + public void testNegateMultiplyLong() { + testAndCheckLIR("negMulLong", 1, 7L, -1L); + } + + /** + * check the case that mneg rule does not work at the reason of multi-use. + */ + public static int multiplyNegateNoMatch(int x, int y) { + return mulNegInt(x, y) + mulZeroSubInt(x, y) + mulSubZeroInt(x, y); + } + + @Test + public void testMultiplyNegateNoMatch() { + testAndCheckLIR("multiplyNegateNoMatch", 0, 7, -1); + } + + /** + * check the case that mneg rule does not work at the reason of data type. + */ + private static float mulNegFloat(float x, float y) { + return ((x + 1) * 2 + 3) * (-y); + } + + private static float mulZeroSubFloat(float x, float y) { + return x * (0 - y); + } + + private static float mulSubZeroFloat(float x, float y) { + return x * (y - 0); + } + + public static float multiplyNegateFloat(float x, float y) { + return mulNegFloat(x, y) + mulZeroSubFloat(y, x) + mulSubZeroFloat(x, y); + } + + @Test + public void testMultiplyNegateFloat() { + testAndCheckLIR("multiplyNegateFloat", 0, 7F, -1F); + } +} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64MatchRuleTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64MatchRuleTest.java index 9579911305e..9254eb9ed41 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64MatchRuleTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64MatchRuleTest.java @@ -27,51 +27,15 @@ package org.graalvm.compiler.core.aarch64.test; import jdk.vm.ci.aarch64.AArch64; -import jdk.vm.ci.code.TargetDescription; -import org.graalvm.compiler.core.test.GraalCompilerTest; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.aarch64.AArch64LIRInstruction; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.phases.LIRPhase; -import org.graalvm.compiler.lir.phases.LIRSuites; -import org.graalvm.compiler.lir.phases.PreAllocationOptimizationPhase; -import org.graalvm.compiler.options.OptionValues; -import org.junit.Assert; +import org.graalvm.compiler.core.test.MatchRuleTest; import org.junit.Before; import static org.junit.Assume.assumeTrue; -public abstract class AArch64MatchRuleTest extends GraalCompilerTest { - private LIR lir; - +public abstract class AArch64MatchRuleTest extends MatchRuleTest { @Before public void checkAArch64() { assumeTrue("skipping AArch64 specific test", getTarget().arch instanceof AArch64); } - @Override - protected LIRSuites createLIRSuites(OptionValues options) { - LIRSuites suites = super.createLIRSuites(options); - suites.getPreAllocationOptimizationStage().appendPhase(new CheckPhase()); - return suites; - } - - private class CheckPhase extends LIRPhase { - @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, - PreAllocationOptimizationPhase.PreAllocationOptimizationContext context) { - lir = lirGenRes.getLIR(); - } - } - - protected void checkLIR(Class op, int expected) { - int actualOpNum = 0; - for (LIRInstruction ins : lir.getLIRforBlock(lir.codeEmittingOrder()[0])) { - if (ins.getClass() == op) { - actualOpNum++; - } - } - Assert.assertEquals(expected, actualOpNum); - } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64MultiplyAddSubTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64MultiplyAddSubTest.java new file mode 100644 index 00000000000..9a579cf9669 --- /dev/null +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64MultiplyAddSubTest.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Arm Limited and affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + + +package org.graalvm.compiler.core.aarch64.test; + +import org.graalvm.compiler.lir.LIRInstruction; +import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticOp; +import org.junit.Test; + +import java.util.function.Predicate; + +public class AArch64MultiplyAddSubTest extends AArch64MatchRuleTest { + private static final Predicate predicate = op -> (op instanceof AArch64ArithmeticOp.MultiplyAddSubOp); + + /** + * multiplyAddSub match rule test for add operation with int type. + */ + public static int mulAddInt(int input0, int input1, int input2) { + return input2 + input0 * input1; + } + + @Test + public void testMultiplyAddInt() { + test("mulAddInt", 3, 46, 23); + test("mulAddInt", -3, -5, 6); + test("mulAddInt", Integer.MAX_VALUE, 2, 5); + checkLIR("mulAddInt", predicate, 1); + } + + /** + * multiplyAddSub match rule test for add operation with long type. + */ + public static long mulAddLong(long input0, long input1, long input2) { + return input0 * input1 + input2; + } + + @Test + public void testMultiplyAddLong() { + test("mulAddLong", 43L, 46442L, 2341455L); + test("mulAddLong", -3141L, -542324L, 65225L); + test("mulAddLong", Long.MAX_VALUE, 2L, 124454L); + checkLIR("mulAddLong", predicate, 1); + } + + /** + * multiplyAddSub match rule test for sub operation with int type. + */ + public static int mulSubInt(int input0, int input1, int input2) { + return input2 - input0 * input1; + } + + @Test + public void testMultiplySubInt() { + test("mulSubInt", 3, 46, 23); + test("mulSubInt", -5, 4, -3); + test("mulSubInt", Integer.MIN_VALUE, 2, Integer.MAX_VALUE); + checkLIR("mulSubInt", predicate, 1); + } + + /** + * multiplyAddSub match rule test for sub operation with long type. + */ + public static long mulSubLong(long input0, long input1, long input2) { + return input2 - input0 * input1; + } + + @Test + public void testMultiplySubLong() { + test("mulSubLong", 43L, 46442L, 2341455L); + test("mulSubLong", -3141L, 542324L, -65225L); + test("mulSubLong", Long.MIN_VALUE, 2L, Long.MAX_VALUE); + checkLIR("mulSubLong", predicate, 1); + } +} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64AddressLoweringByUse.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64AddressLoweringByUse.java index e0fb9327281..3fd2cfb8c0c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64AddressLoweringByUse.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64AddressLoweringByUse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64AddressNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64AddressNode.java index a8ee97d7128..fd4ead11ade 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64AddressNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64AddressNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64ArithmeticLIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64ArithmeticLIRGenerator.java index df7deb02ce1..c3fe49f7460 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64ArithmeticLIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64ArithmeticLIRGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package org.graalvm.compiler.core.aarch64; -import static jdk.vm.ci.aarch64.AArch64.sp; import static jdk.vm.ci.aarch64.AArch64Kind.DWORD; import static jdk.vm.ci.aarch64.AArch64Kind.QWORD; import static org.graalvm.compiler.lir.LIRValueUtil.asJavaConstant; @@ -55,7 +54,6 @@ import org.graalvm.compiler.lir.aarch64.AArch64Unary; import org.graalvm.compiler.lir.gen.ArithmeticLIRGenerator; import jdk.vm.ci.aarch64.AArch64Kind; -import jdk.vm.ci.code.RegisterValue; import jdk.vm.ci.meta.AllocatableValue; import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.PlatformKind; @@ -134,6 +132,11 @@ public class AArch64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implem return emitBinary(LIRKind.combine(a, b), AArch64ArithmeticOp.UMULH, true, a, b); } + public Value emitMNeg(Value a, Value b) { + assert isNumericInteger(a.getPlatformKind()) && isNumericInteger(b.getPlatformKind()); + return emitBinary(LIRKind.combine(a, b), AArch64ArithmeticOp.MNEG, true, a, b); + } + @Override public Value emitDiv(Value a, Value b, LIRFrameState state) { return emitBinary(LIRKind.combine(a, b), getOpCode(a, AArch64ArithmeticOp.DIV, AArch64ArithmeticOp.FDIV), false, asAllocatable(a), asAllocatable(b)); @@ -201,13 +204,24 @@ public class AArch64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implem return result; } - public Value emitAddSubShift(AArch64ArithmeticOp op, Value a, Value b, AArch64MacroAssembler.ShiftType shiftType, int shiftAmount) { + public Value emitMAdd(Value a, Value b, Value c) { + return emitMultiplyAddSub(AArch64ArithmeticOp.ADD, a, b, c); + } + + public Value emitMSub(Value a, Value b, Value c) { + return emitMultiplyAddSub(AArch64ArithmeticOp.SUB, a, b, c); + } + + private Value emitMultiplyAddSub(AArch64ArithmeticOp op, Value a, Value b, Value c) { assert isNumericInteger(a.getPlatformKind()); assert isNumericInteger(b.getPlatformKind()); - Variable result = getLIRGen().newVariable(LIRKind.combine(a, b)); + assert isNumericInteger(c.getPlatformKind()); + + Variable result = getLIRGen().newVariable(LIRKind.combine(a, b, c)); AllocatableValue x = moveSp(asAllocatable(a)); AllocatableValue y = moveSp(asAllocatable(b)); - getLIRGen().append(new AArch64ArithmeticOp.AddSubShiftOp(op, result, x, y, shiftType, shiftAmount)); + AllocatableValue z = moveSp(asAllocatable(c)); + getLIRGen().append(new AArch64ArithmeticOp.MultiplyAddSubOp(op, result, x, y, z)); return result; } @@ -434,16 +448,8 @@ public class AArch64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implem return result; } - /** - * If val denotes the stackpointer, move it to another location. This is necessary since most - * ops cannot handle the stackpointer as input or output. - */ private AllocatableValue moveSp(AllocatableValue val) { - if (val instanceof RegisterValue && ((RegisterValue) val).getRegister().equals(sp)) { - assert val.getPlatformKind() == AArch64Kind.QWORD : "Stackpointer must be long"; - return getLIRGen().emitMove(val); - } - return val; + return getLIRGen().moveSp(val); } /** diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64FloatConvertOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64FloatConvertOp.java index bf8868ae442..9ab782ee74a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64FloatConvertOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64FloatConvertOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64LIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64LIRGenerator.java index e3cc4ace030..42f409c4fd1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64LIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64LIRGenerator.java @@ -24,7 +24,9 @@ package org.graalvm.compiler.core.aarch64; +import static jdk.vm.ci.aarch64.AArch64.sp; import static org.graalvm.compiler.lir.LIRValueUtil.asJavaConstant; +import static org.graalvm.compiler.lir.LIRValueUtil.isIntConstant; import static org.graalvm.compiler.lir.LIRValueUtil.isJavaConstant; import java.util.function.Function; @@ -51,6 +53,7 @@ import org.graalvm.compiler.lir.aarch64.AArch64Compare; import org.graalvm.compiler.lir.aarch64.AArch64ControlFlow; import org.graalvm.compiler.lir.aarch64.AArch64ControlFlow.BranchOp; import org.graalvm.compiler.lir.aarch64.AArch64ControlFlow.CondMoveOp; +import org.graalvm.compiler.lir.aarch64.AArch64ControlFlow.CondSetOp; import org.graalvm.compiler.lir.aarch64.AArch64ControlFlow.StrategySwitchOp; import org.graalvm.compiler.lir.aarch64.AArch64ControlFlow.TableSwitchOp; import org.graalvm.compiler.lir.aarch64.AArch64LIRFlagsVersioned; @@ -99,6 +102,18 @@ public abstract class AArch64LIRGenerator extends LIRGenerator { return true; } + /** + * If val denotes the stackpointer, move it to another location. This is necessary since most + * ops cannot handle the stackpointer as input or output. + */ + public AllocatableValue moveSp(AllocatableValue val) { + if (val instanceof RegisterValue && ((RegisterValue) val).getRegister().equals(sp)) { + assert val.getPlatformKind() == AArch64Kind.QWORD : "Stackpointer must be long"; + return emitMove(val); + } + return val; + } + /** * AArch64 cannot use anything smaller than a word in any instruction other than load and store. */ @@ -228,7 +243,14 @@ public abstract class AArch64LIRGenerator extends LIRGenerator { boolean finalUnorderedIsTrue = mirrored ? !unorderedIsTrue : unorderedIsTrue; ConditionFlag cmpCondition = toConditionFlag(((AArch64Kind) cmpKind).isInteger(), finalCondition, finalUnorderedIsTrue); Variable result = newVariable(trueValue.getValueKind()); - append(new CondMoveOp(result, cmpCondition, loadReg(trueValue), loadReg(falseValue))); + + if (isIntConstant(trueValue, 1) && isIntConstant(falseValue, 0)) { + append(new CondSetOp(result, cmpCondition)); + } else if (isIntConstant(trueValue, 0) && isIntConstant(falseValue, 1)) { + append(new CondSetOp(result, cmpCondition.negate())); + } else { + append(new CondMoveOp(result, cmpCondition, loadReg(trueValue), loadReg(falseValue))); + } return result; } @@ -424,7 +446,14 @@ public abstract class AArch64LIRGenerator extends LIRGenerator { assert ((AArch64Kind) trueValue.getPlatformKind()).isInteger() && ((AArch64Kind) falseValue.getPlatformKind()).isInteger(); ((AArch64ArithmeticLIRGenerator) getArithmetic()).emitBinary(left.getValueKind(), AArch64ArithmeticOp.ANDS, true, left, right); Variable result = newVariable(trueValue.getValueKind()); - append(new CondMoveOp(result, ConditionFlag.EQ, load(trueValue), load(falseValue))); + + if (isIntConstant(trueValue, 1) && isIntConstant(falseValue, 0)) { + append(new CondSetOp(result, ConditionFlag.EQ)); + } else if (isIntConstant(trueValue, 0) && isIntConstant(falseValue, 1)) { + append(new CondSetOp(result, ConditionFlag.NE)); + } else { + append(new CondMoveOp(result, ConditionFlag.EQ, load(trueValue), load(falseValue))); + } return result; } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64LIRKindTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64LIRKindTool.java index 9298fe4d070..0f21f59ba1e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64LIRKindTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64LIRKindTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64MoveFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64MoveFactory.java index 251e2c39828..4d908fbd178 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64MoveFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64MoveFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64NodeLIRBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64NodeLIRBuilder.java index 64839bb4a20..180f86a91c5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64NodeLIRBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64NodeLIRBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64NodeMatchRules.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64NodeMatchRules.java index 13d0979eb59..29e9061f720 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64NodeMatchRules.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64NodeMatchRules.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,19 @@ package org.graalvm.compiler.core.aarch64; +import jdk.vm.ci.meta.AllocatableValue; +import jdk.vm.ci.meta.JavaKind; +import jdk.vm.ci.meta.Value; +import jdk.internal.vm.compiler.collections.EconomicMap; +import jdk.internal.vm.compiler.collections.Equivalence; import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler; +import org.graalvm.compiler.core.common.LIRKind; import org.graalvm.compiler.core.gen.NodeMatchRules; import org.graalvm.compiler.core.match.ComplexMatchResult; import org.graalvm.compiler.core.match.MatchRule; +import org.graalvm.compiler.graph.Node; import org.graalvm.compiler.lir.LIRFrameState; +import org.graalvm.compiler.lir.Variable; import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticOp; import org.graalvm.compiler.lir.gen.LIRGeneratorTool; import org.graalvm.compiler.nodes.ConstantNode; @@ -37,15 +45,37 @@ import org.graalvm.compiler.nodes.DeoptimizingNode; import org.graalvm.compiler.nodes.NodeView; import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.nodes.calc.AddNode; +import org.graalvm.compiler.nodes.calc.AndNode; import org.graalvm.compiler.nodes.calc.BinaryNode; import org.graalvm.compiler.nodes.calc.LeftShiftNode; +import org.graalvm.compiler.nodes.calc.NotNode; +import org.graalvm.compiler.nodes.calc.OrNode; import org.graalvm.compiler.nodes.calc.RightShiftNode; +import org.graalvm.compiler.nodes.calc.SubNode; import org.graalvm.compiler.nodes.calc.UnsignedRightShiftNode; +import org.graalvm.compiler.nodes.calc.XorNode; import org.graalvm.compiler.nodes.memory.Access; import jdk.vm.ci.aarch64.AArch64Kind; public class AArch64NodeMatchRules extends NodeMatchRules { + private static final EconomicMap, AArch64ArithmeticOp> nodeOpMap; + + private static final EconomicMap, AArch64MacroAssembler.ShiftType> shiftTypeMap; + + static { + nodeOpMap = EconomicMap.create(Equivalence.IDENTITY, 5); + nodeOpMap.put(AddNode.class, AArch64ArithmeticOp.ADD); + nodeOpMap.put(SubNode.class, AArch64ArithmeticOp.SUB); + nodeOpMap.put(AndNode.class, AArch64ArithmeticOp.AND); + nodeOpMap.put(OrNode.class, AArch64ArithmeticOp.OR); + nodeOpMap.put(XorNode.class, AArch64ArithmeticOp.XOR); + + shiftTypeMap = EconomicMap.create(Equivalence.IDENTITY, 3); + shiftTypeMap.put(LeftShiftNode.class, AArch64MacroAssembler.ShiftType.LSL); + shiftTypeMap.put(RightShiftNode.class, AArch64MacroAssembler.ShiftType.ASR); + shiftTypeMap.put(UnsignedRightShiftNode.class, AArch64MacroAssembler.ShiftType.LSR); + } public AArch64NodeMatchRules(LIRGeneratorTool gen) { super(gen); @@ -62,21 +92,27 @@ public class AArch64NodeMatchRules extends NodeMatchRules { return (AArch64Kind) gen.getLIRKind(access.asNode().stamp(NodeView.DEFAULT)).getPlatformKind(); } - private ComplexMatchResult emitAddSubShift(AArch64ArithmeticOp op, ValueNode value, BinaryNode shift) { - assert shift.getY() instanceof ConstantNode; - int shiftAmount = shift.getY().asJavaConstant().asInt(); + private AllocatableValue moveSp(AllocatableValue value) { + return getLIRGeneratorTool().moveSp(value); + } - if (shift instanceof LeftShiftNode) { - return builder -> getArithmeticLIRGenerator().emitAddSubShift(op, operand(value), operand(shift.getX()), - AArch64MacroAssembler.ShiftType.LSL, shiftAmount); - } else if (shift instanceof RightShiftNode) { - return builder -> getArithmeticLIRGenerator().emitAddSubShift(op, operand(value), operand(shift.getX()), - AArch64MacroAssembler.ShiftType.ASR, shiftAmount); - } else { - assert shift instanceof UnsignedRightShiftNode; - return builder -> getArithmeticLIRGenerator().emitAddSubShift(op, operand(value), operand(shift.getX()), - AArch64MacroAssembler.ShiftType.LSR, shiftAmount); - } + private ComplexMatchResult emitBinaryShift(AArch64ArithmeticOp op, ValueNode value, BinaryNode shift, boolean isShiftNot) { + AArch64MacroAssembler.ShiftType shiftType = shiftTypeMap.get(shift.getClass()); + assert shiftType != null; + assert value.getStackKind().isNumericInteger(); + assert shift.getX().getStackKind().isNumericInteger(); + assert shift.getY() instanceof ConstantNode; + + return builder -> { + Value a = operand(value); + Value b = operand(shift.getX()); + Variable result = gen.newVariable(LIRKind.combine(a, b)); + AllocatableValue x = moveSp(gen.asAllocatable(a)); + AllocatableValue y = moveSp(gen.asAllocatable(b)); + int shiftAmount = shift.getY().asJavaConstant().asInt(); + gen.append(new AArch64ArithmeticOp.BinaryShiftOp(op, result, x, y, shiftType, shiftAmount, isShiftNot)); + return result; + }; } @MatchRule("(Add=binary a (LeftShift=shift b Constant))") @@ -86,10 +122,60 @@ public class AArch64NodeMatchRules extends NodeMatchRules { @MatchRule("(Sub=binary a (RightShift=shift b Constant))") @MatchRule("(Sub=binary a (UnsignedRightShift=shift b Constant))") public ComplexMatchResult addSubShift(BinaryNode binary, ValueNode a, BinaryNode shift) { - if (binary instanceof AddNode) { - return emitAddSubShift(AArch64ArithmeticOp.ADD, a, shift); + AArch64ArithmeticOp op = nodeOpMap.get(binary.getClass()); + assert op != null; + return emitBinaryShift(op, a, shift, false); + } + + @MatchRule("(And=binary a (LeftShift=shift b Constant))") + @MatchRule("(And=binary a (RightShift=shift b Constant))") + @MatchRule("(And=binary a (UnsignedRightShift=shift b Constant))") + @MatchRule("(Or=binary a (LeftShift=shift b Constant))") + @MatchRule("(Or=binary a (RightShift=shift b Constant))") + @MatchRule("(Or=binary a (UnsignedRightShift=shift b Constant))") + @MatchRule("(Xor=binary a (LeftShift=shift b Constant))") + @MatchRule("(Xor=binary a (RightShift=shift b Constant))") + @MatchRule("(Xor=binary a (UnsignedRightShift=shift b Constant))") + @MatchRule("(And=binary a (Not (LeftShift=shift b Constant)))") + @MatchRule("(And=binary a (Not (RightShift=shift b Constant)))") + @MatchRule("(And=binary a (Not (UnsignedRightShift=shift b Constant)))") + @MatchRule("(Or=binary a (Not (LeftShift=shift b Constant)))") + @MatchRule("(Or=binary a (Not (RightShift=shift b Constant)))") + @MatchRule("(Or=binary a (Not (UnsignedRightShift=shift b Constant)))") + @MatchRule("(Xor=binary a (Not (LeftShift=shift b Constant)))") + @MatchRule("(Xor=binary a (Not (RightShift=shift b Constant)))") + @MatchRule("(Xor=binary a (Not (UnsignedRightShift=shift b Constant)))") + public ComplexMatchResult logicShift(BinaryNode binary, ValueNode a, BinaryNode shift) { + AArch64ArithmeticOp op = nodeOpMap.get(binary.getClass()); + assert op != null; + ValueNode operand = binary.getX() == a ? binary.getY() : binary.getX(); + boolean isShiftNot = operand instanceof NotNode; + return emitBinaryShift(op, a, shift, isShiftNot); + } + + @MatchRule("(Mul (Negate a) b)") + @MatchRule("(Negate (Mul a b))") + public ComplexMatchResult multiplyNegate(ValueNode a, ValueNode b) { + if (a.getStackKind().isNumericInteger() && b.getStackKind().isNumericInteger()) { + return builder -> getArithmeticLIRGenerator().emitMNeg(operand(a), operand(b)); } - return emitAddSubShift(AArch64ArithmeticOp.SUB, a, shift); + return null; + } + + @MatchRule("(Add=binary (Mul a b) c)") + @MatchRule("(Sub=binary c (Mul a b))") + public ComplexMatchResult multiplyAddSub(BinaryNode binary, ValueNode a, ValueNode b, ValueNode c) { + JavaKind kindA = a.getStackKind(); + JavaKind kindB = b.getStackKind(); + JavaKind kindC = c.getStackKind(); + if (!kindA.isNumericInteger() || !kindB.isNumericInteger() || !kindC.isNumericInteger()) { + return null; + } + + if (binary instanceof AddNode) { + return builder -> getArithmeticLIRGenerator().emitMAdd(operand(a), operand(b), operand(c)); + } + return builder -> getArithmeticLIRGenerator().emitMSub(operand(a), operand(b), operand(c)); } @Override diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64ReadNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64ReadNode.java index c428bd2dbc7..96c113f4fd3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64ReadNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64ReadNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64SuitesCreator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64SuitesCreator.java index ca1e82f7ee5..81cc4013003 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64SuitesCreator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64SuitesCreator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/AMD64AddressLoweringTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/AMD64AddressLoweringTest.java index 674da5a3cdf..098213fa9b7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/AMD64AddressLoweringTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/AMD64AddressLoweringTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/AMD64AllocatorTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/AMD64AllocatorTest.java index ccb7121b3b8..4f5690c22ef 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/AMD64AllocatorTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/AMD64AllocatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,6 @@ package org.graalvm.compiler.core.amd64.test; -import static org.graalvm.compiler.core.common.GraalOptions.TraceRA; import static org.graalvm.compiler.core.common.GraalOptions.RegisterPressure; import static org.junit.Assume.assumeTrue; import jdk.vm.ci.amd64.AMD64; @@ -41,7 +40,6 @@ public class AMD64AllocatorTest extends AllocatorTest { public void checkAMD64() { assumeTrue("skipping AMD64 specific test", getTarget().arch instanceof AMD64); assumeTrue("RegisterPressure is set -> skip", RegisterPressure.getValue(getInitialOptions()) == null); - assumeTrue("TraceRA is set -> skip", !TraceRA.getValue(getInitialOptions())); } @Test diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/MatchRuleTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/AMD64MatchRuleTest.java similarity index 70% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/MatchRuleTest.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/AMD64MatchRuleTest.java index 641af95e6e7..6c5d1169a33 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/MatchRuleTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/AMD64MatchRuleTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,24 +26,16 @@ package org.graalvm.compiler.core.amd64.test; import static org.junit.Assume.assumeTrue; +import org.graalvm.compiler.core.test.MatchRuleTest; import org.graalvm.compiler.lir.LIR; import org.graalvm.compiler.lir.LIRInstruction; import org.graalvm.compiler.lir.amd64.AMD64BinaryConsumer.MemoryConstOp; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.jtt.LIRTest; -import org.graalvm.compiler.lir.phases.LIRPhase; -import org.graalvm.compiler.lir.phases.LIRSuites; -import org.graalvm.compiler.lir.phases.PreAllocationOptimizationPhase.PreAllocationOptimizationContext; -import org.graalvm.compiler.options.OptionValues; import org.junit.Before; import org.junit.Test; import jdk.vm.ci.amd64.AMD64; -import jdk.vm.ci.code.TargetDescription; - -public class MatchRuleTest extends LIRTest { - private LIR lir; +public class AMD64MatchRuleTest extends MatchRuleTest { @Before public void checkAMD64() { assumeTrue("skipping AMD64 specific test", getTarget().arch instanceof AMD64); @@ -57,13 +49,6 @@ public class MatchRuleTest extends LIRTest { } } - @Override - protected LIRSuites createLIRSuites(OptionValues options) { - LIRSuites suites = super.createLIRSuites(options); - suites.getPreAllocationOptimizationStage().appendPhase(new CheckPhase()); - return suites; - } - /** * Verifies, if the match rules in AMD64NodeMatchRules do work on the graphs by compiling and * checking if the expected LIR instruction show up. @@ -71,6 +56,7 @@ public class MatchRuleTest extends LIRTest { @Test public void test1() { compile(getResolvedJavaMethod("test1Snippet"), null); + LIR lir = getLIR(); boolean found = false; for (LIRInstruction ins : lir.getLIRforBlock(lir.codeEmittingOrder()[0])) { if (ins instanceof MemoryConstOp && ((MemoryConstOp) ins).getOpcode().toString().equals("CMP")) { @@ -91,11 +77,4 @@ public class MatchRuleTest extends LIRTest { this.x = x; } } - - public class CheckPhase extends LIRPhase { - @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, PreAllocationOptimizationContext context) { - lir = lirGenRes.getLIR(); - } - } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/ConstantStackMoveTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/ConstantStackMoveTest.java index 489a3badd81..596c4fcab91 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/ConstantStackMoveTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/ConstantStackMoveTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/StackStoreTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/StackStoreTest.java index 84ba795fafa..c96474d46ff 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/StackStoreTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64.test/src/org/graalvm/compiler/core/amd64/test/StackStoreTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressLowering.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressLowering.java index 163eaca00ef..795562ebd76 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressLowering.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressLowering.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressNode.java index 53374c552ba..3d759729305 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64ArithmeticLIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64ArithmeticLIRGenerator.java index d24eafb042d..57877831dbc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64ArithmeticLIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64ArithmeticLIRGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,6 +53,18 @@ import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.ROR; import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.SAR; import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.SHL; import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift.SHR; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VADDSD; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VADDSS; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VDIVSD; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VDIVSS; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VMULSD; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VMULSS; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VORPD; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VORPS; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VSUBSD; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VSUBSS; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VXORPD; +import static org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp.VXORPS; import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.BYTE; import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.DWORD; import static org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize.PD; @@ -84,9 +96,11 @@ import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMIOp; import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64RMOp; import org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64Shift; import org.graalvm.compiler.asm.amd64.AMD64Assembler.SSEOp; -import org.graalvm.compiler.asm.amd64.AMD64Assembler.VexGeneralPurposeRVMOp; import org.graalvm.compiler.asm.amd64.AMD64Assembler.VexGeneralPurposeRMOp; +import org.graalvm.compiler.asm.amd64.AMD64Assembler.VexGeneralPurposeRVMOp; +import org.graalvm.compiler.asm.amd64.AMD64Assembler.VexRVMOp; import org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize; +import org.graalvm.compiler.asm.amd64.AVXKind; import org.graalvm.compiler.asm.amd64.AVXKind.AVXSize; import org.graalvm.compiler.core.common.LIRKind; import org.graalvm.compiler.core.common.NumUtil; @@ -110,15 +124,18 @@ import org.graalvm.compiler.lir.amd64.AMD64ShiftOp; import org.graalvm.compiler.lir.amd64.AMD64SignExtendOp; import org.graalvm.compiler.lir.amd64.AMD64Unary; import org.graalvm.compiler.lir.amd64.vector.AMD64VectorBinary; +import org.graalvm.compiler.lir.amd64.vector.AMD64VectorBinary.AVXBinaryOp; import org.graalvm.compiler.lir.amd64.vector.AMD64VectorUnary; import org.graalvm.compiler.lir.gen.ArithmeticLIRGenerator; import org.graalvm.compiler.lir.gen.LIRGenerator; import jdk.vm.ci.amd64.AMD64; +import jdk.vm.ci.amd64.AMD64.CPUFeature; import jdk.vm.ci.amd64.AMD64Kind; import jdk.vm.ci.code.CodeUtil; import jdk.vm.ci.code.Register; import jdk.vm.ci.code.RegisterValue; +import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.meta.AllocatableValue; import jdk.vm.ci.meta.Constant; import jdk.vm.ci.meta.JavaConstant; @@ -175,6 +192,7 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen public Variable emitNegate(Value inputVal) { AllocatableValue input = asAllocatable(inputVal); Variable result = getLIRGen().newVariable(LIRKind.combine(input)); + boolean isAvx = supportAVX(); switch ((AMD64Kind) input.getPlatformKind()) { case DWORD: getLIRGen().append(new AMD64Unary.MOp(NEG, DWORD, result, input)); @@ -183,10 +201,20 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen getLIRGen().append(new AMD64Unary.MOp(NEG, QWORD, result, input)); break; case SINGLE: - getLIRGen().append(new AMD64Binary.DataTwoOp(SSEOp.XOR, PS, result, input, JavaConstant.forFloat(Float.intBitsToFloat(0x80000000)), 16)); + JavaConstant floatMask = JavaConstant.forFloat(Float.intBitsToFloat(0x80000000)); + if (isAvx) { + getLIRGen().append(new AVXBinaryOp(VXORPS, getRegisterSize(result), result, asAllocatable(input), asAllocatable(getLIRGen().emitJavaConstant(floatMask)))); + } else { + getLIRGen().append(new AMD64Binary.DataTwoOp(SSEOp.XOR, PS, result, input, floatMask, 16)); + } break; case DOUBLE: - getLIRGen().append(new AMD64Binary.DataTwoOp(SSEOp.XOR, PD, result, input, JavaConstant.forDouble(Double.longBitsToDouble(0x8000000000000000L)), 16)); + JavaConstant doubleMask = JavaConstant.forDouble(Double.longBitsToDouble(0x8000000000000000L)); + if (isAvx) { + getLIRGen().append(new AVXBinaryOp(VXORPD, getRegisterSize(result), result, asAllocatable(input), asAllocatable(getLIRGen().emitJavaConstant(doubleMask)))); + } else { + getLIRGen().append(new AMD64Binary.DataTwoOp(SSEOp.XOR, PD, result, input, doubleMask, 16)); + } break; default: throw GraalError.shouldNotReachHere(input.getPlatformKind().toString()); @@ -301,6 +329,7 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen @Override public Variable emitAdd(LIRKind resultKind, Value a, Value b, boolean setFlags) { + boolean isAvx = supportAVX(); switch ((AMD64Kind) a.getPlatformKind()) { case DWORD: if (isJavaConstant(b) && !setFlags) { @@ -319,9 +348,17 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen } return emitBinary(resultKind, ADD, QWORD, true, a, b, setFlags); case SINGLE: - return emitBinary(resultKind, SSEOp.ADD, SS, true, a, b); + if (isAvx) { + return emitBinary(resultKind, VADDSS, a, b); + } else { + return emitBinary(resultKind, SSEOp.ADD, SS, true, a, b); + } case DOUBLE: - return emitBinary(resultKind, SSEOp.ADD, SD, true, a, b); + if (isAvx) { + return emitBinary(resultKind, VADDSD, a, b); + } else { + return emitBinary(resultKind, SSEOp.ADD, SD, true, a, b); + } default: throw GraalError.shouldNotReachHere(); } @@ -329,15 +366,24 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen @Override public Variable emitSub(LIRKind resultKind, Value a, Value b, boolean setFlags) { + boolean isAvx = supportAVX(); switch ((AMD64Kind) a.getPlatformKind()) { case DWORD: return emitBinary(resultKind, SUB, DWORD, false, a, b, setFlags); case QWORD: return emitBinary(resultKind, SUB, QWORD, false, a, b, setFlags); case SINGLE: - return emitBinary(resultKind, SSEOp.SUB, SS, false, a, b); + if (isAvx) { + return emitBinary(resultKind, VSUBSS, a, b); + } else { + return emitBinary(resultKind, SSEOp.SUB, SS, false, a, b); + } case DOUBLE: - return emitBinary(resultKind, SSEOp.SUB, SD, false, a, b); + if (isAvx) { + return emitBinary(resultKind, VSUBSD, a, b); + } else { + return emitBinary(resultKind, SSEOp.SUB, SD, false, a, b); + } default: throw GraalError.shouldNotReachHere(); } @@ -374,6 +420,7 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen @Override public Variable emitMul(Value a, Value b, boolean setFlags) { + boolean isAvx = supportAVX(); LIRKind resultKind = LIRKind.combine(a, b); switch ((AMD64Kind) a.getPlatformKind()) { case DWORD: @@ -381,9 +428,17 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen case QWORD: return emitIMUL(QWORD, a, b); case SINGLE: - return emitBinary(resultKind, SSEOp.MUL, SS, true, a, b); + if (isAvx) { + return emitBinary(resultKind, VMULSS, a, b); + } else { + return emitBinary(resultKind, SSEOp.MUL, SS, true, a, b); + } case DOUBLE: - return emitBinary(resultKind, SSEOp.MUL, SD, true, a, b); + if (isAvx) { + return emitBinary(resultKind, VMULSD, a, b); + } else { + return emitBinary(resultKind, SSEOp.MUL, SD, true, a, b); + } default: throw GraalError.shouldNotReachHere(); } @@ -507,6 +562,7 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen @Override public Value emitDiv(Value a, Value b, LIRFrameState state) { + boolean isAvx = supportAVX(); LIRKind resultKind = LIRKind.combine(a, b); switch ((AMD64Kind) a.getPlatformKind()) { case DWORD: @@ -516,9 +572,17 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen AMD64MulDivOp lop = emitIDIV(QWORD, a, b, state); return getLIRGen().emitMove(lop.getQuotient()); case SINGLE: - return emitBinary(resultKind, SSEOp.DIV, SS, false, a, b); + if (isAvx) { + return emitBinary(resultKind, VDIVSS, a, b); + } else { + return emitBinary(resultKind, SSEOp.DIV, SS, false, a, b); + } case DOUBLE: - return emitBinary(resultKind, SSEOp.DIV, SD, false, a, b); + if (isAvx) { + return emitBinary(resultKind, VDIVSD, a, b); + } else { + return emitBinary(resultKind, SSEOp.DIV, SD, false, a, b); + } default: throw GraalError.shouldNotReachHere(); } @@ -599,6 +663,7 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen @Override public Variable emitOr(Value a, Value b) { + boolean isAvx = supportAVX(); LIRKind resultKind = LIRKind.combine(a, b); switch ((AMD64Kind) a.getPlatformKind()) { case DWORD: @@ -606,9 +671,17 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen case QWORD: return emitBinary(resultKind, OR, QWORD, true, a, b, false); case SINGLE: - return emitBinary(resultKind, SSEOp.OR, PS, true, a, b); + if (isAvx) { + return emitBinary(resultKind, VORPS, a, b); + } else { + return emitBinary(resultKind, SSEOp.OR, PS, true, a, b); + } case DOUBLE: - return emitBinary(resultKind, SSEOp.OR, PD, true, a, b); + if (isAvx) { + return emitBinary(resultKind, VORPD, a, b); + } else { + return emitBinary(resultKind, SSEOp.OR, PD, true, a, b); + } default: throw GraalError.shouldNotReachHere(); } @@ -616,6 +689,7 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen @Override public Variable emitXor(Value a, Value b) { + boolean isAvx = supportAVX(); LIRKind resultKind = LIRKind.combine(a, b); switch ((AMD64Kind) a.getPlatformKind()) { case DWORD: @@ -623,9 +697,17 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen case QWORD: return emitBinary(resultKind, XOR, QWORD, true, a, b, false); case SINGLE: - return emitBinary(resultKind, SSEOp.XOR, PS, true, a, b); + if (isAvx) { + return emitBinary(resultKind, VXORPS, a, b); + } else { + return emitBinary(resultKind, SSEOp.XOR, PS, true, a, b); + } case DOUBLE: - return emitBinary(resultKind, SSEOp.XOR, PD, true, a, b); + if (isAvx) { + return emitBinary(resultKind, VXORPD, a, b); + } else { + return emitBinary(resultKind, SSEOp.XOR, PD, true, a, b); + } default: throw GraalError.shouldNotReachHere(); } @@ -1292,4 +1374,25 @@ public class AMD64ArithmeticLIRGenerator extends ArithmeticLIRGenerator implemen } return result; } + + private boolean supportAVX() { + TargetDescription target = getLIRGen().target(); + return ((AMD64) target.arch).getFeatures().contains(CPUFeature.AVX); + } + + private static AVXSize getRegisterSize(Value a) { + AMD64Kind kind = (AMD64Kind) a.getPlatformKind(); + if (kind.isXMM()) { + return AVXKind.getRegisterSize(kind); + } else { + return AVXSize.XMM; + } + } + + private Variable emitBinary(LIRKind resultKind, VexRVMOp op, Value a, Value b) { + Variable result = getLIRGen().newVariable(resultKind); + getLIRGen().append(new AVXBinaryOp(op, getRegisterSize(result), result, asAllocatable(a), asAllocatable(b))); + return result; + } + } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64CompressAddressLowering.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64CompressAddressLowering.java index afbc7a73ebf..038c6868a02 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64CompressAddressLowering.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64CompressAddressLowering.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRGenerator.java index 821ecc2d88e..66d2a64b10a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRKindTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRKindTool.java index 179eafec056..ecf26e19969 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRKindTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64LIRKindTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64MoveFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64MoveFactory.java index 6f86eb45077..7d9f9134ddf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64MoveFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64MoveFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64MoveFactoryBase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64MoveFactoryBase.java index 795dd9a40c3..863c65099d9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64MoveFactoryBase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64MoveFactoryBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64NodeLIRBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64NodeLIRBuilder.java index 335fff4386e..c2dc89e015d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64NodeLIRBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64NodeLIRBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64NodeMatchRules.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64NodeMatchRules.java index cc89bd4b5f8..a3b89ad2605 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64NodeMatchRules.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64NodeMatchRules.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64SuitesCreator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64SuitesCreator.java index 6d425352930..97baf07831c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64SuitesCreator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64SuitesCreator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CancellationBailoutException.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CancellationBailoutException.java index 2994fdbfd87..2ecc4db4fc6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CancellationBailoutException.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CancellationBailoutException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompilationIdentifier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompilationIdentifier.java index dd72619707b..37cf18f9f55 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompilationIdentifier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompilationIdentifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompilationRequestIdentifier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompilationRequestIdentifier.java index 08a6ffcedc7..170f23f60de 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompilationRequestIdentifier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompilationRequestIdentifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompressEncoding.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompressEncoding.java index 84f8a1179eb..387a4b79a9e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompressEncoding.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/CompressEncoding.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/FieldIntrospection.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/FieldIntrospection.java index de2481008f3..3a2292d8f9e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/FieldIntrospection.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/FieldIntrospection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/Fields.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/Fields.java index 8024274ed70..9dde5b2e5be 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/Fields.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/Fields.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/FieldsScanner.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/FieldsScanner.java index 57fbe0bc107..7efe91953f8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/FieldsScanner.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/FieldsScanner.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/GraalBailoutException.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/GraalBailoutException.java index 34e2055696d..f1c36325c2e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/GraalBailoutException.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/GraalBailoutException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/GraalOptions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/GraalOptions.java index 4a1b176fcfc..c16869e7ddf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/GraalOptions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/GraalOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -196,9 +196,6 @@ public final class GraalOptions { @Option(help = "", type = OptionType.Expert) public static final OptionKey AlwaysInlineVTableStubs = new OptionKey<>(false); - @Option(help = "", type = OptionType.Debug) - public static final OptionKey ResolveClassBeforeStaticInvoke = new OptionKey<>(false); - @Option(help = "", type = OptionType.Debug) public static final OptionKey CanOmitFrame = new OptionKey<>(true); @@ -279,9 +276,6 @@ public final class GraalOptions { @Option(help = "Use a cache for snippet graphs.", type = OptionType.Debug) public static final OptionKey UseSnippetGraphCache = new OptionKey<>(true); - @Option(help = "Enable experimental Trace Register Allocation.", type = OptionType.Debug) - public static final OptionKey TraceRA = new OptionKey<>(false); - @Option(help = "file:doc-files/TraceInliningHelp.txt", type = OptionType.Debug) public static final OptionKey TraceInlining = new OptionKey<>(false); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/LIRKind.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/LIRKind.java index 6683cf7b915..1ca5f283f22 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/LIRKind.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/LIRKind.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/NumUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/NumUtil.java index 1b5f5706ebc..3258b13f42f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/NumUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/NumUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/PermanentBailoutException.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/PermanentBailoutException.java index 9bacb5696b8..6f263a16eab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/PermanentBailoutException.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/PermanentBailoutException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/RetryableBailoutException.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/RetryableBailoutException.java index 93fc27b7b98..20c23858298 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/RetryableBailoutException.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/RetryableBailoutException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/SpeculativeExecutionAttacksMitigations.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/SpeculativeExecutionAttacksMitigations.java index beab3b14f94..d37c3dd0f67 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/SpeculativeExecutionAttacksMitigations.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/SpeculativeExecutionAttacksMitigations.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/SuppressFBWarnings.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/SuppressFBWarnings.java index 69cae0b5f71..49f135259c2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/SuppressFBWarnings.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/SuppressFBWarnings.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/IntervalHint.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/SuppressSVMWarnings.java similarity index 72% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/IntervalHint.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/SuppressSVMWarnings.java index b99742099c5..ca9cf91cf5b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/IntervalHint.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/SuppressSVMWarnings.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,18 +22,12 @@ */ -package org.graalvm.compiler.lir.alloc.trace.lsra; +package org.graalvm.compiler.core.common; -import jdk.vm.ci.meta.AllocatableValue; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; -/** - * An interval that is a hint for an {@code TraceInterval interval}. - */ -abstract class IntervalHint { - - public abstract AllocatableValue location(); - - public abstract int from(); - - public abstract String logString(); +@Retention(RetentionPolicy.RUNTIME) +public @interface SuppressSVMWarnings { + String[] value(); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/UnsafeAccess.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/UnsafeAccess.java index 1e35413becd..9948ee63a73 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/UnsafeAccess.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/UnsafeAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/BiDirectionalTraceBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/BiDirectionalTraceBuilder.java index 739fc2426ff..b114c05c954 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/BiDirectionalTraceBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/BiDirectionalTraceBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/ComputeBlockOrder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/ComputeBlockOrder.java index 2c35be2d2f7..bb5772c26ba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/ComputeBlockOrder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/ComputeBlockOrder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/RegisterAllocationConfig.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/RegisterAllocationConfig.java index 8db6c656dbe..b10f249ffbb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/RegisterAllocationConfig.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/RegisterAllocationConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/SingleBlockTraceBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/SingleBlockTraceBuilder.java index 01561ad8394..9f6c9d7d976 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/SingleBlockTraceBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/SingleBlockTraceBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/Trace.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/Trace.java index c75017bc7d6..c5ae2aa2766 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/Trace.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/Trace.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceBuilderResult.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceBuilderResult.java index 7c82070add0..1514a16c30c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceBuilderResult.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceBuilderResult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceMap.java index 21cb5ad7102..0bedcbc9d4d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceStatisticsPrinter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceStatisticsPrinter.java index 27b595d0ddc..ae24806a8e7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceStatisticsPrinter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/TraceStatisticsPrinter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/UniDirectionalTraceBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/UniDirectionalTraceBuilder.java index e85fa442948..8be68dbb767 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/UniDirectionalTraceBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/UniDirectionalTraceBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/CanonicalCondition.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/CanonicalCondition.java index ec2d2ba6621..70667a6df5b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/CanonicalCondition.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/CanonicalCondition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/Condition.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/Condition.java index 73ba1019d31..c2864312a7c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/Condition.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/Condition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/FloatConvert.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/FloatConvert.java index 895217877f3..a15d68cb364 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/FloatConvert.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/FloatConvert.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/FloatConvertCategory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/FloatConvertCategory.java index 418847d6a44..2b59da40802 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/FloatConvertCategory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/FloatConvertCategory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/UnsignedMath.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/UnsignedMath.java index 4a46aa88a11..b46deafd15d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/UnsignedMath.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/calc/UnsignedMath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/AbstractBlockBase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/AbstractBlockBase.java index 58dd15001b2..871390e99b0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/AbstractBlockBase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/AbstractBlockBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/AbstractControlFlowGraph.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/AbstractControlFlowGraph.java index 8e6315f8703..2279d64cf09 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/AbstractControlFlowGraph.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/AbstractControlFlowGraph.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/BlockMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/BlockMap.java index 6e784c20f27..df339e9642f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/BlockMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/BlockMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/CFGVerifier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/CFGVerifier.java index 228c6fd7c02..b251d372ac2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/CFGVerifier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/CFGVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/DominatorOptimizationProblem.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/DominatorOptimizationProblem.java index 6628b6edb1c..b6ef1150035 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/DominatorOptimizationProblem.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/DominatorOptimizationProblem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/Loop.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/Loop.java index a9eeda32c9f..98705d8cc09 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/Loop.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/Loop.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PrintableCFG.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PrintableCFG.java index 2ebb62146fb..97579933c79 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PrintableCFG.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PrintableCFG.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PrintableDominatorOptimizationProblem.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PrintableDominatorOptimizationProblem.java index dced64f7432..e76856cb88d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PrintableDominatorOptimizationProblem.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PrintableDominatorOptimizationProblem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PropertyConsumable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PropertyConsumable.java index c6609f8ff93..b8213ea7e48 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PropertyConsumable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/cfg/PropertyConsumable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/CodeGenProviders.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/CodeGenProviders.java index fdc267fcf3d..f927b86bab3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/CodeGenProviders.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/CodeGenProviders.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ConstantFieldProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ConstantFieldProvider.java index 6aea43fed56..dc6f704a373 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ConstantFieldProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ConstantFieldProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallDescriptor.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallDescriptor.java index fc95b8fd02c..d9c42660cca 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallDescriptor.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallLinkage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallLinkage.java index 241b87e141d..86f00807f32 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallLinkage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallLinkage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallsProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallsProvider.java index 523ebdfe8ba..72d60dba54a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallsProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ForeignCallsProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/JavaConstantFieldProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/JavaConstantFieldProvider.java index bce8f2e0dcc..a281816b671 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/JavaConstantFieldProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/JavaConstantFieldProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/LIRKindTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/LIRKindTool.java index 89a89ba132f..94951e4dbb9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/LIRKindTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/LIRKindTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/AbstractObjectStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/AbstractObjectStamp.java index d051be63d59..82ae67aa663 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/AbstractObjectStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/AbstractObjectStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/AbstractPointerStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/AbstractPointerStamp.java index 36c702b6aa7..737bc096fa4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/AbstractPointerStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/AbstractPointerStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ArithmeticOpTable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ArithmeticOpTable.java index fee99d1bff0..daca1aefe0f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ArithmeticOpTable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ArithmeticOpTable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ArithmeticStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ArithmeticStamp.java index c20fecc0f54..d5b4313170f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ArithmeticStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ArithmeticStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/DataPointerConstant.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/DataPointerConstant.java index 4add0fec67a..1b3224c6ff1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/DataPointerConstant.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/DataPointerConstant.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/FloatStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/FloatStamp.java index d8c055050b0..8e174261b15 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/FloatStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/FloatStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/IllegalStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/IllegalStamp.java index efdafc69220..b13c5e831bf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/IllegalStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/IllegalStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/IntegerStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/IntegerStamp.java index d3469797376..7bc85516b39 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/IntegerStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/IntegerStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ObjectStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ObjectStamp.java index 7e1750d589a..fe0a831c10a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ObjectStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/ObjectStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/PrimitiveStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/PrimitiveStamp.java index 2ab904b7f93..41775617dbb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/PrimitiveStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/PrimitiveStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/RawPointerStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/RawPointerStamp.java index 0c5a1aab90d..3c8d4b48ede 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/RawPointerStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/RawPointerStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/Stamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/Stamp.java index 1c8bbaee31a..dc163fe00a4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/Stamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/Stamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/StampFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/StampFactory.java index d4a6d227c45..b1bda7e1170 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/StampFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/StampFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/StampPair.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/StampPair.java index 0f75f6e5d88..7d702bf9e59 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/StampPair.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/StampPair.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/TypeReference.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/TypeReference.java index 6ad9ac7ef4d..82898671488 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/TypeReference.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/TypeReference.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/VoidStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/VoidStamp.java index 5b5cf58fa21..e7ba3ee6d16 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/VoidStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/VoidStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/BitMap2D.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/BitMap2D.java index 3794676cb10..af0ff871b4e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/BitMap2D.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/BitMap2D.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/CompilationAlarm.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/CompilationAlarm.java index fbab44d17ae..1bf3b8ce30d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/CompilationAlarm.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/CompilationAlarm.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/FrequencyEncoder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/FrequencyEncoder.java index e27172e7877..772d16d5a9e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/FrequencyEncoder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/FrequencyEncoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/IntList.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/IntList.java index b7dae0ecdda..7cb26de5c02 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/IntList.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/IntList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/ReversedList.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/ReversedList.java index 377bef33cdf..39becc9b904 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/ReversedList.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/ReversedList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeConversion.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeConversion.java index d2ce0b08eed..5ec52217871 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeConversion.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeConversion.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeReader.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeReader.java index ec29696b523..c5ff36a3e2b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeReader.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeReader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeWriter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeWriter.java index 6b3df247217..358dcc49cb2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeWriter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/TypeWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeAccess.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeAccess.java index 7c84ed0f4e5..6760c0c8dc5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeAccess.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeArrayTypeReader.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeArrayTypeReader.java index be732f7933c..aa750f6e71d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeArrayTypeReader.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeArrayTypeReader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeArrayTypeWriter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeArrayTypeWriter.java index 14aab6c55d3..6129fcf1517 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeArrayTypeWriter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsafeArrayTypeWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsignedLong.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsignedLong.java index 89160de5cf8..92a5378bc45 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsignedLong.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/UnsignedLong.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/Util.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/Util.java index 5814a50d23d..f9ae2b69f80 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/Util.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/util/Util.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.jdk9.test/src/org/graalvm/compiler/core/test/ea/AtomicVirtualizationTests.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.jdk9.test/src/org/graalvm/compiler/core/jdk9/test/ea/AtomicVirtualizationTests.java similarity index 99% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.jdk9.test/src/org/graalvm/compiler/core/test/ea/AtomicVirtualizationTests.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.jdk9.test/src/org/graalvm/compiler/core/jdk9/test/ea/AtomicVirtualizationTests.java index 20373197755..1f56e8de813 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.jdk9.test/src/org/graalvm/compiler/core/test/ea/AtomicVirtualizationTests.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.jdk9.test/src/org/graalvm/compiler/core/jdk9/test/ea/AtomicVirtualizationTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.match.processor/src/org/graalvm/compiler/core/match/processor/MatchProcessor.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.match.processor/src/org/graalvm/compiler/core/match/processor/MatchProcessor.java index 312656ed612..5fd8570fed4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.match.processor/src/org/graalvm/compiler/core/match/processor/MatchProcessor.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.match.processor/src/org/graalvm/compiler/core/match/processor/MatchProcessor.java @@ -485,7 +485,6 @@ public class MatchProcessor extends AbstractProcessor { * Strip the package off a class name leaving the full class name including any outer classes. */ private String fullClassName(Element element) { - assert element.getKind() == ElementKind.CLASS || element.getKind() == ElementKind.INTERFACE : element; String pkg = findPackage(element); return ((TypeElement) element).getQualifiedName().toString().substring(pkg.length() + 1); } @@ -675,7 +674,6 @@ public class MatchProcessor extends AbstractProcessor { private static TypeElement topDeclaringType(Element element) { Element enclosing = element.getEnclosingElement(); if (enclosing == null || enclosing.getKind() == ElementKind.PACKAGE) { - assert element.getKind() == ElementKind.CLASS || element.getKind() == ElementKind.INTERFACE; return (TypeElement) element; } return topDeclaringType(enclosing); @@ -960,7 +958,7 @@ public class MatchProcessor extends AbstractProcessor { Set originatingElementsList = info.originatingElements; originatingElementsList.add(method); while (enclosing != null) { - if (enclosing.getKind() == ElementKind.CLASS || enclosing.getKind() == ElementKind.INTERFACE) { + if (enclosing.getKind() == ElementKind.CLASS || enclosing.getKind() == ElementKind.INTERFACE || enclosing.getKind() == ElementKind.ENUM) { if (enclosing.getModifiers().contains(Modifier.PRIVATE)) { printError(method, "MatchRule cannot be declared in a private %s %s", enclosing.getKind().name().toLowerCase(), enclosing); return; @@ -968,8 +966,11 @@ public class MatchProcessor extends AbstractProcessor { originatingElementsList.add(enclosing); declaringClass = enclosing.getSimpleName() + separator + declaringClass; separator = "."; + } else if (enclosing.getKind() == ElementKind.PACKAGE) { + break; } else { - assert enclosing.getKind() == ElementKind.PACKAGE; + printError(method, "MatchRule cannot be declared in a %s", enclosing.getKind().name().toLowerCase()); + return; } enclosing = enclosing.getEnclosingElement(); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCAddressLowering.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCAddressLowering.java index 63385d4a83d..e17e8a0e216 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCAddressLowering.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCAddressLowering.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCArithmeticLIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCArithmeticLIRGenerator.java index 6bf3f25be2c..68841835e53 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCArithmeticLIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCArithmeticLIRGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCImmediateAddressNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCImmediateAddressNode.java index f7026028270..71e0f3a94c7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCImmediateAddressNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCImmediateAddressNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCIndexedAddressNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCIndexedAddressNode.java index ce869ba6cca..12e2af68421 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCIndexedAddressNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCIndexedAddressNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCIntegerCompareCanonicalizationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCIntegerCompareCanonicalizationPhase.java index 87ed5a3cf04..ed879483208 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCIntegerCompareCanonicalizationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCIntegerCompareCanonicalizationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCLIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCLIRGenerator.java index f1d8435722a..964bdce0c0a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCLIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCLIRGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCLIRKindTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCLIRKindTool.java index 98edf1eb6b4..c9fe7a6d87f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCLIRKindTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCLIRKindTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCMoveFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCMoveFactory.java index 5c3fe97f6bf..f8ed2e9bcdc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCMoveFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCMoveFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeLIRBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeLIRBuilder.java index 5d5e58511f5..bb7e48d6e8e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeLIRBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeLIRBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeMatchRules.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeMatchRules.java index cd5588cbbad..74be7c8b4ab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeMatchRules.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCNodeMatchRules.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCSuitesCreator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCSuitesCreator.java index afde1f00f4e..de65a1c8909 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCSuitesCreator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.sparc/src/org/graalvm/compiler/core/sparc/SPARCSuitesCreator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/AllocSpy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/AllocSpy.java index aec46aab668..d4b71af417b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/AllocSpy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/AllocSpy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ArrayLengthProviderTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ArrayLengthProviderTest.java index da8db6fbbe7..b1e65e94107 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ArrayLengthProviderTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ArrayLengthProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/BoxingEliminationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/BoxingEliminationTest.java index b5f2f598e0d..f26b2c15946 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/BoxingEliminationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/BoxingEliminationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,7 +32,6 @@ import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase; import org.junit.Assert; @@ -313,7 +312,7 @@ public class BoxingEliminationTest extends GraalCompilerTest { private void processMethod(final String snippet) { graph = parseEager(snippet, AllowAssumptions.NO); HighTierContext context = getDefaultHighTierContext(); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); new PartialEscapePhase(false, new CanonicalizerPhase(), graph.getOptions()).apply(graph, context); } @@ -326,7 +325,7 @@ public class BoxingEliminationTest extends GraalCompilerTest { HighTierContext context = getDefaultHighTierContext(); CanonicalizerPhase canonicalizer = new CanonicalizerPhase(); canonicalizer.apply(graph, context); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); if (loopPeeling) { new LoopPeelingPhase(new DefaultLoopPolicies()).apply(graph, context); } @@ -338,7 +337,7 @@ public class BoxingEliminationTest extends GraalCompilerTest { canonicalizer.apply(graph, context); StructuredGraph referenceGraph = parseEager(referenceSnippet, AllowAssumptions.YES); - new InliningPhase(new CanonicalizerPhase()).apply(referenceGraph, context); + createInliningPhase().apply(referenceGraph, context); new DeadCodeEliminationPhase().apply(referenceGraph); new CanonicalizerPhase().apply(referenceGraph, context); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/BoxingTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/BoxingTest.java index 69d55cccd91..6052b278898 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/BoxingTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/BoxingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ByteBufferTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ByteBufferTest.java index f8dc2e81030..2d862164a50 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ByteBufferTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ByteBufferTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CheckGraalInvariants.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CheckGraalInvariants.java index 68775201f17..30e69e4b2df 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CheckGraalInvariants.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CheckGraalInvariants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -72,16 +72,8 @@ import org.graalvm.compiler.phases.VerifyPhase; import org.graalvm.compiler.phases.VerifyPhase.VerificationError; import org.graalvm.compiler.phases.contract.VerifyNodeCosts; import org.graalvm.compiler.phases.tiers.HighTierContext; +import org.graalvm.compiler.phases.tiers.PhaseContext; import org.graalvm.compiler.phases.util.Providers; -import org.graalvm.compiler.phases.verify.VerifyBailoutUsage; -import org.graalvm.compiler.phases.verify.VerifyCallerSensitiveMethods; -import org.graalvm.compiler.phases.verify.VerifyDebugUsage; -import org.graalvm.compiler.phases.verify.VerifyGetOptionsUsage; -import org.graalvm.compiler.phases.verify.VerifyGraphAddUsage; -import org.graalvm.compiler.phases.verify.VerifyInstanceOfUsage; -import org.graalvm.compiler.phases.verify.VerifyUpdateUsages; -import org.graalvm.compiler.phases.verify.VerifyUsageWithEquals; -import org.graalvm.compiler.phases.verify.VerifyVirtualizableUsage; import org.graalvm.compiler.runtime.RuntimeProvider; import jdk.internal.vm.compiler.word.LocationIdentity; import org.junit.Assert; @@ -176,6 +168,10 @@ public class CheckGraalInvariants extends GraalCompilerTest { protected void handleParsingException(Throwable t) { GraalError.shouldNotReachHere(t); } + + public boolean shouldVerifyFoldableMethods() { + return true; + } } @Test @@ -219,6 +215,12 @@ public class CheckGraalInvariants extends GraalCompilerTest { */ continue; } + if (isGSON(className)) { + /* + * GSON classes are compiled with old JDK + */ + continue; + } classNames.add(className); } } @@ -240,6 +242,35 @@ public class CheckGraalInvariants extends GraalCompilerTest { List errors = Collections.synchronizedList(new ArrayList<>()); + List> verifiers = new ArrayList<>(); + + // If you add a new type to test here, be sure to add appropriate + // methods to the BadUsageWithEquals class below + verifiers.add(new VerifyUsageWithEquals(Value.class)); + verifiers.add(new VerifyUsageWithEquals(Register.class)); + verifiers.add(new VerifyUsageWithEquals(RegisterCategory.class)); + verifiers.add(new VerifyUsageWithEquals(JavaType.class)); + verifiers.add(new VerifyUsageWithEquals(JavaMethod.class)); + verifiers.add(new VerifyUsageWithEquals(JavaField.class)); + verifiers.add(new VerifyUsageWithEquals(LocationIdentity.class)); + verifiers.add(new VerifyUsageWithEquals(LIRKind.class)); + verifiers.add(new VerifyUsageWithEquals(ArithmeticOpTable.class)); + verifiers.add(new VerifyUsageWithEquals(ArithmeticOpTable.Op.class)); + + verifiers.add(new VerifyDebugUsage()); + verifiers.add(new VerifyCallerSensitiveMethods()); + verifiers.add(new VerifyVirtualizableUsage()); + verifiers.add(new VerifyUpdateUsages()); + verifiers.add(new VerifyBailoutUsage()); + verifiers.add(new VerifyInstanceOfUsage()); + verifiers.add(new VerifyGraphAddUsage()); + verifiers.add(new VerifyGetOptionsUsage()); + + VerifyFoldableMethods foldableMethodsVerifier = new VerifyFoldableMethods(); + if (tool.shouldVerifyFoldableMethods()) { + verifiers.add(foldableMethodsVerifier); + } + for (Method m : BadUsageWithEquals.class.getDeclaredMethods()) { ResolvedJavaMethod method = metaAccess.lookupJavaMethod(m); try (DebugContext debug = DebugContext.create(options, DebugHandlersFactory.LOADER)) { @@ -248,7 +279,7 @@ public class CheckGraalInvariants extends GraalCompilerTest { graphBuilderSuite.apply(graph, context); // update phi stamps graph.getNodes().filter(PhiNode.class).forEach(PhiNode::inferStamp); - checkGraph(context, graph); + checkGraph(verifiers, context, graph); errors.add(String.format("Expected error while checking %s", m)); } catch (VerificationError e) { // expected! @@ -288,7 +319,7 @@ public class CheckGraalInvariants extends GraalCompilerTest { graphBuilderSuite.apply(graph, context); // update phi stamps graph.getNodes().filter(PhiNode.class).forEach(PhiNode::inferStamp); - checkGraph(context, graph); + checkGraph(verifiers, context, graph); } catch (VerificationError e) { errors.add(e.getMessage()); } catch (LinkageError e) { @@ -310,12 +341,21 @@ public class CheckGraalInvariants extends GraalCompilerTest { } } } + executor.shutdown(); try { executor.awaitTermination(1, TimeUnit.HOURS); } catch (InterruptedException e1) { throw new RuntimeException(e1); } + + if (tool.shouldVerifyFoldableMethods()) { + try { + foldableMethodsVerifier.finish(); + } catch (Throwable e) { + errors.add(e.getMessage()); + } + } } if (!errors.isEmpty()) { StringBuilder msg = new StringBuilder(); @@ -334,6 +374,10 @@ public class CheckGraalInvariants extends GraalCompilerTest { return className.startsWith("org.graalvm.nativeimage"); } + private static boolean isGSON(String className) { + return className.contains("com.google.gson"); + } + private static List> initializeClasses(InvariantsTool tool, List classNames) { List> classes = new ArrayList<>(classNames.size()); for (String className : classNames) { @@ -382,29 +426,14 @@ public class CheckGraalInvariants extends GraalCompilerTest { /** * Checks the invariants for a single graph. */ - private static void checkGraph(HighTierContext context, StructuredGraph graph) { - if (shouldVerifyEquals(graph.method())) { - // If you add a new type to test here, be sure to add appropriate - // methods to the BadUsageWithEquals class below - new VerifyUsageWithEquals(Value.class).apply(graph, context); - new VerifyUsageWithEquals(Register.class).apply(graph, context); - new VerifyUsageWithEquals(RegisterCategory.class).apply(graph, context); - new VerifyUsageWithEquals(JavaType.class).apply(graph, context); - new VerifyUsageWithEquals(JavaMethod.class).apply(graph, context); - new VerifyUsageWithEquals(JavaField.class).apply(graph, context); - new VerifyUsageWithEquals(LocationIdentity.class).apply(graph, context); - new VerifyUsageWithEquals(LIRKind.class).apply(graph, context); - new VerifyUsageWithEquals(ArithmeticOpTable.class).apply(graph, context); - new VerifyUsageWithEquals(ArithmeticOpTable.Op.class).apply(graph, context); + private static void checkGraph(List> verifiers, HighTierContext context, StructuredGraph graph) { + for (VerifyPhase verifier : verifiers) { + if (!(verifier instanceof VerifyUsageWithEquals) || shouldVerifyEquals(graph.method())) { + verifier.apply(graph, context); + } else { + verifier.apply(graph, context); + } } - new VerifyDebugUsage().apply(graph, context); - new VerifyCallerSensitiveMethods().apply(graph, context); - new VerifyVirtualizableUsage().apply(graph, context); - new VerifyUpdateUsages().apply(graph, context); - new VerifyBailoutUsage().apply(graph, context); - new VerifyInstanceOfUsage().apply(graph, context); - new VerifyGraphAddUsage().apply(graph, context); - new VerifyGetOptionsUsage().apply(graph, context); if (graph.method().isBridge()) { BridgeMethodUtils.getBridgedMethod(graph.method()); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CommonedConstantsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CommonedConstantsTest.java index 91f6f7bd164..870146667d7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CommonedConstantsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CommonedConstantsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CompareCanonicalizerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CompareCanonicalizerTest.java index a936307b761..55e6c2abd26 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CompareCanonicalizerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CompareCanonicalizerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CompareCanonicalizerTest3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CompareCanonicalizerTest3.java index 22f732f4107..e18bbe6875f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CompareCanonicalizerTest3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CompareCanonicalizerTest3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConcreteSubtypeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConcreteSubtypeTest.java index 9ee3c6acc4a..36223afd611 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConcreteSubtypeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConcreteSubtypeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionTest.java index 3904b18c7f1..450a61f239b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationMulTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationMulTest.java index a6f9733bc19..fc4d23965fc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationMulTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationMulTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest1.java index 4c1fd2089c3..d049310386d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest10.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest10.java index 7627f226831..442103e9da3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest10.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest10.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest11.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest11.java index ff6d19ba407..c9a7e654b7f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest11.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest11.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest12.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest12.java index 6f5e23f06a2..4fec58f233e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest12.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest12.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest13.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest13.java index 85f0a6f6b32..288959c1c85 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest13.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest13.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest14.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest14.java index 51755bd91ea..9ac4f3581c6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest14.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest14.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest2.java index efdbcf6140b..90edd66ac85 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest3.java index 662dce40dbe..2074add75ee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest4.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest4.java index a816a94a5c4..055b9850f96 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest4.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest5.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest5.java index 7a618108059..d65b84f6bf3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest5.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest5.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest6.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest6.java index 4218515c51d..2d457d9b3a8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest6.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest7.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest7.java index 1d39b7953d4..6b05652a498 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest7.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest8.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest8.java index ea4e34e3b60..be2bcaf56ff 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest8.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest9.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest9.java index f8961c6a1e8..4264217c9b0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest9.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTest9.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTestBase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTestBase.java index 5eefee23ede..5e53054c703 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTestBase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConditionalEliminationTestBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConstantArrayReadFoldingTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConstantArrayReadFoldingTest.java index 4663ce90808..9015e26fbe8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConstantArrayReadFoldingTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ConstantArrayReadFoldingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CopyOfVirtualizationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CopyOfVirtualizationTest.java index fa11a90d1c5..697e72a8231 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CopyOfVirtualizationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CopyOfVirtualizationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CountedLoopTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CountedLoopTest.java index 2dedfb1625d..ef17c0e2652 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CountedLoopTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CountedLoopTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,6 +43,8 @@ import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins; import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration; import org.graalvm.compiler.nodes.spi.LIRLowerable; import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool; +import org.graalvm.compiler.phases.OptimisticOptimizations; +import org.graalvm.compiler.phases.tiers.HighTierContext; import org.junit.Test; import jdk.vm.ci.meta.JavaKind; @@ -411,6 +413,7 @@ public class CountedLoopTest extends GraalCompilerTest { public void rewrite(LoopsData loops) { InductionVariable inductionVariable = loops.getInductionVariable(iv); assert inductionVariable != null; + assertTrue(inductionVariable.getLoop().isCounted(), "must be counted"); ValueNode node = null; if (staticCheck != null) { assert staticProperty != null; @@ -490,6 +493,12 @@ public class CountedLoopTest extends GraalCompilerTest { return true; } + @Override + protected HighTierContext getDefaultHighTierContext() { + // Don't convert unreached paths into Guard + return new HighTierContext(getProviders(), getDefaultGraphBuilderSuite(), OptimisticOptimizations.NONE); + } + private Object[] argsToBind; @Override diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DeMorganCanonicalizationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DeMorganCanonicalizationTest.java index 7e3a4edd273..2eede24c77a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DeMorganCanonicalizationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DeMorganCanonicalizationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DegeneratedLoopsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DegeneratedLoopsTest.java index 5426af90577..908d0fc084a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DegeneratedLoopsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DegeneratedLoopsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,6 @@ import org.graalvm.compiler.debug.DebugDumpScope; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; import org.graalvm.compiler.phases.common.CanonicalizerPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.junit.Test; @@ -85,7 +84,7 @@ public class DegeneratedLoopsTest extends GraalCompilerTest { try (DebugContext.Scope s = debug.scope("DegeneratedLoopsTest", new DebugDumpScope(snippet))) { StructuredGraph graph = parseEager(snippet, AllowAssumptions.YES); HighTierContext context = getDefaultHighTierContext(); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); new CanonicalizerPhase().apply(graph, context); debug.dump(DebugContext.BASIC_LEVEL, graph, "Graph"); StructuredGraph referenceGraph = parseEager(REFERENCE_SNIPPET, AllowAssumptions.YES); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DirectByteBufferTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DirectByteBufferTest.java index ea735ef2809..e8ea24cfe27 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DirectByteBufferTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DirectByteBufferTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DontReuseArgumentSpaceTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DontReuseArgumentSpaceTest.java index 95141d8ff06..25e901db644 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DontReuseArgumentSpaceTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DontReuseArgumentSpaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DumpPathTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DumpPathTest.java index 964ec3e42ff..b0027a365c1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DumpPathTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/DumpPathTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/EnumSwitchTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/EnumSwitchTest.java index ed9c3d00f4b..1ca8d2c9013 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/EnumSwitchTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/EnumSwitchTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/EnumValuesTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/EnumValuesTest.java index 7cda16026a6..bd7d8cf29c4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/EnumValuesTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/EnumValuesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FinalizableSubclassTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FinalizableSubclassTest.java index bd36bd33b07..3ab4b0eaf53 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FinalizableSubclassTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FinalizableSubclassTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,6 @@ import org.graalvm.compiler.nodes.java.RegisterFinalizerNode; import org.graalvm.compiler.options.OptionValues; import org.graalvm.compiler.phases.OptimisticOptimizations; import org.graalvm.compiler.phases.common.CanonicalizerPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.junit.Assert; import org.junit.Test; @@ -81,7 +80,7 @@ public class FinalizableSubclassTest extends GraalCompilerTest { new GraphBuilderPhase.Instance(getMetaAccess(), getProviders().getStampProvider(), getProviders().getConstantReflection(), getProviders().getConstantFieldProvider(), conf, OptimisticOptimizations.ALL, null).apply(graph); HighTierContext context = new HighTierContext(getProviders(), getDefaultGraphBuilderSuite(), OptimisticOptimizations.ALL); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); new CanonicalizerPhase().apply(graph, context); return graph; } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FindUniqueConcreteMethodBugTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FindUniqueConcreteMethodBugTest.java index 39516db55f1..66c8211dfee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FindUniqueConcreteMethodBugTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FindUniqueConcreteMethodBugTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FindUniqueDefaultMethodTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FindUniqueDefaultMethodTest.java index 2dd8d5eb1a6..6fc20fa2f11 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FindUniqueDefaultMethodTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FindUniqueDefaultMethodTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FloatOptimizationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FloatOptimizationTest.java index eceaf890a68..f40b5a38e15 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FloatOptimizationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FloatOptimizationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FloatingReadTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FloatingReadTest.java index bd23a7cc294..3e6e3afec1c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FloatingReadTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/FloatingReadTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalCompilerAssumptionsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalCompilerAssumptionsTest.java index 1a8d01bc32c..bbc73a14cec 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalCompilerAssumptionsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalCompilerAssumptionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalCompilerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalCompilerTest.java index 2379a9a001a..ac3aba0ce5c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalCompilerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalCompilerTest.java @@ -83,6 +83,7 @@ import org.graalvm.compiler.nodes.ConstantNode; import org.graalvm.compiler.nodes.FixedWithNextNode; import org.graalvm.compiler.nodes.FrameState; import org.graalvm.compiler.nodes.FullInfopointNode; +import org.graalvm.compiler.nodes.Invoke; import org.graalvm.compiler.nodes.InvokeNode; import org.graalvm.compiler.nodes.InvokeWithExceptionNode; import org.graalvm.compiler.nodes.ParameterNode; @@ -111,6 +112,9 @@ import org.graalvm.compiler.phases.Phase; import org.graalvm.compiler.phases.PhaseSuite; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.ConvertDeoptimizeToGuardPhase; +import org.graalvm.compiler.phases.common.inlining.InliningPhase; +import org.graalvm.compiler.phases.common.inlining.info.InlineInfo; +import org.graalvm.compiler.phases.common.inlining.policy.GreedyInliningPolicy; import org.graalvm.compiler.phases.schedule.SchedulePhase; import org.graalvm.compiler.phases.schedule.SchedulePhase.SchedulingStrategy; import org.graalvm.compiler.phases.tiers.HighTierContext; @@ -597,11 +601,11 @@ public abstract class GraalCompilerTest extends GraalTest { } protected HighTierContext getDefaultHighTierContext() { - return new HighTierContext(getProviders(), getDefaultGraphBuilderSuite(), OptimisticOptimizations.ALL); + return new HighTierContext(getProviders(), getDefaultGraphBuilderSuite(), getOptimisticOptimizations()); } protected MidTierContext getDefaultMidTierContext() { - return new MidTierContext(getProviders(), getTargetProvider(), OptimisticOptimizations.ALL, null); + return new MidTierContext(getProviders(), getTargetProvider(), getOptimisticOptimizations(), null); } protected SnippetReflectionProvider getSnippetReflection() { @@ -632,6 +636,30 @@ public abstract class GraalCompilerTest extends GraalTest { return getProviders().getLowerer(); } + protected final BasePhase createInliningPhase() { + return createInliningPhase(new CanonicalizerPhase()); + } + + protected BasePhase createInliningPhase(CanonicalizerPhase canonicalizer) { + return createInliningPhase(null, canonicalizer); + } + + static class GreedyTestInliningPolicy extends GreedyInliningPolicy { + GreedyTestInliningPolicy(Map hints) { + super(hints); + } + + @Override + protected int previousLowLevelGraphSize(InlineInfo info) { + // Ignore previous compiles for tests + return 0; + } + } + + protected BasePhase createInliningPhase(Map hints, CanonicalizerPhase canonicalizer) { + return new InliningPhase(new GreedyTestInliningPolicy(hints), canonicalizer); + } + protected CompilationIdentifier getCompilationId(ResolvedJavaMethod method) { return getBackend().getCompilationIdentifier(method); } @@ -1039,6 +1067,10 @@ public abstract class GraalCompilerTest extends GraalTest { return compile(installedCodeOwner, graph, new CompilationResult(compilationId), compilationId, options); } + protected OptimisticOptimizations getOptimisticOptimizations() { + return OptimisticOptimizations.ALL; + } + /** * Compiles a given method. * @@ -1055,7 +1087,7 @@ public abstract class GraalCompilerTest extends GraalTest { DebugContext debug = graphToCompile.getDebug(); try (DebugContext.Scope s = debug.scope("Compile", graphToCompile)) { assert options != null; - Request request = new Request<>(graphToCompile, installedCodeOwner, getProviders(), getBackend(), getDefaultGraphBuilderSuite(), OptimisticOptimizations.ALL, + Request request = new Request<>(graphToCompile, installedCodeOwner, getProviders(), getBackend(), getDefaultGraphBuilderSuite(), getOptimisticOptimizations(), graphToCompile.getProfilingInfo(), createSuites(options), createLIRSuites(options), compilationResult, CompilationResultBuilderFactory.Default, true); return GraalCompiler.compile(request); } catch (Throwable e) { @@ -1074,7 +1106,7 @@ public abstract class GraalCompilerTest extends GraalTest { } protected void applyFrontEnd(StructuredGraph graph) { - GraalCompiler.emitFrontEnd(getProviders(), getBackend(), graph, getDefaultGraphBuilderSuite(), OptimisticOptimizations.ALL, graph.getProfilingInfo(), createSuites(graph.getOptions())); + GraalCompiler.emitFrontEnd(getProviders(), getBackend(), graph, getDefaultGraphBuilderSuite(), getOptimisticOptimizations(), graph.getProfilingInfo(), createSuites(graph.getOptions())); } protected StructuredGraph lastCompiledGraph; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalDebugHandlersFactoryTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalDebugHandlersFactoryTest.java index 6d011bbadb5..95fd3d181be 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalDebugHandlersFactoryTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraalDebugHandlersFactoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphEncoderTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphEncoderTest.java index 299da47f748..a5626670630 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphEncoderTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphEncoderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphResetDebugTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphResetDebugTest.java index 29e9a7cdd78..74260108474 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphResetDebugTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphResetDebugTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphScheduleTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphScheduleTest.java index 60dcd36db6c..8528a521e17 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphScheduleTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GraphScheduleTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GuardPrioritiesTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GuardPrioritiesTest.java index 8573853d8e4..f304bb5ec29 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GuardPrioritiesTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GuardPrioritiesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GuardedIntrinsicTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GuardedIntrinsicTest.java index 64f0e3c3f66..3967918eecf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GuardedIntrinsicTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/GuardedIntrinsicTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/HashCodeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/HashCodeTest.java index 65e92c68e47..1073e22e156 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/HashCodeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/HashCodeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/HashMapGetTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/HashMapGetTest.java index b0e2086ab44..3a87783fb3e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/HashMapGetTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/HashMapGetTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IfCanonicalizerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IfCanonicalizerTest.java index 58429d79b44..9e89a76ff52 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IfCanonicalizerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IfCanonicalizerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IfReorderTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IfReorderTest.java index fe4166d8e51..2d059aad88f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IfReorderTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IfReorderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ImplicitNullCheckTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ImplicitNullCheckTest.java index 752e6f3543d..2cf4f313a60 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ImplicitNullCheckTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ImplicitNullCheckTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InfopointReasonTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InfopointReasonTest.java index e5d26c632f1..fc6ddb47a5d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InfopointReasonTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InfopointReasonTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InstalledCodeInvalidationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InstalledCodeInvalidationTest.java index b63a374bf8d..438eb4b1c1b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InstalledCodeInvalidationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InstalledCodeInvalidationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IntegerEqualsCanonicalizerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IntegerEqualsCanonicalizerTest.java index db23f1e230a..c864c5428fb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IntegerEqualsCanonicalizerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IntegerEqualsCanonicalizerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IntegerStampMulFoldTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IntegerStampMulFoldTest.java index 102f92c8451..4353856677a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IntegerStampMulFoldTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/IntegerStampMulFoldTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InterfaceMethodHandleTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InterfaceMethodHandleTest.java index a60c1f3fd87..d64c4ff622a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InterfaceMethodHandleTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InterfaceMethodHandleTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvocationPluginsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvocationPluginsTest.java index 7f289d318ed..a14f06ab164 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvocationPluginsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvocationPluginsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvokeExceptionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvokeExceptionTest.java index bd117ad3795..662809f8cbf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvokeExceptionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvokeExceptionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,15 +27,13 @@ package org.graalvm.compiler.core.test; import java.util.HashMap; import java.util.Map; -import org.junit.Test; - import org.graalvm.compiler.nodes.Invoke; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; +import org.junit.Test; public class InvokeExceptionTest extends GraalCompilerTest { @@ -71,7 +69,7 @@ public class InvokeExceptionTest extends GraalCompilerTest { hints.put(invoke, 1000d); } HighTierContext context = getDefaultHighTierContext(); - new InliningPhase(hints, new CanonicalizerPhase()).apply(graph, context); + createInliningPhase(hints, new CanonicalizerPhase()).apply(graph, context); new CanonicalizerPhase().apply(graph, context); new DeadCodeEliminationPhase().apply(graph); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvokeHintsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvokeHintsTest.java index 9e6a567369e..2ce70b62f28 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvokeHintsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/InvokeHintsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,15 +27,13 @@ package org.graalvm.compiler.core.test; import java.util.HashMap; import java.util.Map; -import org.junit.Test; - import org.graalvm.compiler.nodes.Invoke; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; +import org.junit.Test; public class InvokeHintsTest extends GraalCompilerTest { @@ -82,7 +80,7 @@ public class InvokeHintsTest extends GraalCompilerTest { } HighTierContext context = getDefaultHighTierContext(); - new InliningPhase(hints, new CanonicalizerPhase()).apply(graph, context); + createInliningPhase(hints, new CanonicalizerPhase()).apply(graph, context); new CanonicalizerPhase().apply(graph, context); new DeadCodeEliminationPhase().apply(graph); StructuredGraph referenceGraph = parseEager(REFERENCE_SNIPPET, AllowAssumptions.NO); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LockEliminationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LockEliminationTest.java index 3e6cbb8df34..f35d4425a0f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LockEliminationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LockEliminationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,9 +24,6 @@ package org.graalvm.compiler.core.test; -import jdk.vm.ci.meta.ResolvedJavaMethod; - -import org.junit.Test; import org.graalvm.compiler.loop.DefaultLoopPolicies; import org.graalvm.compiler.loop.phases.LoopFullUnrollPhase; import org.graalvm.compiler.nodes.StructuredGraph; @@ -38,10 +35,12 @@ import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; import org.graalvm.compiler.phases.common.LockEliminationPhase; import org.graalvm.compiler.phases.common.LoweringPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.phases.tiers.PhaseContext; import org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase; +import org.junit.Test; + +import jdk.vm.ci.meta.ResolvedJavaMethod; public class LockEliminationTest extends GraalCompilerTest { @@ -121,7 +120,7 @@ public class LockEliminationTest extends GraalCompilerTest { HighTierContext context = getDefaultHighTierContext(); CanonicalizerPhase canonicalizer = new CanonicalizerPhase(); canonicalizer.apply(graph, context); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); new CanonicalizerPhase().apply(graph, context); new DeadCodeEliminationPhase().apply(graph); if (doEscapeAnalysis) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LongNodeChainTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LongNodeChainTest.java index d6c9bebd016..a994eb440c9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LongNodeChainTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LongNodeChainTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LoopFullUnrollTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LoopFullUnrollTest.java index 63ef4ab80c1..82eee7d7759 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LoopFullUnrollTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LoopFullUnrollTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LoopUnswitchTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LoopUnswitchTest.java index 4a47b2572da..541e6c61086 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LoopUnswitchTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/LoopUnswitchTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MatchRuleTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MatchRuleTest.java new file mode 100644 index 00000000000..d30c42f405a --- /dev/null +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MatchRuleTest.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +package org.graalvm.compiler.core.test; + +import org.graalvm.compiler.lir.LIR; +import org.graalvm.compiler.lir.LIRInstruction; +import org.graalvm.compiler.lir.gen.LIRGenerationResult; +import org.graalvm.compiler.lir.phases.LIRPhase; +import org.graalvm.compiler.lir.phases.LIRSuites; +import org.graalvm.compiler.lir.phases.PreAllocationOptimizationPhase.PreAllocationOptimizationContext; +import org.graalvm.compiler.options.OptionValues; + +import jdk.vm.ci.code.TargetDescription; +import org.junit.Assert; + +import java.util.function.Predicate; + +public abstract class MatchRuleTest extends GraalCompilerTest { + private LIR lir; + + protected LIR getLIR() { + return lir; + } + + @Override + protected LIRSuites createLIRSuites(OptionValues options) { + LIRSuites suites = super.createLIRSuites(options); + suites.getPreAllocationOptimizationStage().appendPhase(new CheckPhase()); + return suites; + } + + public class CheckPhase extends LIRPhase { + @Override + protected void run(TargetDescription target, LIRGenerationResult lirGenRes, PreAllocationOptimizationContext context) { + lir = lirGenRes.getLIR(); + } + } + + protected void checkLIR(String methodName, Predicate predicate, int expected) { + compile(getResolvedJavaMethod(methodName), null); + int actualOpNum = 0; + for (LIRInstruction ins : lir.getLIRforBlock(lir.codeEmittingOrder()[0])) { + if (predicate.test(ins)) { + actualOpNum++; + } + } + Assert.assertEquals(expected, actualOpNum); + } + +} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryArithmeticTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryArithmeticTest.java index 2b05059f20b..750447d4e6e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryArithmeticTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryArithmeticTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryGraphCanonicalizeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryGraphCanonicalizeTest.java index ce04f57d65e..8060cceb70e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryGraphCanonicalizeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryGraphCanonicalizeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryScheduleTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryScheduleTest.java index 8dff5c4b6af..779da296377 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryScheduleTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MemoryScheduleTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,7 +53,6 @@ import org.graalvm.compiler.phases.common.FloatingReadPhase; import org.graalvm.compiler.phases.common.GuardLoweringPhase; import org.graalvm.compiler.phases.common.LoweringPhase; import org.graalvm.compiler.phases.common.RemoveValueProxyPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.schedule.SchedulePhase; import org.graalvm.compiler.phases.schedule.SchedulePhase.SchedulingStrategy; import org.graalvm.compiler.phases.tiers.HighTierContext; @@ -712,7 +711,7 @@ public class MemoryScheduleTest extends GraphScheduleTest { CanonicalizerPhase canonicalizer = new CanonicalizerPhase(); canonicalizer.apply(graph, context); if (mode == TestMode.INLINED_WITHOUT_FRAMESTATES) { - new InliningPhase(canonicalizer).apply(graph, context); + createInliningPhase(canonicalizer).apply(graph, context); } new LoweringPhase(canonicalizer, LoweringTool.StandardLoweringStage.HIGH_TIER).apply(graph, context); if (mode == TestMode.WITHOUT_FRAMESTATES || mode == TestMode.INLINED_WITHOUT_FRAMESTATES) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MergeCanonicalizerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MergeCanonicalizerTest.java index 646cfeb69a5..70d6d28e98b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MergeCanonicalizerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MergeCanonicalizerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MethodHandleEagerResolution.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MethodHandleEagerResolution.java index 53ce5bab77c..316367e51c1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MethodHandleEagerResolution.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MethodHandleEagerResolution.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MonitorGraphTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MonitorGraphTest.java index 1bd320ccc7a..38f54d851d4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MonitorGraphTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/MonitorGraphTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,9 +27,6 @@ package org.graalvm.compiler.core.test; import java.util.HashMap; import java.util.Map; -import org.junit.Assert; -import org.junit.Test; - import org.graalvm.compiler.graph.Node; import org.graalvm.compiler.graph.iterators.NodeIterable; import org.graalvm.compiler.nodes.ConstantNode; @@ -41,8 +38,9 @@ import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; import org.graalvm.compiler.nodes.java.MonitorExitNode; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; +import org.junit.Assert; +import org.junit.Test; /** * In the following tests, the usages of local variable "a" are replaced with the integer constant @@ -105,7 +103,7 @@ public class MonitorGraphTest extends GraalCompilerTest { hints.put(invoke, 1000d); } HighTierContext context = getDefaultHighTierContext(); - new InliningPhase(hints, new CanonicalizerPhase()).apply(graph, context); + createInliningPhase(hints, new CanonicalizerPhase()).apply(graph, context); new CanonicalizerPhase().apply(graph, context); new DeadCodeEliminationPhase().apply(graph); return graph; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NarrowingReadTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NarrowingReadTest.java index e4980c254f7..21e22d3a6cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NarrowingReadTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NarrowingReadTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NestedLoopTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NestedLoopTest.java index e09ca1e5360..4954a4031ff 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NestedLoopTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NestedLoopTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NodePosIteratorTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NodePosIteratorTest.java index 07e30d0816d..11920b25f39 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NodePosIteratorTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NodePosIteratorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NodePropertiesTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NodePropertiesTest.java index f3cd492251c..d92d910be40 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NodePropertiesTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/NodePropertiesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OffHeapUnsafeAccessTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OffHeapUnsafeAccessTest.java index 57683c05e7b..7f99886f026 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OffHeapUnsafeAccessTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OffHeapUnsafeAccessTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OnStackReplacementTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OnStackReplacementTest.java index 7673d5aa57e..c8738b72428 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OnStackReplacementTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OnStackReplacementTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OptionsVerifierTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OptionsVerifierTest.java index ff99b15d957..d60b8fbfe3f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OptionsVerifierTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/OptionsVerifierTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PhiCreationTests.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PhiCreationTests.java index 95068377ea0..43c4cd62625 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PhiCreationTests.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PhiCreationTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ProfilingInfoTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ProfilingInfoTest.java index 20948a9d391..6cdbdf16247 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ProfilingInfoTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ProfilingInfoTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PushNodesThroughPiTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PushNodesThroughPiTest.java index 4f01aaffcdb..40f93db5d0c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PushNodesThroughPiTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PushNodesThroughPiTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PushThroughIfTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PushThroughIfTest.java index 0265c67e3f7..898cf865f77 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PushThroughIfTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/PushThroughIfTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReadAfterCheckCastTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReadAfterCheckCastTest.java index 8364533b202..7e3945d22db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReadAfterCheckCastTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReadAfterCheckCastTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReassociateAndCanonicalTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReassociateAndCanonicalTest.java index 2d8f77ae6a2..22be9448435 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReassociateAndCanonicalTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReassociateAndCanonicalTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReentrantBlockIteratorTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReentrantBlockIteratorTest.java index f8f0a1469a3..0fb9f300b52 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReentrantBlockIteratorTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReentrantBlockIteratorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReferenceGetLoopTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReferenceGetLoopTest.java index e605e01dd29..5b6aa0f92f3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReferenceGetLoopTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReferenceGetLoopTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReflectionOptionDescriptors.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReflectionOptionDescriptors.java index 809935a518e..ba548035fc7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReflectionOptionDescriptors.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ReflectionOptionDescriptors.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ScalarTypeSystemTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ScalarTypeSystemTest.java index 5118af7d4e7..b085b0b67a7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ScalarTypeSystemTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ScalarTypeSystemTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SchedulingTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SchedulingTest.java index aca992400af..8195e18651b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SchedulingTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SchedulingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SchedulingTest2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SchedulingTest2.java index eba9cc8f9ab..a4fecea805d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SchedulingTest2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SchedulingTest2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ShortCircuitNodeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ShortCircuitNodeTest.java index 5d7d7066b1b..c54179ca901 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ShortCircuitNodeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ShortCircuitNodeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SimpleCFGTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SimpleCFGTest.java index 3eab6c0427b..89e789188a2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SimpleCFGTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SimpleCFGTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StableArrayReadFoldingTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StableArrayReadFoldingTest.java index 4529cc32d51..7efbd1e4d52 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StableArrayReadFoldingTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StableArrayReadFoldingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StampCanonicalizerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StampCanonicalizerTest.java index 83d2a240ca8..7137d05ec5b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StampCanonicalizerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StampCanonicalizerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StampMemoryAccessTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StampMemoryAccessTest.java index a78194e7b64..faf18d5a290 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StampMemoryAccessTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StampMemoryAccessTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StaticInterfaceFieldTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StaticInterfaceFieldTest.java index c54a5446a90..1ba8f5fc16f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StaticInterfaceFieldTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StaticInterfaceFieldTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StraighteningTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StraighteningTest.java index 8025cef3acd..9fef513afb2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StraighteningTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/StraighteningTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SubWordReturnTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SubWordReturnTest.java index 0b8498f5c2b..30a5b9d950f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SubWordReturnTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SubWordReturnTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SwitchDyingLoopTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SwitchDyingLoopTest.java index e6658fb8cb1..12cf31371e5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SwitchDyingLoopTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/SwitchDyingLoopTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TrivialInliningExplosionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TrivialInliningExplosionTest.java index 602deb2d977..ac742b841c8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TrivialInliningExplosionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TrivialInliningExplosionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TypeSystemTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TypeSystemTest.java index 1e1651ad8f8..fa295e4b000 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TypeSystemTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TypeSystemTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TypeWriterTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TypeWriterTest.java index dfe6b6bff31..83631eb3200 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TypeWriterTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/TypeWriterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnbalancedMonitorsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnbalancedMonitorsTest.java index 46ea4587e3f..95488c70bf7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnbalancedMonitorsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnbalancedMonitorsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UncheckedInterfaceProviderTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UncheckedInterfaceProviderTest.java index 09013de4678..710385c00b1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UncheckedInterfaceProviderTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UncheckedInterfaceProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnsafeReadEliminationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnsafeReadEliminationTest.java index 602543ec9ce..19ac70efe5d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnsafeReadEliminationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnsafeReadEliminationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnsafeVirtualizationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnsafeVirtualizationTest.java index 52c9827c169..f7d331d667c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnsafeVirtualizationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnsafeVirtualizationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnusedArray.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnusedArray.java index 15d238acca6..1e003b89cb2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnusedArray.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/UnusedArray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyBailoutUsage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyBailoutUsage.java similarity index 97% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyBailoutUsage.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyBailoutUsage.java index 3cdb14f2176..f566676eff7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyBailoutUsage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyBailoutUsage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.phases.verify; +package org.graalvm.compiler.core.test; import org.graalvm.compiler.core.common.PermanentBailoutException; import org.graalvm.compiler.core.common.RetryableBailoutException; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyBailoutUsageTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyBailoutUsageTest.java index 1913c961361..427bf523490 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyBailoutUsageTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyBailoutUsageTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,7 +48,6 @@ import org.graalvm.compiler.phases.PhaseSuite; import org.graalvm.compiler.phases.VerifyPhase.VerificationError; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.phases.util.Providers; -import org.graalvm.compiler.phases.verify.VerifyBailoutUsage; import org.graalvm.compiler.runtime.RuntimeProvider; import org.junit.Test; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyCallerSensitiveMethods.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyCallerSensitiveMethods.java similarity index 97% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyCallerSensitiveMethods.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyCallerSensitiveMethods.java index 1ca56f59ac9..045e67e9de5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyCallerSensitiveMethods.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyCallerSensitiveMethods.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.phases.verify; +package org.graalvm.compiler.core.test; import static org.graalvm.compiler.serviceprovider.GraalServices.Java8OrEarlier; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyDebugUsage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyDebugUsage.java similarity index 99% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyDebugUsage.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyDebugUsage.java index 2944ff40471..8cd9f1e8a30 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyDebugUsage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyDebugUsage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.phases.verify; +package org.graalvm.compiler.core.test; import static org.graalvm.compiler.debug.DebugContext.BASIC_LEVEL; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyDebugUsageTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyDebugUsageTest.java index e81ab95f006..cfed3ec4086 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyDebugUsageTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyDebugUsageTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,7 +48,6 @@ import org.graalvm.compiler.phases.PhaseSuite; import org.graalvm.compiler.phases.VerifyPhase.VerificationError; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.phases.util.Providers; -import org.graalvm.compiler.phases.verify.VerifyDebugUsage; import org.graalvm.compiler.runtime.RuntimeProvider; import org.junit.Test; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyFoldableMethods.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyFoldableMethods.java new file mode 100644 index 00000000000..bfdbcf4816a --- /dev/null +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyFoldableMethods.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +package org.graalvm.compiler.core.test; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +import org.graalvm.compiler.api.replacements.Fold; +import org.graalvm.compiler.nodes.StructuredGraph; +import org.graalvm.compiler.nodes.graphbuilderconf.GeneratedInvocationPlugin; +import org.graalvm.compiler.nodes.java.MethodCallTargetNode; +import org.graalvm.compiler.phases.VerifyPhase; +import org.graalvm.compiler.phases.tiers.PhaseContext; + +import jdk.vm.ci.meta.ResolvedJavaMethod; +import jdk.vm.ci.meta.ResolvedJavaType; + +/** + * Verifies that all {@link Fold} annotated methods have at least one caller. + */ +public class VerifyFoldableMethods extends VerifyPhase { + + @Override + public boolean checkContract() { + return false; + } + + private final Map foldables = new ConcurrentHashMap<>(); + ResolvedJavaType generatedInvocationPluginType; + + @Override + protected boolean verify(StructuredGraph graph, PhaseContext context) { + ResolvedJavaMethod method = graph.method(); + if (method.getAnnotation(Fold.class) != null) { + foldables.putIfAbsent(method, false); + } else { + if (generatedInvocationPluginType == null) { + generatedInvocationPluginType = context.getMetaAccess().lookupJavaType(GeneratedInvocationPlugin.class); + } + if (!generatedInvocationPluginType.isAssignableFrom(method.getDeclaringClass())) { + for (MethodCallTargetNode t : graph.getNodes(MethodCallTargetNode.TYPE)) { + ResolvedJavaMethod callee = t.targetMethod(); + if (callee.getAnnotation(Fold.class) != null) { + foldables.put(callee, true); + } + } + } + } + return true; + } + + public void finish() { + String uncalled = foldables.entrySet().stream().filter(e -> e.getValue() == false).map(e -> e.getKey().format("%H.%n(%p)")).collect(Collectors.joining(System.lineSeparator() + " ")); + if (uncalled.length() != 0) { + throw new VerificationError(String.format("Methods annotated with @" + Fold.class.getSimpleName() + " appear to have no usages:%n %s", uncalled)); + } + } +} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyGetOptionsUsage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyGetOptionsUsage.java similarity index 96% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyGetOptionsUsage.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyGetOptionsUsage.java index 30de61f2097..42c421baf16 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyGetOptionsUsage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyGetOptionsUsage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.phases.verify; +package org.graalvm.compiler.core.test; import java.lang.reflect.MalformedParametersException; import java.lang.reflect.Method; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyGraphAddUsage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyGraphAddUsage.java similarity index 97% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyGraphAddUsage.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyGraphAddUsage.java index b011db9339d..9a3f2f4544b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyGraphAddUsage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyGraphAddUsage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.phases.verify; +package org.graalvm.compiler.core.test; import java.lang.reflect.Constructor; import java.lang.reflect.Method; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyInstanceOfUsage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyInstanceOfUsage.java similarity index 96% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyInstanceOfUsage.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyInstanceOfUsage.java index d124ccc69e7..b220293503e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyInstanceOfUsage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyInstanceOfUsage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.phases.verify; +package org.graalvm.compiler.core.test; import org.graalvm.compiler.lir.StandardOp.LoadConstantOp; import org.graalvm.compiler.lir.StandardOp.MoveOp; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyUpdateUsages.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyUpdateUsages.java similarity index 97% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyUpdateUsages.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyUpdateUsages.java index 454a285c6e4..75f3255eca0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyUpdateUsages.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyUpdateUsages.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.phases.verify; +package org.graalvm.compiler.core.test; import java.util.List; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyUsageWithEquals.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyUsageWithEquals.java similarity index 98% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyUsageWithEquals.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyUsageWithEquals.java index b4313272e4c..94d2226ecfa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyUsageWithEquals.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyUsageWithEquals.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.phases.verify; +package org.graalvm.compiler.core.test; import org.graalvm.compiler.core.common.type.ObjectStamp; import org.graalvm.compiler.nodes.Invoke; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyVirtualizableTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyVirtualizableTest.java index 662b8a576bb..b04f67acbaf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyVirtualizableTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyVirtualizableTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,6 @@ import org.graalvm.compiler.phases.PhaseSuite; import org.graalvm.compiler.phases.VerifyPhase.VerificationError; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.phases.util.Providers; -import org.graalvm.compiler.phases.verify.VerifyVirtualizableUsage; import org.graalvm.compiler.runtime.RuntimeProvider; import org.junit.Test; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyVirtualizableUsage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyVirtualizableUsage.java similarity index 97% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyVirtualizableUsage.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyVirtualizableUsage.java index cc83030fc00..6b929c72cdd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/verify/VerifyVirtualizableUsage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/VerifyVirtualizableUsage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.phases.verify; +package org.graalvm.compiler.core.test; import org.graalvm.compiler.core.common.type.ObjectStamp; import org.graalvm.compiler.core.common.type.Stamp; @@ -42,7 +42,6 @@ import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaType; /** - * * Verifies that node types implementing the {@link Virtualizable} interface use it correctly. * Implementors of {@link Virtualizable#virtualize(org.graalvm.compiler.nodes.spi.VirtualizerTool)} * must not apply effects on their {@link Graph graph} that cannot be easily undone. diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ZeroSignExtendTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ZeroSignExtendTest.java index cee1d2ff9f5..f77057b89af 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ZeroSignExtendTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ZeroSignExtendTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/backend/AllocatorTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/backend/AllocatorTest.java index c43392030cd..55ef3cf4949 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/backend/AllocatorTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/backend/AllocatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/backend/BackendTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/backend/BackendTest.java index 62fdc052578..f54dd56be0b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/backend/BackendTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/backend/BackendTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/CompiledMethodTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/CompiledMethodTest.java index 9ba7d299e49..0b2818772ee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/CompiledMethodTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/CompiledMethodTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/MonitorDeoptTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/MonitorDeoptTest.java index a6a7ad4747a..011e1131405 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/MonitorDeoptTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/MonitorDeoptTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/RethrowDeoptMaterializeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/RethrowDeoptMaterializeTest.java index 86a3639de92..fdbd44af78f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/RethrowDeoptMaterializeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/RethrowDeoptMaterializeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/SafepointRethrowDeoptTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/SafepointRethrowDeoptTest.java index 787aff3750f..cb7b5ccd0c8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/SafepointRethrowDeoptTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/SafepointRethrowDeoptTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/SynchronizedMethodDeoptimizationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/SynchronizedMethodDeoptimizationTest.java index d898a6043d2..4173827a4b4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/SynchronizedMethodDeoptimizationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/deopt/SynchronizedMethodDeoptimizationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/CountUppercaseParallelTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/CountUppercaseParallelTest.java index 137a2c2b19a..7ff5d0a1d6f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/CountUppercaseParallelTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/CountUppercaseParallelTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EAMergingTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EAMergingTest.java index ed1978973f6..f53fa1290a0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EAMergingTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EAMergingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EATestBase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EATestBase.java index f00de78e639..d812aabd175 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EATestBase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EATestBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,6 @@ import org.graalvm.compiler.nodes.virtual.AllocatedObjectNode; import org.graalvm.compiler.nodes.virtual.CommitAllocationNode; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase; import org.junit.Assert; @@ -167,7 +166,7 @@ public class EATestBase extends GraalCompilerTest { try (DebugContext.Scope s = debug.scope(getClass(), method, getCodeCache())) { graph = parseEager(method, AllowAssumptions.YES, debug); context = getDefaultHighTierContext(); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); new DeadCodeEliminationPhase().apply(graph); canonicalizeGraph(); new PartialEscapePhase(iterativeEscapeAnalysis, false, new CanonicalizerPhase(), null, graph.getOptions()).apply(graph, context); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EarlyReadEliminationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EarlyReadEliminationTest.java index 1a1542e76df..ccf1ed40995 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EarlyReadEliminationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EarlyReadEliminationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,6 @@ package org.graalvm.compiler.core.test.ea; import java.util.List; -import org.junit.Test; - import org.graalvm.compiler.core.test.GraalCompilerTest; import org.graalvm.compiler.nodes.ProxyNode; import org.graalvm.compiler.nodes.ReturnNode; @@ -41,9 +39,9 @@ import org.graalvm.compiler.nodes.memory.ReadNode; import org.graalvm.compiler.nodes.spi.LoweringTool; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.LoweringPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.virtual.phases.ea.EarlyReadEliminationPhase; +import org.junit.Test; public class EarlyReadEliminationTest extends GraalCompilerTest { @@ -264,7 +262,7 @@ public class EarlyReadEliminationTest extends GraalCompilerTest { protected StructuredGraph processMethod(String snippet, boolean doLowering) { StructuredGraph graph = parseEager(getResolvedJavaMethod(snippet), AllowAssumptions.NO); HighTierContext context = getDefaultHighTierContext(); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); if (doLowering) { new LoweringPhase(new CanonicalizerPhase(), LoweringTool.StandardLoweringStage.HIGH_TIER).apply(graph, context); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EscapeAnalysisTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EscapeAnalysisTest.java index 3af913d859b..0d1f171ac36 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EscapeAnalysisTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EscapeAnalysisTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -510,4 +510,135 @@ public class EscapeAnalysisTest extends EATestBase { array[0] = new Object(); return array[0] == null; } + + static final class Complex { + private final double real; + private final double imag; + + Complex(double real, double imag) { + this.real = real; + this.imag = imag; + } + + public Complex mul(Complex other) { + return new Complex(real * other.real - imag * other.imag, imag * other.real + real * other.imag); + } + + public Complex add(Complex other) { + return new Complex(real + other.real, imag + other.imag); + } + + // equals is needed for result comparison + + @Override + public boolean equals(Object obj) { + if (obj == null || getClass() != obj.getClass()) { + return false; + } + Complex other = (Complex) obj; + return this == other || Double.doubleToLongBits(imag) == Double.doubleToLongBits(other.imag) && Double.doubleToLongBits(real) == Double.doubleToLongBits(other.real); + } + + @Override + public int hashCode() { + return Double.hashCode(real) ^ Double.hashCode(imag); + } + } + + private static final Complex[][] inputValue = new Complex[100][100]; + static { + for (int i = 0; i < 100; i++) { + for (int j = 0; j < 100; j++) { + inputValue[i][j] = new Complex(i, j); + } + } + } + + public static Complex[][] testComplexMultiplySnippet1(Complex[][] input) { + int size = input.length; + Complex[][] result = new Complex[size][size]; + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + Complex s = new Complex(0, 0); + for (int k = 0; k < size; k++) { + s = s.add(input[i][k].mul(input[k][j])); + } + result[i][j] = s; + } + } + return result; + } + + @Test + public void testComplexMultiply1() { + test("testComplexMultiplySnippet1", (Object) inputValue); + + // EA test: only one allocation remains (not counting the NewMultiArray), using iterative EA + testEscapeAnalysis("testComplexMultiplySnippet1", null, true, 1); + } + + public static Complex[][] testComplexMultiplySnippet2(Complex[][] input) { + int size = input.length; + Complex[][] result = new Complex[size][size]; + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + Complex s = input[i][0].mul(input[0][j]); + for (int k = 1; k < size; k++) { + s = s.add(input[i][k].mul(input[k][j])); + } + result[i][j] = s; + } + } + return result; + } + + @Test + public void testComplexMultiply2() { + test("testComplexMultiplySnippet2", (Object) inputValue); + + // EA test: only one allocation remains (not counting the NewMultiArray), using iterative EA + testEscapeAnalysis("testComplexMultiplySnippet2", null, true, 1); + } + + public static Complex testComplexAddSnippet(Complex[][] input) { + int size = input.length; + Complex s = new Complex(0, 0); + for (int i = 0; i < size; i++) { + Complex s2 = new Complex(0, 0); + for (int j = 0; j < size; j++) { + s2 = s2.add(input[i][j]); + } + s.add(s2); + } + return s; + } + + @Test + public void testComplexAdd() { + test("testComplexAddSnippet", (Object) inputValue); + + // EA test: only one allocation remains (not counting the NewMultiArray), using iterative EA + testEscapeAnalysis("testComplexAddSnippet", null, true, 1); + } + + public static Complex[] testComplexRowSumSnippet(Complex[][] input) { + int size = input.length; + Complex[] result = new Complex[size]; + for (int i = 0; i < size; i++) { + Complex s = new Complex(0, 0); + for (int j = 0; j < size; j++) { + s = s.add(input[i][j]); + } + result[i] = s; + } + return result; + } + + @Test + public void testComplexRowSum() { + test("testComplexRowSumSnippet", (Object) inputValue); + + // EA test: only two allocations (new array and new instance) remain + testEscapeAnalysis("testComplexRowSumSnippet", null, true, 2); + } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/NestedBoxingTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/NestedBoxingTest.java index 835916cf259..705b006b67e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/NestedBoxingTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/NestedBoxingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PEAAssertionsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PEAAssertionsTest.java index df38449ddf8..2bdbfc78ecb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PEAAssertionsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PEAAssertionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PEAReadEliminationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PEAReadEliminationTest.java index 36668bdb320..7d24aaf52c4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PEAReadEliminationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PEAReadEliminationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,19 +25,17 @@ package org.graalvm.compiler.core.test.ea; import org.graalvm.compiler.core.test.GraalCompilerTest; -import org.junit.Test; - -import sun.misc.Unsafe; - import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; import org.graalvm.compiler.nodes.extended.RawLoadNode; import org.graalvm.compiler.nodes.java.LoadIndexedNode; import org.graalvm.compiler.nodes.java.StoreIndexedNode; import org.graalvm.compiler.phases.common.CanonicalizerPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase; +import org.junit.Test; + +import sun.misc.Unsafe; public class PEAReadEliminationTest extends GraalCompilerTest { @@ -182,7 +180,7 @@ public class PEAReadEliminationTest extends GraalCompilerTest { protected StructuredGraph processMethod(final String snippet) { StructuredGraph graph = parseEager(snippet, AllowAssumptions.NO); HighTierContext context = getDefaultHighTierContext(); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); new PartialEscapePhase(false, true, new CanonicalizerPhase(), null, graph.getOptions()).apply(graph, context); return graph; } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeAnalysisTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeAnalysisTest.java index 3fe24e72901..e57739cf010 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeAnalysisTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeAnalysisTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeAnalysisTreesTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeAnalysisTreesTest.java index 1a4d89c6feb..321f9a776df 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeAnalysisTreesTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeAnalysisTreesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeUnsafeStoreTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeUnsafeStoreTest.java index 389ac4060b3..12bc1168837 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeUnsafeStoreTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeUnsafeStoreTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PoorMansEATest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PoorMansEATest.java index 084c42e14d0..80e807b251d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PoorMansEATest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PoorMansEATest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,6 @@ import org.graalvm.compiler.nodes.java.NewInstanceNode; import org.graalvm.compiler.nodes.spi.LoweringTool; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.LoweringPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.phases.tiers.PhaseContext; import org.junit.Test; @@ -67,7 +66,7 @@ public class PoorMansEATest extends GraalCompilerTest { try (DebugContext.Scope s = debug.scope("PoorMansEATest", new DebugDumpScope(snippet))) { StructuredGraph graph = parseEager(snippet, AllowAssumptions.NO); HighTierContext highTierContext = getDefaultHighTierContext(); - new InliningPhase(new CanonicalizerPhase()).apply(graph, highTierContext); + createInliningPhase().apply(graph, highTierContext); PhaseContext context = new PhaseContext(getProviders()); new LoweringPhase(new CanonicalizerPhase(), LoweringTool.StandardLoweringStage.HIGH_TIER).apply(graph, context); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/TrufflePEATest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/TrufflePEATest.java index b040688aa42..b260ae54bbc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/TrufflePEATest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/TrufflePEATest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,7 +33,6 @@ import org.graalvm.compiler.nodes.extended.RawLoadNode; import org.graalvm.compiler.nodes.extended.RawStoreNode; import org.graalvm.compiler.nodes.virtual.CommitAllocationNode; import org.graalvm.compiler.phases.common.CanonicalizerPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase; import org.junit.Test; @@ -123,7 +122,7 @@ public class TrufflePEATest extends GraalCompilerTest { protected StructuredGraph processMethod(final String snippet) { StructuredGraph graph = parseEager(snippet, StructuredGraph.AllowAssumptions.NO); HighTierContext context = getDefaultHighTierContext(); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); new PartialEscapePhase(true, true, new CanonicalizerPhase(), null, graph.getOptions()).apply(graph, context); return graph; } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/UnsafeCompareAndSwapVirtualizationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/UnsafeCompareAndSwapVirtualizationTest.java index 72aa11f2df5..fb296328051 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/UnsafeCompareAndSwapVirtualizationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/UnsafeCompareAndSwapVirtualizationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/UnsafeEATest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/UnsafeEATest.java index ef13f5fb39d..fd5bdcdb37f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/UnsafeEATest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/UnsafeEATest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/inlining/InliningTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/inlining/InliningTest.java index 9f438f54388..513c89553dc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/inlining/InliningTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/inlining/InliningTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,8 @@ package org.graalvm.compiler.core.test.inlining; +import java.util.regex.Pattern; + import org.graalvm.compiler.core.common.GraalOptions; import org.graalvm.compiler.core.test.GraalCompilerTest; import org.graalvm.compiler.debug.DebugContext; @@ -41,7 +43,6 @@ import org.graalvm.compiler.phases.OptimisticOptimizations; import org.graalvm.compiler.phases.PhaseSuite; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.junit.Assert; import org.junit.Ignore; @@ -50,8 +51,6 @@ import org.junit.Test; import jdk.vm.ci.code.site.InfopointReason; import jdk.vm.ci.meta.ResolvedJavaMethod; -import java.util.regex.Pattern; - public class InliningTest extends GraalCompilerTest { @Test @@ -293,7 +292,7 @@ public class InliningTest extends GraalCompilerTest { HighTierContext context = new HighTierContext(getProviders(), graphBuilderSuite, OptimisticOptimizations.ALL); debug.dump(DebugContext.BASIC_LEVEL, graph, "Graph"); new CanonicalizerPhase().apply(graph, context); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); debug.dump(DebugContext.BASIC_LEVEL, graph, "Graph"); new CanonicalizerPhase().apply(graph, context); new DeadCodeEliminationPhase().apply(graph); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/inlining/PolymorphicInliningTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/inlining/PolymorphicInliningTest.java index 6555b79d887..feca9fe837e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/inlining/PolymorphicInliningTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/inlining/PolymorphicInliningTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,9 @@ import static org.graalvm.compiler.test.SubprocessUtil.getVMCommandLine; import static org.graalvm.compiler.test.SubprocessUtil.java; import static org.graalvm.compiler.test.SubprocessUtil.withoutDebuggerArguments; -import jdk.vm.ci.meta.ResolvedJavaMethod; +import java.io.IOException; +import java.util.List; + import org.graalvm.compiler.core.test.GraalCompilerTest; import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.debug.DebugDumpScope; @@ -44,7 +46,6 @@ import org.graalvm.compiler.phases.OptimisticOptimizations; import org.graalvm.compiler.phases.PhaseSuite; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.test.SubprocessUtil; import org.junit.Assert; @@ -52,8 +53,7 @@ import org.junit.Assume; import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import java.util.List; +import jdk.vm.ci.meta.ResolvedJavaMethod; public class PolymorphicInliningTest extends GraalCompilerTest { @@ -249,7 +249,7 @@ public class PolymorphicInliningTest extends GraalCompilerTest { HighTierContext context = new HighTierContext(getProviders(), graphBuilderSuite, OptimisticOptimizations.ALL); debug.dump(DebugContext.BASIC_LEVEL, graph, "Graph"); new CanonicalizerPhase().apply(graph, context); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); debug.dump(DebugContext.BASIC_LEVEL, graph, "Graph"); new CanonicalizerPhase().apply(graph, context); new DeadCodeEliminationPhase().apply(graph); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/GraalTutorial.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/GraalTutorial.java index 80b7779a5f6..81d268b484d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/GraalTutorial.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/GraalTutorial.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/InvokeGraal.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/InvokeGraal.java index 406a2fca046..362b5f3bd10 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/InvokeGraal.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/InvokeGraal.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/StaticAnalysis.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/StaticAnalysis.java index 0ffdeff5ed4..32e474863d7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/StaticAnalysis.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/StaticAnalysis.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/StaticAnalysisTests.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/StaticAnalysisTests.java index 02c96ab0bcd..fc133904f0e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/StaticAnalysisTests.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/tutorial/StaticAnalysisTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationPrinter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationPrinter.java index 999508ffba0..9622f07f5af 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationPrinter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationPrinter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationWrapper.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationWrapper.java index 898d8e1f75b..c0aac79f234 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationWrapper.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilationWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilerThread.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilerThread.java index b4a43acc26c..a0ed96c7f11 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilerThread.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilerThread.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilerThreadFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilerThreadFactory.java index f1941ba56e4..4d514f54684 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilerThreadFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/CompilerThreadFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/GraalCompiler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/GraalCompiler.java index b1b0600468a..81b52bb29ba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/GraalCompiler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/GraalCompiler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/GraalCompilerOptions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/GraalCompilerOptions.java index f6c86539f68..3bea40e0b98 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/GraalCompilerOptions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/GraalCompilerOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/LIRGenerationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/LIRGenerationPhase.java index ee6c227930a..2d1612f0b37 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/LIRGenerationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/LIRGenerationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/BytecodeParserTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/BytecodeParserTool.java index 11f93faa051..7f79d4faa23 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/BytecodeParserTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/BytecodeParserTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/DebugInfoBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/DebugInfoBuilder.java index a961403ef67..1ea53a2e4af 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/DebugInfoBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/DebugInfoBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/InstructionPrinter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/InstructionPrinter.java index b25e7921fac..94296a14058 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/InstructionPrinter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/InstructionPrinter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/NodeLIRBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/NodeLIRBuilder.java index 06618ab3a39..5f242953771 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/NodeLIRBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/NodeLIRBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -366,6 +366,7 @@ public abstract class NodeLIRBuilder implements NodeLIRBuilderTool, LIRGeneratio for (int i = 0; i < nodes.size(); i++) { Node node = nodes.get(i); if (node instanceof ValueNode) { + setSourcePosition(node.getNodeSourcePosition()); DebugContext debug = node.getDebug(); ValueNode valueNode = (ValueNode) node; if (trace) { @@ -468,7 +469,6 @@ public abstract class NodeLIRBuilder implements NodeLIRBuilderTool, LIRGeneratio if (node.getDebug().isLogEnabled() && node.stamp(NodeView.DEFAULT).isEmpty()) { node.getDebug().log("This node has an empty stamp, we are emitting dead code(?): %s", node); } - setSourcePosition(node.getNodeSourcePosition()); if (node instanceof LIRLowerable) { ((LIRLowerable) node).generate(this); } else { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/package-info.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/package-info.java index 4eb8b52c6d3..e987b3aa654 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/package-info.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/ComplexMatchResult.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/ComplexMatchResult.java index 5b2485dc40f..2761babebf2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/ComplexMatchResult.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/ComplexMatchResult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/ComplexMatchValue.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/ComplexMatchValue.java index 85293b5067f..3320118dce3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/ComplexMatchValue.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/ComplexMatchValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchContext.java index fd9bce6194a..ba8fc405830 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchGenerator.java index 71f33c3983b..bcb52dc2a59 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchPattern.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchPattern.java index 0ab1a8a1ca9..e80bd6e6122 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchPattern.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchPattern.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRule.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRule.java index 00dec13f4c6..7fd5d242db2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRule.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRule.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRuleRegistry.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRuleRegistry.java index d2c98ad3f39..51e71502857 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRuleRegistry.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRuleRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRules.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRules.java index 0a626b0c876..6c855a9b7bc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRules.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchRules.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchStatement.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchStatement.java index 9f228f4f499..d53bd864e86 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchStatement.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchStatement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchStatementSet.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchStatementSet.java index 87d57035661..f650b7f8b22 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchStatementSet.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchStatementSet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchableNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchableNode.java index 1d98991e93e..e5a7fd89e8a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchableNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchableNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchableNodes.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchableNodes.java index 4f350a83fb6..ec2087d4beb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchableNodes.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/match/MatchableNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/package-info.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/package-info.java index 8eba666ae74..8f78aa935f9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/package-info.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/CommunityCompilerConfiguration.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/CommunityCompilerConfiguration.java index 262f8b49b49..0161ab4b554 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/CommunityCompilerConfiguration.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/CommunityCompilerConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyCompilerConfiguration.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyCompilerConfiguration.java index 0a787620344..5481835ee28 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyCompilerConfiguration.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyCompilerConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyHighTier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyHighTier.java index 0cd6f4ef9a6..62e472e0d87 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyHighTier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyHighTier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyLowTier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyLowTier.java index 4535f54e9ef..80a50b58842 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyLowTier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyLowTier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyMidTier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyMidTier.java index 599610eff2a..944c75bcbb8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyMidTier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/EconomyMidTier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/GraphChangeMonitoringPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/GraphChangeMonitoringPhase.java index f4d60475e31..b4165e6399e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/GraphChangeMonitoringPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/GraphChangeMonitoringPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/HighTier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/HighTier.java index 36d79c3de0a..de50932e699 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/HighTier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/HighTier.java @@ -47,14 +47,15 @@ import org.graalvm.compiler.options.OptionType; import org.graalvm.compiler.options.OptionValues; import org.graalvm.compiler.phases.PhaseSuite; import org.graalvm.compiler.phases.common.CanonicalizerPhase; -import org.graalvm.compiler.phases.common.NodeCounterPhase; import org.graalvm.compiler.phases.common.ConvertDeoptimizeToGuardPhase; import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; import org.graalvm.compiler.phases.common.IncrementalCanonicalizerPhase; import org.graalvm.compiler.phases.common.IterativeConditionalEliminationPhase; import org.graalvm.compiler.phases.common.LoweringPhase; +import org.graalvm.compiler.phases.common.NodeCounterPhase; import org.graalvm.compiler.phases.common.RemoveValueProxyPhase; import org.graalvm.compiler.phases.common.inlining.InliningPhase; +import org.graalvm.compiler.phases.common.inlining.policy.GreedyInliningPolicy; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.virtual.phases.ea.EarlyReadEliminationPhase; import org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase; @@ -82,7 +83,7 @@ public class HighTier extends PhaseSuite { } if (Options.Inline.getValue(options)) { - appendPhase(new InliningPhase(canonicalizer)); + appendPhase(new InliningPhase(new GreedyInliningPolicy(null), canonicalizer)); appendPhase(new DeadCodeEliminationPhase(Optional)); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/LowTier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/LowTier.java index 1f66abb7f94..cae232c4c1c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/LowTier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/LowTier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/MidTier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/MidTier.java index dd36b266992..2c80c7fffb3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/MidTier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/MidTier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/target/Backend.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/target/Backend.java index 51fd42375eb..3b4d814dfa1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/target/Backend.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/target/Backend.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/CSVUtilTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/CSVUtilTest.java index 469716e05fd..4bb99702140 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/CSVUtilTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/CSVUtilTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/DebugContextTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/DebugContextTest.java index 56fcadd7333..989ca81b467 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/DebugContextTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/DebugContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/TimerKeyTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/TimerKeyTest.java index f1945112f5b..5398dad15db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/TimerKeyTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/TimerKeyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/VersionsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/VersionsTest.java index d1148958c49..e64f5a31ec8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/VersionsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug.test/src/org/graalvm/compiler/debug/test/VersionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/AbstractKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/AbstractKey.java index 6ea49cea7ff..cda13de1b7a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/AbstractKey.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/AbstractKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/AccumulatedKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/AccumulatedKey.java index 03fb5ae0a29..55ffd093901 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/AccumulatedKey.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/AccumulatedKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Assertions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Assertions.java index ae463399273..4cf02a296b1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Assertions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Assertions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CSVUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CSVUtil.java index aafcc6bd724..ca3021fb11c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CSVUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CSVUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CausableByCompilerAssert.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CausableByCompilerAssert.java index 95657de6045..927310be4b7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CausableByCompilerAssert.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CausableByCompilerAssert.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CloseableCounter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CloseableCounter.java index 9a25b241ec3..1fa94d9b9be 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CloseableCounter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CloseableCounter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CounterKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CounterKey.java index 6c5a6991a12..bbebd1d7d07 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CounterKey.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CounterKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CounterKeyImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CounterKeyImpl.java index c3a1bf6c858..36929cd8ebc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CounterKeyImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/CounterKeyImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugCloseable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugCloseable.java index 51c86c4bbe1..bab1dab322e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugCloseable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugCloseable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugConfig.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugConfig.java index c8241173918..dda976cb260 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugConfig.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugConfigImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugConfigImpl.java index cd95c727327..2be442bf66d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugConfigImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugConfigImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugContext.java index 1ddaa06505e..3eb1bd23ae5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugDumpHandler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugDumpHandler.java index ae50b0c3f41..225a05597ab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugDumpHandler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugDumpHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugDumpScope.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugDumpScope.java index d84903941b6..7473615443b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugDumpScope.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugDumpScope.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugFilter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugFilter.java index 7f910304ffb..f7b2502acb4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugFilter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugHandler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugHandler.java index f9be31c47e0..c34a19beb57 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugHandler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugHandlersFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugHandlersFactory.java index f0983abe3f5..b9806fdf4f4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugHandlersFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugHandlersFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugMemUseTracker.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugMemUseTracker.java index 3001c32b79d..cb4fbf9e3d1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugMemUseTracker.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugMemUseTracker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugOptions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugOptions.java index ec237a3ec20..03086e2a3bd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugOptions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugVerifyHandler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugVerifyHandler.java index 8b8ffaf090a..46e49529a80 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugVerifyHandler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DebugVerifyHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DiagnosticsOutputDirectory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DiagnosticsOutputDirectory.java index 9ac88ba8fa3..beac60e6ff3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DiagnosticsOutputDirectory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/DiagnosticsOutputDirectory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/GlobalMetrics.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/GlobalMetrics.java index 91851a7d086..17415559400 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/GlobalMetrics.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/GlobalMetrics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/GraalError.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/GraalError.java index 53c92bcb33d..2d57e75154c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/GraalError.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/GraalError.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/IgvDumpChannel.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/IgvDumpChannel.java index 7b2616d3a42..53aa66597cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/IgvDumpChannel.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/IgvDumpChannel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Indent.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Indent.java index 20b4e4fff44..ecbd79ad143 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Indent.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Indent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/JavaMethodContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/JavaMethodContext.java index 967c8c36dbe..848e1d6ce3b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/JavaMethodContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/JavaMethodContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/KeyRegistry.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/KeyRegistry.java index 698e7bf9c86..cba843523c2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/KeyRegistry.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/KeyRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/LogStream.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/LogStream.java index 60abc4537a5..b84e68999c6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/LogStream.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/LogStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MemUseTrackerKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MemUseTrackerKey.java index 1568bcbe34c..836fe6b231c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MemUseTrackerKey.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MemUseTrackerKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MemUseTrackerKeyImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MemUseTrackerKeyImpl.java index 08e75b733a0..5719c40babb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MemUseTrackerKeyImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MemUseTrackerKeyImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MethodFilter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MethodFilter.java index b85bb0ce817..2b0f452e6cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MethodFilter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MethodFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MetricKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MetricKey.java index 00b427179fa..c36ffd2f205 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MetricKey.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/MetricKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/PathUtilities.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/PathUtilities.java index d0ef6bb2525..db254152178 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/PathUtilities.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/PathUtilities.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/ScopeImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/ScopeImpl.java index f2aae5af1ae..885fdcdaf0c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/ScopeImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/ScopeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TTY.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TTY.java index a1532a1a869..cdca15ddac8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TTY.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TTY.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TTYStreamProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TTYStreamProvider.java index 626e65bc497..c4c915febbd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TTYStreamProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TTYStreamProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimeSource.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimeSource.java index 00cb059bfd0..91a0ea2f31f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimeSource.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimeSource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimerKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimerKey.java index 778cc6be446..120a3bd06bd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimerKey.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimerKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimerKeyImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimerKeyImpl.java index 5a3e3316ede..96c021d4c2d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimerKeyImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/TimerKeyImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Versions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Versions.java index 232eba06f0f..15d4279e5ba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Versions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.debug/src/org/graalvm/compiler/debug/Versions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/GraphTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/GraphTest.java index ce69b5e348d..1812c2448b5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/GraphTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/GraphTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeBitMapTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeBitMapTest.java index fe5808d89bb..e6bb92fe0ba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeBitMapTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeBitMapTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeMapTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeMapTest.java index 3e3c185ef4b..b3cd451ee7a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeMapTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeMapTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeUsagesTests.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeUsagesTests.java index 4f6301b2191..82b6edefaa3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeUsagesTests.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeUsagesTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeValidationChecksTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeValidationChecksTest.java index f3855390f64..ace766b65ad 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeValidationChecksTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/NodeValidationChecksTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TestNodeInterface.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TestNodeInterface.java index e660bcbb047..4f499b4cbe8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TestNodeInterface.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TestNodeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TypedNodeIteratorTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TypedNodeIteratorTest.java index ae6709f01be..bbea4d8286c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TypedNodeIteratorTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TypedNodeIteratorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TypedNodeIteratorTest2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TypedNodeIteratorTest2.java index bb0ad89267a..6f5519a62a9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TypedNodeIteratorTest2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/TypedNodeIteratorTest2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/graphio/GraphSnippetTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/graphio/GraphSnippetTest.java index 52db938e7e8..84f404efeae 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/graphio/GraphSnippetTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/graphio/GraphSnippetTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/graphio/NodeEncodingTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/graphio/NodeEncodingTest.java index 90ce43ad653..d73f4b4b7a5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/graphio/NodeEncodingTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/graphio/NodeEncodingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableContains.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableContains.java index 6764b985fd7..4c41b3fd97f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableContains.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableContains.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableCount.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableCount.java index e375a49750c..af410069f8d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableCount.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableCount.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableIsEmpty.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableIsEmpty.java index 4e7b255bcdb..5ae1f53bea8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableIsEmpty.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph.test/src/org/graalvm/compiler/graph/test/matchers/NodeIterableIsEmpty.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/CachedGraph.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/CachedGraph.java index a22cf4acc36..4c47272b1fb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/CachedGraph.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/CachedGraph.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Edges.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Edges.java index d33eb8ba54a..528ba40dae1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Edges.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Edges.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/GraalGraphError.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/GraalGraphError.java index 7fe6c8b1318..0e1d238fad1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/GraalGraphError.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/GraalGraphError.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Graph.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Graph.java index 3fda5c0e79e..89f9df65e58 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Graph.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Graph.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,6 @@ package org.graalvm.compiler.graph; import static org.graalvm.compiler.core.common.GraalOptions.TrackNodeInsertion; -import static org.graalvm.compiler.graph.Graph.SourcePositionTracking.Default; -import static org.graalvm.compiler.graph.Graph.SourcePositionTracking.Track; -import static org.graalvm.compiler.graph.Graph.SourcePositionTracking.UpdateOnly; import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_IGNORED; import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_IGNORED; @@ -75,13 +72,6 @@ public class Graph { DeepFreeze } - public enum SourcePositionTracking { - Default, - Ignore, - UpdateOnly, - Track - } - public final String name; /** @@ -97,7 +87,7 @@ public class Graph { /** * Records if updating of node source information is required when performing inlining. */ - protected SourcePositionTracking trackNodeSourcePosition; + protected boolean trackNodeSourcePosition; /** * The number of valid entries in {@link #nodes}. @@ -224,38 +214,26 @@ public class Graph { return new NodeSourcePositionScope(null); } - /** - * Determines if this graph might contain nodes with source information. This is mainly useful - * to short circuit logic for updating those positions after inlining since that requires - * visiting every node in the graph. - */ - public boolean updateNodeSourcePosition() { - return trackNodeSourcePosition == Track || trackNodeSourcePosition == UpdateOnly; - } - public boolean trackNodeSourcePosition() { - return trackNodeSourcePosition == Track; + return trackNodeSourcePosition; } public void setTrackNodeSourcePosition() { - if (trackNodeSourcePosition != Track) { - assert trackNodeSourcePosition == Default : trackNodeSourcePosition; - trackNodeSourcePosition = Track; + if (!trackNodeSourcePosition) { + assert getNodeCount() == 1 : "can't change the value after nodes have been added"; + trackNodeSourcePosition = true; } } - public static SourcePositionTracking trackNodeSourcePositionDefault(OptionValues options, DebugContext debug) { - if (GraalOptions.TrackNodeSourcePosition.getValue(options) || debug.isDumpEnabledForMethod()) { - return Track; - } - return Default; + public static boolean trackNodeSourcePositionDefault(OptionValues options, DebugContext debug) { + return (GraalOptions.TrackNodeSourcePosition.getValue(options) || debug.isDumpEnabledForMethod()); } /** * Creates an empty Graph with no name. */ public Graph(OptionValues options, DebugContext debug) { - this(null, options, debug); + this(null, options, debug, false); } /** @@ -276,13 +254,13 @@ public class Graph { * * @param name the name of the graph, used for debugging purposes */ - public Graph(String name, OptionValues options, DebugContext debug) { + public Graph(String name, OptionValues options, DebugContext debug, boolean trackNodeSourcePosition) { nodes = new Node[INITIAL_NODES_SIZE]; iterableNodesFirst = new ArrayList<>(NodeClass.allocatedNodeIterabledIds()); iterableNodesLast = new ArrayList<>(NodeClass.allocatedNodeIterabledIds()); this.name = name; this.options = options; - this.trackNodeSourcePosition = trackNodeSourcePositionDefault(options, debug); + this.trackNodeSourcePosition = trackNodeSourcePosition || trackNodeSourcePositionDefault(options, debug); assert debug != null; this.debug = debug; @@ -385,10 +363,7 @@ public class Graph { * accessed by multiple threads). */ protected Graph copy(String newName, Consumer> duplicationMapCallback, DebugContext debugForCopy) { - Graph copy = new Graph(newName, options, debugForCopy); - if (trackNodeSourcePosition()) { - copy.setTrackNodeSourcePosition(); - } + Graph copy = new Graph(newName, options, debugForCopy, trackNodeSourcePosition()); UnmodifiableEconomicMap duplicates = copy.addDuplicates(getNodes(), this, this.getNodeCount(), (EconomicMap) null); if (duplicationMapCallback != null) { duplicationMapCallback.accept(duplicates); @@ -555,7 +530,7 @@ public class Graph { /** * A node was removed from the graph. */ - NODE_REMOVED; + NODE_REMOVED } /** diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/GraphNodeIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/GraphNodeIterator.java index 0d13fd8213a..b52604bd5e2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/GraphNodeIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/GraphNodeIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/InputEdges.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/InputEdges.java index 3d8c82dfef0..0f08b41b3eb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/InputEdges.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/InputEdges.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/IterableNodeType.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/IterableNodeType.java index 1cf23b88a3a..a530dccc9d6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/IterableNodeType.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/IterableNodeType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Node.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Node.java index 4f4b718779b..89ab80481d6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Node.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Node.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1023,7 +1023,7 @@ public abstract class Node implements Cloneable, Formattable, NodeInterface { } newNode.graph = into; newNode.id = INITIAL_ID; - if (getNodeSourcePosition() != null && (into == null || into.updateNodeSourcePosition())) { + if (getNodeSourcePosition() != null && (into == null || into.trackNodeSourcePosition())) { newNode.setNodeSourcePosition(getNodeSourcePosition()); } if (into != null) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeBitMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeBitMap.java index 174ced47dcf..19a852d5644 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeBitMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeBitMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeClass.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeClass.java index 56fc4a7e605..190c31c2b26 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeClass.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeClass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeFlood.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeFlood.java index 47741c2283b..227824f0efc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeFlood.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeFlood.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeIdAccessor.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeIdAccessor.java index ed21885a146..4171079607d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeIdAccessor.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeIdAccessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeInputList.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeInputList.java index 1214f385188..23ce7eafded 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeInputList.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeInputList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeInterface.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeInterface.java index ef6b3e7e917..8bcc052d214 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeInterface.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeList.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeList.java index 897ed182ebc..f8644a2bc2a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeList.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeMap.java index 0a1368100b6..041b856b925 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeSourcePosition.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeSourcePosition.java index a57337ca471..ec5dc4c3f13 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeSourcePosition.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeSourcePosition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeStack.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeStack.java index 6185509aa22..ade3ed6c6dc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeStack.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeStack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeSuccessorList.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeSuccessorList.java index 0d10be93f1d..e026614857b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeSuccessorList.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeSuccessorList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUnionFind.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUnionFind.java index ae4aeef52b0..c298759abac 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUnionFind.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUnionFind.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageIterable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageIterable.java index 1fe3d006981..47bc045b7ff 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageIterable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageIterable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageIterator.java index 7af8df0d6f9..51d8806329a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageWithModCountIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageWithModCountIterator.java index d9c055ca868..57133dddbca 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageWithModCountIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeUsageWithModCountIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeWorkList.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeWorkList.java index d12d09b2d1c..beefd16a314 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeWorkList.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/NodeWorkList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Position.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Position.java index f0b275ad540..2d4854ecedd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Position.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Position.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/SuccessorEdges.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/SuccessorEdges.java index aabb6a17d7a..22d9b9ce5d8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/SuccessorEdges.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/SuccessorEdges.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/TypedGraphNodeIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/TypedGraphNodeIterator.java index 77536c9e219..8a96c548105 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/TypedGraphNodeIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/TypedGraphNodeIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/UnsafeAccess.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/UnsafeAccess.java index a697cc90488..8b0115696f3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/UnsafeAccess.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/UnsafeAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/VerificationError.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/VerificationError.java index 2b1a59dfb9d..96add36a33e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/VerificationError.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/VerificationError.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/FilteredNodeIterable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/FilteredNodeIterable.java index 5defc3d63ec..a4bf9ed40df 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/FilteredNodeIterable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/FilteredNodeIterable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodeIterable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodeIterable.java index e99958d57ec..57ab7e43280 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodeIterable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodeIterable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodeIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodeIterator.java index 4f5bb92346a..f128c55fc13 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodeIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodeIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodePredicate.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodePredicate.java index 5bd3e81c435..02243329e45 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodePredicate.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodePredicate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodePredicates.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodePredicates.java index 75ad3c855a6..95e9d6104e8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodePredicates.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/NodePredicates.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/PredicatedProxyNodeIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/PredicatedProxyNodeIterator.java index caa812f0d02..afe47daa3de 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/PredicatedProxyNodeIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/iterators/PredicatedProxyNodeIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/package-info.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/package-info.java index 28438341b27..676308284fe 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/package-info.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/Canonicalizable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/Canonicalizable.java index 6589dcbfb8d..acb9db52a5e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/Canonicalizable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/Canonicalizable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/CanonicalizerTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/CanonicalizerTool.java index a260bafe08d..db390f142af 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/CanonicalizerTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/CanonicalizerTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/Simplifiable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/Simplifiable.java index b11634b3e5e..b7d6dc7edc6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/Simplifiable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/Simplifiable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/SimplifierTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/SimplifierTool.java index 196f0e75f72..cc87de4a184 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/SimplifierTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/spi/SimplifierTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotBackend.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotBackend.java index cbeca203a75..5ae51b83338 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotBackend.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotBackend.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotBackendFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotBackendFactory.java index 94f37af9e54..4b95c284b01 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotBackendFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotBackendFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotCRuntimeCallEpilogueOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotCRuntimeCallEpilogueOp.java index 98eb7ba70d3..0a29ce44194 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotCRuntimeCallEpilogueOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotCRuntimeCallEpilogueOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotCRuntimeCallPrologueOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotCRuntimeCallPrologueOp.java index 3c0fb283885..df6a0aeb0f1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotCRuntimeCallPrologueOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotCRuntimeCallPrologueOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotConstantRetrievalOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotConstantRetrievalOp.java index 98a3141d632..2d2aec77f4c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotConstantRetrievalOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotConstantRetrievalOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDeoptimizeCallerOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDeoptimizeCallerOp.java index 9a1167035a5..bb0f9302ed8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDeoptimizeCallerOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDeoptimizeCallerOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDeoptimizeOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDeoptimizeOp.java index be42bd86e5b..c754fc3460b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDeoptimizeOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDeoptimizeOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDirectStaticCallOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDirectStaticCallOp.java index 5531116994f..5daf4a32dbc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDirectStaticCallOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDirectStaticCallOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDirectVirtualCallOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDirectVirtualCallOp.java index 5afcd658398..2f3c6d95f90 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDirectVirtualCallOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotDirectVirtualCallOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotEpilogueOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotEpilogueOp.java index 4da491cc6e6..5a9f913b906 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotEpilogueOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotEpilogueOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotForeignCallsProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotForeignCallsProvider.java index 39a1a12489c..bd00cb3678c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotForeignCallsProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotForeignCallsProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotJumpToExceptionHandlerInCallerOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotJumpToExceptionHandlerInCallerOp.java index fff12f3f871..118cdcaa1bd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotJumpToExceptionHandlerInCallerOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotJumpToExceptionHandlerInCallerOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLIRGenerator.java index 4883e772369..457d3e3c63f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLIRGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoadAddressOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoadAddressOp.java index d8ed301b23c..37562c43a74 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoadAddressOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoadAddressOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoadConfigValueOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoadConfigValueOp.java index f7b06390c2b..b2ff3c5f927 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoadConfigValueOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoadConfigValueOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoweringProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoweringProvider.java index c5af6fa7ab1..59ac3e5574c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoweringProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotLoweringProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotMoveFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotMoveFactory.java index 07a2ef7da98..97508debfb0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotMoveFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotMoveFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotNodeLIRBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotNodeLIRBuilder.java index 04c926ca800..9aab14666af 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotNodeLIRBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotNodeLIRBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotPatchReturnAddressOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotPatchReturnAddressOp.java index 81e5f7b6f40..f992e2504ce 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotPatchReturnAddressOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotPatchReturnAddressOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotRegisterAllocationConfig.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotRegisterAllocationConfig.java index b8fdc795893..62b80ddf8df 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotRegisterAllocationConfig.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotRegisterAllocationConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotReturnOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotReturnOp.java index 18530a3c712..e06759563b3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotReturnOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotReturnOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotSafepointOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotSafepointOp.java index da27fa97abb..fadf20eead8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotSafepointOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotSafepointOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotStrategySwitchOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotStrategySwitchOp.java index 052e317e2ab..d092e76e4b1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotStrategySwitchOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotStrategySwitchOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotUnwindOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotUnwindOp.java index b2f885bdee7..33421478045 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotUnwindOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotUnwindOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64IndirectCallOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64IndirectCallOp.java index ac6938a11b6..7429e5c6512 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64IndirectCallOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64IndirectCallOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/AMD64HotSpotFrameOmissionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/AMD64HotSpotFrameOmissionTest.java index 88b3b2fd9c0..f0092e4ea79 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/AMD64HotSpotFrameOmissionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/AMD64HotSpotFrameOmissionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/CompressedNullCheckTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/CompressedNullCheckTest.java index bd2912f5f10..c51eae93b63 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/CompressedNullCheckTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/CompressedNullCheckTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/DataPatchInConstantsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/DataPatchInConstantsTest.java index f85338e2797..5c0ece01f1d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/DataPatchInConstantsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/DataPatchInConstantsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/StubAVXTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/StubAVXTest.java index 09a73056500..8719fdce2d8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/StubAVXTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64.test/src/org/graalvm/compiler/hotspot/amd64/test/StubAVXTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64ArrayIndexOfStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64ArrayIndexOfStub.java index 7f9efa76c9d..b2b0502c68d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64ArrayIndexOfStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64ArrayIndexOfStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64DeoptimizeOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64DeoptimizeOp.java index de979d3d6ea..b371ac890e3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64DeoptimizeOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64DeoptimizeOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotAddressLowering.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotAddressLowering.java index bc381162d3c..191f3a89d63 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotAddressLowering.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotAddressLowering.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java index 7a2dc7927a1..8cbb43b7a10 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackend.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackendFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackendFactory.java index 781ee1b1d3d..4da2174ab08 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackendFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackendFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCRuntimeCallEpilogueOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCRuntimeCallEpilogueOp.java index 0bf32549560..b12552a58cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCRuntimeCallEpilogueOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCRuntimeCallEpilogueOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCRuntimeCallPrologueOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCRuntimeCallPrologueOp.java index a7ccc3d8ee4..581e390412c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCRuntimeCallPrologueOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCRuntimeCallPrologueOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotConstantRetrievalOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotConstantRetrievalOp.java index 1cd8606d749..e9a53552ad5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotConstantRetrievalOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotConstantRetrievalOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCounterOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCounterOp.java index 4dc758b55c3..1a63f7b18cf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCounterOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotCounterOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java index 650e4c544b5..76885c36dee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotDirectStaticCallOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotDirectStaticCallOp.java index 3b2b1d03527..a9c8db1fb4c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotDirectStaticCallOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotDirectStaticCallOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotEpilogueBlockEndOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotEpilogueBlockEndOp.java index 5ae422879bc..a65310fe13b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotEpilogueBlockEndOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotEpilogueBlockEndOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotEpilogueOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotEpilogueOp.java index 0e7674355b6..4dfbce03123 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotEpilogueOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotEpilogueOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotForeignCallsProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotForeignCallsProvider.java index c9e51ed5b3d..58af7334c36 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotForeignCallsProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotForeignCallsProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotJumpToExceptionHandlerInCallerOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotJumpToExceptionHandlerInCallerOp.java index 5ff167ac6fd..ae9c4b11c43 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotJumpToExceptionHandlerInCallerOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotJumpToExceptionHandlerInCallerOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java index 15854797db5..b70c04f92a7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRKindTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRKindTool.java index b90dd29f4c1..80b1e734b29 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRKindTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRKindTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLeaveCurrentStackFrameOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLeaveCurrentStackFrameOp.java index f7d3d5ba377..ea537509310 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLeaveCurrentStackFrameOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLeaveCurrentStackFrameOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLeaveDeoptimizedStackFrameOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLeaveDeoptimizedStackFrameOp.java index 3f9e05db7e8..46e9f8f8014 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLeaveDeoptimizedStackFrameOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLeaveDeoptimizedStackFrameOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoadAddressOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoadAddressOp.java index 40bdd241937..2742a821d80 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoadAddressOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoadAddressOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoadConfigValueOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoadConfigValueOp.java index 44d72cb8eb1..0bf0abfd910 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoadConfigValueOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoadConfigValueOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoweringProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoweringProvider.java index a10add3f4ad..d051468a598 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoweringProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLoweringProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMathIntrinsicOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMathIntrinsicOp.java index bf171c55f39..0eecec07164 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMathIntrinsicOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMathIntrinsicOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMaths.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMaths.java index 922f58edde1..cde8e3b1cbf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMaths.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMaths.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMove.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMove.java index ca7237fc389..0a8eb54740a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMove.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMove.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMoveFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMoveFactory.java index d10e75b52ca..5775667cbf0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMoveFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotMoveFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java index a5104209ba4..979b32c2a7e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotPatchReturnAddressOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotPatchReturnAddressOp.java index 314ffc54d68..bbb86851eb4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotPatchReturnAddressOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotPatchReturnAddressOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotPushInterpreterFrameOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotPushInterpreterFrameOp.java index f6a0558002e..327e4fc3352 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotPushInterpreterFrameOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotPushInterpreterFrameOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotRegisterAllocationConfig.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotRegisterAllocationConfig.java index dbf5a856705..d541cf8e9c9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotRegisterAllocationConfig.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotRegisterAllocationConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotRestoreRbpOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotRestoreRbpOp.java index 09597720afe..80d8c8fd046 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotRestoreRbpOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotRestoreRbpOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotSafepointOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotSafepointOp.java index db49b6dcb2c..84ec50d6235 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotSafepointOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotSafepointOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotStrategySwitchOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotStrategySwitchOp.java index 4a549030684..ba85fd466ff 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotStrategySwitchOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotStrategySwitchOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotSuitesCreator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotSuitesCreator.java index 0ca7c1b1df2..f04e661b3c0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotSuitesCreator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotSuitesCreator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotUnwindOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotUnwindOp.java index f857962df33..19bc6a84450 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotUnwindOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotUnwindOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotspotDirectVirtualCallOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotspotDirectVirtualCallOp.java index b350746f772..ebe2420cb87 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotspotDirectVirtualCallOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotspotDirectVirtualCallOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64IndirectCallOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64IndirectCallOp.java index 4732200fc99..a24aecfb184 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64IndirectCallOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64IndirectCallOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64MathStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64MathStub.java index c370590ff22..dc99d9e465b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64MathStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64MathStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64TailcallOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64TailcallOp.java index e154d9e0208..514a599db90 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64TailcallOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64TailcallOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.lir.test/src/org/graalvm/compiler/hotspot/lir/test/BenchmarkCounterOverflowTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.lir.test/src/org/graalvm/compiler/hotspot/lir/test/BenchmarkCounterOverflowTest.java index 4245e17fd38..8cfc7ed4ffd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.lir.test/src/org/graalvm/compiler/hotspot/lir/test/BenchmarkCounterOverflowTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.lir.test/src/org/graalvm/compiler/hotspot/lir/test/BenchmarkCounterOverflowTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.lir.test/src/org/graalvm/compiler/hotspot/lir/test/ExceedMaxOopMapStackOffset.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.lir.test/src/org/graalvm/compiler/hotspot/lir/test/ExceedMaxOopMapStackOffset.java index c1ec6f5ee4d..c48300f4ede 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.lir.test/src/org/graalvm/compiler/hotspot/lir/test/ExceedMaxOopMapStackOffset.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.lir.test/src/org/graalvm/compiler/hotspot/lir/test/ExceedMaxOopMapStackOffset.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc.test/src/org/graalvm/compiler/hotspot/sparc/test/SPARCAllocatorTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc.test/src/org/graalvm/compiler/hotspot/sparc/test/SPARCAllocatorTest.java index 8f8f49228d2..501b257deb8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc.test/src/org/graalvm/compiler/hotspot/sparc/test/SPARCAllocatorTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc.test/src/org/graalvm/compiler/hotspot/sparc/test/SPARCAllocatorTest.java @@ -25,7 +25,6 @@ package org.graalvm.compiler.hotspot.sparc.test; import static org.graalvm.compiler.core.common.GraalOptions.RegisterPressure; -import static org.graalvm.compiler.core.common.GraalOptions.TraceRA; import static org.junit.Assume.assumeTrue; import org.graalvm.compiler.core.test.backend.AllocatorTest; @@ -44,7 +43,6 @@ public class SPARCAllocatorTest extends AllocatorTest { public void checkSPARC() { assumeTrue("skipping SPARC specific test", getTarget().arch instanceof SPARC); assumeTrue("RegisterPressure is set -> skip", RegisterPressure.getValue(getInitialOptions()) == null); - assumeTrue("TraceRA is set -> skip", !TraceRA.getValue(getInitialOptions())); } @Test diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCDeoptimizeOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCDeoptimizeOp.java index 8bcc518fcd0..a5568409371 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCDeoptimizeOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCDeoptimizeOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotBackend.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotBackend.java index 7c6e2be64c6..7ba9e4328de 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotBackend.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotBackend.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotBackendFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotBackendFactory.java index 153dc82420d..e0182b9acb9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotBackendFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotBackendFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCRuntimeCallEpilogueOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCRuntimeCallEpilogueOp.java index 554797e40d7..09d2ba12e43 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCRuntimeCallEpilogueOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCRuntimeCallEpilogueOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCRuntimeCallPrologueOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCRuntimeCallPrologueOp.java index 99958afc1cc..deaf83af07c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCRuntimeCallPrologueOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCRuntimeCallPrologueOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCounterOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCounterOp.java index 9c6baae6ee8..da20d297bb2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCounterOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotCounterOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotDeoptimizeCallerOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotDeoptimizeCallerOp.java index a6e6c062c6a..bbb5f0c3a3f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotDeoptimizeCallerOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotDeoptimizeCallerOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotEpilogueOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotEpilogueOp.java index f9f161db6b0..355c70d6159 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotEpilogueOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotEpilogueOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotForeignCallsProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotForeignCallsProvider.java index 1bf6d160d6e..ff3a1b81e0f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotForeignCallsProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotForeignCallsProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerInCallerOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerInCallerOp.java index a99f880d77d..1fc3da8f4fc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerInCallerOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerInCallerOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerOp.java index e22b0c43949..3b0b5e957d4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLIRGenerator.java index 5b7104bf93b..bf58b590f26 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLIRGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLeaveCurrentStackFrameOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLeaveCurrentStackFrameOp.java index 7569b8ab6cb..3925c236df4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLeaveCurrentStackFrameOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLeaveCurrentStackFrameOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLeaveDeoptimizedStackFrameOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLeaveDeoptimizedStackFrameOp.java index 65d7b25364c..124ecdff3fb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLeaveDeoptimizedStackFrameOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLeaveDeoptimizedStackFrameOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLoweringProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLoweringProvider.java index 221c342e863..44b39c5cf21 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLoweringProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotLoweringProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotMove.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotMove.java index 91199b63779..8a712d92d36 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotMove.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotMove.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotMoveFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotMoveFactory.java index 92ea814b4e2..ae2079f108e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotMoveFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotMoveFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java index 66b6592b4a4..08f7fffdd16 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotPatchReturnAddressOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotPatchReturnAddressOp.java index ca247440417..49c7aa80828 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotPatchReturnAddressOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotPatchReturnAddressOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotPushInterpreterFrameOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotPushInterpreterFrameOp.java index cf266e0eb13..dca968b72cd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotPushInterpreterFrameOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotPushInterpreterFrameOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotRegisterAllocationConfig.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotRegisterAllocationConfig.java index 5a30984c4b2..4621e4b7830 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotRegisterAllocationConfig.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotRegisterAllocationConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotReturnOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotReturnOp.java index ce005b21378..93bd0b66b15 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotReturnOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotReturnOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotSafepointOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotSafepointOp.java index 3fbc2c7385c..bb91bbfde69 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotSafepointOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotSafepointOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotStrategySwitchOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotStrategySwitchOp.java index 7837a249372..2c3fa87ec5e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotStrategySwitchOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotStrategySwitchOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotUnwindOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotUnwindOp.java index 616941dc38a..54fbe4dd6b2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotUnwindOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotUnwindOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotspotDirectStaticCallOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotspotDirectStaticCallOp.java index a2c57279ff4..826b6e63271 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotspotDirectStaticCallOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotspotDirectStaticCallOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotspotDirectVirtualCallOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotspotDirectVirtualCallOp.java index 1ca425e1c82..4501ce2053f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotspotDirectVirtualCallOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotspotDirectVirtualCallOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCIndirectCallOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCIndirectCallOp.java index 01c1d7f4c84..2ef7eaaaf69 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCIndirectCallOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCIndirectCallOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/AheadOfTimeCompilationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/AheadOfTimeCompilationTest.java index 75df93f09e0..aae87df1b3a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/AheadOfTimeCompilationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/AheadOfTimeCompilationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ArrayCopyIntrinsificationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ArrayCopyIntrinsificationTest.java index d1c5df35b86..2fb73674e18 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ArrayCopyIntrinsificationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ArrayCopyIntrinsificationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,7 +30,7 @@ import java.util.HashMap; import org.graalvm.compiler.core.test.GraalCompilerTest; import org.graalvm.compiler.graph.Node; -import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopySnippets; +import org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets; import org.graalvm.compiler.nodes.DirectCallTargetNode; import org.graalvm.compiler.nodes.Invoke; import org.graalvm.compiler.nodes.LoweredCallTargetNode; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ArrayNewInstanceTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ArrayNewInstanceTest.java index 44d99fda771..ea195b8ac13 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ArrayNewInstanceTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ArrayNewInstanceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CRC32CSubstitutionsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CRC32CSubstitutionsTest.java index 554439ee231..814b51c1035 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CRC32CSubstitutionsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CRC32CSubstitutionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CRC32SubstitutionsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CRC32SubstitutionsTest.java index 442ad98f4ed..5aae18e6c88 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CRC32SubstitutionsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CRC32SubstitutionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CheckGraalIntrinsics.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CheckGraalIntrinsics.java index 84ce715e1b2..de305ef838a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CheckGraalIntrinsics.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CheckGraalIntrinsics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -279,8 +279,6 @@ public class CheckGraalIntrinsics extends GraalTest { "java/lang/Math.fma(DDD)D", // HotSpot MacroAssembler-based intrinsic "java/lang/Math.fma(FFF)F", - // Emit pause instruction if os::is_MP() - "java/lang/Thread.onSpinWait()V", // Just check if the argument is a compile time constant "java/lang/invoke/MethodHandleImpl.isCompileConstant(Ljava/lang/Object;)Z", // Some logic and a runtime call @@ -412,6 +410,7 @@ public class CheckGraalIntrinsics extends GraalTest { "java/lang/StringLatin1.compareToUTF16([B[B)I", "java/lang/StringUTF16.compareTo([B[B)I", "java/lang/StringUTF16.compareToLatin1([B[B)I", + "java/lang/Thread.onSpinWait()V", "jdk/internal/misc/Unsafe.getAndAddInt(Ljava/lang/Object;JI)I", "jdk/internal/misc/Unsafe.getAndAddLong(Ljava/lang/Object;JJ)J", "jdk/internal/misc/Unsafe.getAndSetInt(Ljava/lang/Object;JI)I", diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ClassSubstitutionsTests.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ClassSubstitutionsTests.java index 590ce63a02f..dabdb977aa1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ClassSubstitutionsTests.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ClassSubstitutionsTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompilationWrapperTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompilationWrapperTest.java index 2fc5694f4ee..c4429d260b5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompilationWrapperTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompilationWrapperTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompileTheWorld.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompileTheWorld.java index 669e5084fcb..9f42f9ed6d8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompileTheWorld.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompileTheWorld.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompileTheWorldTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompileTheWorldTest.java index f74f25087ac..613dc98f34a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompileTheWorldTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompileTheWorldTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompressedOopTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompressedOopTest.java index 63ceff738ef..adf7528f0d4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompressedOopTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompressedOopTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ConstantPoolSubstitutionsTests.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ConstantPoolSubstitutionsTests.java index c76070763e8..e3b53766085 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ConstantPoolSubstitutionsTests.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ConstantPoolSubstitutionsTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/DataPatchTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/DataPatchTest.java index 5db46fee610..c599968b87a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/DataPatchTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/DataPatchTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/EliminateRedundantInitializationPhaseTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/EliminateRedundantInitializationPhaseTest.java deleted file mode 100644 index c1b683e9d20..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/EliminateRedundantInitializationPhaseTest.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.hotspot.test; - -import org.graalvm.compiler.core.test.GraalCompilerTest; -import org.graalvm.compiler.hotspot.meta.HotSpotClassInitializationPlugin; -import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode; -import org.graalvm.compiler.hotspot.phases.aot.EliminateRedundantInitializationPhase; -import org.graalvm.compiler.nodes.StructuredGraph; -import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; -import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins; -import org.graalvm.compiler.phases.tiers.HighTierContext; -import org.junit.Assert; -import org.junit.Test; - -public class EliminateRedundantInitializationPhaseTest extends GraalCompilerTest { - @Override - protected Plugins getDefaultGraphBuilderPlugins() { - Plugins plugins = super.getDefaultGraphBuilderPlugins(); - plugins.setClassInitializationPlugin(new HotSpotClassInitializationPlugin()); - return plugins; - } - - public static class X { - public static int x; - public static int y; - public static int z; - } - - public static class Y extends X { - public static int a; - public static int b; - } - - public static void assignFields() { - X.x = 1; - X.y = 2; - X.z = 3; - } - - public static void assignFieldsConditionally(boolean choice) { - X.x = 1; - if (choice) { - X.y = 2; - } else { - X.z = 3; - } - } - - public static void assignFieldsSubclassDominates() { - Y.a = 1; - X.x = 2; - X.y = 3; - X.z = 4; - } - - public static void assignFieldsConditionallySubclassDominates(boolean choice) { - Y.a = 1; - if (choice) { - X.x = 2; - } else { - X.y = 3; - } - Y.z = 4; - } - - public static void assignFieldsSubclassPostdominates() { - X.x = 1; - Y.a = 2; - } - - public static void assignFieldsConditionallySubclassPostdominates(boolean choice) { - X.x = 1; - if (choice) { - X.y = 2; - } else { - X.z = 3; - } - Y.a = 4; - } - - public static void assignFieldsConditionallyMixed(boolean choice) { - X.x = 1; - if (choice) { - Y.a = 2; - } else { - X.z = 3; - } - Y.b = 4; - } - - public static void assignFieldsInLoop() { - X.x = 1; - for (int i = 0; i < 10; i++) { - X.y += X.z; - } - } - - public static void assignFieldsInBranches(boolean choice) { - if (choice) { - X.x = 1; - } else { - X.y = 2; - } - X.z = 3; - } - - public static void assignFieldsInBranchesMixed(boolean choice) { - if (choice) { - X.x = 1; - } else { - Y.a = 2; - } - X.z = 3; - } - - private void test(String name, int initNodesAfterParse, int initNodesAfterOpt) { - StructuredGraph graph = parseEager(name, AllowAssumptions.NO); - Assert.assertEquals(initNodesAfterParse, graph.getNodes().filter(InitializeKlassNode.class).count()); - HighTierContext highTierContext = getDefaultHighTierContext(); - new EliminateRedundantInitializationPhase().apply(graph, highTierContext); - Assert.assertEquals(initNodesAfterOpt, graph.getNodes().filter(InitializeKlassNode.class).count()); - } - - @Test - public void test1() { - test("assignFields", 3, 1); - } - - @Test - public void test2() { - test("assignFieldsConditionally", 3, 1); - } - - @Test - public void test3() { - test("assignFieldsSubclassDominates", 4, 1); - } - - @Test - public void test4() { - test("assignFieldsConditionallySubclassDominates", 4, 1); - } - - @Test - public void test5() { - test("assignFieldsSubclassPostdominates", 2, 2); - } - - @Test - public void test6() { - test("assignFieldsConditionallySubclassPostdominates", 4, 2); - } - - @Test - public void test7() { - test("assignFieldsConditionallyMixed", 4, 3); - } - - @Test - public void test8() { - test("assignFieldsInLoop", 4, 1); - } - - @Test - public void test9() { - test("assignFieldsInBranches", 3, 2); - } - - @Test - public void test10() { - test("assignFieldsInBranchesMixed", 3, 2); - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ExplicitExceptionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ExplicitExceptionTest.java index b371a795ed4..3e82e9f4ead 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ExplicitExceptionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ExplicitExceptionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ForeignCallDeoptimizeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ForeignCallDeoptimizeTest.java index d638b510ed8..c914125cc50 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ForeignCallDeoptimizeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ForeignCallDeoptimizeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRLockTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRLockTest.java index de637d85d52..7d5dc0c7bfc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRLockTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRLockTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRTest.java index e7cf2cfec1c..5f164c02505 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRTestBase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRTestBase.java index d06a6cf19e0..e64e602fbc9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRTestBase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/GraalOSRTestBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotCryptoSubstitutionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotCryptoSubstitutionTest.java index eaefb59ab89..dc041f68635 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotCryptoSubstitutionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotCryptoSubstitutionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotGraalCompilerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotGraalCompilerTest.java index a7caf696a8f..06c6bef6db8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotGraalCompilerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotGraalCompilerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,8 +33,13 @@ import org.graalvm.compiler.hotspot.meta.HotSpotProviders; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.options.OptionValues; import org.graalvm.compiler.runtime.RuntimeProvider; +import org.junit.Assume; +import org.junit.AssumptionViolatedException; import jdk.vm.ci.code.InstalledCode; +import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime; +import jdk.vm.ci.hotspot.HotSpotVMConfigAccess; +import jdk.vm.ci.hotspot.HotSpotVMConfigStore; import jdk.vm.ci.meta.ResolvedJavaMethod; /** @@ -49,6 +54,19 @@ public abstract class HotSpotGraalCompilerTest extends GraalCompilerTest { return ((HotSpotBackend) getBackend()).getRuntime(); } + /** + * Checks that the {@code UseJVMCICompiler} flag is false. + * + * @param message describes the reason the test should be ignored when Graal is the JIT + * @throws AssumptionViolatedException if {@code UseJVMCICompiler == true} + */ + public static void assumeGraalIsNotJIT(String message) { + HotSpotVMConfigStore configStore = HotSpotJVMCIRuntime.runtime().getConfigStore(); + HotSpotVMConfigAccess access = new HotSpotVMConfigAccess(configStore); + boolean useJVMCICompiler = access.getFlag("UseJVMCICompiler", Boolean.class); + Assume.assumeFalse(message, useJVMCICompiler); + } + protected InstalledCode compileAndInstallSubstitution(Class c, String methodName) { ResolvedJavaMethod method = getMetaAccess().lookupJavaMethod(getMethod(c, methodName)); HotSpotGraalRuntimeProvider rt = (HotSpotGraalRuntimeProvider) Graal.getRequiredCapability(RuntimeProvider.class); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotGraalManagementTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotGraalManagementTest.java index 2b292f80399..a2cb7f477eb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotGraalManagementTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotGraalManagementTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ package org.graalvm.compiler.hotspot.test; +import static org.graalvm.compiler.hotspot.test.HotSpotGraalCompilerTest.assumeGraalIsNotJIT; import static org.graalvm.compiler.hotspot.test.HotSpotGraalManagementTest.JunitShield.findAttributeInfo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -72,6 +73,7 @@ public class HotSpotGraalManagementTest { private static final boolean DEBUG = Boolean.getBoolean(HotSpotGraalManagementTest.class.getSimpleName() + ".debug"); public HotSpotGraalManagementTest() { + assumeGraalIsNotJIT("random flipping of Graal options can cause havoc if Graal is being used as a JIT"); try { /* Trigger loading of the management library using the bootstrap class loader. */ ManagementFactory.getThreadMXBean(); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotInvokeDynamicPluginTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotInvokeDynamicPluginTest.java index 2493b5fc7bd..9d43158251c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotInvokeDynamicPluginTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotInvokeDynamicPluginTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotMethodSubstitutionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotMethodSubstitutionTest.java index 7633c60d9a2..83dded7c2e2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotMethodSubstitutionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotMethodSubstitutionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotMonitorValueTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotMonitorValueTest.java index 20215144deb..66d84366009 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotMonitorValueTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotMonitorValueTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotNmethodTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotNmethodTest.java index 53e236b9d1b..8b7c16a436b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotNmethodTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotNmethodTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotNodeSubstitutionsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotNodeSubstitutionsTest.java index 4f09e7f1c7f..2940da2f254 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotNodeSubstitutionsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotNodeSubstitutionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotResolvedJavaFieldTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotResolvedJavaFieldTest.java index 1859f92fb30..6e92711ca13 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotResolvedJavaFieldTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotResolvedJavaFieldTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotResolvedObjectTypeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotResolvedObjectTypeTest.java index e214ecf70c5..ac4e7ed98db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotResolvedObjectTypeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotResolvedObjectTypeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotStampMemoryAccessTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotStampMemoryAccessTest.java index 5fdc0becac0..dde437b4478 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotStampMemoryAccessTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotStampMemoryAccessTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotUnsafeSubstitutionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotUnsafeSubstitutionTest.java index aaf18adcced..71b64300ecf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotUnsafeSubstitutionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HotSpotUnsafeSubstitutionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HsErrLogTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HsErrLogTest.java index b6095c49ed3..af353d66cac 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HsErrLogTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/HsErrLogTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/InstalledCodeExecuteHelperTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/InstalledCodeExecuteHelperTest.java index f0e830ff401..d623a2966c8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/InstalledCodeExecuteHelperTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/InstalledCodeExecuteHelperTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/JVMCIInfopointErrorTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/JVMCIInfopointErrorTest.java index 99592e91a9a..dee9f2ddaea 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/JVMCIInfopointErrorTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/JVMCIInfopointErrorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/LoadJavaMirrorWithKlassTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/LoadJavaMirrorWithKlassTest.java index d7e6934ebac..9c828cd6fe6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/LoadJavaMirrorWithKlassTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/LoadJavaMirrorWithKlassTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/MemoryUsageBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/MemoryUsageBenchmark.java index 1579ab9b7f6..23dc5b24cb7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/MemoryUsageBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/MemoryUsageBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ObjectCloneTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ObjectCloneTest.java index 40b98ed4d50..3fd47161665 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ObjectCloneTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ObjectCloneTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/OptionsInFileTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/OptionsInFileTest.java index 503cce0f15a..1e239520cae 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/OptionsInFileTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/OptionsInFileTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ReplaceConstantNodesPhaseTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ReplaceConstantNodesPhaseTest.java index 51f7de8691e..2575a29df7d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ReplaceConstantNodesPhaseTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ReplaceConstantNodesPhaseTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/TestIntrinsicCompiles.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/TestIntrinsicCompiles.java index 8c7d39d5f74..f0bedeba5d9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/TestIntrinsicCompiles.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/TestIntrinsicCompiles.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/TestSHASubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/TestSHASubstitutions.java index 645e1c69cea..18a6ef465a5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/TestSHASubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/TestSHASubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/WriteBarrierAdditionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/WriteBarrierAdditionTest.java index c546821bdfb..b4ebd81650f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/WriteBarrierAdditionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/WriteBarrierAdditionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/WriteBarrierVerificationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/WriteBarrierVerificationTest.java index c98889a47ec..9069c9b5f4e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/WriteBarrierVerificationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/WriteBarrierVerificationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,6 @@ import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.GuardLoweringPhase; import org.graalvm.compiler.phases.common.LoopSafepointInsertionPhase; import org.graalvm.compiler.phases.common.LoweringPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.graph.ReentrantNodeIterator; import org.graalvm.compiler.phases.graph.ReentrantNodeIterator.NodeIteratorClosure; import org.graalvm.compiler.phases.tiers.HighTierContext; @@ -645,7 +644,7 @@ public class WriteBarrierVerificationTest extends HotSpotGraalCompilerTest { try (DebugCloseable d = debug.disableIntercept(); DebugContext.Scope s = debug.scope("WriteBarrierVerificationTest", new DebugDumpScope(snippet))) { final StructuredGraph graph = parseEager(snippet, AllowAssumptions.YES, debug); HighTierContext highTierContext = getDefaultHighTierContext(); - new InliningPhase(new CanonicalizerPhase()).apply(graph, highTierContext); + createInliningPhase().apply(graph, highTierContext); MidTierContext midTierContext = new MidTierContext(getProviders(), getTargetProvider(), OptimisticOptimizations.ALL, graph.getProfilingInfo()); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/AOTGraalHotSpotVMConfig.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/AOTGraalHotSpotVMConfig.java index ed2f4a2d787..694357a3db0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/AOTGraalHotSpotVMConfig.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/AOTGraalHotSpotVMConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/BootstrapWatchDog.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/BootstrapWatchDog.java index ab89175844a..877997fa47b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/BootstrapWatchDog.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/BootstrapWatchDog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CommunityCompilerConfigurationFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CommunityCompilerConfigurationFactory.java index b5c0fd2162d..781040bf288 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CommunityCompilerConfigurationFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CommunityCompilerConfigurationFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationCounters.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationCounters.java index d6cb8da9de9..1df1388909e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationCounters.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationCounters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationStatistics.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationStatistics.java index de931a85e10..9040bdecf1d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationStatistics.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationStatistics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationTask.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationTask.java index 955466b6eab..0f11edc7f9e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationTask.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationTask.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationWatchDog.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationWatchDog.java index b7f7e38e4ab..cc3dfd2f901 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationWatchDog.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilationWatchDog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilerConfigurationFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilerConfigurationFactory.java index 644e1c775d7..94e448713b7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilerConfigurationFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilerConfigurationFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,7 +67,7 @@ public abstract class CompilerConfigurationFactory implements Comparable CompilerConfiguration = new OptionKey<>(null); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilerRuntimeHotSpotVMConfig.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilerRuntimeHotSpotVMConfig.java index 9b931288282..7b099a27ac5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilerRuntimeHotSpotVMConfig.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/CompilerRuntimeHotSpotVMConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/EconomyCompilerConfigurationFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/EconomyCompilerConfigurationFactory.java index 86f70d9ae47..3c4305a9f1f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/EconomyCompilerConfigurationFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/EconomyCompilerConfigurationFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java index f4c445a48c9..562da1fa46b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,8 @@ package org.graalvm.compiler.hotspot; +import static org.graalvm.compiler.replacements.arraycopy.ArrayCopyForeignCalls.UNSAFE_ARRAYCOPY; + import java.util.EnumSet; import jdk.internal.vm.compiler.collections.EconomicMap; @@ -259,17 +261,10 @@ public abstract class HotSpotBackend extends Backend implements FrameMap.Referen @NodeIntrinsic(ForeignCallNode.class) private static native void sha5ImplCompressStub(@ConstantNodeParameter ForeignCallDescriptor descriptor, Word bufAddr, Object state); - /** - * @see org.graalvm.compiler.hotspot.meta.HotSpotUnsafeSubstitutions#copyMemory - */ - public static final ForeignCallDescriptor UNSAFE_ARRAYCOPY = new ForeignCallDescriptor("unsafe_arraycopy", void.class, Word.class, Word.class, Word.class); - public static void unsafeArraycopy(Word srcAddr, Word dstAddr, Word size) { - unsafeArraycopyStub(HotSpotBackend.UNSAFE_ARRAYCOPY, srcAddr, dstAddr, size); + unsafeArraycopyStub(UNSAFE_ARRAYCOPY, srcAddr, dstAddr, size); } - public static final ForeignCallDescriptor GENERIC_ARRAYCOPY = new ForeignCallDescriptor("generic_arraycopy", int.class, Word.class, int.class, Word.class, int.class, int.class); - @NodeIntrinsic(ForeignCallNode.class) private static native void unsafeArraycopyStub(@ConstantNodeParameter ForeignCallDescriptor descriptor, Word srcAddr, Word dstAddr, Word size); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackendFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackendFactory.java index 1fc537cf5a5..8dbedc534da 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackendFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackendFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCodeCacheListener.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCodeCacheListener.java index 68bae0d3ae0..2759136a0bd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCodeCacheListener.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCodeCacheListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCompilationIdentifier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCompilationIdentifier.java index 5c27d4314d8..5504ef84f34 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCompilationIdentifier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCompilationIdentifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCompiledCodeBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCompiledCodeBuilder.java index af199db984c..391890e2318 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCompiledCodeBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCompiledCodeBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCounterOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCounterOp.java index 958a4ef88bc..c1feeb5febc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCounterOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotCounterOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotDataBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotDataBuilder.java index 1dbeb6b7999..d5f504fd70b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotDataBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotDataBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotDebugInfoBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotDebugInfoBuilder.java index de491961c51..66384cebf30 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotDebugInfoBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotDebugInfoBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotForeignCallLinkage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotForeignCallLinkage.java index 445ccbe3786..cc22f311444 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotForeignCallLinkage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotForeignCallLinkage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotForeignCallLinkageImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotForeignCallLinkageImpl.java index 56e7f43095b..1e8b2fe4a44 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotForeignCallLinkageImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotForeignCallLinkageImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalCompiler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalCompiler.java index a42d84b2c69..3bf46c21e2a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalCompiler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalCompiler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalCompilerFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalCompilerFactory.java index ac586544205..37f02408d4f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalCompilerFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalCompilerFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalJVMCIServiceLocator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalJVMCIServiceLocator.java index 8ca7365fe5a..1279bdb1535 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalJVMCIServiceLocator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalJVMCIServiceLocator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalManagementRegistration.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalManagementRegistration.java index 9e51846e214..0c206c2bdcf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalManagementRegistration.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalManagementRegistration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalOptionValues.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalOptionValues.java index 75b1084f6b5..3b3b12135b8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalOptionValues.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalOptionValues.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntime.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntime.java index a4c83d2c0e0..f0f319eecfc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntime.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntimeProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntimeProvider.java index b349deaea42..c814d7b523e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntimeProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntimeProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalVMEventListener.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalVMEventListener.java index a06bf2c1165..dbd0bf177fc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalVMEventListener.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalVMEventListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotHostBackend.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotHostBackend.java index 687413386dd..ee229821ce3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotHostBackend.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotHostBackend.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotInstructionProfiling.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotInstructionProfiling.java index 069086fded5..9715a766c47 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotInstructionProfiling.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotInstructionProfiling.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLIRGenerationResult.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLIRGenerationResult.java index bb6cf9ef776..88bc4435d86 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLIRGenerationResult.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLIRGenerationResult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLIRGenerator.java index c1d1970ecba..c716464fce9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLIRGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLockStack.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLockStack.java index 4a60554dc7e..996896c7868 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLockStack.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotLockStack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotNodeLIRBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotNodeLIRBuilder.java index 9aabb2d6c23..d815b31b5db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotNodeLIRBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotNodeLIRBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotReferenceMapBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotReferenceMapBuilder.java index dd0d7845e18..4fe6512336c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotReferenceMapBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotReferenceMapBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotReplacementsImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotReplacementsImpl.java index 0728fe35337..205d7b7ebd1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotReplacementsImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotReplacementsImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotTTYStreamProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotTTYStreamProvider.java index 4ef29cbfe1e..31aee425fb5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotTTYStreamProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotTTYStreamProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,15 +24,27 @@ package org.graalvm.compiler.hotspot; +import static org.graalvm.compiler.hotspot.HotSpotGraalOptionValues.GRAAL_OPTION_PROPERTY_PREFIX; import static org.graalvm.compiler.hotspot.HotSpotGraalOptionValues.HOTSPOT_OPTIONS; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; import java.io.PrintStream; +import java.util.List; +import org.graalvm.compiler.core.common.SuppressFBWarnings; import org.graalvm.compiler.debug.TTYStreamProvider; import org.graalvm.compiler.options.Option; +import org.graalvm.compiler.options.OptionKey; import org.graalvm.compiler.options.OptionType; +import org.graalvm.compiler.options.OptionValues; +import org.graalvm.compiler.serviceprovider.GraalServices; import org.graalvm.compiler.serviceprovider.ServiceProvider; +import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime; + @ServiceProvider(TTYStreamProvider.class) public class HotSpotTTYStreamProvider implements TTYStreamProvider { @@ -41,7 +53,7 @@ public class HotSpotTTYStreamProvider implements TTYStreamProvider { // @formatter:off @Option(help = "File to which logging is sent. A %p in the name will be replaced with a string identifying " + "the process, usually the process id and %t will be replaced by System.currentTimeMillis().", type = OptionType.Expert) - public static final PrintStreamOptionKey LogFile = new PrintStreamOptionKey(); + public static final LogStreamOptionKey LogFile = new LogStreamOptionKey(); // @formatter:on } @@ -49,4 +61,108 @@ public class HotSpotTTYStreamProvider implements TTYStreamProvider { public PrintStream getStream() { return Options.LogFile.getStream(HOTSPOT_OPTIONS); } + + /** + * An option for a configurable file name that can also open a {@link PrintStream} on the file. + * If no value is given for the option, the stream will output to HotSpot's + * {@link HotSpotJVMCIRuntime#getLogStream() log} stream + */ + private static class LogStreamOptionKey extends OptionKey { + + LogStreamOptionKey() { + super(null); + } + + /** + * @return {@code nameTemplate} with all instances of %p replaced by + * {@link GraalServices#getExecutionID()} and %t by + * {@link System#currentTimeMillis()} + */ + private static String makeFilename(String nameTemplate) { + String name = nameTemplate; + if (name.contains("%p")) { + name = name.replaceAll("%p", GraalServices.getExecutionID()); + } + if (name.contains("%t")) { + name = name.replaceAll("%t", String.valueOf(System.currentTimeMillis())); + } + return name; + } + + /** + * An output stream that redirects to {@link HotSpotJVMCIRuntime#getLogStream()}. The + * {@link HotSpotJVMCIRuntime#getLogStream()} value is only accessed the first time an IO + * operation is performed on the stream. This is required to break a deadlock in early JVMCI + * initialization. + */ + static class DelayedOutputStream extends OutputStream { + private volatile OutputStream lazy; + + private OutputStream lazy() { + if (lazy == null) { + synchronized (this) { + if (lazy == null) { + lazy = HotSpotJVMCIRuntime.runtime().getLogStream(); + PrintStream ps = new PrintStream(lazy); + ps.printf("[Use -D%sLogFile= to redirect Graal log output to a file.]%n", GRAAL_OPTION_PROPERTY_PREFIX); + } + } + } + return lazy; + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + lazy().write(b, off, len); + } + + @Override + public void write(int b) throws IOException { + lazy().write(b); + } + + @Override + public void flush() throws IOException { + lazy().flush(); + } + + @Override + public void close() throws IOException { + lazy().close(); + } + } + + /** + * Gets the print stream configured by this option. If no file is configured, the print + * stream will output to HotSpot's {@link HotSpotJVMCIRuntime#getLogStream() log} stream. + */ + @SuppressFBWarnings(value = "DLS_DEAD_LOCAL_STORE", justification = "false positive on dead store to `ps`") + public PrintStream getStream(OptionValues options) { + String nameTemplate = getValue(options); + if (nameTemplate != null) { + String name = makeFilename(nameTemplate); + try { + final boolean enableAutoflush = true; + PrintStream ps = new PrintStream(new FileOutputStream(name), enableAutoflush); + /* + * Add the JVM and Java arguments to the log file to help identity it. + */ + List inputArguments = GraalServices.getInputArguments(); + if (inputArguments != null) { + ps.println("VM Arguments: " + String.join(" ", inputArguments)); + } + String cmd = System.getProperty("sun.java.command"); + if (cmd != null) { + ps.println("sun.java.command=" + cmd); + } + return ps; + } catch (FileNotFoundException e) { + throw new RuntimeException("couldn't open file: " + name, e); + } + } else { + return new PrintStream(new DelayedOutputStream()); + } + } + } + } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/JVMCIVersionCheck.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/JVMCIVersionCheck.java index 7b9f45761b7..42aab4eef91 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/JVMCIVersionCheck.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/JVMCIVersionCheck.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/NodeCostDumpUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/NodeCostDumpUtil.java index a07cb7ef505..7ff23467be0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/NodeCostDumpUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/NodeCostDumpUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/PrintStreamOptionKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/PrintStreamOptionKey.java deleted file mode 100644 index ab0a5aa5b05..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/PrintStreamOptionKey.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.hotspot; - -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintStream; -import java.util.List; - -import org.graalvm.compiler.core.common.SuppressFBWarnings; -import org.graalvm.compiler.options.OptionKey; -import org.graalvm.compiler.options.OptionValues; -import org.graalvm.compiler.serviceprovider.GraalServices; - -import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime; - -/** - * An option for a configurable file name that can also open a {@link PrintStream} on the file. If - * no value is given for the option, the stream will output to HotSpot's - * {@link HotSpotJVMCIRuntime#getLogStream() log} stream - */ -public class PrintStreamOptionKey extends OptionKey { - - public PrintStreamOptionKey() { - super(null); - } - - /** - * @return {@code nameTemplate} with all instances of %p replaced by - * {@link GraalServices#getExecutionID()} and %t by {@link System#currentTimeMillis()} - */ - private static String makeFilename(String nameTemplate) { - String name = nameTemplate; - if (name.contains("%p")) { - name = name.replaceAll("%p", GraalServices.getExecutionID()); - } - if (name.contains("%t")) { - name = name.replaceAll("%t", String.valueOf(System.currentTimeMillis())); - } - return name; - } - - /** - * An output stream that redirects to {@link HotSpotJVMCIRuntime#getLogStream()}. The - * {@link HotSpotJVMCIRuntime#getLogStream()} value is only accessed the first time an IO - * operation is performed on the stream. This is required to break a deadlock in early JVMCI - * initialization. - */ - static class DelayedOutputStream extends OutputStream { - private volatile OutputStream lazy; - - private OutputStream lazy() { - if (lazy == null) { - synchronized (this) { - if (lazy == null) { - lazy = HotSpotJVMCIRuntime.runtime().getLogStream(); - } - } - } - return lazy; - } - - @Override - public void write(byte[] b, int off, int len) throws IOException { - lazy().write(b, off, len); - } - - @Override - public void write(int b) throws IOException { - lazy().write(b); - } - - @Override - public void flush() throws IOException { - lazy().flush(); - } - - @Override - public void close() throws IOException { - lazy().close(); - } - } - - /** - * Gets the print stream configured by this option. If no file is configured, the print stream - * will output to HotSpot's {@link HotSpotJVMCIRuntime#getLogStream() log} stream. - */ - @SuppressFBWarnings(value = "DLS_DEAD_LOCAL_STORE", justification = "false positive on dead store to `ps`") - public PrintStream getStream(OptionValues options) { - String nameTemplate = getValue(options); - if (nameTemplate != null) { - String name = makeFilename(nameTemplate); - try { - final boolean enableAutoflush = true; - PrintStream ps = new PrintStream(new FileOutputStream(name), enableAutoflush); - /* - * Add the JVM and Java arguments to the log file to help identity it. - */ - List inputArguments = GraalServices.getInputArguments(); - if (inputArguments != null) { - ps.println("VM Arguments: " + String.join(" ", inputArguments)); - } - String cmd = System.getProperty("sun.java.command"); - if (cmd != null) { - ps.println("sun.java.command=" + cmd); - } - return ps; - } catch (FileNotFoundException e) { - throw new RuntimeException("couldn't open file: " + name, e); - } - } else { - return new PrintStream(new DelayedOutputStream()); - } - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/WeakClassLoaderSet.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/WeakClassLoaderSet.java index 245a1868b93..9983a7e85ed 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/WeakClassLoaderSet.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/WeakClassLoaderSet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/debug/BenchmarkCounters.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/debug/BenchmarkCounters.java index 250cc21a29d..c991bb1156b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/debug/BenchmarkCounters.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/debug/BenchmarkCounters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/lir/HotSpotZapRegistersPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/lir/HotSpotZapRegistersPhase.java index 517f2959c0a..3fdf2b8c00c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/lir/HotSpotZapRegistersPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/lir/HotSpotZapRegistersPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/AddressLoweringHotSpotSuitesProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/AddressLoweringHotSpotSuitesProvider.java index 3399654c92e..db1125e6d6c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/AddressLoweringHotSpotSuitesProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/AddressLoweringHotSpotSuitesProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java index c15aaa7a942..8d4bb5c50cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java @@ -59,13 +59,14 @@ import org.graalvm.compiler.graph.NodeInputList; import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; import org.graalvm.compiler.hotspot.nodes.BeginLockScopeNode; -import org.graalvm.compiler.hotspot.nodes.ComputeObjectAddressNode; +import org.graalvm.compiler.hotspot.replacements.arraycopy.HotSpotArraycopySnippets; +import org.graalvm.compiler.nodes.ComputeObjectAddressNode; import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePostWriteBarrier; import org.graalvm.compiler.hotspot.nodes.G1ArrayRangePreWriteBarrier; import org.graalvm.compiler.hotspot.nodes.G1PostWriteBarrier; import org.graalvm.compiler.hotspot.nodes.G1PreWriteBarrier; import org.graalvm.compiler.hotspot.nodes.G1ReferentFieldReadBarrier; -import org.graalvm.compiler.hotspot.nodes.GetObjectAddressNode; +import org.graalvm.compiler.nodes.GetObjectAddressNode; import org.graalvm.compiler.hotspot.nodes.HotSpotCompressionNode; import org.graalvm.compiler.hotspot.nodes.HotSpotDirectCallTargetNode; import org.graalvm.compiler.hotspot.nodes.HotSpotIndirectCallTargetNode; @@ -93,9 +94,9 @@ import org.graalvm.compiler.hotspot.replacements.StringToBytesSnippets; import org.graalvm.compiler.hotspot.replacements.UnsafeLoadSnippets; import org.graalvm.compiler.hotspot.replacements.WriteBarrierSnippets; import org.graalvm.compiler.hotspot.replacements.aot.ResolveConstantSnippets; -import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyNode; -import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopySnippets; -import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyWithSlowPathNode; +import org.graalvm.compiler.replacements.arraycopy.ArrayCopyNode; +import org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets; +import org.graalvm.compiler.replacements.arraycopy.ArrayCopyWithSlowPathNode; import org.graalvm.compiler.hotspot.replacements.profiling.ProfileSnippets; import org.graalvm.compiler.hotspot.word.KlassPointer; import org.graalvm.compiler.nodes.AbstractBeginNode; @@ -215,7 +216,7 @@ public class DefaultHotSpotLoweringProvider extends DefaultJavaLoweringProvider exceptionObjectSnippets = new LoadExceptionObjectSnippets.Templates(options, factories, providers, target); unsafeLoadSnippets = new UnsafeLoadSnippets.Templates(options, factories, providers, target); assertionSnippets = new AssertionSnippets.Templates(options, factories, providers, target); - arraycopySnippets = new ArrayCopySnippets.Templates(options, factories, runtime, providers, target); + arraycopySnippets = new ArrayCopySnippets.Templates(new HotSpotArraycopySnippets(), options, factories, runtime, providers, providers.getSnippetReflection(), target); stringToBytesSnippets = new StringToBytesSnippets.Templates(options, factories, providers, target); hashCodeSnippets = new HashCodeSnippets.Templates(options, factories, providers, target); resolveConstantSnippets = new ResolveConstantSnippets.Templates(options, factories, providers, target); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotAOTProfilingPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotAOTProfilingPlugin.java index 647ef1dfee6..23d86044ebd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotAOTProfilingPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotAOTProfilingPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotClassInitializationPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotClassInitializationPlugin.java index c10ef637454..09d56891122 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotClassInitializationPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotClassInitializationPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,11 @@ package org.graalvm.compiler.hotspot.meta; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.function.Supplier; + import org.graalvm.compiler.core.common.type.ObjectStamp; import org.graalvm.compiler.core.common.type.Stamp; import org.graalvm.compiler.core.common.type.StampFactory; @@ -38,17 +43,12 @@ import org.graalvm.compiler.nodes.graphbuilderconf.ClassInitializationPlugin; import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext; import jdk.vm.ci.hotspot.HotSpotResolvedObjectType; +import jdk.vm.ci.meta.ConstantPool; import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaType; -import jdk.vm.ci.meta.ConstantPool; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; public final class HotSpotClassInitializationPlugin implements ClassInitializationPlugin { - @Override - public boolean shouldApply(GraphBuilderContext builder, ResolvedJavaType type) { + private static boolean shouldApply(GraphBuilderContext builder, ResolvedJavaType type) { if (!builder.parsingIntrinsic()) { if (!type.isArray()) { ResolvedJavaMethod method = builder.getGraph().method(); @@ -73,13 +73,18 @@ public final class HotSpotClassInitializationPlugin implements ClassInitializati } @Override - public ValueNode apply(GraphBuilderContext builder, ResolvedJavaType type, FrameState frameState) { - assert shouldApply(builder, type); - Stamp hubStamp = builder.getStampProvider().createHubStamp((ObjectStamp) StampFactory.objectNonNull()); - ConstantNode hub = builder.append(ConstantNode.forConstant(hubStamp, ((HotSpotResolvedObjectType) type).klass(), builder.getMetaAccess(), builder.getGraph())); - DeoptimizingFixedWithNextNode result = builder.append(type.isArray() ? new ResolveConstantNode(hub) : new InitializeKlassNode(hub)); - result.setStateBefore(frameState); - return result; + public boolean apply(GraphBuilderContext builder, ResolvedJavaType type, Supplier frameState, ValueNode[] classInit) { + if (shouldApply(builder, type)) { + Stamp hubStamp = builder.getStampProvider().createHubStamp((ObjectStamp) StampFactory.objectNonNull()); + ConstantNode hub = builder.append(ConstantNode.forConstant(hubStamp, ((HotSpotResolvedObjectType) type).klass(), builder.getMetaAccess(), builder.getGraph())); + DeoptimizingFixedWithNextNode result = builder.append(type.isArray() ? new ResolveConstantNode(hub) : new InitializeKlassNode(hub)); + result.setStateBefore(frameState.get()); + if (classInit != null) { + classInit[0] = result; + } + return true; + } + return false; } private static final Class hscp; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotConstantFieldProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotConstantFieldProvider.java index adbea6f768e..d3ec6e86523 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotConstantFieldProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotConstantFieldProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotConstantLoadAction.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotConstantLoadAction.java index 0e9538ffa08..9da61d39fe0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotConstantLoadAction.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotConstantLoadAction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotDisassemblerProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotDisassemblerProvider.java index 0f933d7a5b5..e487d1c411c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotDisassemblerProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotDisassemblerProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotForeignCallsProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotForeignCallsProvider.java index c831b07a319..abde0da1fce 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotForeignCallsProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotForeignCallsProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotForeignCallsProviderImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotForeignCallsProviderImpl.java index 2faa802a396..fe6785cd5e4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotForeignCallsProviderImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotForeignCallsProviderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraalConstantFieldProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraalConstantFieldProvider.java index 3ba650f6e03..b22c17774b9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraalConstantFieldProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraalConstantFieldProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java index f9a383d1d83..6e6036252be 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,12 +66,9 @@ import org.graalvm.compiler.hotspot.replacements.SHA2Substitutions; import org.graalvm.compiler.hotspot.replacements.SHA5Substitutions; import org.graalvm.compiler.hotspot.replacements.SHASubstitutions; import org.graalvm.compiler.hotspot.replacements.ThreadSubstitutions; -import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyNode; +import org.graalvm.compiler.replacements.arraycopy.ArrayCopyNode; import org.graalvm.compiler.hotspot.word.HotSpotWordTypes; import org.graalvm.compiler.nodes.ConstantNode; -import org.graalvm.compiler.nodes.DynamicPiNode; -import org.graalvm.compiler.nodes.FixedGuardNode; -import org.graalvm.compiler.nodes.LogicNode; import org.graalvm.compiler.nodes.NamedLocationIdentity; import org.graalvm.compiler.nodes.NodeView; import org.graalvm.compiler.nodes.ValueNode; @@ -86,7 +83,6 @@ import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver; import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins; import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration; import org.graalvm.compiler.nodes.graphbuilderconf.NodeIntrinsicPluginFactory; -import org.graalvm.compiler.nodes.java.InstanceOfDynamicNode; import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType; import org.graalvm.compiler.nodes.memory.ReadNode; import org.graalvm.compiler.nodes.memory.address.AddressNode; @@ -107,7 +103,6 @@ import jdk.internal.vm.compiler.word.LocationIdentity; import jdk.vm.ci.code.CodeUtil; import jdk.vm.ci.meta.ConstantReflectionProvider; import jdk.vm.ci.meta.DeoptimizationAction; -import jdk.vm.ci.meta.DeoptimizationReason; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.MetaAccessProvider; import jdk.vm.ci.meta.ResolvedJavaMethod; @@ -227,26 +222,6 @@ public class HotSpotGraphBuilderPlugins { if (config.getFieldOffset("ArrayKlass::_component_mirror", Integer.class, "oop", Integer.MAX_VALUE) != Integer.MAX_VALUE) { r.registerMethodSubstitution(HotSpotClassSubstitutions.class, "getComponentType", Receiver.class); } - - r.register2("cast", Receiver.class, Object.class, new InvocationPlugin() { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) { - ValueNode javaClass = receiver.get(); - LogicNode condition = b.append(InstanceOfDynamicNode.create(b.getAssumptions(), b.getConstantReflection(), javaClass, object, true)); - if (condition.isTautology()) { - b.addPush(JavaKind.Object, object); - } else { - FixedGuardNode fixedGuard = b.add(new FixedGuardNode(condition, DeoptimizationReason.ClassCastException, DeoptimizationAction.InvalidateReprofile, false)); - b.addPush(JavaKind.Object, DynamicPiNode.create(b.getAssumptions(), b.getConstantReflection(), object, fixedGuard, javaClass)); - } - return true; - } - - @Override - public boolean inlineOnly() { - return true; - } - }); } private static void registerCallSitePlugins(InvocationPlugins plugins) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotHostForeignCallsProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotHostForeignCallsProvider.java index ef5bc5e70e9..7ec852fe168 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotHostForeignCallsProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotHostForeignCallsProvider.java @@ -36,7 +36,6 @@ import static org.graalvm.compiler.hotspot.HotSpotBackend.DECRYPT_WITH_ORIGINAL_ import static org.graalvm.compiler.hotspot.HotSpotBackend.ENCRYPT; import static org.graalvm.compiler.hotspot.HotSpotBackend.ENCRYPT_BLOCK; import static org.graalvm.compiler.hotspot.HotSpotBackend.EXCEPTION_HANDLER; -import static org.graalvm.compiler.hotspot.HotSpotBackend.GENERIC_ARRAYCOPY; import static org.graalvm.compiler.hotspot.HotSpotBackend.IC_MISS_HANDLER; import static org.graalvm.compiler.hotspot.HotSpotBackend.INITIALIZE_KLASS_BY_SYMBOL; import static org.graalvm.compiler.hotspot.HotSpotBackend.INVOCATION_EVENT; @@ -58,13 +57,12 @@ import static org.graalvm.compiler.hotspot.HotSpotBackend.SHA2_IMPL_COMPRESS; import static org.graalvm.compiler.hotspot.HotSpotBackend.SHA5_IMPL_COMPRESS; import static org.graalvm.compiler.hotspot.HotSpotBackend.SHA_IMPL_COMPRESS; import static org.graalvm.compiler.hotspot.HotSpotBackend.SQUARE_TO_LEN; -import static org.graalvm.compiler.hotspot.HotSpotBackend.UNSAFE_ARRAYCOPY; import static org.graalvm.compiler.hotspot.HotSpotBackend.UNWIND_EXCEPTION_TO_CALLER; import static org.graalvm.compiler.hotspot.HotSpotBackend.VM_ERROR; import static org.graalvm.compiler.hotspot.HotSpotBackend.WRONG_METHOD_HANDLER; +import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.NOT_REEXECUTABLE; import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.REEXECUTABLE; import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.REEXECUTABLE_ONLY_AFTER_EXCEPTION; -import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.NOT_REEXECUTABLE; import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.DESTROYS_REGISTERS; import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.PRESERVES_REGISTERS; import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.LEAF; @@ -128,6 +126,7 @@ import org.graalvm.compiler.hotspot.stubs.VerifyOopStub; import org.graalvm.compiler.nodes.NamedLocationIdentity; import org.graalvm.compiler.nodes.extended.BytecodeExceptionNode.BytecodeExceptionKind; import org.graalvm.compiler.options.OptionValues; +import org.graalvm.compiler.replacements.arraycopy.ArrayCopyForeignCalls; import org.graalvm.compiler.word.Word; import org.graalvm.compiler.word.WordTypes; import jdk.internal.vm.compiler.word.LocationIdentity; @@ -140,7 +139,7 @@ import jdk.vm.ci.meta.MetaAccessProvider; /** * HotSpot implementation of {@link ForeignCallsProvider}. */ -public abstract class HotSpotHostForeignCallsProvider extends HotSpotForeignCallsProviderImpl { +public abstract class HotSpotHostForeignCallsProvider extends HotSpotForeignCallsProviderImpl implements ArrayCopyForeignCalls { public static final ForeignCallDescriptor JAVA_TIME_MILLIS = new ForeignCallDescriptor("javaTimeMillis", long.class); public static final ForeignCallDescriptor JAVA_TIME_NANOS = new ForeignCallDescriptor("javaTimeNanos", long.class); @@ -157,11 +156,13 @@ public abstract class HotSpotHostForeignCallsProvider extends HotSpotForeignCall stub.getLinkage().setCompiledStub(stub); } - public static ForeignCallDescriptor lookupCheckcastArraycopyDescriptor(boolean uninit) { + @Override + public ForeignCallDescriptor lookupCheckcastArraycopyDescriptor(boolean uninit) { return checkcastArraycopyDescriptors[uninit ? 1 : 0]; } - public static ForeignCallDescriptor lookupArraycopyDescriptor(JavaKind kind, boolean aligned, boolean disjoint, boolean uninit, boolean killAny) { + @Override + public ForeignCallDescriptor lookupArraycopyDescriptor(JavaKind kind, boolean aligned, boolean disjoint, boolean uninit, boolean killAny) { if (uninit) { assert kind == JavaKind.Object; assert !killAny : "unsupported"; @@ -213,7 +214,7 @@ public abstract class HotSpotHostForeignCallsProvider extends HotSpotForeignCall } private void registerCheckcastArraycopyDescriptor(boolean uninit, long routine) { - String name = "Object" + (uninit ? "Uninit" : "") + "Checkcast"; + String name = "Object" + (uninit ? "Uninit" : "") + "CheckcastArraycopy"; // Input: // c_rarg0 - source array address // c_rarg1 - destination array address diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotInvocationPlugins.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotInvocationPlugins.java index 187b877a2b8..b69a99ca391 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotInvocationPlugins.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotInvocationPlugins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotInvokeDynamicPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotInvokeDynamicPlugin.java index 79e27b6df67..86d43851cab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotInvokeDynamicPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotInvokeDynamicPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotLoweringProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotLoweringProvider.java index 779b862ca0b..f3a5800768f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotLoweringProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotLoweringProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotNodePlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotNodePlugin.java index 07ec6b2fe62..5b034bd17c5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotNodePlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotNodePlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotProfilingPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotProfilingPlugin.java index e4e95e30cd2..865aa7ff70e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotProfilingPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotProfilingPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotProviders.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotProviders.java index 7fd206a266c..4ac6d617c47 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotProviders.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotProviders.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotRegisters.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotRegisters.java index 6ccd59af983..9e3cb046712 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotRegisters.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotRegisters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotRegistersProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotRegistersProvider.java index a7bc09af678..9bb52626d26 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotRegistersProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotRegistersProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotSnippetReflectionProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotSnippetReflectionProvider.java index 89ad4966b6d..a5cec59ba17 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotSnippetReflectionProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotSnippetReflectionProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotStampProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotStampProvider.java index dfd11e12e36..cbce56f85c8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotStampProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotStampProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotSuitesProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotSuitesProvider.java index 54667fb2a64..9a511bac46f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotSuitesProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotSuitesProvider.java @@ -30,8 +30,8 @@ import static org.graalvm.compiler.core.common.GraalOptions.VerifyPhases; import static org.graalvm.compiler.core.phases.HighTier.Options.Inline; import java.util.ListIterator; -import org.graalvm.compiler.debug.Assertions; +import org.graalvm.compiler.debug.Assertions; import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; import org.graalvm.compiler.hotspot.HotSpotBackend; import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; @@ -140,13 +140,10 @@ public class HotSpotSuitesProvider extends SuitesProviderBase { protected void run(StructuredGraph graph, HighTierContext context) { EncodedGraph encodedGraph = GraphEncoder.encodeSingleGraph(graph, runtime.getTarget().arch); - StructuredGraph targetGraph = new StructuredGraph.Builder(graph.getOptions(), graph.getDebug(), AllowAssumptions.YES).method(graph.method()).build(); + StructuredGraph targetGraph = new StructuredGraph.Builder(graph.getOptions(), graph.getDebug(), AllowAssumptions.YES).method(graph.method()).trackNodeSourcePosition( + graph.trackNodeSourcePosition()).build(); SimplifyingGraphDecoder graphDecoder = new SimplifyingGraphDecoder(runtime.getTarget().arch, targetGraph, context.getMetaAccess(), context.getConstantReflection(), context.getConstantFieldProvider(), context.getStampProvider(), !ImmutableCode.getValue(graph.getOptions())); - - if (graph.trackNodeSourcePosition()) { - targetGraph.setTrackNodeSourcePosition(); - } graphDecoder.decode(encodedGraph); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotUnsafeSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotUnsafeSubstitutions.java index 7b5da8baa10..4ad8babd24a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotUnsafeSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotUnsafeSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,7 @@ import static org.graalvm.compiler.serviceprovider.GraalServices.Java8OrEarlier; import org.graalvm.compiler.api.replacements.ClassSubstitution; import org.graalvm.compiler.api.replacements.MethodSubstitution; import org.graalvm.compiler.hotspot.HotSpotBackend; -import org.graalvm.compiler.hotspot.nodes.ComputeObjectAddressNode; +import org.graalvm.compiler.nodes.ComputeObjectAddressNode; import org.graalvm.compiler.word.Word; import jdk.internal.vm.compiler.word.WordFactory; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotWordOperationPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotWordOperationPlugin.java index fc00ebbd4e7..383b5047d62 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotWordOperationPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotWordOperationPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/AcquiredCASLockNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/AcquiredCASLockNode.java index 7d4a267be3c..4297235d0b0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/AcquiredCASLockNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/AcquiredCASLockNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/AllocaNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/AllocaNode.java index 439302032e6..1263c647617 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/AllocaNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/AllocaNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/ArrayRangeWriteBarrier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/ArrayRangeWriteBarrier.java index e731adf4c22..30b97511246 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/ArrayRangeWriteBarrier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/ArrayRangeWriteBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/BeginLockScopeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/BeginLockScopeNode.java index dfb2c81498f..8ee28e3e19d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/BeginLockScopeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/BeginLockScopeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/CurrentJavaThreadNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/CurrentJavaThreadNode.java index 9d81265d681..2741d3c7652 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/CurrentJavaThreadNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/CurrentJavaThreadNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/CurrentLockNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/CurrentLockNode.java index a837e292738..082d52bba74 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/CurrentLockNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/CurrentLockNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DeoptimizeCallerNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DeoptimizeCallerNode.java index e4c3ea1e977..be513de52dd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DeoptimizeCallerNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DeoptimizeCallerNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DeoptimizingStubCall.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DeoptimizingStubCall.java index 3076031a976..c175e95ab10 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DeoptimizingStubCall.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DeoptimizingStubCall.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DimensionsNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DimensionsNode.java index ddaeb37b210..14648ede5f0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DimensionsNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/DimensionsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/EndLockScopeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/EndLockScopeNode.java index 4f88e16e59c..1cc3cfc9924 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/EndLockScopeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/EndLockScopeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/FastAcquireBiasedLockNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/FastAcquireBiasedLockNode.java index 6b7ef4f5721..f7984320f47 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/FastAcquireBiasedLockNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/FastAcquireBiasedLockNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ArrayRangePostWriteBarrier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ArrayRangePostWriteBarrier.java index d887d0f840b..6aebdfb754d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ArrayRangePostWriteBarrier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ArrayRangePostWriteBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ArrayRangePreWriteBarrier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ArrayRangePreWriteBarrier.java index a8547a47a90..51b274e929f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ArrayRangePreWriteBarrier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ArrayRangePreWriteBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1PostWriteBarrier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1PostWriteBarrier.java index 239f25da4d9..dcc3e0f0f3e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1PostWriteBarrier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1PostWriteBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1PreWriteBarrier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1PreWriteBarrier.java index 5e1a2b5d996..1c2b9f2a56d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1PreWriteBarrier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1PreWriteBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ReferentFieldReadBarrier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ReferentFieldReadBarrier.java index 50486cb586d..432f4c2b0c3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ReferentFieldReadBarrier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/G1ReferentFieldReadBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/GraalHotSpotVMConfigNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/GraalHotSpotVMConfigNode.java index 3ea5340ff56..a191e24a514 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/GraalHotSpotVMConfigNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/GraalHotSpotVMConfigNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotCompressionNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotCompressionNode.java index aabede91c14..1b8503ba636 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotCompressionNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotCompressionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotDirectCallTargetNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotDirectCallTargetNode.java index ed269922f93..b591532fcdd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotDirectCallTargetNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotDirectCallTargetNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotIndirectCallTargetNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotIndirectCallTargetNode.java index e207c73b1f9..c93268c9197 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotIndirectCallTargetNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/HotSpotIndirectCallTargetNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/JumpToExceptionHandlerInCallerNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/JumpToExceptionHandlerInCallerNode.java index 6709f127837..f4e40efc14d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/JumpToExceptionHandlerInCallerNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/JumpToExceptionHandlerInCallerNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/JumpToExceptionHandlerNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/JumpToExceptionHandlerNode.java index 32b0a40fc6f..aabf21bdb22 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/JumpToExceptionHandlerNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/JumpToExceptionHandlerNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/LoadIndexedPointerNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/LoadIndexedPointerNode.java index f3a0083bef4..acf46a64b8d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/LoadIndexedPointerNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/LoadIndexedPointerNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/MonitorCounterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/MonitorCounterNode.java index 58a8228d365..81479b9d8a9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/MonitorCounterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/MonitorCounterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/ObjectWriteBarrier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/ObjectWriteBarrier.java index c954ca193f4..17d387d69f6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/ObjectWriteBarrier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/ObjectWriteBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/PatchReturnAddressNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/PatchReturnAddressNode.java index 4e9a07959bb..903ec1903bf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/PatchReturnAddressNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/PatchReturnAddressNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/SerialArrayRangeWriteBarrier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/SerialArrayRangeWriteBarrier.java index 40ebbcecf27..455acfb446a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/SerialArrayRangeWriteBarrier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/SerialArrayRangeWriteBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/SerialWriteBarrier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/SerialWriteBarrier.java index e35944f465d..e19d11f4641 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/SerialWriteBarrier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/SerialWriteBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/StubForeignCallNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/StubForeignCallNode.java index 6ba9d99f91e..94b8ec54232 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/StubForeignCallNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/StubForeignCallNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/StubStartNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/StubStartNode.java index fa9aa6679da..8ca6b7a408b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/StubStartNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/StubStartNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/VMErrorNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/VMErrorNode.java index d2a174d299a..73336751016 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/VMErrorNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/VMErrorNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/WriteBarrier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/WriteBarrier.java index a61fe6efbc0..b8168dcc9d2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/WriteBarrier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/WriteBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/EncodedSymbolNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/EncodedSymbolNode.java index 0bf3d0d0e69..8098a2e0b68 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/EncodedSymbolNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/EncodedSymbolNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/InitializeKlassNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/InitializeKlassNode.java index 652295ecb67..8253fb2df96 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/InitializeKlassNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/InitializeKlassNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/InitializeKlassStubCall.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/InitializeKlassStubCall.java index 9b116340944..840f7aa971b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/InitializeKlassStubCall.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/InitializeKlassStubCall.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadConstantIndirectlyFixedNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadConstantIndirectlyFixedNode.java index 5a711cb77d0..5f7fe34a559 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadConstantIndirectlyFixedNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadConstantIndirectlyFixedNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadConstantIndirectlyNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadConstantIndirectlyNode.java index 4dd891c2214..1d62e940774 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadConstantIndirectlyNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadConstantIndirectlyNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadMethodCountersIndirectlyNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadMethodCountersIndirectlyNode.java index 519827d10e8..a3bca3e08e6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadMethodCountersIndirectlyNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadMethodCountersIndirectlyNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadMethodCountersNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadMethodCountersNode.java index 107a036a6fb..afb2c315590 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadMethodCountersNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/LoadMethodCountersNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveConstantNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveConstantNode.java index 9e28c280cba..1c06379403d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveConstantNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveConstantNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveConstantStubCall.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveConstantStubCall.java index 8c653a9a965..bb9f1d6f5b1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveConstantStubCall.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveConstantStubCall.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveDynamicConstantNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveDynamicConstantNode.java index 9405c077512..af5f9534511 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveDynamicConstantNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveDynamicConstantNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveDynamicStubCall.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveDynamicStubCall.java index 86eff201232..65a3c9ff142 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveDynamicStubCall.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveDynamicStubCall.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveMethodAndLoadCountersNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveMethodAndLoadCountersNode.java index 9074c2ec3ef..fee0f23f46f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveMethodAndLoadCountersNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveMethodAndLoadCountersNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveMethodAndLoadCountersStubCall.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveMethodAndLoadCountersStubCall.java index c8ccaaa49ca..a79569b6e7f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveMethodAndLoadCountersStubCall.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/aot/ResolveMethodAndLoadCountersStubCall.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileBranchNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileBranchNode.java index 0d0309f69d7..844c204a9ee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileBranchNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileBranchNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileInvokeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileInvokeNode.java index 519c607c33d..26374fc6688 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileInvokeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileInvokeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileNode.java index 0acfae8f8b8..d6e888938e3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileWithNotificationNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileWithNotificationNode.java index f5c0b5d07cd..018d206d7dc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileWithNotificationNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/ProfileWithNotificationNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/RandomSeedNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/RandomSeedNode.java index 61e3347911c..c2e63d0da3f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/RandomSeedNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/profiling/RandomSeedNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/HotSpotNarrowOopStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/HotSpotNarrowOopStamp.java index 648b5a9345e..d3d2d92e4da 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/HotSpotNarrowOopStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/HotSpotNarrowOopStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/KlassPointerStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/KlassPointerStamp.java index c7fa265c897..fb1b6d3e6eb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/KlassPointerStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/KlassPointerStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MetaspacePointerStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MetaspacePointerStamp.java index 8ad06cd3e57..192524f557c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MetaspacePointerStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MetaspacePointerStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MethodCountersPointerStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MethodCountersPointerStamp.java index 3697737fe9f..a05e88ac0e8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MethodCountersPointerStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MethodCountersPointerStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MethodPointerStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MethodPointerStamp.java index 0dd6c23b934..97061afca53 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MethodPointerStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/type/MethodPointerStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/package-info.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/package-info.java index dfce4390047..2b2e4ba7194 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/package-info.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/AheadOfTimeVerificationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/AheadOfTimeVerificationPhase.java index e5ce7f2162f..afcae4c205b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/AheadOfTimeVerificationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/AheadOfTimeVerificationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/LoadJavaMirrorWithKlassPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/LoadJavaMirrorWithKlassPhase.java index 31a793f6616..15df87867e6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/LoadJavaMirrorWithKlassPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/LoadJavaMirrorWithKlassPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/OnStackReplacementPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/OnStackReplacementPhase.java index 2acbf9670e8..0da39f6785c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/OnStackReplacementPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/OnStackReplacementPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/WriteBarrierAdditionPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/WriteBarrierAdditionPhase.java index 498ddd85e89..3de108f4533 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/WriteBarrierAdditionPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/WriteBarrierAdditionPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/WriteBarrierVerificationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/WriteBarrierVerificationPhase.java index e9d4f33a60b..feefeb67d69 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/WriteBarrierVerificationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/WriteBarrierVerificationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/aot/AOTInliningPolicy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/aot/AOTInliningPolicy.java index 4c1b9d16a5b..984e9d7a6ea 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/aot/AOTInliningPolicy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/aot/AOTInliningPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/aot/EliminateRedundantInitializationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/aot/EliminateRedundantInitializationPhase.java index d301548dde2..b17ff97e123 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/aot/EliminateRedundantInitializationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/aot/EliminateRedundantInitializationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,12 +52,11 @@ public class EliminateRedundantInitializationPhase extends BasePhase TYPE = NodeClass.create(HubGetClassNode.class); @Input protected ValueNode hub; @@ -63,6 +64,7 @@ public final class HubGetClassNode extends FloatingNode implements Lowerable, Ca this.hub = hub; } + @Override public ValueNode getHub() { return hub; } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/IdentityHashCodeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/IdentityHashCodeNode.java index 2747c4a67c3..6737ac03833 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/IdentityHashCodeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/IdentityHashCodeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/InstanceOfSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/InstanceOfSnippets.java index e9f11aaa0d9..395d6c5a766 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/InstanceOfSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/InstanceOfSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/KlassLayoutHelperNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/KlassLayoutHelperNode.java index 6dc185a3c8a..a737e5e685f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/KlassLayoutHelperNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/KlassLayoutHelperNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/LoadExceptionObjectSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/LoadExceptionObjectSnippets.java index 8c0c53d9d12..6a770eaac42 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/LoadExceptionObjectSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/LoadExceptionObjectSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/MonitorSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/MonitorSnippets.java index 3af00be4843..6d6c2a44bb3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/MonitorSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/MonitorSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/NewObjectSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/NewObjectSnippets.java index 363cf7a159e..6964d3fa576 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/NewObjectSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/NewObjectSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectCloneNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectCloneNode.java index b4b950ea963..cb48414f0a4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectCloneNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectCloneNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectCloneSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectCloneSnippets.java index 510cc26de55..239195bd7f5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectCloneSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectCloneSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,13 +24,15 @@ package org.graalvm.compiler.hotspot.replacements; +import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfigBase.INJECTED_VMCONFIG; + import java.lang.reflect.Method; import java.util.EnumMap; import org.graalvm.compiler.api.directives.GraalDirectives; import org.graalvm.compiler.api.replacements.Snippet; import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyCallNode; +import org.graalvm.compiler.replacements.arraycopy.ArrayCopyCallNode; import org.graalvm.compiler.nodes.java.DynamicNewArrayNode; import org.graalvm.compiler.nodes.java.NewArrayNode; import org.graalvm.compiler.replacements.Snippets; @@ -64,56 +66,56 @@ public class ObjectCloneSnippets implements Snippets { @Snippet public static boolean[] booleanArrayClone(boolean[] src) { boolean[] result = (boolean[]) NewArrayNode.newUninitializedArray(Boolean.TYPE, src.length); - ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Boolean); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Boolean, HotSpotReplacementsUtil.getHeapWordSize(INJECTED_VMCONFIG)); return result; } @Snippet public static byte[] byteArrayClone(byte[] src) { byte[] result = (byte[]) NewArrayNode.newUninitializedArray(Byte.TYPE, src.length); - ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Byte); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Byte, HotSpotReplacementsUtil.getHeapWordSize(INJECTED_VMCONFIG)); return result; } @Snippet public static short[] shortArrayClone(short[] src) { short[] result = (short[]) NewArrayNode.newUninitializedArray(Short.TYPE, src.length); - ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Short); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Short, HotSpotReplacementsUtil.getHeapWordSize(INJECTED_VMCONFIG)); return result; } @Snippet public static char[] charArrayClone(char[] src) { char[] result = (char[]) NewArrayNode.newUninitializedArray(Character.TYPE, src.length); - ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Char); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Char, HotSpotReplacementsUtil.getHeapWordSize(INJECTED_VMCONFIG)); return result; } @Snippet public static int[] intArrayClone(int[] src) { int[] result = (int[]) NewArrayNode.newUninitializedArray(Integer.TYPE, src.length); - ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Int); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Int, HotSpotReplacementsUtil.getHeapWordSize(INJECTED_VMCONFIG)); return result; } @Snippet public static float[] floatArrayClone(float[] src) { float[] result = (float[]) NewArrayNode.newUninitializedArray(Float.TYPE, src.length); - ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Float); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Float, HotSpotReplacementsUtil.getHeapWordSize(INJECTED_VMCONFIG)); return result; } @Snippet public static long[] longArrayClone(long[] src) { long[] result = (long[]) NewArrayNode.newUninitializedArray(Long.TYPE, src.length); - ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Long); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Long, HotSpotReplacementsUtil.getHeapWordSize(INJECTED_VMCONFIG)); return result; } @Snippet public static double[] doubleArrayClone(double[] src) { double[] result = (double[]) NewArrayNode.newUninitializedArray(Double.TYPE, src.length); - ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Double); + ArrayCopyCallNode.disjointArraycopy(src, 0, result, 0, src.length, JavaKind.Double, HotSpotReplacementsUtil.getHeapWordSize(INJECTED_VMCONFIG)); return result; } @@ -121,7 +123,7 @@ public class ObjectCloneSnippets implements Snippets { public static Object[] objectArrayClone(Object[] src) { /* Since this snippet is lowered early the array must be initialized */ Object[] result = (Object[]) DynamicNewArrayNode.newArray(GraalDirectives.guardingNonNull(src.getClass().getComponentType()), src.length, JavaKind.Object); - ArrayCopyCallNode.disjointUninitializedArraycopy(src, 0, result, 0, src.length, JavaKind.Object); + ArrayCopyCallNode.disjointUninitializedArraycopy(src, 0, result, 0, src.length, JavaKind.Object, HotSpotReplacementsUtil.getHeapWordSize(INJECTED_VMCONFIG)); return result; } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectSubstitutions.java index 3d5997fb722..d79a9392904 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ObjectSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ReflectionGetCallerClassNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ReflectionGetCallerClassNode.java index fa8c37896a2..cab3afb52db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ReflectionGetCallerClassNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ReflectionGetCallerClassNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ReflectionSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ReflectionSubstitutions.java index 32a2fee5512..98d9d844e91 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ReflectionSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ReflectionSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHA2Substitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHA2Substitutions.java index c0e859c49d3..6efe27f2891 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHA2Substitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHA2Substitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,16 @@ package org.graalvm.compiler.hotspot.replacements; import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfigBase.INJECTED_METAACCESS; -import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.getArrayBaseOffset; import static org.graalvm.compiler.serviceprovider.GraalServices.Java8OrEarlier; import org.graalvm.compiler.api.replacements.ClassSubstitution; import org.graalvm.compiler.api.replacements.MethodSubstitution; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.hotspot.HotSpotBackend; -import org.graalvm.compiler.hotspot.nodes.ComputeObjectAddressNode; +import org.graalvm.compiler.nodes.ComputeObjectAddressNode; import org.graalvm.compiler.nodes.PiNode; import org.graalvm.compiler.nodes.extended.RawLoadNode; +import org.graalvm.compiler.replacements.ReplacementsUtil; import org.graalvm.compiler.word.Word; import jdk.internal.vm.compiler.word.LocationIdentity; import jdk.internal.vm.compiler.word.WordFactory; @@ -67,8 +67,8 @@ public class SHA2Substitutions { static void implCompress0(Object receiver, byte[] buf, int ofs) { Object realReceiver = PiNode.piCastNonNull(receiver, shaClass); Object state = RawLoadNode.load(realReceiver, stateOffset, JavaKind.Object, LocationIdentity.any()); - Word bufAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(buf, getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Byte) + ofs)); - Word stateAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(state, getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Int))); + Word bufAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(buf, ReplacementsUtil.getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Byte) + ofs)); + Word stateAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(state, ReplacementsUtil.getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Int))); HotSpotBackend.sha2ImplCompressStub(bufAddr, stateAddr); } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHA5Substitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHA5Substitutions.java index ec3e50df965..a8f839e88ec 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHA5Substitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHA5Substitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,16 @@ package org.graalvm.compiler.hotspot.replacements; import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfigBase.INJECTED_METAACCESS; -import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.getArrayBaseOffset; import static org.graalvm.compiler.serviceprovider.GraalServices.Java8OrEarlier; import org.graalvm.compiler.api.replacements.ClassSubstitution; import org.graalvm.compiler.api.replacements.MethodSubstitution; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.hotspot.HotSpotBackend; -import org.graalvm.compiler.hotspot.nodes.ComputeObjectAddressNode; +import org.graalvm.compiler.nodes.ComputeObjectAddressNode; import org.graalvm.compiler.nodes.PiNode; import org.graalvm.compiler.nodes.extended.RawLoadNode; +import org.graalvm.compiler.replacements.ReplacementsUtil; import org.graalvm.compiler.word.Word; import jdk.internal.vm.compiler.word.LocationIdentity; import jdk.internal.vm.compiler.word.WordFactory; @@ -67,8 +67,8 @@ public class SHA5Substitutions { static void implCompress0(Object receiver, byte[] buf, int ofs) { Object realReceiver = PiNode.piCastNonNull(receiver, shaClass); Object state = RawLoadNode.load(realReceiver, stateOffset, JavaKind.Object, LocationIdentity.any()); - Word bufAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(buf, getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Byte) + ofs)); - Word stateAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(state, getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Int))); + Word bufAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(buf, ReplacementsUtil.getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Byte) + ofs)); + Word stateAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(state, ReplacementsUtil.getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Int))); HotSpotBackend.sha5ImplCompressStub(bufAddr, stateAddr); } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHASubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHASubstitutions.java index 979a7f7841b..b99f73d1ac6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHASubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/SHASubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,16 @@ package org.graalvm.compiler.hotspot.replacements; import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfigBase.INJECTED_METAACCESS; -import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.getArrayBaseOffset; import static org.graalvm.compiler.serviceprovider.GraalServices.Java8OrEarlier; import org.graalvm.compiler.api.replacements.ClassSubstitution; import org.graalvm.compiler.api.replacements.MethodSubstitution; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.hotspot.HotSpotBackend; -import org.graalvm.compiler.hotspot.nodes.ComputeObjectAddressNode; +import org.graalvm.compiler.nodes.ComputeObjectAddressNode; import org.graalvm.compiler.nodes.PiNode; import org.graalvm.compiler.nodes.extended.RawLoadNode; +import org.graalvm.compiler.replacements.ReplacementsUtil; import org.graalvm.compiler.word.Word; import jdk.internal.vm.compiler.word.LocationIdentity; import jdk.internal.vm.compiler.word.WordFactory; @@ -67,8 +67,8 @@ public class SHASubstitutions { static void implCompress0(Object receiver, byte[] buf, int ofs) { Object realReceiver = PiNode.piCastNonNull(receiver, shaClass); Object state = RawLoadNode.load(realReceiver, stateOffset, JavaKind.Object, LocationIdentity.any()); - Word bufAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(buf, getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Byte) + ofs)); - Word stateAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(state, getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Int))); + Word bufAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(buf, ReplacementsUtil.getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Byte) + ofs)); + Word stateAddr = WordFactory.unsigned(ComputeObjectAddressNode.get(state, ReplacementsUtil.getArrayBaseOffset(INJECTED_METAACCESS, JavaKind.Int))); HotSpotBackend.shaImplCompressStub(bufAddr, stateAddr); } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/StringToBytesSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/StringToBytesSnippets.java index 1aa4642676b..b1c4a791e13 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/StringToBytesSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/StringToBytesSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ThreadSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ThreadSubstitutions.java index b8ea013b0d7..0b14e220177 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ThreadSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/ThreadSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/TypeCheckSnippetUtils.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/TypeCheckSnippetUtils.java index 49c1e5e1ade..66489eacad4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/TypeCheckSnippetUtils.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/TypeCheckSnippetUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/UnsafeAccess.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/UnsafeAccess.java index 057adc2c09e..1d0c12be933 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/UnsafeAccess.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/UnsafeAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/UnsafeLoadSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/UnsafeLoadSnippets.java index 02856d2a7e4..a2321169fe4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/UnsafeLoadSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/UnsafeLoadSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/WriteBarrierSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/WriteBarrierSnippets.java index 3f347b38fec..79e4354a48f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/WriteBarrierSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/WriteBarrierSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -328,7 +328,7 @@ public class WriteBarrierSnippets implements Snippets { Word bufferAddress = thread.readWord(g1SATBQueueBufferOffset(INJECTED_VMCONFIG)); Word indexAddress = thread.add(g1SATBQueueIndexOffset(INJECTED_VMCONFIG)); long indexValue = indexAddress.readWord(0).rawValue(); - final int scale = HotSpotReplacementsUtil.arrayIndexScale(INJECTED_METAACCESS, JavaKind.Object); + final int scale = ReplacementsUtil.arrayIndexScale(INJECTED_METAACCESS, JavaKind.Object); long start = getPointerToFirstArrayElement(address, length, elementStride); for (int i = 0; i < length; i++) { @@ -435,15 +435,22 @@ public class WriteBarrierSnippets implements Snippets { private final CompressEncoding oopEncoding; private final Counters counters; private final boolean verifyBarrier; + private final long gcTotalCollectionsAddress; public Templates(OptionValues options, Iterable factories, Group.Factory factory, HotSpotProviders providers, TargetDescription target, GraalHotSpotVMConfig config) { super(options, factories, providers, providers.getSnippetReflection(), target); this.oopEncoding = config.useCompressedOops ? config.getOopEncoding() : null; this.verifyBarrier = ReplacementsUtil.REPLACEMENTS_ASSERTIONS_ENABLED || config.verifyBeforeGC || config.verifyAfterGC; + this.gcTotalCollectionsAddress = config.gcTotalCollectionsAddress(); this.counters = new Counters(factory); } + public boolean traceBarrier(StructuredGraph graph) { + long startCycle = GraalOptions.GCDebugStartCycle.getValue(graph.getOptions()); + return startCycle > 0 && ((Pointer) WordFactory.pointer(gcTotalCollectionsAddress)).readLong(0) > startCycle; + } + public void lower(SerialWriteBarrier writeBarrier, LoweringTool tool) { Arguments args; if (writeBarrier.usePrecise()) { @@ -588,12 +595,6 @@ public class WriteBarrierSnippets implements Snippets { } } - public static boolean traceBarrier(StructuredGraph graph) { - return GraalOptions.GCDebugStartCycle.getValue(graph.getOptions()) > 0 && - ((int) ((Pointer) WordFactory.pointer(HotSpotReplacementsUtil.gcTotalCollectionsAddress(INJECTED_VMCONFIG))).readLong(0) > GraalOptions.GCDebugStartCycle.getValue( - graph.getOptions())); - } - /** * Validation helper method which performs sanity checks on write operations. The addresses of * both the object and the value being written are checked in order to determine if they reside diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/aot/ResolveConstantSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/aot/ResolveConstantSnippets.java index 23aad1eb2dc..744c7a13c35 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/aot/ResolveConstantSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/aot/ResolveConstantSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/HotSpotArraycopySnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/HotSpotArraycopySnippets.java new file mode 100644 index 00000000000..6d5f9f7729a --- /dev/null +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/HotSpotArraycopySnippets.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + + +package org.graalvm.compiler.hotspot.replacements.arraycopy; + +import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfigBase.INJECTED_VMCONFIG; + +import org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil; +import org.graalvm.compiler.hotspot.word.KlassPointer; +import org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets; +import org.graalvm.compiler.word.Word; +import jdk.internal.vm.compiler.word.Pointer; +import jdk.internal.vm.compiler.word.WordFactory; + +public class HotSpotArraycopySnippets extends ArrayCopySnippets { + + @Override + public Pointer loadHub(Object nonNullSrc) { + return HotSpotReplacementsUtil.loadHub(nonNullSrc).asWord(); + } + + @Override + public Word getSuperCheckOffset(Pointer destElemKlass) { + return WordFactory.signed(destElemKlass.readInt(HotSpotReplacementsUtil.superCheckOffsetOffset(INJECTED_VMCONFIG), HotSpotReplacementsUtil.KLASS_SUPER_CHECK_OFFSET_LOCATION)); + } + + @Override + public int getReadLayoutHelper(Pointer srcHub) { + return HotSpotReplacementsUtil.readLayoutHelper(KlassPointer.fromWord(srcHub)); + } + + @Override + public Pointer getDestElemClass(Pointer destKlassPointer) { + KlassPointer destKlass = (KlassPointer.fromWord(destKlassPointer)); + return destKlass.readKlassPointer(HotSpotReplacementsUtil.arrayClassElementOffset(INJECTED_VMCONFIG), + HotSpotReplacementsUtil.OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION).asWord(); + } + + @Override + protected int heapWordSize() { + return HotSpotReplacementsUtil.getHeapWordSize(INJECTED_VMCONFIG); + } +} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/profiling/ProbabilisticProfileSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/profiling/ProbabilisticProfileSnippets.java index 55f7dbbbb66..92c7ecf5e4e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/profiling/ProbabilisticProfileSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/profiling/ProbabilisticProfileSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/profiling/ProfileSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/profiling/ProfileSnippets.java index da2eae7c703..eb21133f0aa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/profiling/ProfileSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/profiling/ProfileSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ArrayStoreExceptionStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ArrayStoreExceptionStub.java index 789c2d17d8f..2807f6e36c9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ArrayStoreExceptionStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ArrayStoreExceptionStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ClassCastExceptionStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ClassCastExceptionStub.java index f2b59609f22..56717ddb50e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ClassCastExceptionStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ClassCastExceptionStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/CreateExceptionStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/CreateExceptionStub.java index b8ff1ccba35..f97dcfb3e5d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/CreateExceptionStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/CreateExceptionStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/DivisionByZeroExceptionStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/DivisionByZeroExceptionStub.java index 4f8bac69e91..790e960e2e1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/DivisionByZeroExceptionStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/DivisionByZeroExceptionStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ExceptionHandlerStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ExceptionHandlerStub.java index 7a9c4fd724c..aa4c26ef07a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ExceptionHandlerStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ExceptionHandlerStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ForeignCallStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ForeignCallStub.java index 94ffbe2b31f..f82bbcb94ba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ForeignCallStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/ForeignCallStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/NullPointerExceptionStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/NullPointerExceptionStub.java index 9dc25a6747e..4bce2ce116e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/NullPointerExceptionStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/NullPointerExceptionStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/SnippetStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/SnippetStub.java index 0ed4d5a3530..8b8f395f9fa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/SnippetStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/SnippetStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/Stub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/Stub.java index dcb2ed8e071..63c2f010044 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/Stub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/Stub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubCompilationIdentifier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubCompilationIdentifier.java index 9bffb9fcc2a..d2c5c4f934a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubCompilationIdentifier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubCompilationIdentifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubOptions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubOptions.java index bae8b7b9eb0..8e7deb6bb17 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubOptions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubUtil.java index 4dea8a85912..c608924db44 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/StubUtil.java @@ -271,11 +271,6 @@ public class StubUtil { return config.verifyOopBits; } - @Fold - static int hubOffset(@InjectedParameter GraalHotSpotVMConfig config) { - return config.hubOffset; - } - /** * Print {@code number} as decimal string to {@code buffer}. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/UnwindExceptionToCallerStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/UnwindExceptionToCallerStub.java index 8f24039e67d..3a9eb15a107 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/UnwindExceptionToCallerStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/UnwindExceptionToCallerStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/VerifyOopStub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/VerifyOopStub.java index 645e769d398..acd281f50b3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/VerifyOopStub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/stubs/VerifyOopStub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/HotSpotOperation.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/HotSpotOperation.java index 15637c67488..1d7e76dcbd6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/HotSpotOperation.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/HotSpotOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/HotSpotWordTypes.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/HotSpotWordTypes.java index 0d66955cac2..3ae70a18406 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/HotSpotWordTypes.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/HotSpotWordTypes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/KlassPointer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/KlassPointer.java index 23b1a74c28e..95345f94c86 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/KlassPointer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/KlassPointer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MetaspacePointer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MetaspacePointer.java index 811edc36f58..ecbbeb1323d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MetaspacePointer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MetaspacePointer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MethodCountersPointer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MethodCountersPointer.java index f1850a577a8..b0d7de4c55c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MethodCountersPointer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MethodCountersPointer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MethodPointer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MethodPointer.java index acfed8c3197..0775933e24b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MethodPointer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/MethodPointer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/PointerCastNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/PointerCastNode.java index f58c29aefce..322b4ffb923 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/PointerCastNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/word/PointerCastNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BciBlockMapping.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BciBlockMapping.java index 08c112ead14..d2e905c96db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BciBlockMapping.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BciBlockMapping.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -75,6 +75,9 @@ import static org.graalvm.compiler.bytecode.Bytecodes.JSR; import static org.graalvm.compiler.bytecode.Bytecodes.JSR_W; import static org.graalvm.compiler.bytecode.Bytecodes.LALOAD; import static org.graalvm.compiler.bytecode.Bytecodes.LASTORE; +import static org.graalvm.compiler.bytecode.Bytecodes.LDC; +import static org.graalvm.compiler.bytecode.Bytecodes.LDC2_W; +import static org.graalvm.compiler.bytecode.Bytecodes.LDC_W; import static org.graalvm.compiler.bytecode.Bytecodes.LDIV; import static org.graalvm.compiler.bytecode.Bytecodes.LOOKUPSWITCH; import static org.graalvm.compiler.bytecode.Bytecodes.LREM; @@ -688,7 +691,10 @@ public final class BciBlockMapping { case PUTSTATIC: case GETSTATIC: case PUTFIELD: - case GETFIELD: { + case GETFIELD: + case LDC: + case LDC_W: + case LDC2_W: { /* * All bytecodes that can trigger lazy class initialization via a * ClassInitializationPlugin (allocations, static field access) must be listed diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java index a4743574178..482d12a5183 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java @@ -245,7 +245,6 @@ import static org.graalvm.compiler.core.common.GraalOptions.DeoptALot; import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC; import static org.graalvm.compiler.core.common.GraalOptions.HotSpotPrintInlining; import static org.graalvm.compiler.core.common.GraalOptions.PrintProfilingInformation; -import static org.graalvm.compiler.core.common.GraalOptions.ResolveClassBeforeStaticInvoke; import static org.graalvm.compiler.core.common.GraalOptions.StressExplicitExceptionCode; import static org.graalvm.compiler.core.common.GraalOptions.StressInvokeWithExceptionNode; import static org.graalvm.compiler.core.common.type.StampFactory.objectNonNull; @@ -267,6 +266,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.Formatter; import java.util.List; +import java.util.function.Supplier; import jdk.internal.vm.compiler.collections.EconomicMap; import jdk.internal.vm.compiler.collections.Equivalence; @@ -867,7 +867,7 @@ public class BytecodeParser implements GraphBuilderContext { ProfilingPlugin profilingPlugin = this.graphBuilderConfig.getPlugins().getProfilingPlugin(); if (profilingPlugin != null && profilingPlugin.shouldProfile(this, method)) { - FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); + FrameState stateBefore = createCurrentFrameState(); profilingPlugin.profileInvoke(this, method, stateBefore); } @@ -1251,7 +1251,7 @@ public class BytecodeParser implements GraphBuilderContext { protected void genGoto() { ProfilingPlugin profilingPlugin = this.graphBuilderConfig.getPlugins().getProfilingPlugin(); if (profilingPlugin != null && profilingPlugin.shouldProfile(this, method)) { - FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); + FrameState stateBefore = createCurrentFrameState(); int targetBci = currentBlock.getSuccessor(0).startBci; profilingPlugin.profileGoto(this, method, bci(), targetBci, stateBefore); } @@ -1447,27 +1447,35 @@ public class BytecodeParser implements GraphBuilderContext { if (callTargetIsResolved(target)) { ResolvedJavaMethod resolvedTarget = (ResolvedJavaMethod) target; ResolvedJavaType holder = resolvedTarget.getDeclaringClass(); - if (!holder.isInitialized() && ResolveClassBeforeStaticInvoke.getValue(options)) { + maybeEagerlyInitialize(holder); + ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin(); + if (!holder.isInitialized() && classInitializationPlugin == null) { handleUnresolvedInvoke(target, InvokeKind.Static); - } else { - ValueNode classInit = null; - ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin(); - if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedTarget.getDeclaringClass())) { - FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); - classInit = classInitializationPlugin.apply(this, resolvedTarget.getDeclaringClass(), stateBefore); - } + return; + } - ValueNode[] args = frameState.popArguments(resolvedTarget.getSignature().getParameterCount(false)); - Invoke invoke = appendInvoke(InvokeKind.Static, resolvedTarget, args); - if (invoke != null) { - invoke.setClassInit(classInit); - } + ValueNode[] classInit = {null}; + if (classInitializationPlugin != null) { + classInitializationPlugin.apply(this, resolvedTarget.getDeclaringClass(), this::createCurrentFrameState, classInit); + } + + ValueNode[] args = frameState.popArguments(resolvedTarget.getSignature().getParameterCount(false)); + Invoke invoke = appendInvoke(InvokeKind.Static, resolvedTarget, args); + if (invoke != null && classInit[0] != null) { + invoke.setClassInit(classInit[0]); } } else { handleUnresolvedInvoke(target, InvokeKind.Static); } } + /** + * Creates a frame state for the current parse position. + */ + private FrameState createCurrentFrameState() { + return frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); + } + protected void genInvokeInterface(int cpi, int opcode) { JavaMethod target = lookupMethod(cpi, opcode); genInvokeInterface(target); @@ -1543,7 +1551,7 @@ public class BytecodeParser implements GraphBuilderContext { invokeDynamicPlugin.recordDynamicMethod(this, cpi, opcode, target); // Will perform runtime type checks and static initialization - FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); + FrameState stateBefore = createCurrentFrameState(); appendixNode = invokeDynamicPlugin.genAppendixNode(this, cpi, opcode, appendix, stateBefore); } else { appendixNode = ConstantNode.forConstant(appendix, metaAccess, graph); @@ -3353,7 +3361,7 @@ public class BytecodeParser implements GraphBuilderContext { FrameState stateBefore = null; ProfilingPlugin profilingPlugin = this.graphBuilderConfig.getPlugins().getProfilingPlugin(); if (profilingPlugin != null && profilingPlugin.shouldProfile(this, method)) { - stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); + stateBefore = createCurrentFrameState(); } // Remove a logic negation node. @@ -3497,7 +3505,7 @@ public class BytecodeParser implements GraphBuilderContext { BciBlock successorBlock = nextBlock.successors.get(0); ProfilingPlugin profilingPlugin = graphBuilderConfig.getPlugins().getProfilingPlugin(); if (profilingPlugin != null && profilingPlugin.shouldProfile(this, method)) { - FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); + FrameState stateBefore = createCurrentFrameState(); profilingPlugin.profileGoto(this, method, bci(), successorBlock.startBci, stateBefore); } appendGoto(successorBlock); @@ -3505,7 +3513,7 @@ public class BytecodeParser implements GraphBuilderContext { } else { ProfilingPlugin profilingPlugin = graphBuilderConfig.getPlugins().getProfilingPlugin(); if (profilingPlugin != null && profilingPlugin.shouldProfile(this, method)) { - FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); + FrameState stateBefore = createCurrentFrameState(); profilingPlugin.profileGoto(this, method, bci(), nextBlock.startBci, stateBefore); } appendGoto(nextBlock); @@ -4025,6 +4033,12 @@ public class BytecodeParser implements GraphBuilderContext { } } + protected void maybeEagerlyInitialize(ResolvedJavaType resolvedType) { + if (!resolvedType.isInitialized() && eagerInitializing) { + initialize(resolvedType); + } + } + private JavaTypeProfile getProfileForTypeCheck(TypeReference type) { if (parsingIntrinsic() || profilingInfo == null || !optimisticOpts.useTypeCheckHints(getOptions()) || type.isExact()) { return null; @@ -4182,6 +4196,8 @@ public class BytecodeParser implements GraphBuilderContext { return; } + maybeEagerlyInitialize(resolvedType); + ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin(); if (!resolvedType.isInitialized() && classInitializationPlugin == null) { handleIllegalNewInstance(resolvedType); @@ -4198,9 +4214,8 @@ public class BytecodeParser implements GraphBuilderContext { } } - if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedType)) { - FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); - classInitializationPlugin.apply(this, resolvedType, stateBefore); + if (classInitializationPlugin != null) { + classInitializationPlugin.apply(this, resolvedType, this::createCurrentFrameState); } for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) { @@ -4272,9 +4287,8 @@ public class BytecodeParser implements GraphBuilderContext { private void genNewObjectArray(ResolvedJavaType resolvedType) { ClassInitializationPlugin classInitializationPlugin = this.graphBuilderConfig.getPlugins().getClassInitializationPlugin(); - if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedType.getArrayClass())) { - FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); - classInitializationPlugin.apply(this, resolvedType.getArrayClass(), stateBefore); + if (classInitializationPlugin != null) { + classInitializationPlugin.apply(this, resolvedType.getArrayClass(), this::createCurrentFrameState); } ValueNode length = frameState.pop(JavaKind.Int); @@ -4308,9 +4322,8 @@ public class BytecodeParser implements GraphBuilderContext { private void genNewMultiArray(ResolvedJavaType resolvedType, int rank, ValueNode[] dims) { ClassInitializationPlugin classInitializationPlugin = this.graphBuilderConfig.getPlugins().getClassInitializationPlugin(); - if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedType)) { - FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); - classInitializationPlugin.apply(this, resolvedType, stateBefore); + if (classInitializationPlugin != null) { + classInitializationPlugin.apply(this, resolvedType, this::createCurrentFrameState); } for (int i = rank - 1; i >= 0; i--) { @@ -4495,10 +4508,11 @@ public class BytecodeParser implements GraphBuilderContext { return; } + ResolvedJavaType holder = resolvedField.getDeclaringClass(); + maybeEagerlyInitialize(holder); ClassInitializationPlugin classInitializationPlugin = this.graphBuilderConfig.getPlugins().getClassInitializationPlugin(); - if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedField.getDeclaringClass())) { - FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null); - classInitializationPlugin.apply(this, resolvedField.getDeclaringClass(), stateBefore); + if (classInitializationPlugin != null) { + classInitializationPlugin.apply(this, holder, this::createCurrentFrameState); } for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) { @@ -4573,12 +4587,17 @@ public class BytecodeParser implements GraphBuilderContext { } ClassInitializationPlugin classInitializationPlugin = this.graphBuilderConfig.getPlugins().getClassInitializationPlugin(); - if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedField.getDeclaringClass())) { - JavaKind[] pushedSlotKinds = {field.getJavaKind()}; - ValueNode[] pushedValues = {value}; - FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, pushedSlotKinds, pushedValues); - assert stackSizeBefore == stateBefore.stackSize(); - classInitializationPlugin.apply(this, resolvedField.getDeclaringClass(), stateBefore); + ResolvedJavaType holder = resolvedField.getDeclaringClass(); + maybeEagerlyInitialize(holder); + if (classInitializationPlugin != null) { + Supplier stateBefore = () -> { + JavaKind[] pushedSlotKinds = {field.getJavaKind()}; + ValueNode[] pushedValues = {value}; + FrameState fs = frameState.create(bci(), getNonIntrinsicAncestor(), false, pushedSlotKinds, pushedValues); + assert stackSizeBefore == fs.stackSize(); + return fs; + }; + classInitializationPlugin.apply(this, holder, stateBefore); } for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParserOptions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParserOptions.java index 5a92aa316d3..1488018e423 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParserOptions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParserOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/ComputeLoopFrequenciesClosure.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/ComputeLoopFrequenciesClosure.java index 40a822dbd35..0806ac4633a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/ComputeLoopFrequenciesClosure.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/ComputeLoopFrequenciesClosure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/DefaultSuitesCreator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/DefaultSuitesCreator.java index 2bbf54c9862..f013fa6057d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/DefaultSuitesCreator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/DefaultSuitesCreator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/FrameStateBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/FrameStateBuilder.java index 0d8eb8671e7..e8ce0f54131 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/FrameStateBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/FrameStateBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/GraphBuilderPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/GraphBuilderPhase.java index 8f2aae3ac7a..97e3d097ceb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/GraphBuilderPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/GraphBuilderPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/JsrNotSupportedBailout.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/JsrNotSupportedBailout.java index 00654228164..a7d4b0da558 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/JsrNotSupportedBailout.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/JsrNotSupportedBailout.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/JsrScope.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/JsrScope.java index 9c557831f80..2b1f4421c7b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/JsrScope.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/JsrScope.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LargeLocalLiveness.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LargeLocalLiveness.java index 64de1f1d9a0..b8464ce8fbc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LargeLocalLiveness.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LargeLocalLiveness.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LocalLiveness.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LocalLiveness.java index 42bfaab389d..21e517fe45e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LocalLiveness.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/LocalLiveness.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/SmallLocalLiveness.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/SmallLocalLiveness.java index 3b04012d982..a4dd95cc541 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/SmallLocalLiveness.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/SmallLocalLiveness.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/SuitesProviderBase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/SuitesProviderBase.java index 9e0455b44bd..b969049a9d4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/SuitesProviderBase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/SuitesProviderBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/JTTTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/JTTTest.java index 4e6fc423462..2ac20e6abf4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/JTTTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/JTTTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/ConstantPhiTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/ConstantPhiTest.java index 7a8e3506f88..34b0ac80bbd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/ConstantPhiTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/ConstantPhiTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/EmptyMethodTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/EmptyMethodTest.java index 3bad097e6cb..cfe56ed9bc1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/EmptyMethodTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/EmptyMethodTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/LargeConstantSectionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/LargeConstantSectionTest.java index 99ae7c9fe59..81caf50da98 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/LargeConstantSectionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/backend/LargeConstantSectionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aaload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aaload.java index 764cb439cc0..8be35e0459c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aaload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aaload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aaload_1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aaload_1.java index 48dc5a3f404..c86f9dae62f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aaload_1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aaload_1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aastore.java index 96d82ba5aaf..69d3911ef51 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_0.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_0.java index 419b91fa23a..a90a42c2fdc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_0.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_0.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_1.java index b1203b1898d..94ba61bc487 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_2.java index 98b666347f2..a79bdd9eb10 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_3.java index 72de244e2d9..37023618f52 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_aload_3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_anewarray.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_anewarray.java index 5b7863cceb8..87fb022b246 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_anewarray.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_anewarray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_areturn.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_areturn.java index 7d4f0d4b0ef..9b6fac0d8c3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_areturn.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_areturn.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_arraylength.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_arraylength.java index c9af24ba3a2..6c8a9821565 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_arraylength.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_arraylength.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_athrow.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_athrow.java index 0d34db65f58..fc169cb14ff 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_athrow.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_athrow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_baload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_baload.java index 00fbd500091..fc2561adf1f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_baload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_baload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_bastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_bastore.java index ace5d6c0517..78078c17b48 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_bastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_bastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_caload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_caload.java index fc2e34cecb8..a76d93e9e78 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_caload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_caload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_castore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_castore.java index 337304e200c..b31a6feda64 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_castore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_castore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast01.java index f048193b937..2924a9e2457 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast02.java index 12ae47fd378..47f644b4925 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast03.java index 53c63b3e6fd..1527c232d46 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_checkcast03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2f.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2f.java index 8b5ebe9b684..bcdaa87d0ee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2f.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2f.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2i01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2i01.java index 5a6962fb868..6350996a5b3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2i01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2i01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2i02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2i02.java index 179e18542e3..18664491823 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2i02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2i02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l01.java index 43c15772bff..d4597c5591d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l02.java index 69c79ac59ba..431a147232e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l03.java index 8ca919be19a..4419ce4a188 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_d2l03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dadd.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dadd.java index 7e4fcd28845..b57311ece2b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dadd.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dadd.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_daload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_daload.java index 36f2273e8f6..acc65dd90c6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_daload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_daload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dastore.java index 704a9054199..85f250d2d45 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp01.java index e7800af0399..cfa6cafaa1d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp02.java index 3ba5c3bebb0..06149edfa23 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp03.java index 30ff7e42190..9033451b4a7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp04.java index f1932f41f71..9153d3e54ed 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp05.java index 3a70d1a388f..c37669904a1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp06.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp06.java index b2ad49118e4..73cc657afec 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp06.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp06.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp07.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp07.java index edd61fb59ed..9acdab01418 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp07.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp07.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp08.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp08.java index 4da0fb7c5e0..d8f26447eab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp08.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp08.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp09.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp09.java index 23fe0e1ac4a..111967844c2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp09.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp09.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp10.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp10.java index 0440214b838..f1c58c9055f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp10.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dcmp10.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ddiv.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ddiv.java index e4c0196d5bf..bc9d2751609 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ddiv.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ddiv.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dmul.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dmul.java index ca3d979983f..6b3bd79bdb1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dmul.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dmul.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dneg.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dneg.java index b0ce439c366..cd5b5688304 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dneg.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dneg.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dneg2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dneg2.java index 10f0e8f3680..7e21984fbbf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dneg2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dneg2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_double_base.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_double_base.java index e6a02c3431b..9eb29366c5c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_double_base.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_double_base.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_drem.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_drem.java index f45392b7348..8f9ba83590a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_drem.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_drem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dreturn.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dreturn.java index 9ffce52230d..9e32e97653e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dreturn.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dreturn.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dsub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dsub.java index 645e89dc731..7f911b6cfd3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dsub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dsub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dsub2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dsub2.java index 56be29bd406..db724be49c0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dsub2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_dsub2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2d.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2d.java index 88a2a11204c..c44d8fbc4e1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2d.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2d.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2i01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2i01.java index 91b63c36264..51cb93cef39 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2i01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2i01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2i02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2i02.java index df069868adc..312ee43194f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2i02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2i02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2l01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2l01.java index ddb2188f5ff..bcae47f2b62 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2l01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2l01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2l02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2l02.java index 9a97b5132f9..a83cb28c445 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2l02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_f2l02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fadd.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fadd.java index b86d5b99f35..862aa330876 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fadd.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fadd.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_faload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_faload.java index 981bff4c4ae..d0b4f389a7b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_faload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_faload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fastore.java index e93bf8184c4..cd0c256af99 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp01.java index ab21a2013b0..356257950bc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp02.java index 874fa2da1ef..bfb54d53fe9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp03.java index e4c5d736133..02f742d44b2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp04.java index cd64e7738f5..005cd4b273c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp05.java index 4a24f6a3d7f..c1b0981de86 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp06.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp06.java index 987cb231233..78e2c881856 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp06.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp06.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp07.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp07.java index a0d461c385d..b7574799b76 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp07.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp07.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp08.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp08.java index f1dd5b86fab..790d5d242a2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp08.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp08.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp09.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp09.java index 3e6be8e6ace..83a1af33189 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp09.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp09.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp10.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp10.java index f5bdbd06ab1..ae86c07af9a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp10.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fcmp10.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fdiv.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fdiv.java index a3a6b26b3b6..684203d72c6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fdiv.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fdiv.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fload.java index 1b491dd08bd..e2e379b96a4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fload_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fload_2.java index 0a6c760a7ce..a2f8c10f367 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fload_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fload_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_float_base.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_float_base.java index 2a0c71e5b04..30d10f8d213 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_float_base.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_float_base.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fmul.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fmul.java index 4a913c9f49b..a757ec57bdf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fmul.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fmul.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fneg.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fneg.java index 70f4a66194c..2d31db5327d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fneg.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fneg.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_frem.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_frem.java index 808f44495f9..773a841ba30 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_frem.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_frem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_freturn.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_freturn.java index 4182f1149e7..173adb28b04 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_freturn.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_freturn.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fsub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fsub.java index 00dd23c5393..16fd1363255 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fsub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_fsub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield.java index 82fac469ae6..90dab87a32f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_b.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_b.java index 37a792eaece..263512bcd2d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_b.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_b.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_c.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_c.java index 57905ac8f50..22e284fe519 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_c.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_c.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_d.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_d.java index e92ad53b0f1..ddebf6a7160 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_d.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_d.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_f.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_f.java index b2b9850c9db..5ad956f9074 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_f.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_f.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_i.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_i.java index 109506a21d1..937a02e71ea 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_i.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_i.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_l.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_l.java index 2476af496f3..4ad5631df74 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_l.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_l.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_o.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_o.java index 60b0a05a2cd..2e179018a02 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_o.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_o.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_s.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_s.java index 9570578bb21..4cb0c88830b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_s.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_s.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_z.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_z.java index 58b687d5d27..8b5c1da4b1e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_z.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getfield_z.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_b.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_b.java index b1f63336513..5fcba41d4f1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_b.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_b.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_c.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_c.java index 6246cad6ed9..c8c9115d304 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_c.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_c.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_d.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_d.java index 8aac1acd1fe..fccab327398 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_d.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_d.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_f.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_f.java index 14603c3fc9e..df860b00c2e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_f.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_f.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_i.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_i.java index 5f37268ac7a..8779cc589aa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_i.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_i.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_l.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_l.java index a59c46dbf70..0def452a811 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_l.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_l.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_s.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_s.java index 04c83c18b9c..b26bf2280a9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_s.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_s.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_z.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_z.java index f3f24a7cf46..ed343bfa9f6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_z.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_getstatic_z.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2b.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2b.java index 8992baa9cb2..97a7552a59b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2b.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2b.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2c.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2c.java index ef0002443fa..01154f76f14 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2c.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2c.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2d.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2d.java index a7f02cf0eae..3a0a708d95d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2d.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2d.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2f.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2f.java index 99e57ad2985..f8042972315 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2f.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2f.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2l.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2l.java index 640942f7370..e30e0ae1c0b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2l.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2l.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2s.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2s.java index 202bb02a9bb..32c17c418c8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2s.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_i2s.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd.java index cf1b0f0097a..651f32a8fec 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd2.java index 33497372d39..7b394f84151 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd3.java index 9439668bd9a..0ca536c28d3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const0.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const0.java index 85bd3c08eaf..bc4290e6acd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const0.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const0.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const1.java index b5c57d7e82a..21d67bcefd0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const2.java index 00b911b8b04..584677b8a00 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const3.java index f5d1b0fcf6d..77dc3a84f71 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iadd_const3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iaload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iaload.java index c83ae593f8c..b44927ed3b8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iaload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iaload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iand.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iand.java index dff3582860c..a746bbda8d0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iand.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iand.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iastore.java index a47a887f324..fd7d2d3195a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iconst.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iconst.java index 27752370024..32dd6f3cd9d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iconst.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iconst.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv.java index 17c2c42d2b7..e9fbfe0370b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv2.java index 5b5930420a9..799aab935bf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv_overflow.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv_overflow.java index 14df63bae17..91880e7e147 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv_overflow.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_idiv_overflow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq.java index 7e8b6e13408..2725dde312d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq_2.java index b53ad902736..6ed2dbbc27f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq_3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq_3.java index 5242e7917c9..45f37777a8e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq_3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifeq_3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge.java index 9418b7f0090..f48da792202 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge_2.java index 0bada01329a..072815725df 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge_3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge_3.java index a8dc8e4a3f4..253b2a02528 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge_3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifge_3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifgt.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifgt.java index e3a9d452bf1..81c665c8637 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifgt.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifgt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmplt1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmplt1.java index 2c4881bd812..a36b4696bff 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmplt1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmplt1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmplt2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmplt2.java index 11512caab6f..c5b6de55901 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmplt2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmplt2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmpne1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmpne1.java index 5c5af8bc254..9a3356e6d9f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmpne1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmpne1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmpne2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmpne2.java index ec19ef68e63..9cafc2efba7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmpne2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ificmpne2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifle.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifle.java index 2da5fc265a1..1eb98e7a8bc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifle.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iflt.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iflt.java index fe4bce03f25..ca27ad0cbe4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iflt.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iflt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifne.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifne.java index 1921eab6f7b..1850b5ad231 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifne.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifne.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull.java index f994b4e2a61..30e749478d3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull_2.java index 5730b486bcc..165e856a871 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull_3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull_3.java index 4ced1222bf4..2da9f300597 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull_3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnonnull_3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull.java index e9c9c337ffa..f0e53f47127 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull_2.java index d9f6fc500a7..2fce95c3a2f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull_3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull_3.java index 19987062884..68c0315c0af 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull_3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ifnull_3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_1.java index 5302a9f416a..32ece8a43a3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_2.java index f23275d2720..efafe5aa8cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_3.java index 0856474204d..b2fc809d48e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_4.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_4.java index e7b82c50ba3..98c4f91d8d6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_4.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iinc_4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0.java index 49a01c7557b..1a8a6ab6255 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0_1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0_1.java index 04333863dd3..e216d3cc59d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0_1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0_1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0_2.java index 59d8364d239..7f37745b38b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_0_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_1.java index 3aed792a7b4..fc6b39526bc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_1_1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_1_1.java index b2fff32c32b..21c5bcd3dd8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_1_1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_1_1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_2.java index a133456a8c2..68fd09b4e28 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_3.java index 625bc60c670..1d8cb258a2c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iload_3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_imul.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_imul.java index c4af5e9b55a..aa4dd08aa56 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_imul.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_imul.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ineg.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ineg.java index a78c2c4dceb..485f067a4d9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ineg.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ineg.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_instanceof.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_instanceof.java index 6bc4270cdf7..20dd652fea0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_instanceof.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_instanceof.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_instanceof01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_instanceof01.java index 1b03cfc3e34..8eba7aecdc6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_instanceof01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_instanceof01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokeinterface.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokeinterface.java index 611a7350419..bb83d3bff42 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokeinterface.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokeinterface.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokespecial.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokespecial.java index b3e3f901051..6d6b54634ad 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokespecial.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokespecial.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokespecial2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokespecial2.java index e3af6d98829..366e36e3bbc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokespecial2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokespecial2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokestatic.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokestatic.java index 7ffd1f4e1ca..eb8a948907b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokestatic.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokestatic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokevirtual.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokevirtual.java index 98565250814..440af207e49 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokevirtual.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_invokevirtual.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ior.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ior.java index 4f76ef12971..6f8b098537f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ior.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ior.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem.java index 0de41d484ef..48d591df315 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem2.java index 0b5ddb2bbc6..e49e76449e0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem3.java index 5a47d48956d..8c9e1a166e7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem4.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem4.java index 91dc2376e99..e1880df3e6b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem4.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_irem4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ireturn.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ireturn.java index 9b257623ad3..ef4c479a4db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ireturn.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ireturn.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ishl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ishl.java index 083b73b4a1b..4681ebd05fa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ishl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ishl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ishr.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ishr.java index 7d7ea479032..fb555f1eb19 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ishr.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ishr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_isub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_isub.java index 9933c85f290..53e56e6c3e5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_isub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_isub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iushr.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iushr.java index 4bf6d48fcf7..36f8e7b8e68 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iushr.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_iushr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ixor.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ixor.java index 13de2ef3281..c3efd80712e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ixor.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ixor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2d.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2d.java index eaa08129227..d8e25c13ab2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2d.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2d.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2f.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2f.java index aaaab93d8c6..6d6669851bd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2f.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2f.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2i.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2i.java index c53ded3443d..d06b5edcc3d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2i.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2i.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2i_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2i_2.java index 947918f63d9..8674ba013f3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2i_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_l2i_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ladd.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ladd.java index 3564d0325ef..1bfdddb1d5f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ladd.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ladd.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ladd2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ladd2.java index dfe0eac5067..91f402d7084 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ladd2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ladd2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_laload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_laload.java index 65f023f4fdf..89f28ebede6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_laload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_laload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_land.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_land.java index ea1d21f81f3..afcc0fc80cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_land.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_land.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lastore.java index 16d6ae34d5b..84eb950037b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lcmp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lcmp.java index b2e160de9ef..5afdbf85356 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lcmp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lcmp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_01.java index a4ebf8d2637..e73222ffb2c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_02.java index 7fd7af3ed0f..f1425b67a00 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_03.java index 1ad997fccfe..8a6bce86e43 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_04.java index a5fa3ab589f..3c147b1e923 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_05.java index 1f243936038..d26114ad11f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_06.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_06.java index 6a62e433eca..d3cf325b1a6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_06.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldc_06.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv.java index 0d19f431cc8..f0e05a665aa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv2.java index 2b79a7374ef..9cc645008fa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv3.java index 84f06832c12..d8c3911d260 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv_overflow.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv_overflow.java index 37c58f397de..0d1ba85e347 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv_overflow.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_ldiv_overflow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_0.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_0.java index 23f7366a0a4..2efed49827a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_0.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_0.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_01.java index 60783452dcc..a1c5e52cac3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_1.java index 3948398285e..41cfd00b867 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_2.java index 10ddf1be3b5..9917ba7bc14 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_3.java index 30c4c13795c..39410b3c1e1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lload_3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lmul.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lmul.java index 71b3b8b2a9d..46c4f5f1ab1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lmul.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lmul.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lneg.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lneg.java index f9d9d2a9728..cb33fad5c1b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lneg.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lneg.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch01.java index 0e89d3f89ac..cbc0ebbb6b9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch02.java index 29b98a3a77e..87d571365b4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch03.java index 439999620eb..60072773f18 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch04.java index a46fa8f0226..4296b4b1a2e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch05.java index d3d22b4dd11..729995372e5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lookupswitch05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lor.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lor.java index 2269cc13798..969c5c3d4e8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lor.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lrem.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lrem.java index d6c51d3ec03..a009991de2c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lrem.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lrem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lrem2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lrem2.java index 0f0ac26ae26..9d48d3b8ee4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lrem2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lrem2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lreturn.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lreturn.java index 92d45a481e9..a8935001fb2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lreturn.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lreturn.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshl.java index 1fb734fde6c..51a550b025a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshr.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshr.java index 235ece68163..04d2e2da2d1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshr.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshr02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshr02.java index 273344926a2..6c075430846 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshr02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lshr02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lsub.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lsub.java index 79497845ebf..c1ca5bfa81e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lsub.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lsub.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lushr.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lushr.java index 85b17ffd438..d4a80e8deaf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lushr.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lushr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lxor.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lxor.java index a9f5dd40a92..102d4f82dbd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lxor.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_lxor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_monitorenter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_monitorenter.java index 970eb6a926e..43d3f1b4597 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_monitorenter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_monitorenter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_monitorenter02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_monitorenter02.java index 7e497526750..259ee230316 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_monitorenter02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_monitorenter02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray01.java index 6b7d54cfed6..c64143226bc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray02.java index a022e231971..6f60cd0c673 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray03.java index bf396163cdf..198694a163c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray04.java index c5d750978c3..005f5629ce2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_multianewarray04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_new.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_new.java index 915c087343f..1e1c11e2f35 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_new.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_new.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_newarray.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_newarray.java index 37b123ab309..8f59b908de6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_newarray.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_newarray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_newarray_02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_newarray_02.java index d168beafe2a..ee01b899d08 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_newarray_02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_newarray_02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_01.java index be7475b7075..7016ff2fc79 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_02.java index 6ed73742b07..5e57eaea2c5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_03.java index c755c99f745..d7bd4a36c44 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_04.java index f4a50bea3eb..3efa526487f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putfield_04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putstatic.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putstatic.java index 2ce8d128a90..1090761721f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putstatic.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_putstatic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_saload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_saload.java index 7c537b10eea..e10a0ca9a38 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_saload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_saload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_sastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_sastore.java index b1ba0c9e127..b5fa2f6b4a1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_sastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_sastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch.java index 19697aebcb4..db8e28d1551 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch2.java index 81df0ef8bde..387eba8c4a1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch3.java index 28f45843b92..3c6e1290a24 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch4.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch4.java index 29160bcc681..5737ce2313d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch4.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_tableswitch4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_wide01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_wide01.java index 9f82187c063..77c6e8b399f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_wide01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_wide01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_wide02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_wide02.java index 6da03661b15..ec3696a97fe 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_wide02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/bytecode/BC_wide02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aaload0.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aaload0.java index cfe4ac07e86..484598542ed 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aaload0.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aaload0.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aaload1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aaload1.java index 3d87ad15812..570641ecf82 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aaload1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aaload1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aastore0.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aastore0.java index 51e2b6b35f8..d65eefaaf38 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aastore0.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aastore0.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aastore1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aastore1.java index e4af2531a6a..7f59dc0f6d5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aastore1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_aastore1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_anewarray.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_anewarray.java index 3f26417e90c..ca455c1e485 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_anewarray.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_anewarray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_arraylength.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_arraylength.java index bc2ba138db0..416f95007cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_arraylength.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_arraylength.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow0.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow0.java index bd6614be43c..729d9db7d15 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow0.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow0.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow1.java index d2eefbadfc9..465f62cc0b0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow2.java index a62571f49fb..507d202fa5c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow3.java index b7e7d4a2ce9..64ff162dd6a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_athrow3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_baload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_baload.java index fad0f6dd259..14c3be2e5f5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_baload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_baload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_bastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_bastore.java index 6f66d2233bc..268d652e302 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_bastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_bastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_caload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_caload.java index 36744c3e729..76bda8bd5e6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_caload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_caload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_castore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_castore.java index 1b221862e50..36dba2fdb85 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_castore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_castore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast.java index f72c4693c02..255acbd4872 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast1.java index a81e1690332..2f272d9e990 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast2.java index 7728c536b5b..f9688897d56 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast3.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast3.java index 67c76ee254f..7acec41cd1b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast3.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast4.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast4.java index e62f55101d4..01c4ed22c7c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast4.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast5.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast5.java index d0c907b9e4b..55e9e1304d1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast5.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast5.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast6.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast6.java index ff2359e59d5..0b7a78220c3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast6.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_checkcast6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_daload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_daload.java index a792d29b5e7..aef80f588d4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_daload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_daload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_dastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_dastore.java index 719fba14fe1..5f86f2c78ee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_dastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_dastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_faload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_faload.java index 50c0b330ddd..75961e4bf4f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_faload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_faload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_fastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_fastore.java index d3fcab2fae1..b4bff54d89a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_fastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_fastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_getfield.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_getfield.java index 9ce55ee9a04..805f6c42746 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_getfield.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_getfield.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_getfield1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_getfield1.java index 35435607822..52560ec1767 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_getfield1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_getfield1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_iaload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_iaload.java index 50ddc9a8ccd..1637d560f05 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_iaload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_iaload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_iastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_iastore.java index 9f10b4a9fdb..13d52c79f5d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_iastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_iastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_idiv.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_idiv.java index 4279131b7c3..0af787065a9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_idiv.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_idiv.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_idiv2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_idiv2.java index a6ead4f66ea..e426d09262b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_idiv2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_idiv2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokespecial01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokespecial01.java index f8975122127..48b104e2dd1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokespecial01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokespecial01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokevirtual01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokevirtual01.java index bcf067a6e48..efe494b5088 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokevirtual01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokevirtual01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokevirtual02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokevirtual02.java index 5cb8ba5e2f9..bb643c60d8c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokevirtual02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_invokevirtual02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_irem.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_irem.java index 5218192d6d9..7f9f8c8af55 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_irem.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_irem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_laload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_laload.java index ee45bca3d75..53525b16cbc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_laload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_laload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_lastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_lastore.java index 1914676f068..1faaaf2e111 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_lastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_lastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_ldiv.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_ldiv.java index 8e7aee6fb4f..8f8b7203d8f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_ldiv.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_ldiv.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_ldiv2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_ldiv2.java index 56026f87dca..714f90cd025 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_ldiv2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_ldiv2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_lrem.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_lrem.java index 56d5d4dab25..acdc87728db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_lrem.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_lrem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_monitorenter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_monitorenter.java index ef77065bc7e..a5156a855dc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_monitorenter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_monitorenter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_multianewarray.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_multianewarray.java index fd49db721a7..2e55a46ee41 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_multianewarray.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_multianewarray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_newarray.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_newarray.java index f9551c4e5cc..429f60f622c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_newarray.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_newarray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_putfield.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_putfield.java index 5375e783bc8..b8a7bc1c18c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_putfield.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_putfield.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_saload.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_saload.java index 0ecaaee93ae..914ad1c9487 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_saload.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_saload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_sastore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_sastore.java index 85f6366ee3d..7c7012f9c8d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_sastore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/BC_sastore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop01.java index 5dd7f201936..91e80fcd058 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop02.java index 18529fcf819..2a9b287b92d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop03.java index a2a7ac7f73a..4b2ee48f2dc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Loop03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NASE_1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NASE_1.java index 1e4778c5164..a1969cc8e85 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NASE_1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NASE_1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NASE_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NASE_2.java index 7e43a2797a8..537a2f4bb41 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NASE_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NASE_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_00.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_00.java index 520ba0bcb3e..a7fe5f6d2c7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_00.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_00.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_01.java index 6930e1925b5..230a04e15db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_02.java index 0756f4e0e3b..ddf9ea04153 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_03.java index c03612fdf30..204efca0e3a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_04.java index dab98dc87f9..0e329d7ac3a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_05.java index 6a456136a27..66bb0b68d31 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_06.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_06.java index af730801695..b61cd4d5144 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_06.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_06.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_07.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_07.java index 5cd9fd27bf9..3dc2fd372b1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_07.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_07.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_08.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_08.java index 694ab885c53..277473603c9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_08.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_08.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_09.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_09.java index e344c94bb98..9fbe911fcc1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_09.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_09.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_10.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_10.java index 9a65569e252..bf9e726219c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_10.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_10.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_11.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_11.java index 12684d4c4e9..940e266228c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_11.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_NPE_11.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_01.java index 961cea074c4..ea9f569bb28 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_02.java index d7615c8c731..616e1c7685d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_03.java index d05c2ce6918..556c3e86f0e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_StackOverflowError_03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two01.java index 89d24946552..f30e708c202 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two02.java index e46749d275c..24a33d98caf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two03.java index c36331cd33e..b49eefa6798 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Two03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved.java index c21816ae9c8..03664e31ff2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved01.java index b50637f83c6..07a6de29f1b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved02.java index d674f1e64d0..dcfe5248890 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved03.java index 7d128e4c11b..3017a8b2164 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Catch_Unresolved03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Locals.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Locals.java index c3beda701d7..99bb0482881 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Locals.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Locals.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized01.java index 9ef96ff4273..f3255da14a7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized02.java index 7d16fcbd58f..5fe530d4b9e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized03.java index 74615f99c0e..e5d7417b7ba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized04.java index 57a495ea4cf..b6d74537e33 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized05.java index 45d22c0ec64..c660a977b05 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Except_Synchronized05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Finally01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Finally01.java index ba689dd4068..25bdd74cb6b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Finally01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Finally01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Finally02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Finally02.java index 0baf6dbfe85..d62332d8393 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Finally02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Finally02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_AIOOBE_00.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_AIOOBE_00.java index cc15fad5e09..a9ee97d057a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_AIOOBE_00.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_AIOOBE_00.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_CCE_00.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_CCE_00.java index 5ac0c8c643c..5cb461aa9f7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_CCE_00.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_CCE_00.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_00.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_00.java index 8e751fb8697..9542243d8d0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_00.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_00.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_01.java index 6370e3c0396..109bb92a016 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_02.java index 9d5071fa056..ecd1a93c577 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_03.java index a97b58866c0..6c5d958b145 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/StackTrace_NPE_03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch01.java index 7a0f5c3c3cf..324faea5f0e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch02.java index 7d882327bf7..eb074be5779 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch03.java index b9a7f92d875..1dea115e925 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InCatch03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InNested.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InNested.java index 5ff32251b70..a39ccdac411 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InNested.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_InNested.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_NPE_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_NPE_01.java index a7826c1e1d6..6761e02446e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_NPE_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_NPE_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized01.java index 0d2a0c72c36..8d6351d058a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized02.java index df6d1819d53..1786f0b7742 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized03.java index 7a11f0a119e..f745530e27e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized04.java index c8b1a0fe8d0..e4b8a2c2a9a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized05.java index 891871f114a..2fde6640d76 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/Throw_Synchronized05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/UntrustedInterfaces.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/UntrustedInterfaces.java index ad86f7e7ce2..80660e75dec 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/UntrustedInterfaces.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/except/UntrustedInterfaces.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate01.java index 8de6228e071..17af9df1cdd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate02.java index ba532725eb2..41e89b8dc1f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate03.java index 12f9a0343f6..0f760307f22 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate04.java index cb19d02fdde..dd31f58499b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_allocate04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array01.java index ec26e682985..253476f25de 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array02.java index 0d0bda553c0..0bdb363f929 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array03.java index 0405e753801..80b193b31fd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array04.java index b2c0c11eff0..64e13f840b5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_array04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_control01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_control01.java index d3e94938713..397eb758924 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_control01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_control01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_control02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_control02.java index 0098233fe00..3c299fd350d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_control02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_control02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_convert01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_convert01.java index 23ab6bfc699..582ad399215 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_convert01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_convert01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_count.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_count.java index cfc49246568..f2918e3f042 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_count.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_count.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_dead01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_dead01.java index 71b97111ccb..a354de9969e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_dead01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_dead01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_demo01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_demo01.java index bb338a4067c..a65b4bd273f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_demo01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_demo01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field01.java index 9992f632fb3..072668815da 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field02.java index 5817b2e4429..cda52ab2d30 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field03.java index 1f25eca5356..f9ba3d27ca7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field04.java index 206d8ac6461..cf83b414ace 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_field04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_idea.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_idea.java index 5854d034d0d..36ed60cba1b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_idea.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_idea.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_inline01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_inline01.java index 588a9168abd..7940f332e06 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_inline01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_inline01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_inline02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_inline02.java index 89840b48b9e..12165c23550 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_inline02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_inline02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_invoke01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_invoke01.java index f4747ae75c2..dd50f1d4e73 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_invoke01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_invoke01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_life.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_life.java index ab722e6f205..f095512dd83 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_life.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_life.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_nest01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_nest01.java index 5f54d67a01e..4ca14886b9b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_nest01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_nest01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_nest02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_nest02.java index 73150d7bab0..074dc7ab438 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_nest02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_nest02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_scope01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_scope01.java index 4e8ea474056..7bef3ce2b68 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_scope01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_scope01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_scope02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_scope02.java index 9e47b5c8b2d..b270c971f5e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_scope02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_scope02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_series.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_series.java index ca435f9062f..adb3d8123a5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_series.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_series.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_trees01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_trees01.java index ce7d4d0b416..e1c92b1b089 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_trees01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotpath/HP_trees01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6186134.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6186134.java index c07a8acf353..d687946424a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6186134.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6186134.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6196102.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6196102.java index 5d1ea079087..f926c99fff7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6196102.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6196102.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6753639.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6753639.java index c96808008a8..f103afda89e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6753639.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6753639.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6823354.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6823354.java index 9b99f5c1201..acb827d4613 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6823354.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6823354.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6850611.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6850611.java index fe279a0b6c8..ba95198c1b1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6850611.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test6850611.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test7005594.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test7005594.java index 47e60c39ca8..f7bd699b099 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test7005594.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/hotspot/Test7005594.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/CharacterBits.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/CharacterBits.java index 4b07bae60e8..a5b4db650a9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/CharacterBits.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/CharacterBits.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Class_getName.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Class_getName.java index 175c39da610..c8ea819e625 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Class_getName.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Class_getName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/DivideUnsigned.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/DivideUnsigned.java index 8b783cf7f78..3adc79a47a6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/DivideUnsigned.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/DivideUnsigned.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/EnumMap01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/EnumMap01.java index f1c12bd9e07..904ee06ea0b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/EnumMap01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/EnumMap01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/EnumMap02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/EnumMap02.java index d1ab8a7c03a..b1a2ace0b2a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/EnumMap02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/EnumMap02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/IntegerBits.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/IntegerBits.java index dde3303e4aa..56a6fd1e2ef 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/IntegerBits.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/IntegerBits.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/LongBits.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/LongBits.java index a246262dd67..c77c0279a78 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/LongBits.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/LongBits.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/ShortBits.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/ShortBits.java index 449fb1eae5f..9913c877c1f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/ShortBits.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/ShortBits.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_currentTimeMillis01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_currentTimeMillis01.java index ebea62a22c6..310ba43cad8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_currentTimeMillis01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_currentTimeMillis01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_currentTimeMillis02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_currentTimeMillis02.java index e71289533b3..b7b99c9dc4c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_currentTimeMillis02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_currentTimeMillis02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_nanoTime01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_nanoTime01.java index 021bd8a9bc2..f00be11a50b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_nanoTime01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_nanoTime01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_nanoTime02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_nanoTime02.java index c7cd8896263..e6744da95c3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_nanoTime02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_nanoTime02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_setOut.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_setOut.java index ec4d9706f89..ae3d5002bbe 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_setOut.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/System_setOut.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Thread_setName.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Thread_setName.java index b1b718b19a6..75bd7ae2158 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Thread_setName.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Thread_setName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/UnsafeAccess01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/UnsafeAccess01.java index f6077c85bad..36a497bc550 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/UnsafeAccess01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/UnsafeAccess01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/UnsafeAllocateInstance01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/UnsafeAllocateInstance01.java index 580233e9e4d..4fa7b613013 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/UnsafeAllocateInstance01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/UnsafeAllocateInstance01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Unsafe_compareAndSwap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Unsafe_compareAndSwap.java index 75897c42c41..74b73bf9cd2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Unsafe_compareAndSwap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Unsafe_compareAndSwap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Unsafe_compareAndSwapNullCheck.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Unsafe_compareAndSwapNullCheck.java index dcc75c878b7..f19a0aae142 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Unsafe_compareAndSwapNullCheck.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/jdk/Unsafe_compareAndSwapNullCheck.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Boxed_TYPE_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Boxed_TYPE_01.java index aeb3ca43c51..8d5e24c403d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Boxed_TYPE_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Boxed_TYPE_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Bridge_method01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Bridge_method01.java index 9b81025c009..b33e2d2fe76 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Bridge_method01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Bridge_method01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/CheckedListTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/CheckedListTest.java new file mode 100644 index 00000000000..b78bf1c10ab --- /dev/null +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/CheckedListTest.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + */ + + +package org.graalvm.compiler.jtt.lang; + +import org.graalvm.compiler.jtt.JTTTest; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.atomic.AtomicBoolean; + +public final class CheckedListTest extends JTTTest { + @Test + public void run0() throws Throwable { + runTest("testCast"); + } + + @SuppressWarnings({"unchecked", "rawtypes", "serial"}) + public static void testCast() { + final AtomicBoolean addAllWasCalled = new AtomicBoolean(); + ArrayList orig = new ArrayList() { + @Override + public boolean addAll(Collection c) { + addAllWasCalled.set(true); + return super.addAll(c); + } + }; + Collection checked = Collections.checkedList(orig, String.class); + ArrayList passed = new ArrayList(Arrays.asList("a", "b", 5678, "d")); + try { + checked.addAll(passed); + System.out.println(checked); + throw new RuntimeException("not good"); + } catch (ClassCastException e) { + // OKK + } + Assert.assertFalse(addAllWasCalled.get()); + } + + @Test + public void run1() throws Throwable { + runTest("testCopyOf"); + } + + public static void testCopyOf() { + Object[] mixed = new Object[]{"a", "b", 18}; + try { + Arrays.copyOf(mixed, 4, String[].class); + } catch (ArrayStoreException e) { + return; + } + throw new RuntimeException("should not reach here"); + } + + @Test + public void run2() throws Throwable { + runTest("testArraycopy"); + } + + public static void testArraycopy() { + Object[] mixed = new Object[]{"a", "b", 18}; + try { + String[] strings = new String[4]; + System.arraycopy(mixed, 0, strings, 0, 3); + } catch (ArrayStoreException e) { + return; + } + throw new RuntimeException("should not reach here"); + } +} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/ClassLoader_loadClass01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/ClassLoader_loadClass01.java index cc5689922f4..94c29ed6dd7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/ClassLoader_loadClass01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/ClassLoader_loadClass01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_Literal01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_Literal01.java index 4ab34ebd458..c3e0d414918 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_Literal01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_Literal01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_asSubclass01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_asSubclass01.java index 8a3a7eb263c..9e8a120dca7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_asSubclass01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_asSubclass01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast01.java index d67ff048be0..94f95503df1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,8 @@ package org.graalvm.compiler.jtt.lang; -import org.junit.Test; - import org.graalvm.compiler.jtt.JTTTest; +import org.junit.Test; public final class Class_cast01 extends JTTTest { @@ -57,6 +56,11 @@ public final class Class_cast01 extends JTTTest { return -1; } } + if (i == 4) { + if (int.class.cast(object) == null) { + return -1; + } + } return i; } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast02.java index 63013900ab7..081f3df705d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -84,5 +84,4 @@ public final class Class_cast02 extends JTTTest { public void run4() throws Throwable { runTest("test", 4); } - } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName01.java index d5cf9ddf538..dbdc3a5abb0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName02.java index b9fc55bd085..877412693bc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName03.java index 8bf794c497e..96cfc1e623c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName04.java index 40e49561517..5be115f4a7f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName05.java index 1c6d4636d14..3e4be3ffd44 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_forName05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getComponentType01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getComponentType01.java index 8db9480faeb..05331f20e6a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getComponentType01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getComponentType01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getInterfaces01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getInterfaces01.java index 14f9c93cbe5..ef03f382a76 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getInterfaces01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getInterfaces01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getModifiers01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getModifiers01.java index 6d0d9564e4e..88d63c5403f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getModifiers01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getModifiers01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getModifiers02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getModifiers02.java index f350157e1c2..f3a4f92d288 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getModifiers02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getModifiers02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getName01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getName01.java index 4f5ba6c7604..a7e66d7c39f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getName01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getName01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getName02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getName02.java index 81ec6386f0a..6abd4e37608 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getName02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getName02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSimpleName01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSimpleName01.java index d56114831a7..8b62f0cfab7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSimpleName01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSimpleName01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ /* */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSimpleName02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSimpleName02.java index 44bb6d9640a..cffedd4a233 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSimpleName02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSimpleName02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ /* */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSuperClass01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSuperClass01.java index aeecb63b8ea..7e10686f4ba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSuperClass01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_getSuperClass01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isArray01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isArray01.java index 2f425cd9964..9937023a145 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isArray01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isArray01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom01.java index db6b57f643b..176bbab2e66 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom02.java index b8091a0622f..377cec8ef57 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom03.java index dbe704f42de..65e3d752b70 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isAssignableFrom03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance01.java index 92bc248e2d4..3e2288c6fba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance02.java index 5b59e3c8429..1ea3de1c63d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance03.java index c9800617e25..6da9196d63a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance04.java index 2c2e724db13..9b9713e0b49 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance05.java index 2a7dd5ca9fd..81b59d9396a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance06.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance06.java index f45c29e8ee3..e0fc88f98c0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance06.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance06.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance07.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance07.java index e2f58d5aa21..252452cea56 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance07.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInstance07.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInterface01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInterface01.java index 7d29098f667..09eb9f171e0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInterface01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isInterface01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isPrimitive01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isPrimitive01.java index 6da653aad16..5a46dbe80c7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isPrimitive01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_isPrimitive01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_01.java index 3a32df8e328..f9d28897908 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_conditional.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_conditional.java index c6dd9b8d765..308f0f2fa47 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_conditional.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_conditional.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_toString.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_toString.java index 1b471d48025..04e88e6d18f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_toString.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Double_toString.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_01.java index 5732db0efe1..35a27f489eb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_02.java index c543f668d99..0095f6e8aca 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_03.java index fe8677f7300..bbe1e65c82a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_conditional.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_conditional.java index ff4acb510b7..741632baf39 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_conditional.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Float_conditional.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater01.java index 647c3fdc70d..8375983c7f0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater02.java index 309d71b668e..a723fdf86d5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater03.java index dc5cceff7c9..88eecf2abda 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greater03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual01.java index 416604646b9..2432c834adc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual02.java index 06c1f46922c..cfaefe18a23 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual03.java index 02ebd4be9a9..22562d72c34 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_greaterEqual03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less01.java index 02102ee1a93..277c67ca1d7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less02.java index 271748f58ee..a27765bb11b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less03.java index 645dd6be1ec..4b86942f3e3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_less03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual01.java index 57a44e4c5c9..79cd2ea48ca 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual02.java index c63b7709cb0..764d0f83242 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual03.java index c9d453b2e02..93764117d44 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Int_lessEqual03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/JDK_ClassLoaders01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/JDK_ClassLoaders01.java index 5284cebc0dd..b81d69c676b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/JDK_ClassLoaders01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/JDK_ClassLoaders01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/JDK_ClassLoaders02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/JDK_ClassLoaders02.java index f429a5f0192..438c7b225ee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/JDK_ClassLoaders02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/JDK_ClassLoaders02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/LambdaEagerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/LambdaEagerTest.java index 4d10aad03d4..1e8d93dfa59 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/LambdaEagerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/LambdaEagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater01.java index 37f77b919f4..846abf63ff3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater02.java index cd33c4369fa..8b59cb11d47 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater03.java index 5fe687ee33f..0cde8f62372 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greater03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual01.java index 11273b92ff7..46d2261a98d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual02.java index 89f8e480a67..15ceaf07034 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual03.java index 1226408429c..aad9aec48cd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_greaterEqual03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less01.java index d8ed63ea4da..9d821caf51b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less02.java index 519692ae64b..33dd821ac45 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less03.java index 44978963ad7..2de71ffb7b8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_less03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual01.java index 8d3e6df9f40..887a813180c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual02.java index 5f6e410fb1e..0cdff86a4c7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual03.java index e2951305a2e..ba4910276dc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_lessEqual03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_reverseBytes01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_reverseBytes01.java index ce51f81078e..8af35bd9003 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_reverseBytes01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_reverseBytes01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_reverseBytes02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_reverseBytes02.java index 695791ac9a1..091ccc61847 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_reverseBytes02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Long_reverseBytes02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_abs.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_abs.java index 967fdddf0b5..0323fe967fb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_abs.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_abs.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_cos.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_cos.java index 68da6498cf9..331331738dc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_cos.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_cos.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_exact.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_exact.java index c2a95ceacd3..c88d672f99d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_exact.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_exact.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_exp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_exp.java index 858eb706ac5..22f4636bd2f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_exp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_exp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_log.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_log.java index b6a5d2ae197..9ada94ae237 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_log.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_log.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_log10.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_log10.java index cec8773da49..f94979a7408 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_log10.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_log10.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_pow.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_pow.java index 18518d73830..8e5b420276f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_pow.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_pow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_round.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_round.java index b5ba05a082d..12f4bd81f9c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_round.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_round.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_sin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_sin.java index 9dff9a70301..dcd608cd3ec 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_sin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_sin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_sqrt.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_sqrt.java index 7111a5456b1..284b5783eca 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_sqrt.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_sqrt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_tan.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_tan.java index 032c4533529..33e85cfa6c1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_tan.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Math_tan.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_clone01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_clone01.java index 36ca5deaf59..f49e7c2babb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_clone01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_clone01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_clone02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_clone02.java index 6e871e33091..ed888fa4fff 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_clone02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_clone02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_equals01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_equals01.java index 12894df81c6..284433daaf6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_equals01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_equals01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_getClass01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_getClass01.java index d10e84c8a9a..71468d30120 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_getClass01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_getClass01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_hashCode01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_hashCode01.java index 3371f8a490f..faf48a3eb93 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_hashCode01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_hashCode01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_hashCode02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_hashCode02.java index d4163dc5c3f..6b51d340ca9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_hashCode02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_hashCode02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notify01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notify01.java index dccb45bab0e..fb7b2e993db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notify01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notify01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notify02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notify02.java index e736663799e..e62342615f8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notify02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notify02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notifyAll01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notifyAll01.java index 7df5d09e36a..ccd38333249 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notifyAll01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notifyAll01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notifyAll02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notifyAll02.java index eb15d750345..d8a2ae73bf2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notifyAll02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_notifyAll02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_toString01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_toString01.java index fa47cad836c..018e4bcea5b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_toString01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_toString01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_toString02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_toString02.java index a347f38d98a..45a5db737be 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_toString02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_toString02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ /* */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait01.java index 3cbf1902717..643f1fd7a03 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait02.java index 9a83e675e89..1b70a44ebe6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait03.java index f28480368d0..d124b6baa58 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Object_wait03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/ProcessEnvironment_init.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/ProcessEnvironment_init.java index 6fb1d34026a..f4be72a3984 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/ProcessEnvironment_init.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/ProcessEnvironment_init.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/StringCoding_Scale.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/StringCoding_Scale.java index 08b11d48d46..7327b4b80f6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/StringCoding_Scale.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/StringCoding_Scale.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern01.java index 0cebf619c04..14ab17f1164 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern02.java index 057ddb1f338..64cf7fd1363 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern03.java index 97e05c4a471..8cb1ecafe76 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_intern03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_valueOf01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_valueOf01.java index d17f4ef7041..3047512a53c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_valueOf01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/String_valueOf01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/System_identityHashCode01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/System_identityHashCode01.java index a75c1b4eeb2..e7c7df48df4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/System_identityHashCode01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/System_identityHashCode01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/UnaryMath.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/UnaryMath.java index 1559eee1219..10785fd8f93 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/UnaryMath.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/UnaryMath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/DegeneratedLoop.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/DegeneratedLoop.java index 984f2a5ccb5..b946355a7c4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/DegeneratedLoop.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/DegeneratedLoop.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop01.java index 2b64378111f..7f2fce62738 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop02.java index 031730995da..e00b643cc70 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop03.java index bda6e953499..9f1944562bd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop04.java index 78242690f66..f84ff678192 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop05.java index 6e07a0e1e87..28563ed12e8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop06.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop06.java index 6615cd97fdc..9f96a3dd5b1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop06.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop06.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop07.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop07.java index 5fd4fe4bc72..7570fb6feca 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop07.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop07.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop07_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop07_2.java index 78843c32ea3..f5f27345ab2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop07_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop07_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop08.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop08.java index b5a38232909..674305d53de 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop08.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop08.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop09.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop09.java index 4da2aa3489c..aad1f5ff886 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop09.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop09.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop09_2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop09_2.java index c8d71ed4fa5..8a60558368c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop09_2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop09_2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop11.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop11.java index 273001b3487..9af22c0de2e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop11.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop11.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop12.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop12.java index 36c955ba848..1e2766f16fb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop12.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop12.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop13.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop13.java index 9570738e3c7..78bf4fa14b2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop13.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop13.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop14.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop14.java index 36edcdb163f..5672f1df52a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop14.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop14.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop15.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop15.java index 3cf29845338..3c3bf1fc74c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop15.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop15.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop16.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop16.java index e3f4d3749c0..0952b5d196e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop16.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop16.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop17.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop17.java index 21eace8a9f0..32dea3d27a9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop17.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/Loop17.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopEscape.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopEscape.java index a211ed367f4..26eb43d7c9d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopEscape.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopEscape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopInline.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopInline.java index 6bbbb691178..0a577a70bc2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopInline.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopInline.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopLastIndexOf.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopLastIndexOf.java index 1d23d5c318f..2738379d071 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopLastIndexOf.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopLastIndexOf.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopNewInstance.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopNewInstance.java index 1f57ecd6d3b..bf23a4fab35 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopNewInstance.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopNewInstance.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopParseLong.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopParseLong.java index 8bfcd9c520c..31b17de1e3d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopParseLong.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopParseLong.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopPhi.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopPhi.java index 800e03ce145..71e8d36958d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopPhi.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopPhi.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopPhiResolutionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopPhiResolutionTest.java index 5f91c01c8f8..dff1d830bc5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopPhiResolutionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopPhiResolutionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopSpilling.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopSpilling.java index c195c21ced4..2bf08051f86 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopSpilling.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopSpilling.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopSwitch01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopSwitch01.java index 8a53750d1c9..14ccde98849 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopSwitch01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopSwitch01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopUnroll.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopUnroll.java index b33deee450f..209c794549c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopUnroll.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/LoopUnroll.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/SpillLoopPhiVariableAtDefinition.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/SpillLoopPhiVariableAtDefinition.java index 931333363d0..0d310270081 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/SpillLoopPhiVariableAtDefinition.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/loop/SpillLoopPhiVariableAtDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ArrayCompare01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ArrayCompare01.java index 1e44eeaef40..f25f36a5427 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ArrayCompare01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ArrayCompare01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ArrayCompare02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ArrayCompare02.java index 617f662871b..fccd96066db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ArrayCompare02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ArrayCompare02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BC_invokevirtual2.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BC_invokevirtual2.java index ba10e98b695..a7c979c6161 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BC_invokevirtual2.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BC_invokevirtual2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigByteParams01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigByteParams01.java index 6608b7ac409..f891f15ecde 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigByteParams01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigByteParams01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigDoubleParams02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigDoubleParams02.java index 2b1426897df..ed8feeea0dd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigDoubleParams02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigDoubleParams02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigFloatParams01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigFloatParams01.java index c2a231d10da..0b892384458 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigFloatParams01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigFloatParams01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigFloatParams02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigFloatParams02.java index 450acb4ac98..56749b03f2c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigFloatParams02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigFloatParams02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigIntParams01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigIntParams01.java index 99f16b4c225..b8276a1de71 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigIntParams01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigIntParams01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigIntParams02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigIntParams02.java index 069a5cc1600..4a5828c2031 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigIntParams02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigIntParams02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigInterfaceParams01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigInterfaceParams01.java index 780cedf1bb4..68d57f131e1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigInterfaceParams01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigInterfaceParams01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigLongParams02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigLongParams02.java index c75c831ff98..9312bbdb67e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigLongParams02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigLongParams02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams01.java index 0cb8c5370f0..956e8ede000 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams02.java index 39c0448d529..c0f2a7687cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams03.java index e690114ee45..3383a26ce2f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams04.java index 5f0d1809558..914806745d1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigMixedParams04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigObjectParams01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigObjectParams01.java index 4ffb40208d9..4c3765dcc32 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigObjectParams01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigObjectParams01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigObjectParams02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigObjectParams02.java index 9a041545d02..2352cfc4ba1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigObjectParams02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigObjectParams02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigParamsAlignment.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigParamsAlignment.java index 1605f3f4cca..ab1f214b932 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigParamsAlignment.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigParamsAlignment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,7 +21,7 @@ * questions. */ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. */ /* */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigShortParams01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigShortParams01.java index 3f14d298348..49533a0b8d3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigShortParams01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigShortParams01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigVirtualParams01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigVirtualParams01.java index 65816e862fb..d13631fe3ee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigVirtualParams01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/BigVirtualParams01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Bubblesort.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Bubblesort.java index 070e66c0029..2253b0ac45e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Bubblesort.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Bubblesort.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ConstantLoadTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ConstantLoadTest.java index 15fba4fbd92..7cc6cdcb47b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ConstantLoadTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ConstantLoadTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Fibonacci.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Fibonacci.java index d3b75b17e80..0e4f775c4bc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Fibonacci.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Fibonacci.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/FloatingReads.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/FloatingReads.java index 6d6a9253b7b..d0847ec5027 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/FloatingReads.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/FloatingReads.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_01.java index 29f5bfcfd47..020a50fa2bc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_02.java index b6a81dd82be..fbd153a61e1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_03.java index 140df2fc112..b4a1d60740c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_04.java index 33d8bb3215b..a976f9d91b3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeInterface_04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeVirtual_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeVirtual_01.java index 38b100f6c3d..64f43bed00e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeVirtual_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeVirtual_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeVirtual_02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeVirtual_02.java index b257ec343b2..bd81803e661 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeVirtual_02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/InvokeVirtual_02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Matrix01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Matrix01.java index 1ce8e1c3ca3..88cede12ad4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Matrix01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/Matrix01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ReferenceMap01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ReferenceMap01.java index 32b81187943..4167dad6f43 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ReferenceMap01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/ReferenceMap01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/StrangeFrames.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/StrangeFrames.java index 8c03f757eae..20c408fff91 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/StrangeFrames.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/StrangeFrames.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/String_format01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/String_format01.java index d228963cc42..ee7f17ee590 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/String_format01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/String_format01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/String_format02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/String_format02.java index aea2005cf1d..140c0291284 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/String_format02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/String_format02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_String01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_String01.java index cdcac3e01a3..9b6a9b18616 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_String01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_String01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_Unroll.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_Unroll.java index feec116fe04..9edaf827287 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_Unroll.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_Unroll.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_boolean01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_boolean01.java index b4409c7e886..f35cd2c54c4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_boolean01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_boolean01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_byte01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_byte01.java index 0c3bf2274c7..9dfc2d2a0b4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_byte01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_byte01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_char01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_char01.java index 3a4cafa745b..f1018bb4bbb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_char01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_char01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_double01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_double01.java index 5fb4a99d707..777a12909dd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_double01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_double01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_float01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_float01.java index 7486abaf4f6..913747bf999 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_float01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_float01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_int01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_int01.java index 954b2ab157d..4458715fb90 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_int01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_int01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_long01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_long01.java index 4519be230ec..1c7ff212166 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_long01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_long01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_short01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_short01.java index 4c6af72ad42..626ef9d8815 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_short01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/micro/VarArgs_short01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_01.java index cbc5e6d6283..db177fdbfbb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_02.java index 661e53614f5..d5bde90be29 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_03.java index 77d64ef1c77..6bc25bcf2be 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ABCE_03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy01.java index c9f67fe0667..e3571b94352 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy02.java index ea27a87c3ae..5c6ad39d638 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy03.java index 5acdd982a59..eaa7c21aa73 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy04.java index 496e61e9500..c157e72fc44 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy05.java index 802f67e74ca..3f52c47f728 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy06.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy06.java index ea04097d5e6..977f0fe37fb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy06.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopy06.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopyGeneric.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopyGeneric.java index fcc1e8f8ffa..03ee5fccbc8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopyGeneric.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayCopyGeneric.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayLength01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayLength01.java index 9aa33896f55..277c52f78a0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayLength01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ArrayLength01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_idiv_16.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_idiv_16.java index 44d5e5566a2..34f21e35d64 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_idiv_16.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_idiv_16.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_idiv_4.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_idiv_4.java index 96ab18075da..b53c255a6c0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_idiv_4.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_idiv_4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_imul_16.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_imul_16.java index ecff5ffc3de..227c7338b7c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_imul_16.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_imul_16.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_imul_4.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_imul_4.java index 215f6e2a2a9..b879041615a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_imul_4.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_imul_4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_ldiv_16.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_ldiv_16.java index dbe1315acdf..27e4489f4a6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_ldiv_16.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_ldiv_16.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_ldiv_4.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_ldiv_4.java index 173453236d2..d63dac002a9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_ldiv_4.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_ldiv_4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lmul_16.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lmul_16.java index 6065db6b286..ecc0d00762f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lmul_16.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lmul_16.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lmul_4.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lmul_4.java index a5396769f5c..a22747156d1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lmul_4.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lmul_4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C16.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C16.java index 41bb9897165..8ff54e77c83 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C16.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C16.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C24.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C24.java index 42f97dbcdbe..f064bbeff37 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C24.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C24.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C32.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C32.java index 9d77ccda8ea..248763e9a48 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C32.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BC_lshr_C32.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BlockSkip01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BlockSkip01.java index 675209f937e..00c71cfc5a7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BlockSkip01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BlockSkip01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BoxingIdentity.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BoxingIdentity.java index c86579ba67d..64184d2fcf9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BoxingIdentity.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/BoxingIdentity.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Cmov01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Cmov01.java index 9d3b28f5948..4492b9d65fb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Cmov01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Cmov01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Cmov02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Cmov02.java index d6f92332f74..08adf1f2d18 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Cmov02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Cmov02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Conditional01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Conditional01.java index 1d3b1d37550..2528571a8b3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Conditional01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Conditional01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConditionalElimination01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConditionalElimination01.java index 5af8c34afe4..58e243f7060 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConditionalElimination01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConditionalElimination01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConditionalElimination02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConditionalElimination02.java index b2eec177f6c..060f5c5e029 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConditionalElimination02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConditionalElimination02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConvertCompare.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConvertCompare.java index 08657f0d4cc..c1ff9c7c6c4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConvertCompare.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ConvertCompare.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/DeadCode01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/DeadCode01.java index eb00c000ca6..93b4b1e64c1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/DeadCode01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/DeadCode01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/DeadCode02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/DeadCode02.java index f822f388918..1a4ec4d2c93 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/DeadCode02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/DeadCode02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Cast01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Cast01.java index 39a0332fdc9..5124941a023 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Cast01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Cast01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert01.java index 975adecd2d2..3a464fc7fed 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert02.java index f8bf8621f34..aeeba3857e2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert03.java index 45408563106..5ab1fbc3bb3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert04.java index c162b847759..8be60c17a4b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Convert04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double01.java index 6433c4a4406..228f631f748 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double02.java index 7c8e2cc1f74..e1a58414191 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double03.java index 44596221782..f60414f6b0f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double04.java index b000aa82e7d..0d7e54e4d1f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Double04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float01.java index 796e10f15c1..0ed29d15036 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float02.java index 73d9468cad1..72dce78dd89 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float03.java index c694a1bba8d..8c0157573bd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Float03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_InstanceOf01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_InstanceOf01.java index dcf76331070..6aa238c50e5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_InstanceOf01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_InstanceOf01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Int01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Int01.java index 4914bfcc178..e33b07f4dfd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Int01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Int01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Int02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Int02.java index d7217f2c289..425a9f65a4d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Int02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Int02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Long01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Long01.java index fb74dbdc753..881e1dc8dd0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Long01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Long01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Long02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Long02.java index bc2d20db671..1c709056cfb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Long02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Long02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Math01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Math01.java index 30346998c1d..a78bed55c2f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Math01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Fold_Math01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/GuardMovement.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/GuardMovement.java index 42db4e4be94..62b4d4e1570 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/GuardMovement.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/GuardMovement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/InferStamp01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/InferStamp01.java index 4128a75cd18..3f2758499b3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/InferStamp01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/InferStamp01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Inline01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Inline01.java index cebdf5b4618..5ea0923dfb6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Inline01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Inline01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Inline02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Inline02.java index 8cda5a90f61..1968531ea11 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Inline02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Inline02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/LLE_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/LLE_01.java index 837f4e2ae74..3500591b3e4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/LLE_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/LLE_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/List_reorder_bug.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/List_reorder_bug.java index c2faad4f4da..fa841779f16 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/List_reorder_bug.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/List_reorder_bug.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Logic0.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Logic0.java index f36bd6786c2..8f3db512f8d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Logic0.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Logic0.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/LongToSomethingArray01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/LongToSomethingArray01.java index 5e11609c4a4..8d50f9840e3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/LongToSomethingArray01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/LongToSomethingArray01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_01.java index 6c7ec3f983e..8a7ffc838be 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_02.java index 6156e21d7f4..15645d9e0b2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_03.java index ba5a549d15c..103b2e0b48a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_04.java index 4d6ace74999..178c16b1e3c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive01.java index 70324d0dcad..193ff492ffb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive02.java index 19c2bf88e80..23e5857c645 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive03.java index f7b5864e0a5..42783b2d5d2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive04.java index de4f52ae583..7637da1bd81 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive05.java index 754601f9fab..0b5c5c12ac2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NCE_FlowSensitive05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte01.java index 0ada86381a3..1666828a295 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte02.java index 86f3305c44d..72456dc2e78 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte03.java index b04b9cd3b65..52f19b7e82d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_byte03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char01.java index 56f8d06aaa0..73d0c2c5ec0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char02.java index c0d6e0ff3b2..b72ba083dd6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char03.java index 5b5ecb36eca..f502f9fce65 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_char03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short01.java index e657e4bac9c..9265af8bc73 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short02.java index 944de28dc44..a7c966b068a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short03.java index efa7968861e..1afb1f3854e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Narrow_short03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NestedLoop_EA.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NestedLoop_EA.java index d7507eb7c13..9420696daee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NestedLoop_EA.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/NestedLoop_EA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi01.java index 46e71283f8f..6c60ced3949 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi02.java index f445271fd7a..c9ce3cd3716 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi03.java index fd5eaf479b1..3b22c650bc2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Phi03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ReassociateConstants.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ReassociateConstants.java index b4ed09a4c4d..01aee4bd502 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ReassociateConstants.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/ReassociateConstants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Convert01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Convert01.java index bb5f71caa24..e1e08cdcc55 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Convert01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Convert01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Double01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Double01.java index e80d16edf56..8f374e586b7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Double01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Double01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Float01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Float01.java index 43cb492b27f..6a4a5813aad 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Float01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Float01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int01.java index d030b5b38d3..7a1a34ea60c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int02.java index 6767a5d558a..fda422bde94 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int03.java index ca4b540e9e8..713e11aa652 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int04.java index 55b8d207a5f..cacc951a855 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Int04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_IntShift01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_IntShift01.java index f64e25507e5..cbac6732a6a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_IntShift01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_IntShift01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_IntShift02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_IntShift02.java index 0de83fb28f1..dbd07efe276 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_IntShift02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_IntShift02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long01.java index becf443fc79..708e3892c97 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long02.java index 61a54623dc0..6aca972cf65 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long03.java index 539555bc6e3..3ea6c343e9a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long04.java index cd8a4ec90aa..9cbe489e2a7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_Long04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_LongShift01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_LongShift01.java index 644bb2db852..140d60f8952 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_LongShift01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_LongShift01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_LongShift02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_LongShift02.java index 377a213cebf..27dd0aff98c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_LongShift02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Reduce_LongShift02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/SchedulingBug_01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/SchedulingBug_01.java index 3e9fc9c421b..8674d0ee749 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/SchedulingBug_01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/SchedulingBug_01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/SignExtendShort.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/SignExtendShort.java index 98a4ac06e72..da1604da1f1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/SignExtendShort.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/SignExtendShort.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Switch01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Switch01.java index 3b21e964167..88049d578b5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Switch01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Switch01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Switch02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Switch02.java index e3680ddaf55..41d9362d35b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Switch02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/Switch02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/TrichotomyTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/TrichotomyTest.java index 9017f072da6..5283eab6c10 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/TrichotomyTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/TrichotomyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/TypeCastElem.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/TypeCastElem.java index 15b3599c4c8..1c34a2aed23 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/TypeCastElem.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/TypeCastElem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/UnsafeDeopt.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/UnsafeDeopt.java index daa8cd2596d..a3aed50d23b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/UnsafeDeopt.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/UnsafeDeopt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Cast01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Cast01.java index cebc51b355d..756e2bbf3bf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Cast01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Cast01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Cast02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Cast02.java index 67e182846d4..7ca318908a0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Cast02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Cast02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Convert01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Convert01.java index 57c3efeeeee..c5f1b68611c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Convert01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Convert01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Convert02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Convert02.java index 7195c6dc9e5..5236c0cd202 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Convert02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Convert02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double01.java index f3375d408c4..28b5bb01e45 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double02.java index bc6757b1c74..9ec8430589d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double03.java index 24a01b1e09d..090a07c5555 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Double03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Field01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Field01.java index d26bc07172b..7d70f7af051 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Field01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Field01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Field02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Field02.java index a9a8f28fe66..77b8bf16dc3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Field02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Field02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Float01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Float01.java index 727d43afe7a..9bde8d4f61c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Float01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Float01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Float02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Float02.java index 30754a83844..81699c1c128 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Float02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Float02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf01.java index 6424d72e415..4aba338fd0a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf02.java index 4581401b52c..fc66a95e17f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf03.java index 03fbba29344..be5ecd4138d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_InstanceOf03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int01.java index c1edc1bacb3..5b11f95d2ea 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int02.java index 197f2eb6d6d..0fb04ca4a0b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int03.java index 5d16877d1ef..e618b8d2dab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Int03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long01.java index 890c1c1d595..17574ef61c7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long02.java index 9980db19742..b8139f13eaf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long03.java index acf8ac5a6df..f863a783f84 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Long03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Loop01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Loop01.java index b01fce64b15..4f30cec3133 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Loop01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/optimize/VN_Loop01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get01.java index f874444303b..b26913dce0a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get02.java index b09c2b41162..5de94ac8025 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get03.java index ea1c12bcd26..13b373c1102 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_get03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getBoolean01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getBoolean01.java index dc581720a20..d174fdb9e01 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getBoolean01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getBoolean01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getByte01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getByte01.java index 8abc73bf387..459ad9d12fd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getByte01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getByte01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getChar01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getChar01.java index a928546d21f..8419bde7c82 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getChar01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getChar01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getDouble01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getDouble01.java index ba5a0b32e30..bc073d81f17 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getDouble01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getDouble01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getFloat01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getFloat01.java index 1c5c037e9e5..08aa2ba3694 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getFloat01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getFloat01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getInt01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getInt01.java index f02bad66273..7cb72f83e42 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getInt01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getInt01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getLength01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getLength01.java index 4aa1c524845..358d551304d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getLength01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getLength01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getLong01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getLong01.java index 41feaff53d2..6a1ff7cb919 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getLong01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getLong01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getShort01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getShort01.java index 7055dfcecf5..bc97f1054c7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getShort01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_getShort01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance01.java index 0e24ab4634d..4992dcf3d34 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance02.java index 2b0a8b6d23a..4df4bce8b3d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance03.java index a38feb4662a..532523188f9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance04.java index 0e371d117f0..15273ec9f01 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance05.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance05.java index 79cea87d476..d265c636987 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance05.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance05.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance06.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance06.java index 0d59968b8bf..8b428a47637 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance06.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_newInstance06.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set01.java index d0e5338c01f..b7942b156a0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set02.java index 00a4bad55fe..4ad32e637f4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set03.java index d529cdeddcd..90dd7ba8045 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_set03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setBoolean01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setBoolean01.java index 745f0b8615f..05e64fe2b42 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setBoolean01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setBoolean01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setByte01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setByte01.java index 49fcff77a2f..ec94ac0268a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setByte01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setByte01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setChar01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setChar01.java index 0e9078b39e6..b961131723b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setChar01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setChar01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setDouble01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setDouble01.java index 076c572a25b..02a5e9b06d7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setDouble01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setDouble01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setFloat01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setFloat01.java index daf331aaebb..1837a00a33a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setFloat01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setFloat01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setInt01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setInt01.java index da0277b9777..4c091cf3776 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setInt01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setInt01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setLong01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setLong01.java index 392a695ad44..66a46268f0b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setLong01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setLong01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setShort01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setShort01.java index 2b31897c7b5..53449ded110 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setShort01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Array_setShort01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getDeclaredField01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getDeclaredField01.java index 8b0042a9b4b..a947a579f6a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getDeclaredField01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getDeclaredField01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getDeclaredMethod01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getDeclaredMethod01.java index 65372957697..a7e32623be8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getDeclaredMethod01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getDeclaredMethod01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getField01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getField01.java index f3dce42a5ac..2010558e96a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getField01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getField01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getField02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getField02.java index 6c864893eee..454ca1bf149 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getField02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getField02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getMethod01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getMethod01.java index c96ba480d6d..24057ff6b4d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getMethod01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getMethod01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getMethod02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getMethod02.java index daf90ab1857..85142fe2cfc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getMethod02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_getMethod02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance01.java index be878b18f37..3bd8b04b5a0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance02.java index 750a9091407..83160b5025a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance03.java index 0fde2f84ced..c5934e21c6d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance06.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance06.java index c91e6937570..e88157b3423 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance06.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance06.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance07.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance07.java index beb47a27aed..f70ea0d305c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance07.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Class_newInstance07.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get01.java index d15efb8b21a..a3e09877ab8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get02.java index b5371e97263..c9e0bba448b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get03.java index 11861b248d2..6e986a8d962 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get04.java index 72f249c7c45..65c04541195 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_get04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_getType01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_getType01.java index 8422569edc3..e1278245bc5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_getType01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_getType01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set01.java index f0e9a6c106f..5f6e23647d5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set02.java index 62af454f376..f25e8bffeb3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set03.java index 68bc1e39e9a..74db39afef3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Field_set03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_except01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_except01.java index 60d100d54d3..63ccfec61ab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_except01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_except01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main01.java index a019855f102..f7315b19925 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main02.java index 2b5ab81875c..7ceea0c3cd8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main03.java index 187db07f125..1c3bdf8c28a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_main03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_virtual01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_virtual01.java index 452655b3c36..889c913da21 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_virtual01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Invoke_virtual01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Method_getParameterTypes01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Method_getParameterTypes01.java index 9e3030bc22a..111f7d37ca8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Method_getParameterTypes01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Method_getParameterTypes01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Method_getReturnType01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Method_getReturnType01.java index 6ae4d7884c3..7c0c339b641 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Method_getReturnType01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/reflect/Method_getReturnType01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Object_wait01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Object_wait01.java index 28d8f068c99..ae75c1533ab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Object_wait01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Object_wait01.java @@ -55,8 +55,13 @@ public class Object_wait01 extends JTTTest { public static boolean test(int i) throws InterruptedException { count = 0; done = false; - new Thread(new TestClass()).start(); synchronized (object) { + // Only start the other thread once we have the lock + // so that the other thread will rendezvous with this + // thread the first time it tries to acquire the lock. + // Otherwise, the other thread could terminate before + // this thread executes its first wait. + new Thread(new TestClass()).start(); while (count < i) { object.wait(); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal01.java index 1a25fb79115..bfc90c48f41 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal02.java index dfa806d0358..64111f89c63 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal03.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal03.java index 23a3d2f3bcc..0dc895ce3a6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal03.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/ThreadLocal03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_currentThread01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_currentThread01.java index fccbac671ae..5597d03564f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_currentThread01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_currentThread01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_getState01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_getState01.java index 58b55db07d1..30b5feb489e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_getState01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_getState01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_getState02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_getState02.java index 3c742ad57d5..4c5b1eaca7f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_getState02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_getState02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_holdsLock01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_holdsLock01.java index 612e548115f..004fe7479d2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_holdsLock01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_holdsLock01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isAlive01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isAlive01.java index 02b0da8e0c6..ff0a0f395c5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isAlive01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isAlive01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isInterrupted01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isInterrupted01.java index 2dd6223ba9e..357c905154b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isInterrupted01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isInterrupted01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isInterrupted04.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isInterrupted04.java index 600177decd9..e1ac6a8168f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isInterrupted04.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_isInterrupted04.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_new01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_new01.java index 41afbc1b1bb..a82403a01ee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_new01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_new01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_new02.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_new02.java index 7aa57364aab..9e95dda11ca 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_new02.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_new02.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_setPriority01.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_setPriority01.java index 48db12ac7f4..655a42823db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_setPriority01.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/threads/Thread_setPriority01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64AddressValue.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64AddressValue.java index 2ab8d36ba47..f6694634a7d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64AddressValue.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64AddressValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticLIRGeneratorTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticLIRGeneratorTool.java index 70c34cf6d86..737a1477347 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticLIRGeneratorTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticLIRGeneratorTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticOp.java index ee2e4235f5f..c42258bf35b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArithmeticOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,6 +54,7 @@ public enum AArch64ArithmeticOp { SUBS(ARITHMETIC), MUL, MULVS, + MNEG, DIV, SMULH, UMULH, @@ -275,6 +276,9 @@ public enum AArch64ArithmeticOp { case SMULH: masm.smulh(size, dst, src1, src2); break; + case MNEG: + masm.mneg(size, dst, src1, src2); + break; case DIV: masm.sdiv(size, dst, src1, src2); break; @@ -367,8 +371,8 @@ public enum AArch64ArithmeticOp { } } - public static class AddSubShiftOp extends AArch64LIRInstruction { - private static final LIRInstructionClass TYPE = LIRInstructionClass.create(AddSubShiftOp.class); + public static class BinaryShiftOp extends AArch64LIRInstruction { + private static final LIRInstructionClass TYPE = LIRInstructionClass.create(BinaryShiftOp.class); @Opcode private final AArch64ArithmeticOp op; @Def(REG) protected AllocatableValue result; @@ -376,19 +380,24 @@ public enum AArch64ArithmeticOp { @Use(REG) protected AllocatableValue src2; private final AArch64MacroAssembler.ShiftType shiftType; private final int shiftAmt; + private final boolean isShiftNot; /** - * Computes result = src1 src2 . + * If shiftNot: Computes result = src1 ~(src2 ) + * (Only for logic ops). else: Computes + * result = src1 src2 . */ - public AddSubShiftOp(AArch64ArithmeticOp op, AllocatableValue result, AllocatableValue src1, AllocatableValue src2, AArch64MacroAssembler.ShiftType shiftType, int shiftAmt) { + public BinaryShiftOp(AArch64ArithmeticOp op, AllocatableValue result, AllocatableValue src1, AllocatableValue src2, + AArch64MacroAssembler.ShiftType shiftType, int shiftAmt, boolean isShiftNot) { super(TYPE); - assert op == ADD || op == SUB; + assert op == ADD || op == SUB || op == AND || op == OR || op == XOR; this.op = op; this.result = result; this.src1 = src1; this.src2 = src2; this.shiftType = shiftType; this.shiftAmt = shiftAmt; + this.isShiftNot = isShiftNot; } @Override @@ -401,6 +410,27 @@ public enum AArch64ArithmeticOp { case SUB: masm.sub(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); break; + case AND: + if (!isShiftNot) { + masm.and(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } else { + masm.bic(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } + break; + case OR: + if (!isShiftNot) { + masm.or(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } else { + masm.orn(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } + break; + case XOR: + if (!isShiftNot) { + masm.eor(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } else { + masm.eon(size, asRegister(result), asRegister(src1), asRegister(src2), shiftType, shiftAmt); + } + break; default: throw GraalError.shouldNotReachHere(); } @@ -437,4 +467,42 @@ public enum AArch64ArithmeticOp { } } + public static class MultiplyAddSubOp extends AArch64LIRInstruction { + private static final LIRInstructionClass TYPE = LIRInstructionClass.create(MultiplyAddSubOp.class); + + @Opcode private final AArch64ArithmeticOp op; + @Def(REG) protected AllocatableValue result; + @Use(REG) protected AllocatableValue src1; + @Use(REG) protected AllocatableValue src2; + @Use(REG) protected AllocatableValue src3; + + /** + * Computes result = src3 src1 * src2. + */ + public MultiplyAddSubOp(AArch64ArithmeticOp op, AllocatableValue result, AllocatableValue src1, AllocatableValue src2, AllocatableValue src3) { + super(TYPE); + assert op == ADD || op == SUB; + this.op = op; + this.result = result; + this.src1 = src1; + this.src2 = src2; + this.src3 = src3; + } + + @Override + public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) { + int size = result.getPlatformKind().getSizeInBytes() * Byte.SIZE; + switch (op) { + case ADD: + masm.madd(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3)); + break; + case SUB: + masm.msub(size, asRegister(result), asRegister(src1), asRegister(src2), asRegister(src3)); + break; + default: + throw GraalError.shouldNotReachHere(); + } + } + } + } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArrayCompareToOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArrayCompareToOp.java index 4bffbbab760..fb7f300925b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArrayCompareToOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArrayCompareToOp.java @@ -107,7 +107,11 @@ public final class AArch64ArrayCompareToOp extends AArch64LIRInstruction { @Override protected void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) { - + /* + * Note: AArch64StringUTF16Substitutions.compareToLatin1 and + * AArch64StringUTF16Substitutions.compareToLatin1 swap input to array1=byte[] and + * array2=char[] but kind1==Char and kind2==Byte remains + */ Register result = asRegister(resultValue); Register length1 = asRegister(length1Value); Register length2 = asRegister(length2Value); @@ -127,18 +131,23 @@ public final class AArch64ArrayCompareToOp extends AArch64LIRInstruction { final Label COMPARE_SHORT_LABEL = new Label(); // Checkstyle: resume + boolean isLL = (kind1 == kind2 && kind1 == JavaKind.Byte); + boolean isUU = (kind1 == kind2 && kind1 == JavaKind.Char); + boolean isLU = (kind1 != kind2 && kind1 == JavaKind.Byte); + boolean isUL = (kind1 != kind2 && kind1 == JavaKind.Char); + // Checkstyle: stop int CHAR_SIZE_BYTES = 1; int VECTOR_SIZE_BYTES = 8; int VECTOR_COUNT_BYTES = 8; // Checkstyle: resume - // Byte is expanded to short if we compare strings with different encoding - if (kind1 != kind2 || kind1 == JavaKind.Char) { + // Byte is expanded to short if we compare non-LL strings. + if (!isLL) { CHAR_SIZE_BYTES = 2; } - if (kind1 != kind2) { + if (isLU || isUL) { VECTOR_COUNT_BYTES = 4; } @@ -146,13 +155,13 @@ public final class AArch64ArrayCompareToOp extends AArch64LIRInstruction { masm.lea(array1, AArch64Address.createUnscaledImmediateAddress(asRegister(array1Value), array1BaseOffset)); masm.lea(array2, AArch64Address.createUnscaledImmediateAddress(asRegister(array2Value), array2BaseOffset)); - // Calculate minimal length in chars for different kind case - // Conditions could be squashed but lets keep it readable - if (kind1 != kind2) { + // Calculate minimal length in chars for different kind cases. + // Conditions could be squashed but let's keep it readable. + if (isLU || isUL) { masm.lshr(64, length2, length2, 1); } - if (kind1 == kind2 && kind1 == JavaKind.Char) { + if (isUU) { masm.lshr(64, length1, length1, 1); masm.lshr(64, length2, length2, 1); } @@ -163,8 +172,9 @@ public final class AArch64ArrayCompareToOp extends AArch64LIRInstruction { // One of strings is empty masm.cbz(64, length, LENGTH_DIFFER_LABEL); - // Go back to bytes if necessary - if (kind1 != kind2 || kind1 == JavaKind.Char) { + // Go back to bytes for not LL cases, because following tail and length calculation is done + // in byte. + if (!isLL) { masm.shl(64, length, length, 1); } @@ -172,13 +182,18 @@ public final class AArch64ArrayCompareToOp extends AArch64LIRInstruction { masm.and(64, tailCount, length, VECTOR_SIZE_BYTES - 1); // tail count (in bytes) masm.ands(64, length, length, ~(VECTOR_SIZE_BYTES - 1)); // vector count (in bytes) - // Length of string is less than VECTOR_SIZE, go to simple compare + // Length of string is less than VECTOR_SIZE, go to simple compare. masm.branchConditionally(ConditionFlag.EQ, COMPARE_SHORT_LABEL); + // Go back to char because vecCount in the following loop is increasing in char. + if (isLU || isUL) { + masm.lshr(64, length, length, 1); + } + // MAIN_LOOP - read strings by 8 byte. masm.bind(MAIN_LOOP_LABEL); - if (kind1 != kind2) { - // Load 32 bits ad unpack it to entire 64bit register + if (isLU || isUL) { + // Load 32 bits and unpack it to entire 64bit register. masm.ldr(32, result, AArch64Address.createRegisterOffsetAddress(array1, vecCount, false)); masm.ubfm(64, temp, result, 0, 7); masm.lshr(64, result, result, 8); @@ -202,17 +217,23 @@ public final class AArch64ArrayCompareToOp extends AArch64LIRInstruction { masm.branchConditionally(ConditionFlag.LT, MAIN_LOOP_LABEL); // End of MAIN_LOOP - // Strings are equal and no TAIL go to END + // Strings are equal and no TAIL go to END. masm.cbz(64, tailCount, LENGTH_DIFFER_LABEL); // Compaire tail of long string ... masm.lea(array1, AArch64Address.createRegisterOffsetAddress(array1, length, false)); + + // Go back to bytes because the following array2's offset is caculated in byte. + if (isLU || isUL) { + masm.shl(64, length, length, 1); + } + masm.lea(array2, AArch64Address.createRegisterOffsetAddress(array2, length, false)); - // ... or string less than vector length + // ... or string less than vector length. masm.bind(COMPARE_SHORT_LABEL); - for (int i = 0; i < VECTOR_COUNT_BYTES; i += CHAR_SIZE_BYTES) { - if (kind1 != kind2) { + for (int i = 0; i < VECTOR_SIZE_BYTES; i += CHAR_SIZE_BYTES) { + if (isLU || isUL) { masm.ldr(8, temp, AArch64Address.createUnscaledImmediateAddress(array1, i / 2)); } else { masm.ldr(8 * CHAR_SIZE_BYTES, temp, AArch64Address.createUnscaledImmediateAddress(array1, i)); @@ -220,8 +241,8 @@ public final class AArch64ArrayCompareToOp extends AArch64LIRInstruction { masm.ldr(8 * CHAR_SIZE_BYTES, result, AArch64Address.createUnscaledImmediateAddress(array2, i)); - if (kind1 != kind2 && kind1 == JavaKind.Char) { - // Weird swap of substraction order + if (isUL) { + // UL's input has been swapped in AArch64StringUTF16Substitutions.compareToLatin1. masm.subs(64, result, result, temp); } else { masm.subs(64, result, temp, result); @@ -232,7 +253,7 @@ public final class AArch64ArrayCompareToOp extends AArch64LIRInstruction { masm.branchConditionally(ConditionFlag.EQ, LENGTH_DIFFER_LABEL); } - // STRING_DIFFER extract exact value of a difference + // STRING_DIFFER extract exact value of a difference. masm.bind(STRING_DIFFER_LABEL); masm.rbit(64, tailCount, result); masm.clz(64, vecCount, tailCount); @@ -245,21 +266,27 @@ public final class AArch64ArrayCompareToOp extends AArch64LIRInstruction { masm.and(64, result, result, 0xFFFF >>> (16 - (8 * CHAR_SIZE_BYTES))); // 0xFF or 0xFFFF masm.and(64, temp, temp, 0xFFFF >>> (16 - (8 * CHAR_SIZE_BYTES))); - masm.sub(64, result, temp, result); + if (isUL) { + // UL's input has been swapped in AArch64StringUTF16Substitutions.compareToLatin1. + masm.sub(64, result, result, temp); + } else { + masm.sub(64, result, temp, result); + } + masm.branchConditionally(ConditionFlag.AL, BREAK_LABEL); // End of STRING_DIFFER // Strings are equials up to length, - // return length difference in chars + // Return length difference in chars. masm.bind(LENGTH_DIFFER_LABEL); - if (kind1 != kind2 && kind1 == JavaKind.Char) { - // Weird swap of substraction order + if (isUL) { + // UL's input has been swapped in AArch64StringUTF16Substitutions.compareToLatin1. masm.sub(64, result, length2, length1); } else { masm.sub(64, result, length1, length2); } - // We are done + // We are done. masm.bind(BREAK_LABEL); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArrayEqualsOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArrayEqualsOp.java index 51b3fdd9978..3f0a5da4ac2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArrayEqualsOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ArrayEqualsOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -111,7 +111,7 @@ public final class AArch64ArrayEqualsOp extends AArch64LIRInstruction { // Return: rscratch1 is non-zero iff the arrays differ masm.bind(breakLabel); masm.cmp(64, rscratch1, zr); - masm.cset(result, ConditionFlag.EQ); + masm.cset(resultValue.getPlatformKind().getSizeInBytes() * Byte.SIZE, result, ConditionFlag.EQ); } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BitManipulationOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BitManipulationOp.java index 3569811233d..e1d2ca2d097 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BitManipulationOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BitManipulationOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BlockEndOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BlockEndOp.java index 2e133142193..1cdcd7897fe 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BlockEndOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BlockEndOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BreakpointOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BreakpointOp.java index aaac7b75a20..4fa2e4988fd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BreakpointOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64BreakpointOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ByteSwapOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ByteSwapOp.java index c7822aac270..0ba9ea18954 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ByteSwapOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ByteSwapOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64CCall.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64CCall.java index 48b5a8a6ce9..22c3e56b9e4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64CCall.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64CCall.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Call.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Call.java index 5d4b63444db..70d6741d57e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Call.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Call.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Compare.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Compare.java index 4acbd40dc66..96232ab1287 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Compare.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Compare.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ControlFlow.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ControlFlow.java index 1375206c96f..680622dac57 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ControlFlow.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ControlFlow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -159,6 +159,25 @@ public class AArch64ControlFlow { } } + public static class CondSetOp extends AArch64LIRInstruction { + public static final LIRInstructionClass TYPE = LIRInstructionClass.create(CondSetOp.class); + + @Def protected Value result; + private final AArch64Assembler.ConditionFlag condition; + + public CondSetOp(Variable result, AArch64Assembler.ConditionFlag condition) { + super(TYPE); + this.result = result; + this.condition = condition; + } + + @Override + public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) { + int size = result.getPlatformKind().getSizeInBytes() * Byte.SIZE; + masm.cset(size, asRegister(result), condition); + } + } + public static class StrategySwitchOp extends AArch64BlockEndOp implements StandardOp.BlockEndOp { public static final LIRInstructionClass TYPE = LIRInstructionClass.create(StrategySwitchOp.class); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64FrameMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64FrameMap.java index 35298ec1069..12639cde804 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64FrameMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64FrameMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64FrameMapBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64FrameMapBuilder.java index 660644a1ae7..44baf5f20fa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64FrameMapBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64FrameMapBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64LIRFlagsVersioned.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64LIRFlagsVersioned.java index 27f3614338c..66dc07a777f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64LIRFlagsVersioned.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64LIRFlagsVersioned.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64LIRInstruction.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64LIRInstruction.java index 59a5f175afa..903e890f56b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64LIRInstruction.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64LIRInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Move.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Move.java index 227f0030f29..efcba926f06 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Move.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Move.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64PauseOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64PauseOp.java index 41caa260de5..b729a2e5f0b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64PauseOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64PauseOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64PrefetchOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64PrefetchOp.java index d6a65ede7e8..7d1a5d1ba9b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64PrefetchOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64PrefetchOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ReinterpretOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ReinterpretOp.java index cc7cb7f52e9..0502c72de89 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ReinterpretOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64ReinterpretOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64RestoreRegistersOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64RestoreRegistersOp.java index f4db9c62779..e36741e6f15 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64RestoreRegistersOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64RestoreRegistersOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SaveRegistersOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SaveRegistersOp.java index 76697acf744..41f54bb16fb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SaveRegistersOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SaveRegistersOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SignExtendOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SignExtendOp.java index f5391609b50..6dcaa040600 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SignExtendOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SignExtendOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SpeculativeBarrier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SpeculativeBarrier.java index b2cfef2a5ac..88cd8d76546 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SpeculativeBarrier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64SpeculativeBarrier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Unary.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Unary.java index d087d8385ee..36ed637e369 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Unary.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.aarch64/src/org/graalvm/compiler/lir/aarch64/AArch64Unary.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64AddressValue.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64AddressValue.java index b12bb8b5454..00b5d7267dd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64AddressValue.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64AddressValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Arithmetic.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Arithmetic.java index a7c9ce3e90f..2f60bef405f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Arithmetic.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Arithmetic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArithmeticLIRGeneratorTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArithmeticLIRGeneratorTool.java index 9d9c2d7f326..c8bda0d61c3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArithmeticLIRGeneratorTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArithmeticLIRGeneratorTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArrayCompareToOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArrayCompareToOp.java index e953e680621..537de9fbf8b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArrayCompareToOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArrayCompareToOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArrayEqualsOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArrayEqualsOp.java index 807983c49d5..c2f16af9164 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArrayEqualsOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArrayEqualsOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Binary.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Binary.java index 446936c79a5..2f9dca66b3b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Binary.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Binary.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BinaryConsumer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BinaryConsumer.java index a021c1c5ae7..134d12bba02 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BinaryConsumer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BinaryConsumer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BlockEndOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BlockEndOp.java index 06165ec10cb..5f59ba1a413 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BlockEndOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BlockEndOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BreakpointOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BreakpointOp.java index 8e2494c4611..24ee43e2215 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BreakpointOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64BreakpointOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ByteSwapOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ByteSwapOp.java index be200c9eb91..cdccc16fdd9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ByteSwapOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ByteSwapOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64CCall.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64CCall.java index eabcef00b75..aecd87be843 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64CCall.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64CCall.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ClearRegisterOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ClearRegisterOp.java index 2a928844619..a5ea4ac6243 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ClearRegisterOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ClearRegisterOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ControlFlow.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ControlFlow.java index d47c7a9f1de..f010ea0ae81 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ControlFlow.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ControlFlow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64FrameMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64FrameMap.java index 2456d3035c3..fcc70922b7f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64FrameMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64FrameMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64FrameMapBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64FrameMapBuilder.java index ca98a278656..6c4cf486dd6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64FrameMapBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64FrameMapBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64LFenceOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64LFenceOp.java index 0e35d61eb0a..7097538e9c1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64LFenceOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64LFenceOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64LIRInstruction.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64LIRInstruction.java index 077f9e741c6..3062421c7f7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64LIRInstruction.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64LIRInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MathIntrinsicBinaryOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MathIntrinsicBinaryOp.java index 84828bf5e15..cdf06fd0a80 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MathIntrinsicBinaryOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MathIntrinsicBinaryOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MathIntrinsicUnaryOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MathIntrinsicUnaryOp.java index 59088696abf..b28c65def47 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MathIntrinsicUnaryOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MathIntrinsicUnaryOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Move.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Move.java index fb56c51074c..3cfb4475115 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Move.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Move.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MulDivOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MulDivOp.java index 57fb758cd9b..f1e678cfca8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MulDivOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64MulDivOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64PauseOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64PauseOp.java index 77480ed9a99..75706055bb2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64PauseOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64PauseOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64PrefetchOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64PrefetchOp.java index 21db485a768..1157cbec2e0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64PrefetchOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64PrefetchOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ReadTimestampCounter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ReadTimestampCounter.java index 0765479e2a7..237266653a4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ReadTimestampCounter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ReadTimestampCounter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64RestoreRegistersOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64RestoreRegistersOp.java index b2820b2511f..1097027724f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64RestoreRegistersOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64RestoreRegistersOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64SaveRegistersOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64SaveRegistersOp.java index 540fe67c0a7..6ffe5dcb928 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64SaveRegistersOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64SaveRegistersOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ShiftOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ShiftOp.java index a77b2c4266c..0e7f5f74105 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ShiftOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ShiftOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64SignExtendOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64SignExtendOp.java index 0247dfdf5d6..b8285b09453 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64SignExtendOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64SignExtendOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Unary.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Unary.java index a344de5ef95..7999dbb0720 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Unary.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64Unary.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64VZeroUpper.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64VZeroUpper.java index 781031ff8c6..6b1d0242ba8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64VZeroUpper.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64VZeroUpper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ZapRegistersOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ZapRegistersOp.java index 3deb9511b48..fe88dd60ff2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ZapRegistersOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ZapRegistersOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ZapStackOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ZapStackOp.java index 78dd19ab7c8..5df28ff844b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ZapStackOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ZapStackOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/phases/StackMoveOptimizationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/phases/StackMoveOptimizationPhase.java index e4ff9f6da7d..cf577c50585 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/phases/StackMoveOptimizationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/phases/StackMoveOptimizationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/ConstantStackCastTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/ConstantStackCastTest.java index e44f5154e47..02a185a8d98 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/ConstantStackCastTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/ConstantStackCastTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTest.java index 9435be75b7d..dcc490b3244 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTestSpecification.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTestSpecification.java index 9376b4b34fb..53c9a47c0b6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTestSpecification.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTestSpecification.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTestTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTestTest.java index 5cdc6633e64..0f92b4c3998 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTestTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/LIRTestTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/SPARCBranchBailoutTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/SPARCBranchBailoutTest.java index 74e92b423d6..d06035777dc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/SPARCBranchBailoutTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/SPARCBranchBailoutTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/StackMoveTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/StackMoveTest.java index afd1f63596e..b99cb1f92af 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/StackMoveTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/StackMoveTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/StackStoreLoadTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/StackStoreLoadTest.java index 0129a74632d..dc1fd96d5da 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/StackStoreLoadTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.jtt/src/org/graalvm/compiler/lir/jtt/StackStoreLoadTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCAddressValue.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCAddressValue.java index b20b050da02..7609b4f89b5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCAddressValue.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCAddressValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCArithmetic.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCArithmetic.java index 3ee9d8b0c3f..93826010f95 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCArithmetic.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCArithmetic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCArrayEqualsOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCArrayEqualsOp.java index fffc3aa9f25..564969a56a8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCArrayEqualsOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCArrayEqualsOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBitManipulationOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBitManipulationOp.java index 00061cd5a1c..10852c1f5ae 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBitManipulationOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBitManipulationOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBlockEndOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBlockEndOp.java index f11328720cc..bbdf2b88f7f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBlockEndOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBlockEndOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBreakpointOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBreakpointOp.java index 4dd0cc774f0..87d076c87e6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBreakpointOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCBreakpointOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCByteSwapOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCByteSwapOp.java index 005c63056c3..c7b814deed7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCByteSwapOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCByteSwapOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCCall.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCCall.java index 1cb40c45586..57101fb44b7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCCall.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCCall.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCControlFlow.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCControlFlow.java index e18eb419b14..58bba0e675b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCControlFlow.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCControlFlow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCDelayedControlTransfer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCDelayedControlTransfer.java index e43be4fa480..83b20e12daa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCDelayedControlTransfer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCDelayedControlTransfer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFloatCompareOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFloatCompareOp.java index 24728acb524..03f0d880280 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFloatCompareOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFloatCompareOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFrameMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFrameMap.java index c397518a3be..6fe92adc474 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFrameMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFrameMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFrameMapBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFrameMapBuilder.java index f8f584ecd12..025df00c764 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFrameMapBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCFrameMapBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCImmediateAddressValue.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCImmediateAddressValue.java index 5059e6aec48..870b79ad38c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCImmediateAddressValue.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCImmediateAddressValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCIndexedAddressValue.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCIndexedAddressValue.java index 412ab6dbaa4..66cb3bb7b74 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCIndexedAddressValue.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCIndexedAddressValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCJumpOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCJumpOp.java index 090448415c9..54410802904 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCJumpOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCJumpOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLIRInstruction.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLIRInstruction.java index 775ff2c236d..6e02d80bb7a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLIRInstruction.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLIRInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLIRInstructionMixin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLIRInstructionMixin.java index d24fa3075d4..543984fbcf7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLIRInstructionMixin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLIRInstructionMixin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLoadConstantTableBaseOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLoadConstantTableBaseOp.java index f3a80c62eb7..177d2eb9407 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLoadConstantTableBaseOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCLoadConstantTableBaseOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCMove.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCMove.java index f7d39f5d166..96ab88734ea 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCMove.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCMove.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCOP3Op.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCOP3Op.java index b9ea2ee6e3a..969030ea401 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCOP3Op.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCOP3Op.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCOPFOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCOPFOp.java index 39b84689a58..ddabdac2c57 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCOPFOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCOPFOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCPauseOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCPauseOp.java index 407a4ca6507..542233b0fd7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCPauseOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCPauseOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCPrefetchOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCPrefetchOp.java index b6a71dd26ee..0cdc4279e2a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCPrefetchOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCPrefetchOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCSaveRegistersOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCSaveRegistersOp.java index 4de5d57cf8b..8753b481aa7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCSaveRegistersOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCSaveRegistersOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCTailDelayedLIRInstruction.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCTailDelayedLIRInstruction.java index f71435a3366..1ae165bb1eb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCTailDelayedLIRInstruction.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.sparc/src/org/graalvm/compiler/lir/sparc/SPARCTailDelayedLIRInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.test/src/org/graalvm/compiler/lir/test/CompositeValueReplacementTest1.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.test/src/org/graalvm/compiler/lir/test/CompositeValueReplacementTest1.java index 78d5cbcb2f9..a2226fa2847 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.test/src/org/graalvm/compiler/lir/test/CompositeValueReplacementTest1.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.test/src/org/graalvm/compiler/lir/test/CompositeValueReplacementTest1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.test/src/org/graalvm/compiler/lir/test/GenericValueMapTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.test/src/org/graalvm/compiler/lir/test/GenericValueMapTest.java index 3da341ad340..e48c5e4fc15 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.test/src/org/graalvm/compiler/lir/test/GenericValueMapTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.test/src/org/graalvm/compiler/lir/test/GenericValueMapTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.test/src/org/graalvm/compiler/lir/test/alloc/trace/TraceGlobalMoveResolutionMappingTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.test/src/org/graalvm/compiler/lir/test/alloc/trace/TraceGlobalMoveResolutionMappingTest.java deleted file mode 100644 index e14426718ee..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.test/src/org/graalvm/compiler/lir/test/alloc/trace/TraceGlobalMoveResolutionMappingTest.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.test.alloc.trace; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.HashSet; - -import jdk.internal.vm.compiler.collections.Pair; -import org.graalvm.compiler.core.common.LIRKind; -import org.graalvm.compiler.lir.alloc.trace.ShadowedRegisterValue; -import org.graalvm.compiler.lir.alloc.trace.TraceGlobalMoveResolutionPhase; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - -import jdk.vm.ci.code.Register; -import jdk.vm.ci.code.Register.RegisterCategory; -import jdk.vm.ci.code.RegisterValue; -import jdk.vm.ci.code.StackSlot; -import jdk.vm.ci.meta.AllocatableValue; -import jdk.vm.ci.meta.PlatformKind; -import jdk.vm.ci.meta.Value; - -/** - * Test global move resolver of the trace register allocator. - * - * Especially the mapping of LabelOp.incoming and BlockEndOp.outgoing. - */ -public class TraceGlobalMoveResolutionMappingTest { - - private static final class MoveResolverMock extends TraceGlobalMoveResolutionPhase.MoveResolver { - - private final HashSet> mapping = new HashSet<>(); - - @Override - public void addMapping(Value src, AllocatableValue dst, Value srcStack) { - mapping.add(Pair.create(src, dst)); - } - - public int size() { - return mapping.size(); - } - - public boolean contains(Value src, AllocatableValue dst) { - return mapping.contains(Pair.create(src, dst)); - } - - @Override - public String toString() { - return mapping.toString(); - } - - } - - private static final RegisterCategory CPU = new RegisterCategory("CPU"); - - private static final Register r0 = new Register(0, 0, "r0", CPU); - private static final Register r1 = new Register(1, 1, "r1", CPU); - - private enum DummyPlatformKind implements PlatformKind { - Long; - - private EnumKey key = new EnumKey<>(this); - - @Override - public Key getKey() { - return key; - } - - @Override - public int getSizeInBytes() { - return 8; - } - - @Override - public int getVectorLength() { - return 1; - } - - @Override - public char getTypeChar() { - return 'l'; - } - } - - private static final LIRKind kind = LIRKind.value(DummyPlatformKind.Long); - - private MoveResolverMock resolver; - - @Before - public void setUp() { - resolver = new MoveResolverMock(); - } - - private void addMapping(Value src, Value dst) { - TraceGlobalMoveResolutionPhase.addMapping(resolver, src, dst); - } - - /** Create RegisterValue. */ - private static RegisterValue v(Register r) { - return r.asValue(kind); - } - - /** Create StackSlot. */ - private static StackSlot s(int offset) { - return StackSlot.get(kind, -offset, true); - } - - /** Create ShadowedRegisterValue. */ - private static ShadowedRegisterValue sd(Register reg, int offset) { - return new ShadowedRegisterValue(v(reg), s(offset)); - } - - private void assertContains(Value src, AllocatableValue dst) { - assertTrue(String.format("Expected move from %s to %s. %s", src, dst, resolver), resolver.contains(src, dst)); - } - - private void assertSize(int expected) { - assertEquals(resolver.toString(), expected, resolver.size()); - } - - @Test - public void testReg2Reg0() { - addMapping(v(r0), v(r1)); - assertContains(v(r0), v(r1)); - } - - @Test - public void testReg2Reg1() { - addMapping(v(r0), v(r0)); - assertSize(0); - } - - @Test - public void testStack2Stack0() { - addMapping(s(1), s(2)); - assertContains(s(1), s(2)); - } - - @Test - public void testStack2Stack1() { - addMapping(s(1), s(1)); - assertSize(0); - } - - @Test - public void testStack2Reg() { - addMapping(s(1), v(r1)); - assertContains(s(1), v(r1)); - } - - @Test - public void testReg2Stack() { - addMapping(v(r0), s(1)); - assertContains(v(r0), s(1)); - } - - @Test - public void testShadowed2Reg() { - addMapping(sd(r0, 1), v(r1)); - assertContains(v(r0), v(r1)); - } - - @Test - public void testReg2Shadowed0() { - addMapping(v(r0), sd(r1, 1)); - assertSize(2); - assertContains(v(r0), v(r1)); - assertContains(v(r0), s(1)); - } - - @Test - public void testReg2Shadowed1() { - addMapping(v(r0), sd(r0, 1)); - assertSize(1); - assertContains(v(r0), s(1)); - } - - @Test - @Ignore("Cannot express mapping dependencies (yet)") - public void testStack2Shadowed0() { - addMapping(s(2), sd(r1, 1)); - assertSize(2); - assertContains(s(2), v(r1)); - assertContains(v(r1), s(1)); - } - - @Test - public void testStack2Shadowed0WorkArount() { - addMapping(s(2), sd(r1, 1)); - assertSize(2); - assertContains(s(2), v(r1)); - assertContains(s(2), s(1)); - } - - @Test - public void testStack2Shadowed1() { - addMapping(s(1), sd(r1, 1)); - assertSize(1); - assertContains(s(1), v(r1)); - } - - @Test - public void testShadowed2Shadowed0() { - addMapping(sd(r0, 1), sd(r1, 2)); - assertSize(2); - assertContains(v(r0), v(r1)); - assertContains(v(r0), s(2)); - } - - @Test - public void testShadowed2Shadowed1() { - addMapping(sd(r0, 1), sd(r1, 1)); - assertSize(1); - assertContains(v(r0), v(r1)); - } - - @Test - public void testShadowed2Shadowed2() { - addMapping(sd(r0, 1), sd(r0, 1)); - assertSize(0); - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/BailoutAndRestartBackendException.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/BailoutAndRestartBackendException.java index e6e1f1d0e79..12334f22a62 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/BailoutAndRestartBackendException.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/BailoutAndRestartBackendException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/CompositeValue.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/CompositeValue.java index 4a63a5fe35a..ffe6b7c8ffe 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/CompositeValue.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/CompositeValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/CompositeValueClass.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/CompositeValueClass.java index abc511b89f9..7ebbf72d9ef 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/CompositeValueClass.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/CompositeValueClass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ConstantValue.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ConstantValue.java index ad1980594ec..ebb2672ed39 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ConstantValue.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ConstantValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ControlFlowOptimizer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ControlFlowOptimizer.java index 13de27a523d..2dd8855f515 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ControlFlowOptimizer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ControlFlowOptimizer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/EdgeMoveOptimizer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/EdgeMoveOptimizer.java index 7cc1bca55bd..71bab4bb9a9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/EdgeMoveOptimizer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/EdgeMoveOptimizer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/FullInfopointOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/FullInfopointOp.java index d22c6da32ec..3a24326a839 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/FullInfopointOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/FullInfopointOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionStateProcedure.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionStateProcedure.java index fafea53d5ce..f1f4c2783eb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionStateProcedure.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionStateProcedure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionValueConsumer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionValueConsumer.java index 7f119da328b..23d7f25a493 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionValueConsumer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionValueConsumer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionValueProcedure.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionValueProcedure.java index 20f8c916c00..09989006d82 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionValueProcedure.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/InstructionValueProcedure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIR.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIR.java index 2607363ee7b..bc91f6382b7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIR.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIR.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRFrameState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRFrameState.java index e76cd02e853..32993938c6a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRFrameState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRFrameState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInsertionBuffer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInsertionBuffer.java index 3fe98e2cc11..22144d0bab4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInsertionBuffer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInsertionBuffer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInstruction.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInstruction.java index b0b89d7025b..a1eedee0286 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInstruction.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInstructionClass.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInstructionClass.java index 9e042e0e57b..36ad1f620d7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInstructionClass.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRInstructionClass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRIntrospection.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRIntrospection.java index 2048eaaee90..861fda151ef 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRIntrospection.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRIntrospection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRValueUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRValueUtil.java index e4613b6270e..37412750257 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRValueUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRValueUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRVerifier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRVerifier.java index 69b1a3d9b6f..d11ffa05c07 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRVerifier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LIRVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LabelRef.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LabelRef.java index 6a95185b6f3..a5b3a9b69db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LabelRef.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/LabelRef.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/NullCheckOptimizer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/NullCheckOptimizer.java index b8d28f7fd91..e4655bff17b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/NullCheckOptimizer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/NullCheckOptimizer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/Opcode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/Opcode.java index c3768ce1307..ece0a8627a2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/Opcode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/Opcode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/RedundantMoveElimination.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/RedundantMoveElimination.java index 4394620c4b0..8d0aa6d13af 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/RedundantMoveElimination.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/RedundantMoveElimination.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/StandardOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/StandardOp.java index ffb65a69e90..5b08f595f9d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/StandardOp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/StandardOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/StateProcedure.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/StateProcedure.java index bf0f27dbfbf..3625ab59ee6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/StateProcedure.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/StateProcedure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/SwitchStrategy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/SwitchStrategy.java index e0cafb6d084..89c09516006 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/SwitchStrategy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/SwitchStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ValueConsumer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ValueConsumer.java index 4377fd87134..52a449fe0b7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ValueConsumer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ValueConsumer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ValueProcedure.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ValueProcedure.java index 7e7e3f16b02..4541a94c03a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ValueProcedure.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ValueProcedure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/Variable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/Variable.java index 50cd85c3eb4..4bfbeb2ce40 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/Variable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/Variable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/VirtualStackSlot.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/VirtualStackSlot.java index 052bde9d4d9..14cb96188c8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/VirtualStackSlot.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/VirtualStackSlot.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/AllocationStageVerifier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/AllocationStageVerifier.java index f4baf8f6cc9..4977dad3dd6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/AllocationStageVerifier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/AllocationStageVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/OutOfRegistersException.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/OutOfRegistersException.java index ff8bc74201d..0c81c9b9fc3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/OutOfRegistersException.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/OutOfRegistersException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/SaveCalleeSaveRegisters.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/SaveCalleeSaveRegisters.java index d74a12c0d3f..cd531ef156d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/SaveCalleeSaveRegisters.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/SaveCalleeSaveRegisters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/Interval.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/Interval.java index cc3839de008..b85ee9dc01c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/Interval.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/Interval.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/IntervalWalker.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/IntervalWalker.java index 1b6b915ac43..00797c155ce 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/IntervalWalker.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/IntervalWalker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScan.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScan.java index 112238823ed..a5f5a3f2dec 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScan.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScan.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanAllocationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanAllocationPhase.java index 78da364345d..8187f0874ba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanAllocationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanAllocationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanAssignLocationsPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanAssignLocationsPhase.java index 05708d44f09..de3d4f0511d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanAssignLocationsPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanAssignLocationsPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanEliminateSpillMovePhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanEliminateSpillMovePhase.java index 7ebd268eb7b..271f4727468 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanEliminateSpillMovePhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanEliminateSpillMovePhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanIntervalDumper.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanIntervalDumper.java index 71610701ae3..247e525ae51 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanIntervalDumper.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanIntervalDumper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanLifetimeAnalysisPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanLifetimeAnalysisPhase.java index b7d62d9fafd..d01fb2b40a1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanLifetimeAnalysisPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanLifetimeAnalysisPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanOptimizeSpillPositionPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanOptimizeSpillPositionPhase.java index 5584278fcac..063cdc517f9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanOptimizeSpillPositionPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanOptimizeSpillPositionPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanPhase.java index cb2d7636e00..9622b0a60f4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanRegisterAllocationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanRegisterAllocationPhase.java index de2332cdfb5..bc56bfdf630 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanRegisterAllocationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanRegisterAllocationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanResolveDataFlowPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanResolveDataFlowPhase.java index 7c2cdc8d7d6..8008cf617f8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanResolveDataFlowPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanResolveDataFlowPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanWalker.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanWalker.java index 50efada45dd..fc2c0a3b8c7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanWalker.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/LinearScanWalker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/MoveResolver.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/MoveResolver.java index 2df6499c4ce..2e86f003288 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/MoveResolver.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/MoveResolver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/OptimizingLinearScanWalker.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/OptimizingLinearScanWalker.java index a84bf43a792..f62dc911111 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/OptimizingLinearScanWalker.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/OptimizingLinearScanWalker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/Range.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/Range.java index e8c177215f0..bbc79dd1d54 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/Range.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/Range.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/RegisterVerifier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/RegisterVerifier.java index 86328c462e2..ce3b022ec43 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/RegisterVerifier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/RegisterVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScan.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScan.java index d8649141b90..ce0c50b0ef6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScan.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScan.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanEliminateSpillMovePhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanEliminateSpillMovePhase.java index 78a52c87c14..b2afe06df4a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanEliminateSpillMovePhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanEliminateSpillMovePhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanLifetimeAnalysisPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanLifetimeAnalysisPhase.java index 7db781a4f91..ab8d6a1715b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanLifetimeAnalysisPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanLifetimeAnalysisPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanResolveDataFlowPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanResolveDataFlowPhase.java index 183f65f5869..61c03d67d2a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanResolveDataFlowPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSALinearScanResolveDataFlowPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSAMoveResolver.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSAMoveResolver.java index 10367d750c7..2c67680ed92 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSAMoveResolver.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/lsra/ssa/SSAMoveResolver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/DefaultTraceRegisterAllocationPolicy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/DefaultTraceRegisterAllocationPolicy.java deleted file mode 100644 index 5bfafd1a6df..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/DefaultTraceRegisterAllocationPolicy.java +++ /dev/null @@ -1,420 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import java.util.ArrayList; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.lir.alloc.trace.TraceAllocationPhase.TraceAllocationContext; -import org.graalvm.compiler.lir.alloc.trace.TraceRegisterAllocationPolicy.AllocationStrategy; -import org.graalvm.compiler.lir.alloc.trace.bu.BottomUpAllocator; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.options.EnumOptionKey; -import org.graalvm.compiler.options.Option; -import org.graalvm.compiler.options.OptionKey; -import org.graalvm.compiler.options.OptionType; -import org.graalvm.compiler.options.OptionValues; - -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.common.JVMCIError; -import jdk.vm.ci.meta.AllocatableValue; -import jdk.vm.ci.meta.PlatformKind; - -/** - * Manages the selection of allocation strategies. - */ -public final class DefaultTraceRegisterAllocationPolicy { - - public enum TraceRAPolicies { - Default, - LinearScanOnly, - BottomUpOnly, - AlmostTrivial, - NumVariables, - Ratio, - Loops, - MaxFreq, - FreqBudget, - LoopRatio, - LoopBudget, - LoopMaxFreq - } - - public static class Options { - // @formatter:off - @Option(help = "Use special allocator for trivial blocks.", type = OptionType.Debug) - public static final OptionKey TraceRAtrivialBlockAllocator = new OptionKey<>(true); - @Option(help = "Use BottomUp if there is only one block with at most this number of instructions", type = OptionType.Debug) - public static final OptionKey TraceRAalmostTrivialSize = new OptionKey<>(2); - @Option(help = "Use BottomUp for traces with low number of variables at block boundaries", type = OptionType.Debug) - public static final OptionKey TraceRAnumVariables = new OptionKey<>(null); - @Option(help = "Use LSRA / BottomUp ratio", type = OptionType.Debug) - public static final OptionKey TraceRAbottomUpRatio = new OptionKey<>(0.0); - @Option(help = "Frequency Threshold", type = OptionType.Debug) - public static final OptionKey TraceRAfrequencyThreshold = new OptionKey<>(0.8); - @Option(help = "Sum Frequency Budget Threshold", type = OptionType.Debug) - public static final OptionKey TraceRAsumBudget = new OptionKey<>(0.5); - @Option(help = "TraceRA allocation policy to use.", type = OptionType.Debug) - public static final EnumOptionKey TraceRAPolicy = new EnumOptionKey<>(TraceRAPolicies.Default); - // @formatter:on - } - - public static final class TrivialTraceStrategy extends AllocationStrategy { - - public TrivialTraceStrategy(TraceRegisterAllocationPolicy plan) { - plan.super(); - } - - @Override - public boolean shouldApplyTo(Trace trace) { - return TraceUtil.isTrivialTrace(getLIR(), trace); - } - - @Override - protected TraceAllocationPhase initAllocator(TargetDescription target, LIRGenerationResult lirGenRes, MoveFactory spillMoveFactory, - RegisterAllocationConfig registerAllocationConfig, AllocatableValue[] cachedStackSlots, TraceBuilderResult resultTraces, boolean neverSpillConstant, - GlobalLivenessInfo livenessInfo, ArrayList strategies) { - return new TrivialTraceAllocator(); - } - } - - public static class BottomUpStrategy extends AllocationStrategy { - - public BottomUpStrategy(TraceRegisterAllocationPolicy plan) { - // explicitly specify the enclosing instance for the superclass constructor call - plan.super(); - } - - @Override - public boolean shouldApplyTo(Trace trace) { - return !containsExceptionEdge(trace); - } - - private static boolean containsExceptionEdge(Trace trace) { - for (AbstractBlockBase block : trace.getBlocks()) { - // check if one of the successors is an exception handler - for (AbstractBlockBase succ : block.getSuccessors()) { - if (succ.isExceptionEntry()) { - return true; - } - } - } - return false; - } - - @Override - protected TraceAllocationPhase initAllocator(TargetDescription target, LIRGenerationResult lirGenRes, MoveFactory spillMoveFactory, - RegisterAllocationConfig registerAllocationConfig, AllocatableValue[] cachedStackSlots, TraceBuilderResult resultTraces, boolean neverSpillConstant, - GlobalLivenessInfo livenessInfo, ArrayList strategies) { - return new BottomUpAllocator(target, lirGenRes, spillMoveFactory, registerAllocationConfig, cachedStackSlots, resultTraces, neverSpillConstant, livenessInfo); - } - } - - public static final class BottomUpAlmostTrivialStrategy extends BottomUpStrategy { - - private final int trivialTraceSize; - - public BottomUpAlmostTrivialStrategy(TraceRegisterAllocationPolicy plan) { - // explicitly specify the enclosing instance for the superclass constructor call - super(plan); - trivialTraceSize = Options.TraceRAalmostTrivialSize.getValue(plan.getOptions()); - } - - @Override - public boolean shouldApplyTo(Trace trace) { - if (!super.shouldApplyTo(trace)) { - return false; - } - if (trace.size() != 1) { - return false; - } - return getLIR().getLIRforBlock(trace.getBlocks()[0]).size() <= trivialTraceSize; - } - - } - - public static final class BottomUpNumVariablesStrategy extends BottomUpStrategy { - - private final int numVarLimit; - - public BottomUpNumVariablesStrategy(TraceRegisterAllocationPolicy plan) { - // explicitly specify the enclosing instance for the superclass constructor call - super(plan); - Integer value = Options.TraceRAnumVariables.getValue(plan.getOptions()); - if (value != null) { - numVarLimit = value; - } else { - /* Default to the number of allocatable word registers. */ - PlatformKind wordKind = getTarget().arch.getWordKind(); - int numWordRegisters = getRegisterAllocationConfig().getAllocatableRegisters(wordKind).allocatableRegisters.length; - numVarLimit = numWordRegisters; - } - } - - @Override - public boolean shouldApplyTo(Trace trace) { - if (!super.shouldApplyTo(trace)) { - return false; - } - GlobalLivenessInfo livenessInfo = getGlobalLivenessInfo(); - int maxNumVars = livenessInfo.getBlockIn(trace.getBlocks()[0]).length; - for (AbstractBlockBase block : trace.getBlocks()) { - maxNumVars = Math.max(maxNumVars, livenessInfo.getBlockOut(block).length); - } - return maxNumVars <= numVarLimit; - } - - } - - public static final class BottomUpRatioStrategy extends BottomUpStrategy { - - private final double ratio; - - public BottomUpRatioStrategy(TraceRegisterAllocationPolicy plan) { - // explicitly specify the enclosing instance for the superclass constructor call - super(plan); - ratio = Options.TraceRAbottomUpRatio.getValue(plan.getOptions()); - } - - @Override - public boolean shouldApplyTo(Trace trace) { - if (!super.shouldApplyTo(trace)) { - return false; - } - double numTraces = getTraceBuilderResult().getTraces().size(); - double traceId = trace.getId(); - assert ratio >= 0 && ratio <= 1.0 : "Ratio out of range: " + ratio; - return (traceId / numTraces) >= ratio; - } - - } - - public abstract static class BottomUpLoopStrategyBase extends BottomUpStrategy { - - public BottomUpLoopStrategyBase(TraceRegisterAllocationPolicy plan) { - // explicitly specify the enclosing instance for the superclass constructor call - super(plan); - } - - @Override - public final boolean shouldApplyTo(Trace trace) { - if (!super.shouldApplyTo(trace)) { - return false; - } - if (getLIR().getControlFlowGraph().getLoops().isEmpty()) { - return shouldApplyToNoLoop(trace); - } - for (AbstractBlockBase block : trace.getBlocks()) { - if (block.getLoopDepth() > 0) { - return false; - } - } - return true; - } - - protected abstract boolean shouldApplyToNoLoop(Trace trace); - - } - - public static final class BottomUpLoopStrategy extends BottomUpLoopStrategyBase { - - public BottomUpLoopStrategy(TraceRegisterAllocationPolicy plan) { - // explicitly specify the enclosing instance for the superclass constructor call - super(plan); - } - - @Override - protected boolean shouldApplyToNoLoop(Trace trace) { - // no loops at all -> use LSRA - return false; - } - - } - - public static final class BottomUpDelegatingLoopStrategy extends BottomUpLoopStrategyBase { - - private final BottomUpStrategy delegate; - - public BottomUpDelegatingLoopStrategy(TraceRegisterAllocationPolicy plan, BottomUpStrategy delegate) { - // explicitly specify the enclosing instance for the superclass constructor call - super(plan); - this.delegate = delegate; - } - - @Override - protected boolean shouldApplyToNoLoop(Trace trace) { - return delegate.shouldApplyTo(trace); - } - - } - - public static final class BottomUpMaxFrequencyStrategy extends BottomUpStrategy { - - private final double maxRelativeFrequency; - private final double frequencyThreshold; - - public BottomUpMaxFrequencyStrategy(TraceRegisterAllocationPolicy plan) { - // explicitly specify the enclosing instance for the superclass constructor call - super(plan); - maxRelativeFrequency = maxRelativeFrequency(getLIR().getControlFlowGraph().getBlocks()); - frequencyThreshold = Options.TraceRAfrequencyThreshold.getValue(plan.getOptions()); - } - - private static double maxRelativeFrequency(AbstractBlockBase[] blocks) { - double max = 0; - for (AbstractBlockBase block : blocks) { - double frequency = block.getRelativeFrequency(); - if (frequency > max) { - max = frequency; - } - } - return max; - } - - @Override - public boolean shouldApplyTo(Trace trace) { - if (!super.shouldApplyTo(trace)) { - return false; - } - return maxRelativeFrequency(trace.getBlocks()) / maxRelativeFrequency <= frequencyThreshold; - } - - } - - public static final class BottomUpFrequencyBudgetStrategy extends BottomUpStrategy { - - private final double[] cumulativeTraceFrequency; - private final double budget; - - public BottomUpFrequencyBudgetStrategy(TraceRegisterAllocationPolicy plan) { - // explicitly specify the enclosing instance for the superclass constructor call - super(plan); - ArrayList traces = getTraceBuilderResult().getTraces(); - this.cumulativeTraceFrequency = new double[traces.size()]; - double sumMethodFrequency = init(traces, this.cumulativeTraceFrequency); - this.budget = sumMethodFrequency * Options.TraceRAsumBudget.getValue(plan.getOptions()); - } - - private static double init(ArrayList traces, double[] sumTraces) { - double sumMethod = 0; - for (Trace trace : traces) { - double traceSum = 0; - for (AbstractBlockBase block : trace.getBlocks()) { - traceSum += block.getRelativeFrequency(); - } - sumMethod += traceSum; - // store cumulative sum for trace - sumTraces[trace.getId()] = sumMethod; - } - return sumMethod; - } - - @Override - public boolean shouldApplyTo(Trace trace) { - if (!super.shouldApplyTo(trace)) { - return false; - } - double cumTraceFrequency = cumulativeTraceFrequency[trace.getId()]; - return cumTraceFrequency > budget; - } - - } - - public static final class TraceLinearScanStrategy extends AllocationStrategy { - - public TraceLinearScanStrategy(TraceRegisterAllocationPolicy plan) { - // explicitly specify the enclosing instance for the superclass constructor call - plan.super(); - } - - @Override - public boolean shouldApplyTo(Trace trace) { - return true; - } - - @Override - protected TraceAllocationPhase initAllocator(TargetDescription target, LIRGenerationResult lirGenRes, MoveFactory spillMoveFactory, - RegisterAllocationConfig registerAllocationConfig, AllocatableValue[] cachedStackSlots, TraceBuilderResult resultTraces, boolean neverSpillConstant, - GlobalLivenessInfo livenessInfo, ArrayList strategies) { - return new TraceLinearScanPhase(target, lirGenRes, spillMoveFactory, registerAllocationConfig, resultTraces, neverSpillConstant, cachedStackSlots, livenessInfo); - } - - } - - public static TraceRegisterAllocationPolicy allocationPolicy(TargetDescription target, LIRGenerationResult lirGenRes, MoveFactory spillMoveFactory, - RegisterAllocationConfig registerAllocationConfig, AllocatableValue[] cachedStackSlots, TraceBuilderResult resultTraces, boolean neverSpillConstant, - GlobalLivenessInfo livenessInfo, OptionValues options) { - TraceRegisterAllocationPolicy plan = new TraceRegisterAllocationPolicy(target, lirGenRes, spillMoveFactory, registerAllocationConfig, cachedStackSlots, resultTraces, neverSpillConstant, - livenessInfo); - if (Options.TraceRAtrivialBlockAllocator.getValue(options)) { - plan.appendStrategy(new TrivialTraceStrategy(plan)); - } - switch (Options.TraceRAPolicy.getValue(options)) { - case Default: - case LinearScanOnly: - break; - case BottomUpOnly: - plan.appendStrategy(new BottomUpStrategy(plan)); - break; - case AlmostTrivial: - plan.appendStrategy(new BottomUpAlmostTrivialStrategy(plan)); - break; - case NumVariables: - plan.appendStrategy(new BottomUpNumVariablesStrategy(plan)); - break; - case Ratio: - plan.appendStrategy(new BottomUpRatioStrategy(plan)); - break; - case Loops: - plan.appendStrategy(new BottomUpLoopStrategy(plan)); - break; - case MaxFreq: - plan.appendStrategy(new BottomUpMaxFrequencyStrategy(plan)); - break; - case FreqBudget: - plan.appendStrategy(new BottomUpFrequencyBudgetStrategy(plan)); - break; - case LoopRatio: - plan.appendStrategy(new BottomUpDelegatingLoopStrategy(plan, new BottomUpRatioStrategy(plan))); - break; - case LoopMaxFreq: - plan.appendStrategy(new BottomUpDelegatingLoopStrategy(plan, new BottomUpMaxFrequencyStrategy(plan))); - break; - case LoopBudget: - plan.appendStrategy(new BottomUpDelegatingLoopStrategy(plan, new BottomUpFrequencyBudgetStrategy(plan))); - break; - default: - throw JVMCIError.shouldNotReachHere(); - } - // Fallback - plan.appendStrategy(new TraceLinearScanStrategy(plan)); - return plan; - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/GlobalLivenessAnalysisPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/GlobalLivenessAnalysisPhase.java deleted file mode 100644 index 0027dde96c0..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/GlobalLivenessAnalysisPhase.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import static org.graalvm.compiler.lir.LIRValueUtil.asVariable; -import static org.graalvm.compiler.lir.LIRValueUtil.isVariable; - -import java.util.ArrayList; -import java.util.BitSet; -import java.util.EnumSet; - -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.core.common.cfg.Loop; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.InstructionValueConsumer; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.LIRInstruction.OperandFlag; -import org.graalvm.compiler.lir.LIRInstruction.OperandMode; -import org.graalvm.compiler.lir.Variable; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.phases.AllocationPhase; -import org.graalvm.compiler.lir.ssa.SSAUtil; - -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.meta.Value; - -/** - * Constructs {@link GlobalLivenessInfo global liveness information}. - */ -public final class GlobalLivenessAnalysisPhase extends AllocationPhase { - - @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, AllocationContext context) { - assert SSAUtil.verifySSAForm(lirGenRes.getLIR()); - Analyser ssiBuilder = new Analyser(lirGenRes.getLIR()); - ssiBuilder.build(); - ssiBuilder.finish(); - GlobalLivenessInfo livenessInfo = ssiBuilder.getLivenessInfo(); - assert livenessInfo.verify(lirGenRes.getLIR()); - context.contextAdd(livenessInfo); - } - - private static final class Analyser { - - private static final int LOG_LEVEL = DebugContext.INFO_LEVEL; - - /** - * Bit map specifying which operands are live upon entry to this block. These are values - * used in this block or any of its successors where such value are not defined in this - * block. The bit index of an operand is its {@linkplain #operandNumber operand number}. - */ - private final BitSet[] liveIns; - - /** - * Bit map specifying which operands are live upon exit from this block. These are values - * used in a successor block that are either defined in this block or were live upon entry - * to this block. The bit index of an operand is its {@linkplain #operandNumber operand - * number}. - */ - private final BitSet[] liveOuts; - - private final AbstractBlockBase[] blocks; - - private final Value[] operands; - - private final LIR lir; - - private final GlobalLivenessInfo.Builder livenessInfoBuilder; - - Analyser(LIR lir) { - int numBlocks = lir.getControlFlowGraph().getBlocks().length; - this.liveIns = new BitSet[numBlocks]; - this.liveOuts = new BitSet[numBlocks]; - this.blocks = lir.getControlFlowGraph().getBlocks(); - this.lir = lir; - this.operands = new Value[lir.numVariables()]; - this.livenessInfoBuilder = new GlobalLivenessInfo.Builder(lir); - } - - private BitSet getLiveIn(final AbstractBlockBase block) { - return liveIns[block.getId()]; - } - - private BitSet getLiveOut(final AbstractBlockBase block) { - return liveOuts[block.getId()]; - } - - private void setLiveIn(final AbstractBlockBase block, final BitSet liveIn) { - liveIns[block.getId()] = liveIn; - } - - private void setLiveOut(final AbstractBlockBase block, final BitSet liveOut) { - liveOuts[block.getId()] = liveOut; - } - - private void buildIntern() { - computeLiveness(); - } - - /** - * Gets the size of the {@link #liveIns} and {@link #liveOuts} sets for a basic block. - */ - private int liveSetSize() { - return lir.numVariables(); - } - - private static int operandNumber(Value operand) { - if (isVariable(operand)) { - return asVariable(operand).index; - } - throw GraalError.shouldNotReachHere("Can only handle Variables: " + operand); - } - - /** - * Computes live sets for each block. - */ - @SuppressWarnings("try") - private void computeLiveness() { - // iterate all blocks - DebugContext debug = lir.getDebug(); - for (int i = blocks.length - 1; i >= 0; i--) { - final AbstractBlockBase block = blocks[i]; - try (Indent indent = debug.logAndIndent(LOG_LEVEL, "compute local live sets for block %s", block)) { - - final BitSet liveIn = mergeLiveSets(block); - setLiveOut(block, (BitSet) liveIn.clone()); - - InstructionValueConsumer useConsumer = new InstructionValueConsumer() { - @Override - public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet flags) { - processUse(liveIn, operand); - } - }; - InstructionValueConsumer defConsumer = new InstructionValueConsumer() { - @Override - public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet flags) { - processDef(liveIn, op, operand); - } - }; - if (debug.isLogEnabled()) { - debug.log(LOG_LEVEL, "liveOut B%d %s", block.getId(), getLiveOut(block)); - } - - // iterate all instructions of the block - ArrayList instructions = getLIR().getLIRforBlock(block); - for (int j = instructions.size() - 1; j >= 0; j--) { - final LIRInstruction op = instructions.get(j); - - try (Indent indent2 = debug.logAndIndent(LOG_LEVEL, "handle op %d: %s", op.id(), op)) { - op.visitEachOutput(defConsumer); - op.visitEachTemp(defConsumer); - op.visitEachState(useConsumer); - op.visitEachAlive(useConsumer); - op.visitEachInput(useConsumer); - } - } // end of instruction iteration - - setLiveIn(block, liveIn); - if (block.isLoopHeader()) { - handleLoopHeader(block.getLoop(), liveIn); - } - - if (debug.isLogEnabled()) { - debug.log(LOG_LEVEL, "liveIn B%d %s", block.getId(), getLiveIn(block)); - } - - } - } // end of block iteration - } - - /** - * All variables live at the beginning of a loop are live throughout the loop. - */ - private void handleLoopHeader(Loop loop, BitSet live) { - for (AbstractBlockBase block : loop.getBlocks()) { - getLiveIn(block).or(live); - getLiveOut(block).or(live); - } - } - - private BitSet mergeLiveSets(final AbstractBlockBase block) { - assert block != null; - final BitSet liveOut = new BitSet(liveSetSize()); - for (AbstractBlockBase successor : block.getSuccessors()) { - BitSet succLiveIn = getLiveIn(successor); - if (succLiveIn != null) { - liveOut.or(succLiveIn); - } else { - assert successor.isLoopHeader() : "Successor of " + block + " not yet processed and not loop header: " + successor; - } - } - return liveOut; - } - - private void processUse(final BitSet liveGen, Value operand) { - if (isVariable(operand)) { - int operandNum = operandNumber(operand); - liveGen.set(operandNum); - DebugContext debug = lir.getDebug(); - if (debug.isLogEnabled()) { - debug.log(LOG_LEVEL, "liveGen for operand %d(%s)", operandNum, operand); - } - } - } - - private void processDef(final BitSet liveGen, LIRInstruction op, Value operand) { - if (isVariable(operand)) { - recordVariable(op, asVariable(operand)); - int operandNum = operandNumber(operand); - if (operands[operandNum] == null) { - operands[operandNum] = operand; - } - liveGen.clear(operandNum); - DebugContext debug = lir.getDebug(); - if (debug.isLogEnabled()) { - debug.log(LOG_LEVEL, "liveKill for operand %d(%s)", operandNum, operand); - } - } - } - - private LIR getLIR() { - return lir; - } - - public void build() { - buildIntern(); - // check that the liveIn set of the first block is empty - AbstractBlockBase startBlock = getLIR().getControlFlowGraph().getStartBlock(); - if (getLiveIn(startBlock).cardinality() != 0) { - // bailout if this occurs in product mode. - throw new GraalError("liveIn set of first block must be empty: " + getLiveIn(startBlock)); - } - } - - @SuppressWarnings("try") - public void finish() { - // iterate all blocks in reverse order - for (AbstractBlockBase block : (AbstractBlockBase[]) lir.getControlFlowGraph().getBlocks()) { - try (Indent indent = lir.getDebug().logAndIndent(LOG_LEVEL, "Finish Block %s", block)) { - buildIncoming(block); - buildOutgoing(block); - } - } - } - - public GlobalLivenessInfo getLivenessInfo() { - assert livenessInfoBuilder != null : "No liveness info collected"; - return livenessInfoBuilder.createLivenessInfo(); - } - - private void buildIncoming(AbstractBlockBase block) { - if (!GlobalLivenessInfo.storesIncoming(block)) { - assert block.getPredecessorCount() == 1; - assert GlobalLivenessInfo.storesOutgoing(block.getPredecessors()[0]) : "No incoming liveness info: " + block; - return; - } - - final int[] liveInArray; - if (block.getPredecessorCount() == 0) { - // start block - assert getLiveIn(block).isEmpty() : "liveIn for start block is not empty? " + getLiveIn(block); - liveInArray = livenessInfoBuilder.emptySet; - } else { - /* - * Collect live out of predecessors since there might be values not used in this - * block which might cause out/in mismatch. Per construction the live sets of all - * predecessors are equal. - */ - BitSet predLiveOut = getLiveOut(block.getPredecessors()[0]); - liveInArray = predLiveOut.isEmpty() ? livenessInfoBuilder.emptySet : bitSetToIntArray(predLiveOut); - } - - livenessInfoBuilder.setIncoming(block, liveInArray); - // reuse the same array for outgoing variables in predecessors - for (AbstractBlockBase pred : block.getPredecessors()) { - livenessInfoBuilder.setOutgoing(pred, liveInArray); - } - } - - private void buildOutgoing(AbstractBlockBase block) { - BitSet liveOut = getLiveOut(block); - if (!GlobalLivenessInfo.storesOutgoing(block)) { - assert GlobalLivenessInfo.storesOutgoing(block) || block.getSuccessorCount() == 1; - assert GlobalLivenessInfo.storesOutgoing(block) || GlobalLivenessInfo.storesIncoming(block.getSuccessors()[0]) : "No outgoing liveness info: " + block; - return; - } - int[] liveOutArray = liveOut.isEmpty() ? livenessInfoBuilder.emptySet : bitSetToIntArray(liveOut); - - livenessInfoBuilder.setOutgoing(block, liveOutArray); - // reuse the same array for incoming variables in successors - for (AbstractBlockBase succ : block.getSuccessors()) { - livenessInfoBuilder.setIncoming(succ, liveOutArray); - } - } - - private static int[] bitSetToIntArray(BitSet live) { - int[] vars = new int[live.cardinality()]; - int cnt = 0; - for (int i = live.nextSetBit(0); i >= 0; i = live.nextSetBit(i + 1), cnt++) { - vars[cnt] = i; - } - return vars; - } - - private void recordVariable(LIRInstruction op, Variable var) { - livenessInfoBuilder.addVariable(op, var); - } - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/GlobalLivenessInfo.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/GlobalLivenessInfo.java deleted file mode 100644 index 21079e2db94..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/GlobalLivenessInfo.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import java.util.Arrays; -import java.util.BitSet; -import java.util.EnumSet; - -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.LIRInstruction.OperandFlag; -import org.graalvm.compiler.lir.LIRInstruction.OperandMode; -import org.graalvm.compiler.lir.LIRValueUtil; -import org.graalvm.compiler.lir.ValueConsumer; -import org.graalvm.compiler.lir.Variable; - -import jdk.vm.ci.meta.Value; - -/** - * Stores live in/live out variables and locations for each basic block. - * - * Live variable information is stored as an integer array containing variable - * indices. The information is only stored once per control-flow split or - * control-merge. In other words the live sets at the end of the source block and the - * beginning of the target block of an edge are the same. - */ -public final class GlobalLivenessInfo { - - public static final class Builder { - private GlobalLivenessInfo info; - public final int[] emptySet; - - public Builder(LIR lir) { - this(lir.numVariables(), lir.getControlFlowGraph().getBlocks().length); - } - - public Builder(int numVariables, int numBlocks) { - info = new GlobalLivenessInfo(numVariables, numBlocks); - emptySet = new int[0]; - } - - public GlobalLivenessInfo createLivenessInfo() { - GlobalLivenessInfo livenessInfo = info; - info = null; - return livenessInfo; - } - - public void setIncoming(AbstractBlockBase block, int[] varsIn) { - assert info.blockToVarIn[block.getId()] == null; - assert verifyVars(varsIn); - assert storesIncoming(block) || info.blockToVarOut[block.getPredecessors()[0].getId()] == varsIn; - info.blockToVarIn[block.getId()] = varsIn; - } - - public void setOutgoing(AbstractBlockBase block, int[] varsOut) { - assert info.blockToVarOut[block.getId()] == null; - assert verifyVars(varsOut); - assert storesOutgoing(block) || info.blockToVarIn[block.getSuccessors()[0].getId()] == varsOut; - info.blockToVarOut[block.getId()] = varsOut; - } - - private static boolean verifyVars(int[] vars) { - for (int var : vars) { - assert var >= 0; - } - return true; - } - - @SuppressWarnings("unused") - public void addVariable(LIRInstruction op, Variable var) { - info.variables[var.index] = var; - } - - } - - private final Variable[] variables; - private final int[][] blockToVarIn; - private final int[][] blockToVarOut; - private final Value[][] blockToLocIn; - private final Value[][] blockToLocOut; - - private GlobalLivenessInfo(int numVariables, int numBlocks) { - variables = new Variable[numVariables]; - blockToVarIn = new int[numBlocks][]; - blockToVarOut = new int[numBlocks][]; - blockToLocIn = new Value[numBlocks][]; - blockToLocOut = new Value[numBlocks][]; - } - - public Variable getVariable(int varNum) { - return variables[varNum]; - } - - public int[] getBlockOut(AbstractBlockBase block) { - return blockToVarOut[block.getId()]; - } - - public int[] getBlockIn(AbstractBlockBase block) { - return blockToVarIn[block.getId()]; - } - - public void setInLocations(AbstractBlockBase block, Value[] values) { - blockToLocIn[block.getId()] = values; - } - - public void setOutLocations(AbstractBlockBase block, Value[] values) { - blockToLocOut[block.getId()] = values; - } - - public Value[] getInLocation(AbstractBlockBase block) { - return blockToLocIn[block.getId()]; - } - - public Value[] getOutLocation(AbstractBlockBase block) { - return blockToLocOut[block.getId()]; - } - - public static boolean storesIncoming(AbstractBlockBase block) { - assert block.getPredecessorCount() >= 0; - return block.getPredecessorCount() != 1; - } - - public static boolean storesOutgoing(AbstractBlockBase block) { - assert block.getSuccessorCount() >= 0; - /* - * The second condition handles non-critical empty blocks, introduced, e.g., by two - * consecutive loop-exits. - */ - return block.getSuccessorCount() != 1 || block.getSuccessors()[0].getPredecessorCount() == 1; - } - - /** - * Verifies that the local liveness information is correct, i.e., that all variables used in a - * block {@code b} are either defined in {@code b} or in the incoming live set. - */ - @SuppressWarnings("try") - public boolean verify(LIR lir) { - DebugContext debug = lir.getDebug(); - try (DebugContext.Scope s = debug.scope("Verify GlobalLivenessInfo", this)) { - for (AbstractBlockBase block : lir.getControlFlowGraph().getBlocks()) { - assert verifyBlock(block, lir); - } - } catch (Throwable e) { - throw debug.handle(e); - } - return true; - } - - private boolean verifyBlock(AbstractBlockBase block, LIR lir) { - BitSet liveSet = new BitSet(lir.numVariables()); - int[] liveIn = getBlockIn(block); - for (int varNum : liveIn) { - liveSet.set(varNum); - } - ValueConsumer proc = new ValueConsumer() { - - @Override - public void visitValue(Value value, OperandMode mode, EnumSet flags) { - if (LIRValueUtil.isVariable(value)) { - Variable var = LIRValueUtil.asVariable(value); - if (mode == OperandMode.DEF) { - liveSet.set(var.index); - } else { - assert liveSet.get(var.index) : String.format("Variable %s but not defined in block %s (liveIn: %s)", var, block, Arrays.toString(liveIn)); - } - } - } - - }; - for (LIRInstruction op : lir.getLIRforBlock(block)) { - op.visitEachInput(proc); - op.visitEachAlive(proc); - op.visitEachState(proc); - op.visitEachOutput(proc); - // no need for checking temp - } - return true; - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/ShadowedRegisterValue.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/ShadowedRegisterValue.java deleted file mode 100644 index 754a8858b03..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/ShadowedRegisterValue.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; -import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK; - -import java.util.EnumSet; - -import org.graalvm.compiler.lir.CompositeValue; -import org.graalvm.compiler.lir.InstructionValueConsumer; -import org.graalvm.compiler.lir.InstructionValueProcedure; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.LIRInstruction.OperandFlag; -import org.graalvm.compiler.lir.LIRInstruction.OperandMode; - -import jdk.vm.ci.code.RegisterValue; -import jdk.vm.ci.meta.AllocatableValue; - -/** - * Represents a {@link #register} which has a shadow copy on the {@link #stackslot stack}. - */ -public final class ShadowedRegisterValue extends CompositeValue { - private static final EnumSet registerFlags = EnumSet.of(REG); - private static final EnumSet stackslotFlags = EnumSet.of(STACK); - - @Component({REG}) protected RegisterValue register; - @Component({STACK}) protected AllocatableValue stackslot; - - public ShadowedRegisterValue(RegisterValue register, AllocatableValue stackslot) { - super(register.getValueKind()); - assert (register.getValueKind().equals(stackslot.getValueKind())); - this.register = register; - this.stackslot = stackslot; - } - - public RegisterValue getRegister() { - return register; - } - - public AllocatableValue getStackSlot() { - return stackslot; - } - - @Override - public CompositeValue forEachComponent(LIRInstruction inst, OperandMode mode, InstructionValueProcedure proc) { - RegisterValue newRegister = (RegisterValue) proc.doValue(inst, register, mode, registerFlags); - AllocatableValue newStackSlot = (AllocatableValue) proc.doValue(inst, stackslot, mode, stackslotFlags); - if (register.equals(newRegister) || stackslot.equals(newStackSlot)) { - return this; - } - return new ShadowedRegisterValue(newRegister, newStackSlot); - } - - @Override - protected void visitEachComponent(LIRInstruction inst, OperandMode mode, InstructionValueConsumer proc) { - proc.visitValue(inst, register, mode, registerFlags); - proc.visitValue(inst, stackslot, mode, stackslotFlags); - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (this == obj) { - return true; - } - if (getClass() != obj.getClass()) { - return false; - } - ShadowedRegisterValue other = (ShadowedRegisterValue) obj; - assert register != null; - assert stackslot != null; - assert other.register != null; - assert other.stackslot != null; - if (!register.equals(other.register)) { - return false; - } - if (!stackslot.equals(other.stackslot)) { - return false; - } - return true; - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceAllocationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceAllocationPhase.java deleted file mode 100644 index ac7e3b38bcb..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceAllocationPhase.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.debug.CounterKey; -import org.graalvm.compiler.debug.DebugCloseable; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.MemUseTrackerKey; -import org.graalvm.compiler.debug.TimerKey; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.lir.phases.LIRPhase; -import org.graalvm.compiler.lir.phases.LIRPhase.LIRPhaseStatistics; - -import jdk.vm.ci.code.TargetDescription; - -public abstract class TraceAllocationPhase { - - public static class TraceAllocationContext { - public final MoveFactory spillMoveFactory; - public final RegisterAllocationConfig registerAllocationConfig; - public final TraceBuilderResult resultTraces; - public final GlobalLivenessInfo livenessInfo; - - public TraceAllocationContext(MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, TraceBuilderResult resultTraces, GlobalLivenessInfo livenessInfo) { - this.spillMoveFactory = spillMoveFactory; - this.registerAllocationConfig = registerAllocationConfig; - this.resultTraces = resultTraces; - this.livenessInfo = livenessInfo; - } - } - - /** - * Records time spent within {@link #apply}. - */ - private final TimerKey timer; - - /** - * Records memory usage within {@link #apply}. - */ - private final MemUseTrackerKey memUseTracker; - - /** - * Records the number of traces allocated with this phase. - */ - private final CounterKey allocatedTraces; - - public static final class AllocationStatistics { - private final CounterKey allocatedTraces; - - public AllocationStatistics(Class clazz) { - allocatedTraces = DebugContext.counter("TraceRA[%s]", clazz); - } - } - - private static final ClassValue counterClassValue = new ClassValue() { - @Override - protected AllocationStatistics computeValue(Class c) { - return new AllocationStatistics(c); - } - }; - - private static AllocationStatistics getAllocationStatistics(Class c) { - return counterClassValue.get(c); - } - - public TraceAllocationPhase() { - LIRPhaseStatistics statistics = LIRPhase.getLIRPhaseStatistics(getClass()); - timer = statistics.timer; - memUseTracker = statistics.memUseTracker; - allocatedTraces = getAllocationStatistics(getClass()).allocatedTraces; - } - - public final CharSequence getName() { - return LIRPhase.createName(getClass()); - } - - @Override - public final String toString() { - return getName().toString(); - } - - public final void apply(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, C context) { - apply(target, lirGenRes, trace, context, true); - } - - @SuppressWarnings("try") - public final void apply(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, C context, boolean dumpTrace) { - DebugContext debug = lirGenRes.getLIR().getDebug(); - try (DebugContext.Scope s = debug.scope(getName(), this)) { - try (DebugCloseable a = timer.start(debug); DebugCloseable c = memUseTracker.start(debug)) { - if (dumpTrace) { - if (debug.isDumpEnabled(DebugContext.DETAILED_LEVEL)) { - debug.dump(DebugContext.DETAILED_LEVEL, trace, "Before %s (Trace%s: %s)", getName(), trace.getId(), trace); - } - } - run(target, lirGenRes, trace, context); - allocatedTraces.increment(debug); - if (dumpTrace) { - if (debug.isDumpEnabled(DebugContext.VERBOSE_LEVEL)) { - debug.dump(DebugContext.VERBOSE_LEVEL, trace, "After %s (Trace%s: %s)", getName(), trace.getId(), trace); - } - } - } - } catch (Throwable e) { - throw debug.handle(e); - } - } - - protected abstract void run(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, C context); -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceAssertions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceAssertions.java deleted file mode 100644 index e969de5478a..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceAssertions.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; - -/** - * A collection of assertions that are assumed to hold in various places of the Trace Register - * Allocation framework. - * - * The main goal is to document pieces of code that rely on specific properties of traces. In case - * an assumption is no longer valid, this makes it easy (assumed they are used correctly) to find - * places that need changes. - */ -final class TraceAssertions { - - /** - * Asserts that variable indices are properly sorted. - */ - public static boolean liveSetsAreSorted(GlobalLivenessInfo livenessInfo, AbstractBlockBase block) { - return isSorted(livenessInfo.getBlockIn(block)) && isSorted(livenessInfo.getBlockOut(block)); - } - - private static boolean isSorted(int[] live) { - if (live.length == 0) { - return true; - } - int current = live[0]; - for (int i = 1; i < live.length; i++) { - int last = current; - current = live[i]; - if (current <= last) { - return false; - } - } - return true; - } - - /** - * Asserts that a trace head has only a single predecessor. - * - * This is not true for every trace-building algorithm (for example - * {@link TraceBuilderPhase.TraceBuilder#SingleBlock}). - */ - public static boolean singleHeadPredecessor(Trace trace) { - return trace.getBlocks()[0].getPredecessorCount() == 1; - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceBuilderPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceBuilderPhase.java deleted file mode 100644 index 3a2c8e7d1b5..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceBuilderPhase.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.isTrivialTrace; - -import java.util.ArrayList; - -import org.graalvm.compiler.core.common.alloc.BiDirectionalTraceBuilder; -import org.graalvm.compiler.core.common.alloc.SingleBlockTraceBuilder; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult.TrivialTracePredicate; -import org.graalvm.compiler.core.common.alloc.TraceStatisticsPrinter; -import org.graalvm.compiler.core.common.alloc.UniDirectionalTraceBuilder; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.phases.AllocationPhase; -import org.graalvm.compiler.options.EnumOptionKey; -import org.graalvm.compiler.options.Option; -import org.graalvm.compiler.options.OptionKey; -import org.graalvm.compiler.options.OptionType; -import org.graalvm.compiler.options.OptionValues; - -import jdk.vm.ci.code.TargetDescription; - -public class TraceBuilderPhase extends AllocationPhase { - - public enum TraceBuilder { - UniDirectional, - BiDirectional, - SingleBlock - } - - public static class Options { - // @formatter:off - @Option(help = "Trace building algorithm.", type = OptionType.Debug) - public static final EnumOptionKey TraceBuilding = new EnumOptionKey<>(TraceBuilder.UniDirectional); - @Option(help = "Schedule trivial traces as early as possible.", type = OptionType.Debug) - public static final OptionKey TraceRAScheduleTrivialTracesEarly = new OptionKey<>(true); - // @formatter:on - } - - @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, AllocationContext context) { - AbstractBlockBase[] linearScanOrder = lirGenRes.getLIR().linearScanOrder(); - AbstractBlockBase startBlock = linearScanOrder[0]; - LIR lir = lirGenRes.getLIR(); - assert startBlock.equals(lir.getControlFlowGraph().getStartBlock()); - - final TraceBuilderResult traceBuilderResult = getTraceBuilderResult(lir, startBlock, linearScanOrder); - - DebugContext debug = lir.getDebug(); - if (debug.isLogEnabled(DebugContext.BASIC_LEVEL)) { - ArrayList traces = traceBuilderResult.getTraces(); - for (int i = 0; i < traces.size(); i++) { - Trace trace = traces.get(i); - debug.log(DebugContext.BASIC_LEVEL, "Trace %5d: %s%s", i, trace, isTrivialTrace(lirGenRes.getLIR(), trace) ? " (trivial)" : ""); - } - } - TraceStatisticsPrinter.printTraceStatistics(debug, traceBuilderResult, lirGenRes.getCompilationUnitName()); - debug.dump(DebugContext.VERBOSE_LEVEL, traceBuilderResult, "TraceBuilderResult"); - context.contextAdd(traceBuilderResult); - } - - private static TraceBuilderResult getTraceBuilderResult(LIR lir, AbstractBlockBase startBlock, AbstractBlockBase[] linearScanOrder) { - TraceBuilderResult.TrivialTracePredicate pred = getTrivialTracePredicate(lir); - - OptionValues options = lir.getOptions(); - TraceBuilder selectedTraceBuilder = Options.TraceBuilding.getValue(options); - DebugContext debug = lir.getDebug(); - debug.log(DebugContext.BASIC_LEVEL, "Building Traces using %s", selectedTraceBuilder); - switch (Options.TraceBuilding.getValue(options)) { - case SingleBlock: - return SingleBlockTraceBuilder.computeTraces(debug, startBlock, linearScanOrder, pred); - case BiDirectional: - return BiDirectionalTraceBuilder.computeTraces(debug, startBlock, linearScanOrder, pred); - case UniDirectional: - return UniDirectionalTraceBuilder.computeTraces(debug, startBlock, linearScanOrder, pred); - } - throw GraalError.shouldNotReachHere("Unknown trace building algorithm: " + Options.TraceBuilding.getValue(options)); - } - - public static TraceBuilderResult.TrivialTracePredicate getTrivialTracePredicate(LIR lir) { - if (!Options.TraceRAScheduleTrivialTracesEarly.getValue(lir.getOptions())) { - return null; - } - return new TrivialTracePredicate() { - @Override - public boolean isTrivialTrace(Trace trace) { - return TraceUtil.isTrivialTrace(lir, trace); - } - }; - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceGlobalMoveResolutionPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceGlobalMoveResolutionPhase.java deleted file mode 100644 index 7973c87ba85..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceGlobalMoveResolutionPhase.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import static jdk.vm.ci.code.ValueUtil.asRegisterValue; -import static jdk.vm.ci.code.ValueUtil.isIllegal; -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; -import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.asShadowedRegisterValue; -import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.isShadowedRegisterValue; - -import java.util.ArrayList; -import java.util.Arrays; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.StandardOp.JumpOp; -import org.graalvm.compiler.lir.StandardOp.LabelOp; -import org.graalvm.compiler.lir.alloc.trace.TraceAllocationPhase.TraceAllocationContext; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.lir.ssa.SSAUtil; - -import jdk.vm.ci.code.Architecture; -import jdk.vm.ci.code.RegisterValue; -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.meta.AllocatableValue; -import jdk.vm.ci.meta.Value; - -public final class TraceGlobalMoveResolutionPhase { - - private TraceGlobalMoveResolutionPhase() { - } - - /** - * Abstract move resolver interface for testing. - */ - public abstract static class MoveResolver { - public abstract void addMapping(Value src, AllocatableValue dst, Value fromStack); - } - - public static void resolve(TargetDescription target, LIRGenerationResult lirGenRes, TraceAllocationContext context) { - LIR lir = lirGenRes.getLIR(); - DebugContext debug = lir.getDebug(); - debug.dump(DebugContext.VERBOSE_LEVEL, lir, "Before TraceGlobalMoveResultion"); - MoveFactory spillMoveFactory = context.spillMoveFactory; - resolveGlobalDataFlow(context.resultTraces, lirGenRes, spillMoveFactory, target.arch, context.livenessInfo, context.registerAllocationConfig); - } - - @SuppressWarnings("try") - private static void resolveGlobalDataFlow(TraceBuilderResult resultTraces, LIRGenerationResult lirGenRes, MoveFactory spillMoveFactory, Architecture arch, GlobalLivenessInfo livenessInfo, - RegisterAllocationConfig registerAllocationConfig) { - LIR lir = lirGenRes.getLIR(); - /* Resolve trace global data-flow mismatch. */ - TraceGlobalMoveResolver moveResolver = new TraceGlobalMoveResolver(lirGenRes, spillMoveFactory, registerAllocationConfig, arch); - - DebugContext debug = lir.getDebug(); - try (Indent indent = debug.logAndIndent("Trace global move resolution")) { - for (Trace trace : resultTraces.getTraces()) { - resolveTrace(resultTraces, livenessInfo, lir, moveResolver, trace); - } - } - } - - private static void resolveTrace(TraceBuilderResult resultTraces, GlobalLivenessInfo livenessInfo, LIR lir, TraceGlobalMoveResolver moveResolver, Trace trace) { - AbstractBlockBase[] traceBlocks = trace.getBlocks(); - int traceLength = traceBlocks.length; - // all but the last block - AbstractBlockBase nextBlock = traceBlocks[0]; - for (int i = 1; i < traceLength; i++) { - AbstractBlockBase fromBlock = nextBlock; - nextBlock = traceBlocks[i]; - if (fromBlock.getSuccessorCount() > 1) { - for (AbstractBlockBase toBlock : fromBlock.getSuccessors()) { - if (toBlock != nextBlock) { - interTraceEdge(resultTraces, livenessInfo, lir, moveResolver, fromBlock, toBlock); - } - } - } - } - // last block - assert nextBlock == traceBlocks[traceLength - 1]; - for (AbstractBlockBase toBlock : nextBlock.getSuccessors()) { - if (resultTraces.getTraceForBlock(nextBlock) != resultTraces.getTraceForBlock(toBlock)) { - interTraceEdge(resultTraces, livenessInfo, lir, moveResolver, nextBlock, toBlock); - } - } - } - - @SuppressWarnings("try") - private static void interTraceEdge(TraceBuilderResult resultTraces, GlobalLivenessInfo livenessInfo, LIR lir, TraceGlobalMoveResolver moveResolver, AbstractBlockBase fromBlock, - AbstractBlockBase toBlock) { - DebugContext debug = lir.getDebug(); - try (Indent indent0 = debug.logAndIndent("Handle trace edge from %s (Trace%d) to %s (Trace%d)", fromBlock, resultTraces.getTraceForBlock(fromBlock).getId(), toBlock, - resultTraces.getTraceForBlock(toBlock).getId())) { - - final ArrayList instructions; - final int insertIdx; - if (fromBlock.getSuccessorCount() == 1) { - instructions = lir.getLIRforBlock(fromBlock); - insertIdx = instructions.size() - 1; - } else { - assert toBlock.getPredecessorCount() == 1; - instructions = lir.getLIRforBlock(toBlock); - insertIdx = 1; - } - - moveResolver.setInsertPosition(instructions, insertIdx); - resolveEdge(lir, livenessInfo, moveResolver, fromBlock, toBlock); - moveResolver.resolveAndAppendMoves(); - } - } - - private static void resolveEdge(LIR lir, GlobalLivenessInfo livenessInfo, TraceGlobalMoveResolver moveResolver, AbstractBlockBase fromBlock, AbstractBlockBase toBlock) { - assert verifyEdge(fromBlock, toBlock); - - if (SSAUtil.isMerge(toBlock)) { - // PHI - JumpOp blockEnd = SSAUtil.phiOut(lir, fromBlock); - LabelOp label = SSAUtil.phiIn(lir, toBlock); - - for (int i = 0; i < label.getPhiSize(); i++) { - Value in = label.getIncomingValue(i); - Value out = blockEnd.getOutgoingValue(i); - addMapping(moveResolver, out, in); - } - } - // GLI - Value[] locFrom = livenessInfo.getOutLocation(fromBlock); - Value[] locTo = livenessInfo.getInLocation(toBlock); - if (locFrom == locTo) { - // a strategy might reuse the locations array if locations are the same - return; - } - assert locFrom.length == locTo.length; - - for (int i = 0; i < locFrom.length; i++) { - addMapping(moveResolver, locFrom[i], locTo[i]); - } - } - - private static boolean isIllegalDestination(Value to) { - return isIllegal(to) || isConstantValue(to); - } - - private static boolean verifyEdge(AbstractBlockBase fromBlock, AbstractBlockBase toBlock) { - assert Arrays.asList(toBlock.getPredecessors()).contains(fromBlock) : String.format("%s not in predecessor list: %s", fromBlock, - Arrays.toString(toBlock.getPredecessors())); - assert fromBlock.getSuccessorCount() == 1 || toBlock.getPredecessorCount() == 1 : String.format("Critical Edge? %s has %d successors and %s has %d predecessors", - fromBlock, fromBlock.getSuccessorCount(), toBlock, toBlock.getPredecessorCount()); - assert Arrays.asList(fromBlock.getSuccessors()).contains(toBlock) : String.format("Predecessor block %s has wrong successor: %s, should contain: %s", fromBlock, - Arrays.toString(fromBlock.getSuccessors()), toBlock); - return true; - } - - public static void addMapping(MoveResolver moveResolver, Value from, Value to) { - if (isIllegalDestination(to)) { - return; - } - if (isShadowedRegisterValue(to)) { - ShadowedRegisterValue toSh = asShadowedRegisterValue(to); - addMappingToRegister(moveResolver, from, toSh.getRegister()); - addMappingToStackSlot(moveResolver, from, toSh.getStackSlot()); - } else { - if (isRegister(to)) { - addMappingToRegister(moveResolver, from, asRegisterValue(to)); - } else { - assert isStackSlotValue(to) : "Expected stack slot: " + to; - addMappingToStackSlot(moveResolver, from, (AllocatableValue) to); - } - } - } - - private static void addMappingToRegister(MoveResolver moveResolver, Value from, RegisterValue register) { - if (isShadowedRegisterValue(from)) { - RegisterValue fromReg = asShadowedRegisterValue(from).getRegister(); - AllocatableValue fromStack = asShadowedRegisterValue(from).getStackSlot(); - checkAndAddMapping(moveResolver, fromReg, register, fromStack); - } else { - checkAndAddMapping(moveResolver, from, register, null); - } - } - - private static void addMappingToStackSlot(MoveResolver moveResolver, Value from, AllocatableValue stack) { - if (isShadowedRegisterValue(from)) { - ShadowedRegisterValue shadowedFrom = asShadowedRegisterValue(from); - RegisterValue fromReg = shadowedFrom.getRegister(); - AllocatableValue fromStack = shadowedFrom.getStackSlot(); - if (!fromStack.equals(stack)) { - checkAndAddMapping(moveResolver, fromReg, stack, fromStack); - } - } else { - checkAndAddMapping(moveResolver, from, stack, null); - } - - } - - private static void checkAndAddMapping(MoveResolver moveResolver, Value from, AllocatableValue to, AllocatableValue fromStack) { - if (!from.equals(to) && (fromStack == null || !fromStack.equals(to))) { - moveResolver.addMapping(from, to, fromStack); - } - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceGlobalMoveResolver.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceGlobalMoveResolver.java deleted file mode 100644 index 475c301e437..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceGlobalMoveResolver.java +++ /dev/null @@ -1,513 +0,0 @@ -/* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import static jdk.vm.ci.code.ValueUtil.asAllocatableValue; -import static jdk.vm.ci.code.ValueUtil.asRegister; -import static jdk.vm.ci.code.ValueUtil.asStackSlot; -import static jdk.vm.ci.code.ValueUtil.isIllegal; -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static jdk.vm.ci.code.ValueUtil.isStackSlot; -import static org.graalvm.compiler.lir.LIRValueUtil.asVirtualStackSlot; -import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isVirtualStackSlot; -import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.asShadowedRegisterValue; -import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.isShadowedRegisterValue; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; - -import org.graalvm.compiler.core.common.LIRKind; -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.debug.CounterKey; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.LIRInsertionBuffer; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.VirtualStackSlot; -import org.graalvm.compiler.lir.framemap.FrameMap; -import org.graalvm.compiler.lir.framemap.FrameMapBuilder; -import org.graalvm.compiler.lir.framemap.FrameMapBuilderTool; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.options.OptionValues; - -import jdk.vm.ci.code.Architecture; -import jdk.vm.ci.code.RegisterArray; -import jdk.vm.ci.code.StackSlot; -import jdk.vm.ci.meta.AllocatableValue; -import jdk.vm.ci.meta.Value; - -/** - */ -public final class TraceGlobalMoveResolver extends TraceGlobalMoveResolutionPhase.MoveResolver { - - private static final CounterKey cycleBreakingSlotsAllocated = DebugContext.counter("TraceRA[cycleBreakingSlotsAllocated(global)]"); - private static final CounterKey cycleBreakingSlotsReused = DebugContext.counter("TraceRA[cycleBreakingSlotsReused(global)]"); - - private int insertIdx; - private LIRInsertionBuffer insertionBuffer; // buffer where moves are inserted - - private final ArrayList mappingFrom; - private final ArrayList mappingFromStack; - private final ArrayList mappingTo; - private final int[] registerBlocked; - private static final int STACK_SLOT_IN_CALLER_FRAME_IDX = -1; - private int[] stackBlocked; - private final int firstVirtualStackIndex; - private final MoveFactory spillMoveFactory; - private final FrameMapBuilder frameMapBuilder; - private final OptionValues options; - private final RegisterAllocationConfig registerAllocationConfig; - private final LIRGenerationResult res; - private final DebugContext debug; - - private void setValueBlocked(Value location, int direction) { - assert direction == 1 || direction == -1 : "out of bounds"; - if (isStackSlotValue(location)) { - int stackIdx = getStackArrayIndex(location); - if (stackIdx == STACK_SLOT_IN_CALLER_FRAME_IDX) { - // incoming stack arguments can be ignored - return; - } - if (stackIdx >= stackBlocked.length) { - stackBlocked = Arrays.copyOf(stackBlocked, stackIdx + 1); - } - stackBlocked[stackIdx] += direction; - } else { - assert direction == 1 || direction == -1 : "out of bounds"; - if (isRegister(location)) { - registerBlocked[asRegister(location).number] += direction; - } else { - throw GraalError.shouldNotReachHere("unhandled value " + location); - } - } - } - - private int valueBlocked(Value location) { - if (isStackSlotValue(location)) { - int stackIdx = getStackArrayIndex(location); - if (stackIdx == STACK_SLOT_IN_CALLER_FRAME_IDX) { - // incoming stack arguments are always blocked (aka they can not be written) - return 1; - } - if (stackIdx >= stackBlocked.length) { - return 0; - } - return stackBlocked[stackIdx]; - } - if (isRegister(location)) { - return registerBlocked[asRegister(location).number]; - } - throw GraalError.shouldNotReachHere("unhandled value " + location); - } - - private static boolean areMultipleReadsAllowed() { - return true; - } - - private boolean hasMappings() { - return mappingFrom.size() > 0; - } - - private MoveFactory getSpillMoveFactory() { - return spillMoveFactory; - } - - private RegisterArray getRegisters() { - return frameMapBuilder.getRegisterConfig().getAllocatableRegisters(); - } - - public TraceGlobalMoveResolver(LIRGenerationResult res, MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, Architecture arch) { - - this.mappingFrom = new ArrayList<>(8); - this.mappingFromStack = new ArrayList<>(8); - this.mappingTo = new ArrayList<>(8); - this.insertIdx = -1; - this.insertionBuffer = new LIRInsertionBuffer(); - - this.frameMapBuilder = res.getFrameMapBuilder(); - this.spillMoveFactory = spillMoveFactory; - this.registerBlocked = new int[arch.getRegisters().size()]; - this.registerAllocationConfig = registerAllocationConfig; - - FrameMapBuilderTool frameMapBuilderTool = (FrameMapBuilderTool) frameMapBuilder; - this.stackBlocked = new int[frameMapBuilderTool.getNumberOfStackSlots()]; - - FrameMap frameMap = frameMapBuilderTool.getFrameMap(); - this.firstVirtualStackIndex = !frameMap.frameNeedsAllocating() ? 0 : frameMap.currentFrameSize() + 1; - this.res = res; - LIR lir = res.getLIR(); - this.options = lir.getOptions(); - this.debug = lir.getDebug(); - } - - private boolean checkEmpty() { - for (int i = 0; i < stackBlocked.length; i++) { - assert stackBlocked[i] == 0 : "stack map must be empty before and after processing"; - } - assert mappingFrom.size() == 0 && mappingTo.size() == 0 && mappingFromStack.size() == 0 : "list must be empty before and after processing"; - for (int i = 0; i < getRegisters().size(); i++) { - assert registerBlocked[i] == 0 : "register map must be empty before and after processing"; - } - return true; - } - - private boolean verifyBeforeResolve() { - assert mappingFrom.size() == mappingTo.size() && mappingFrom.size() == mappingFromStack.size() : "length must be equal"; - assert insertIdx != -1 : "insert position not set"; - - int i; - int j; - if (!areMultipleReadsAllowed()) { - for (i = 0; i < mappingFrom.size(); i++) { - for (j = i + 1; j < mappingFrom.size(); j++) { - assert mappingFrom.get(i) == null || mappingFrom.get(i) != mappingFrom.get(j) : "cannot read from same interval twice"; - } - } - } - - for (i = 0; i < mappingTo.size(); i++) { - for (j = i + 1; j < mappingTo.size(); j++) { - assert mappingTo.get(i) != mappingTo.get(j) : "cannot write to same interval twice"; - } - } - - for (i = 0; i < mappingTo.size(); i++) { - Value to = mappingTo.get(i); - assert !isStackSlotValue(to) || getStackArrayIndex(to) != STACK_SLOT_IN_CALLER_FRAME_IDX : "Cannot move to in argument: " + to; - } - - HashSet usedRegs = new HashSet<>(); - if (!areMultipleReadsAllowed()) { - for (i = 0; i < mappingFrom.size(); i++) { - Value from = mappingFrom.get(i); - if (from != null && !isIllegal(from)) { - boolean unique = usedRegs.add(from); - assert unique : "cannot read from same register twice"; - } - } - } - - usedRegs.clear(); - for (i = 0; i < mappingTo.size(); i++) { - Value to = mappingTo.get(i); - if (isIllegal(to)) { - // After insertion the location may become illegal, so don't check it since multiple - // intervals might be illegal. - continue; - } - boolean unique = usedRegs.add(to); - assert unique : "cannot write to same register twice"; - } - - return true; - } - - // mark assignedReg and assignedRegHi of the interval as blocked - private void block(Value location) { - if (mightBeBlocked(location)) { - assert areMultipleReadsAllowed() || valueBlocked(location) == 0 : "location already marked as used: " + location; - setValueBlocked(location, 1); - debug.log("block %s", location); - } - } - - // mark assignedReg and assignedRegHi of the interval as unblocked - private void unblock(Value location) { - if (mightBeBlocked(location)) { - assert valueBlocked(location) > 0 : "location already marked as unused: " + location; - setValueBlocked(location, -1); - debug.log("unblock %s", location); - } - } - - /** - * Checks if {@code to} is not blocked or is only blocked by {@code from}. - */ - private boolean safeToProcessMove(Value fromLocation, Value toLocation) { - if (mightBeBlocked(toLocation)) { - if ((valueBlocked(toLocation) > 1 || (valueBlocked(toLocation) == 1 && !isMoveToSelf(fromLocation, toLocation)))) { - return false; - } - } - - return true; - } - - public static boolean isMoveToSelf(Value from, Value to) { - assert to != null; - if (to.equals(from)) { - return true; - } - if (from == null) { - return false; - } - if (isShadowedRegisterValue(from)) { - /* From is a shadowed register. */ - if (isShadowedRegisterValue(to)) { - // both shadowed but not equal - return false; - } - ShadowedRegisterValue shadowed = asShadowedRegisterValue(from); - if (isRegisterToRegisterMoveToSelf(shadowed.getRegister(), to)) { - return true; - } - if (isStackSlotValue(to)) { - return to.equals(shadowed.getStackSlot()); - } - } else { - /* - * A shadowed destination value is never a self move it both values are not equal. Fall - * through. - */ - // if (isShadowedRegisterValue(to)) return false; - - return isRegisterToRegisterMoveToSelf(from, to); - } - return false; - } - - private static boolean isRegisterToRegisterMoveToSelf(Value from, Value to) { - if (to.equals(from)) { - return true; - } - if (isRegister(from) && isRegister(to) && asRegister(from).equals(asRegister(to))) { - // Values differ but Registers are the same - return true; - } - return false; - } - - private static boolean mightBeBlocked(Value location) { - return isRegister(location) || isStackSlotValue(location); - } - - private void createInsertionBuffer(ArrayList list) { - assert !insertionBuffer.initialized() : "overwriting existing buffer"; - insertionBuffer.init(list); - } - - private void appendInsertionBuffer() { - if (insertionBuffer.initialized()) { - insertionBuffer.finish(); - } - assert !insertionBuffer.initialized() : "must be uninitialized now"; - - insertIdx = -1; - } - - private LIRInstruction insertMove(Value fromOperand, AllocatableValue toOperand) { - assert !fromOperand.equals(toOperand) : "from and to are equal: " + fromOperand + " vs. " + toOperand; - assert LIRKind.verifyMoveKinds(fromOperand.getValueKind(), fromOperand.getValueKind(), registerAllocationConfig) : "move between different types"; - assert insertIdx != -1 : "must setup insert position first"; - - LIRInstruction move = createMove(fromOperand, toOperand); - insertionBuffer.append(insertIdx, move); - - if (debug.isLogEnabled()) { - debug.log("insert move from %s to %s at %d", fromOperand, toOperand, insertIdx); - } - return move; - } - - /** - * @param fromOpr Operand of the {@code from} interval - * @param toOpr Operand of the {@code to} interval - */ - private LIRInstruction createMove(Value fromOpr, AllocatableValue toOpr) { - if (isStackSlotValue(toOpr) && isStackSlotValue(fromOpr)) { - return getSpillMoveFactory().createStackMove(toOpr, asAllocatableValue(fromOpr)); - } - return getSpillMoveFactory().createMove(toOpr, fromOpr); - } - - @SuppressWarnings("try") - private void resolveMappings() { - try (Indent indent = debug.logAndIndent("resolveMapping")) { - assert verifyBeforeResolve(); - if (debug.isLogEnabled()) { - printMapping(); - } - - // Block all registers that are used as input operands of a move. - // When a register is blocked, no move to this register is emitted. - // This is necessary for detecting cycles in moves. - for (int i = mappingFrom.size() - 1; i >= 0; i--) { - Value from = mappingFrom.get(i); - block(from); - } - - ArrayList busySpillSlots = null; - while (mappingFrom.size() > 0) { - boolean processedInterval = false; - - int spillCandidate = -1; - for (int i = mappingFrom.size() - 1; i >= 0; i--) { - Value fromLocation = mappingFrom.get(i); - AllocatableValue toLocation = mappingTo.get(i); - if (safeToProcessMove(fromLocation, toLocation)) { - // this interval can be processed because target is free - LIRInstruction move = insertMove(fromLocation, toLocation); - move.setComment(res, "TraceGlobalMoveResolver: resolveMapping"); - unblock(fromLocation); - if (isStackSlotValue(toLocation)) { - if (busySpillSlots == null) { - busySpillSlots = new ArrayList<>(2); - } - busySpillSlots.add(toLocation); - } - mappingFrom.remove(i); - mappingFromStack.remove(i); - mappingTo.remove(i); - - processedInterval = true; - } else if (fromLocation != null) { - if (isRegister(fromLocation) && (busySpillSlots == null || !busySpillSlots.contains(mappingFromStack.get(i)))) { - // this interval cannot be processed now because target is not free - // it starts in a register, so it is a possible candidate for spilling - spillCandidate = i; - } else if (isStackSlotValue(fromLocation) && spillCandidate == -1) { - // fall back to spill a stack slot in case no other candidate is found - spillCandidate = i; - } - } - } - - if (!processedInterval) { - breakCycle(spillCandidate); - } - } - } - - // check that all intervals have been processed - assert checkEmpty(); - } - - @SuppressWarnings("try") - private void breakCycle(int spillCandidate) { - // no move could be processed because there is a cycle in the move list - // (e.g. r1 . r2, r2 . r1), so one interval must be spilled to memory - assert spillCandidate != -1 : "no interval in register for spilling found"; - - // create a new spill interval and assign a stack slot to it - Value from = mappingFrom.get(spillCandidate); - try (Indent indent = debug.logAndIndent("BreakCycle: %s", from)) { - AllocatableValue spillSlot = null; - if (TraceRegisterAllocationPhase.Options.TraceRAreuseStackSlotsForMoveResolutionCycleBreaking.getValue(options) && !isStackSlotValue(from)) { - // don't use the stack slot if from is already the stack slot - Value fromStack = mappingFromStack.get(spillCandidate); - if (fromStack != null) { - spillSlot = (AllocatableValue) fromStack; - cycleBreakingSlotsReused.increment(debug); - debug.log("reuse slot for spilling: %s", spillSlot); - } - } - if (spillSlot == null) { - spillSlot = frameMapBuilder.allocateSpillSlot(from.getValueKind()); - cycleBreakingSlotsAllocated.increment(debug); - debug.log("created new slot for spilling: %s", spillSlot); - // insert a move from register to stack and update the mapping - LIRInstruction move = insertMove(from, spillSlot); - move.setComment(res, "TraceGlobalMoveResolver: breakCycle"); - } - block(spillSlot); - mappingFrom.set(spillCandidate, spillSlot); - unblock(from); - } - } - - @SuppressWarnings("try") - private void printMapping() { - try (Indent indent = debug.logAndIndent("Mapping")) { - for (int i = mappingFrom.size() - 1; i >= 0; i--) { - debug.log("move %s <- %s (%s)", mappingTo.get(i), mappingFrom.get(i), mappingFromStack.get(i)); - } - } - } - - public void setInsertPosition(ArrayList insertList, int insertIdx) { - assert this.insertIdx == -1 : "use moveInsertPosition instead of setInsertPosition when data already set"; - - createInsertionBuffer(insertList); - this.insertIdx = insertIdx; - } - - @Override - public void addMapping(Value from, AllocatableValue to, Value fromStack) { - if (debug.isLogEnabled()) { - debug.log("add move mapping from %s to %s", from, to); - } - - assert !from.equals(to) : "from and to interval equal: " + from; - assert LIRKind.verifyMoveKinds(to.getValueKind(), from.getValueKind(), registerAllocationConfig) : String.format("Kind mismatch: %s vs. %s, from=%s, to=%s", from.getValueKind(), - to.getValueKind(), from, to); - assert fromStack == null || LIRKind.verifyMoveKinds(to.getValueKind(), fromStack.getValueKind(), registerAllocationConfig) : String.format("Kind mismatch: %s vs. %s, fromStack=%s, to=%s", - fromStack.getValueKind(), - to.getValueKind(), fromStack, to); - mappingFrom.add(from); - mappingFromStack.add(fromStack); - mappingTo.add(to); - } - - public void resolveAndAppendMoves() { - if (hasMappings()) { - resolveMappings(); - } - appendInsertionBuffer(); - } - - private int getStackArrayIndex(Value stackSlotValue) { - if (isStackSlot(stackSlotValue)) { - return getStackArrayIndex(asStackSlot(stackSlotValue)); - } - if (isVirtualStackSlot(stackSlotValue)) { - return getStackArrayIndex(asVirtualStackSlot(stackSlotValue)); - } - throw GraalError.shouldNotReachHere("value is not a stack slot: " + stackSlotValue); - } - - private int getStackArrayIndex(StackSlot stackSlot) { - int stackIdx; - if (stackSlot.isInCallerFrame()) { - // incoming stack arguments can be ignored - stackIdx = STACK_SLOT_IN_CALLER_FRAME_IDX; - } else { - assert stackSlot.getRawAddFrameSize() : "Unexpected stack slot: " + stackSlot; - int offset = -stackSlot.getRawOffset(); - assert 0 <= offset && offset < firstVirtualStackIndex : String.format("Wrong stack slot offset: %d (first virtual stack slot index: %d", offset, firstVirtualStackIndex); - stackIdx = offset; - } - return stackIdx; - } - - private int getStackArrayIndex(VirtualStackSlot virtualStackSlot) { - return firstVirtualStackIndex + virtualStackSlot.getId(); - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceRegisterAllocationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceRegisterAllocationPhase.java deleted file mode 100644 index 240bc222743..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceRegisterAllocationPhase.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.debug.CounterKey; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.alloc.RegisterAllocationPhase; -import org.graalvm.compiler.lir.alloc.trace.TraceAllocationPhase.TraceAllocationContext; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.lir.ssa.SSAUtil; -import org.graalvm.compiler.options.Option; -import org.graalvm.compiler.options.OptionKey; -import org.graalvm.compiler.options.OptionType; - -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.meta.AllocatableValue; - -/** - * Implements the Trace Register Allocation approach as described in - * "Trace-based Register Allocation in a JIT - * Compiler" by Josef Eisl et al. - */ -public final class TraceRegisterAllocationPhase extends RegisterAllocationPhase { - - public static class Options { - // @formatter:off - @Option(help = "Use inter-trace register hints.", type = OptionType.Debug) - public static final OptionKey TraceRAuseInterTraceHints = new OptionKey<>(true); - @Option(help = "Share information about spilled values to other traces.", type = OptionType.Debug) - public static final OptionKey TraceRAshareSpillInformation = new OptionKey<>(true); - @Option(help = "Reuse spill slots for global move resolution cycle breaking.", type = OptionType.Debug) - public static final OptionKey TraceRAreuseStackSlotsForMoveResolutionCycleBreaking = new OptionKey<>(true); - @Option(help = "Cache stack slots globally (i.e. a variable always gets the same slot in every trace).", type = OptionType.Debug) - public static final OptionKey TraceRACacheStackSlots = new OptionKey<>(true); - // @formatter:on - } - - private static final CounterKey tracesCounter = DebugContext.counter("TraceRA[traces]"); - - public static final CounterKey globalStackSlots = DebugContext.counter("TraceRA[GlobalStackSlots]"); - public static final CounterKey allocatedStackSlots = DebugContext.counter("TraceRA[AllocatedStackSlots]"); - - private final TraceBuilderPhase traceBuilder; - private final GlobalLivenessAnalysisPhase livenessAnalysis; - - public TraceRegisterAllocationPhase() { - this.traceBuilder = new TraceBuilderPhase(); - this.livenessAnalysis = new GlobalLivenessAnalysisPhase(); - } - - @Override - @SuppressWarnings("try") - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, AllocationContext context) { - traceBuilder.apply(target, lirGenRes, context); - livenessAnalysis.apply(target, lirGenRes, context); - - MoveFactory spillMoveFactory = context.spillMoveFactory; - RegisterAllocationConfig registerAllocationConfig = context.registerAllocationConfig; - LIR lir = lirGenRes.getLIR(); - DebugContext debug = lir.getDebug(); - TraceBuilderResult resultTraces = context.contextLookup(TraceBuilderResult.class); - GlobalLivenessInfo livenessInfo = context.contextLookup(GlobalLivenessInfo.class); - assert livenessInfo != null; - TraceAllocationContext traceContext = new TraceAllocationContext(spillMoveFactory, registerAllocationConfig, resultTraces, livenessInfo); - AllocatableValue[] cachedStackSlots = Options.TraceRACacheStackSlots.getValue(lir.getOptions()) ? new AllocatableValue[lir.numVariables()] : null; - - boolean neverSpillConstant = getNeverSpillConstants(); - assert !neverSpillConstant : "currently this is not supported"; - - final TraceRegisterAllocationPolicy plan = DefaultTraceRegisterAllocationPolicy.allocationPolicy(target, lirGenRes, spillMoveFactory, registerAllocationConfig, cachedStackSlots, resultTraces, - neverSpillConstant, livenessInfo, lir.getOptions()); - - try (DebugContext.Scope s0 = debug.scope("AllocateTraces", resultTraces, livenessInfo)) { - for (Trace trace : resultTraces.getTraces()) { - tracesCounter.increment(debug); - TraceAllocationPhase allocator = plan.selectStrategy(trace); - try (Indent i = debug.logAndIndent("Allocating Trace%d: %s (%s)", trace.getId(), trace, allocator); DebugContext.Scope s = debug.scope("AllocateTrace", trace)) { - allocator.apply(target, lirGenRes, trace, traceContext); - } - } - } catch (Throwable e) { - throw debug.handle(e); - } - - TraceGlobalMoveResolutionPhase.resolve(target, lirGenRes, traceContext); - deconstructSSAForm(lir); - } - - /** - * Remove Phi In/Out. - */ - private static void deconstructSSAForm(LIR lir) { - for (AbstractBlockBase block : lir.getControlFlowGraph().getBlocks()) { - if (SSAUtil.isMerge(block)) { - SSAUtil.phiIn(lir, block).clearIncomingValues(); - for (AbstractBlockBase pred : block.getPredecessors()) { - SSAUtil.phiOut(lir, pred).clearOutgoingValues(); - } - } - } - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceRegisterAllocationPolicy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceRegisterAllocationPolicy.java deleted file mode 100644 index fa8b9d674d6..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceRegisterAllocationPolicy.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import java.util.ArrayList; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.alloc.trace.TraceAllocationPhase.TraceAllocationContext; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.options.OptionValues; - -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.common.JVMCIError; -import jdk.vm.ci.meta.AllocatableValue; - -/** - * Manages the selection of allocation strategies. - */ -public final class TraceRegisterAllocationPolicy { - - protected abstract class AllocationStrategy { - TraceAllocationPhase allocator; - - public final TraceAllocationPhase getAllocator() { - if (allocator == null) { - allocator = initAllocator(target, lirGenRes, spillMoveFactory, registerAllocationConfig, cachedStackSlots, resultTraces, neverSpillConstants, livenessInfo, strategies); - } - return allocator; - } - - protected final LIR getLIR() { - return lirGenRes.getLIR(); - } - - protected final LIRGenerationResult getLIRGenerationResult() { - return lirGenRes; - } - - protected final TraceBuilderResult getTraceBuilderResult() { - return resultTraces; - } - - protected final GlobalLivenessInfo getGlobalLivenessInfo() { - return livenessInfo; - } - - protected final RegisterAllocationConfig getRegisterAllocationConfig() { - return registerAllocationConfig; - } - - protected final TargetDescription getTarget() { - return target; - } - - /** - * Returns {@code true} if the allocation strategy should be used for {@code trace}. - * - * This method must not alter any state of the strategy, nor rely on being called in a - * specific trace order. - */ - public abstract boolean shouldApplyTo(Trace trace); - - @SuppressWarnings("hiding") - protected abstract TraceAllocationPhase initAllocator(TargetDescription target, LIRGenerationResult lirGenRes, MoveFactory spillMoveFactory, - RegisterAllocationConfig registerAllocationConfig, AllocatableValue[] cachedStackSlots, TraceBuilderResult resultTraces, boolean neverSpillConstant, - GlobalLivenessInfo livenessInfo, ArrayList strategies); - } - - private final TargetDescription target; - private final LIRGenerationResult lirGenRes; - private final MoveFactory spillMoveFactory; - private final RegisterAllocationConfig registerAllocationConfig; - private final AllocatableValue[] cachedStackSlots; - private final TraceBuilderResult resultTraces; - private final boolean neverSpillConstants; - private final GlobalLivenessInfo livenessInfo; - - private final ArrayList strategies; - - public TraceRegisterAllocationPolicy(TargetDescription target, LIRGenerationResult lirGenRes, MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, - AllocatableValue[] cachedStackSlots, TraceBuilderResult resultTraces, boolean neverSpillConstant, GlobalLivenessInfo livenessInfo) { - this.target = target; - this.lirGenRes = lirGenRes; - this.spillMoveFactory = spillMoveFactory; - this.registerAllocationConfig = registerAllocationConfig; - this.cachedStackSlots = cachedStackSlots; - this.resultTraces = resultTraces; - this.neverSpillConstants = neverSpillConstant; - this.livenessInfo = livenessInfo; - - this.strategies = new ArrayList<>(3); - } - - protected OptionValues getOptions() { - return lirGenRes.getLIR().getOptions(); - } - - public void appendStrategy(AllocationStrategy strategy) { - strategies.add(strategy); - } - - public TraceAllocationPhase selectStrategy(Trace trace) { - for (AllocationStrategy strategy : strategies) { - if (strategy.shouldApplyTo(trace)) { - return strategy.getAllocator(); - } - } - throw JVMCIError.shouldNotReachHere("No Allocation Strategy found!"); - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceUtil.java deleted file mode 100644 index 9737ae8196e..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceUtil.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import java.util.ArrayList; - -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.StandardOp.JumpOp; -import org.graalvm.compiler.lir.StandardOp.LabelOp; - -import jdk.vm.ci.meta.Value; - -public class TraceUtil { - - public static boolean isShadowedRegisterValue(Value value) { - assert value != null; - return value instanceof ShadowedRegisterValue; - } - - public static ShadowedRegisterValue asShadowedRegisterValue(Value value) { - assert isShadowedRegisterValue(value); - return (ShadowedRegisterValue) value; - } - - public static boolean isTrivialTrace(LIR lir, Trace trace) { - if (trace.size() != 1) { - return false; - } - ArrayList instructions = lir.getLIRforBlock(trace.getBlocks()[0]); - if (instructions.size() != 2) { - return false; - } - assert instructions.get(0) instanceof LabelOp : "First instruction not a LabelOp: " + instructions.get(0); - if (((LabelOp) instructions.get(0)).isPhiIn()) { - /* - * Merge blocks are in general not trivial block because variables defined by a PHI - * always need a location. If the outgoing value of the predecessor is a constant we - * need to find an appropriate location (register or stack). - * - * Note that this case should not happen in practice since the trace containing the - * merge block should also contain one of the predecessors. For non-standard trace - * builders (e.g. the single block trace builder) this is not the true, though. - */ - return false; - } - /* - * Now we need to check if the BlockEndOp has no special operand requirements (i.e. - * stack-slot, register). For now we just check for JumpOp because we know that it doesn't. - */ - return instructions.get(1) instanceof JumpOp; - } - - public static boolean hasInterTracePredecessor(TraceBuilderResult result, Trace trace, AbstractBlockBase block) { - assert result.getTraceForBlock(block).equals(trace); - if (block.getPredecessorCount() == 0) { - // start block - return false; - } - if (block.getPredecessorCount() == 1) { - return !result.getTraceForBlock(block.getPredecessors()[0]).equals(trace); - } - return true; - } - - public static boolean hasInterTraceSuccessor(TraceBuilderResult result, Trace trace, AbstractBlockBase block) { - assert result.getTraceForBlock(block).equals(trace); - if (block.getSuccessorCount() == 0) { - // method end block - return false; - } - if (block.getSuccessorCount() == 1) { - return !result.getTraceForBlock(block.getSuccessors()[0]).equals(trace); - } - return true; - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TrivialTraceAllocator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TrivialTraceAllocator.java deleted file mode 100644 index 2daaa992dce..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TrivialTraceAllocator.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace; - -import static org.graalvm.compiler.lir.LIRValueUtil.asVariable; -import static org.graalvm.compiler.lir.LIRValueUtil.isVariable; -import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.isTrivialTrace; - -import java.util.Arrays; -import java.util.EnumSet; - -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.LIRInstruction.OperandFlag; -import org.graalvm.compiler.lir.LIRInstruction.OperandMode; -import org.graalvm.compiler.lir.StandardOp.JumpOp; -import org.graalvm.compiler.lir.StandardOp.LabelOp; -import org.graalvm.compiler.lir.ValueProcedure; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.ssa.SSAUtil; - -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.meta.Value; - -/** - * Allocates a trivial trace i.e. a trace consisting of a single block with no instructions other - * than the {@link LabelOp} and the {@link JumpOp}. - */ -public final class TrivialTraceAllocator extends TraceAllocationPhase { - - @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, TraceAllocationContext context) { - LIR lir = lirGenRes.getLIR(); - assert isTrivialTrace(lir, trace) : "Not a trivial trace! " + trace; - AbstractBlockBase block = trace.getBlocks()[0]; - assert TraceAssertions.singleHeadPredecessor(trace) : "Trace head with more than one predecessor?!" + trace; - AbstractBlockBase pred = block.getPredecessors()[0]; - - GlobalLivenessInfo livenessInfo = context.livenessInfo; - allocate(block, pred, livenessInfo, SSAUtil.phiOutOrNull(lir, block)); - } - - public static void allocate(AbstractBlockBase block, AbstractBlockBase pred, GlobalLivenessInfo livenessInfo, LIRInstruction jump) { - // exploit that the live sets are sorted - assert TraceAssertions.liveSetsAreSorted(livenessInfo, block); - assert TraceAssertions.liveSetsAreSorted(livenessInfo, pred); - - // setup incoming variables/locations - final int[] blockIn = livenessInfo.getBlockIn(block); - final Value[] predLocOut = livenessInfo.getOutLocation(pred); - int inLenght = blockIn.length; - - // setup outgoing variables/locations - final int[] blockOut = livenessInfo.getBlockOut(block); - int outLength = blockOut.length; - final Value[] locationOut = new Value[outLength]; - - assert outLength <= inLenght : "Trivial Trace! There cannot be more outgoing values than incoming."; - for (int outIdx = 0, inIdx = 0; outIdx < outLength; inIdx++) { - if (blockOut[outIdx] == blockIn[inIdx]) { - // set the outgoing location to the incoming value - locationOut[outIdx++] = predLocOut[inIdx]; - } - } - - /* - * Since we do not change any of the location we can just use the outgoing of the - * predecessor. - */ - livenessInfo.setInLocations(block, predLocOut); - livenessInfo.setOutLocations(block, locationOut); - if (jump != null) { - handlePhiOut(jump, blockIn, predLocOut); - } - } - - private static void handlePhiOut(LIRInstruction jump, int[] varIn, Value[] locIn) { - // handle outgoing phi values - ValueProcedure outputConsumer = new ValueProcedure() { - @Override - public Value doValue(Value value, OperandMode mode, EnumSet flags) { - if (isVariable(value)) { - // since incoming variables are sorted, we can do a binary search - return locIn[Arrays.binarySearch(varIn, asVariable(value).index)]; - } - return value; - } - }; - - // Jumps have only alive values (outgoing phi values) - jump.forEachAlive(outputConsumer); - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/bu/BottomUpAllocator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/bu/BottomUpAllocator.java deleted file mode 100644 index 1d93f329486..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/bu/BottomUpAllocator.java +++ /dev/null @@ -1,855 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.bu; - -import static jdk.vm.ci.code.ValueUtil.asAllocatableValue; -import static jdk.vm.ci.code.ValueUtil.asRegister; -import static jdk.vm.ci.code.ValueUtil.isIllegal; -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static org.graalvm.compiler.lir.LIRValueUtil.asVariable; -import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isVariable; - -import java.util.ArrayList; -import java.util.BitSet; -import java.util.Collections; -import java.util.EnumSet; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig.AllocatableRegisters; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.debug.Assertions; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.InstructionValueProcedure; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.LIRInstruction.OperandFlag; -import org.graalvm.compiler.lir.LIRInstruction.OperandMode; -import org.graalvm.compiler.lir.LIRValueUtil; -import org.graalvm.compiler.lir.RedundantMoveElimination; -import org.graalvm.compiler.lir.StandardOp; -import org.graalvm.compiler.lir.StandardOp.BlockEndOp; -import org.graalvm.compiler.lir.StandardOp.JumpOp; -import org.graalvm.compiler.lir.StandardOp.LabelOp; -import org.graalvm.compiler.lir.Variable; -import org.graalvm.compiler.lir.VirtualStackSlot; -import org.graalvm.compiler.lir.alloc.OutOfRegistersException; -import org.graalvm.compiler.lir.alloc.trace.GlobalLivenessInfo; -import org.graalvm.compiler.lir.alloc.trace.TraceAllocationPhase; -import org.graalvm.compiler.lir.alloc.trace.TraceAllocationPhase.TraceAllocationContext; -import org.graalvm.compiler.lir.alloc.trace.TraceGlobalMoveResolutionPhase; -import org.graalvm.compiler.lir.alloc.trace.TraceGlobalMoveResolver; -import org.graalvm.compiler.lir.alloc.trace.TraceRegisterAllocationPhase; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.lir.ssa.SSAUtil; - -import jdk.vm.ci.code.Register; -import jdk.vm.ci.code.RegisterArray; -import jdk.vm.ci.code.RegisterAttributes; -import jdk.vm.ci.code.RegisterValue; -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.common.JVMCIError; -import jdk.vm.ci.meta.AllocatableValue; -import jdk.vm.ci.meta.PlatformKind; -import jdk.vm.ci.meta.Value; - -/** - * Allocates registers within a trace in a greedy, bottom-up fashion. The liveness information is - * computed on the fly as the instructions are traversed instead of computing it in a separate pass. - * The goal of this allocator is to provide a simple and fast algorithm for situations where code - * quality is not the primary target. - * - * This implementation does not (yet) exploit hinting information and might introduce multiple spill - * moves to the same stack slot (which are likely to be remove by {@link RedundantMoveElimination}. - * - * The current implementation cannot deal with {@link AbstractBlockBase blocks} with edges to - * compiled exception handlers since it might introduce spill code after the {@link LIRInstruction - * instruction} that triggers the exception. - */ -public final class BottomUpAllocator extends TraceAllocationPhase { - private final TargetDescription target; - private final LIRGenerationResult lirGenRes; - private final MoveFactory spillMoveFactory; - private final RegisterAllocationConfig registerAllocationConfig; - private final RegisterArray callerSaveRegs; - private final RegisterAttributes[] registerAttributes; - private final BitSet allocatedBlocks; - private final TraceBuilderResult resultTraces; - private final TraceGlobalMoveResolver moveResolver; - private final DebugContext debug; - - /** - * Maps from {@link Variable#index} to a spill stack slot. If - * {@linkplain org.graalvm.compiler.lir.alloc.trace.TraceRegisterAllocationPhase.Options#TraceRACacheStackSlots - * enabled} a {@link Variable} is always assigned to the same stack slot. - */ - private final AllocatableValue[] stackSlots; - - private final ArrayList insertInstructionsBefore; - private final ArrayList insertInstructionsAfter; - private final boolean neverSpillConstants; - - private final GlobalLivenessInfo livenessInfo; - - public BottomUpAllocator(TargetDescription target, LIRGenerationResult lirGenRes, MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, - AllocatableValue[] cachedStackSlots, TraceBuilderResult resultTraces, boolean neverSpillConstant, GlobalLivenessInfo livenessInfo) { - this.target = target; - this.debug = lirGenRes.getLIR().getDebug(); - this.lirGenRes = lirGenRes; - this.spillMoveFactory = spillMoveFactory; - this.registerAllocationConfig = registerAllocationConfig; - this.callerSaveRegs = registerAllocationConfig.getRegisterConfig().getCallerSaveRegisters(); - this.registerAttributes = registerAllocationConfig.getRegisterConfig().getAttributesMap(); - this.allocatedBlocks = new BitSet(lirGenRes.getLIR().getControlFlowGraph().getBlocks().length); - this.resultTraces = resultTraces; - this.moveResolver = new TraceGlobalMoveResolver(lirGenRes, spillMoveFactory, registerAllocationConfig, target.arch); - this.neverSpillConstants = neverSpillConstant; - this.livenessInfo = livenessInfo; - - this.insertInstructionsBefore = new ArrayList<>(4); - this.insertInstructionsAfter = new ArrayList<>(4); - - if (TraceRegisterAllocationPhase.Options.TraceRACacheStackSlots.getValue(lirGenRes.getLIR().getOptions())) { - this.stackSlots = cachedStackSlots; - } else { - this.stackSlots = new AllocatableValue[lirGenRes.getLIR().numVariables()]; - } - - } - - private LIR getLIR() { - return lirGenRes.getLIR(); - } - - /** - * Gets an object describing the attributes of a given register according to this register - * configuration. - */ - private RegisterAttributes attributes(Register reg) { - return registerAttributes[reg.number]; - } - - /** - * Returns a new spill slot or a cached entry if there is already one for the variable. - */ - private AllocatableValue allocateSpillSlot(Variable var) { - int variableIndex = var.index; - AllocatableValue cachedStackSlot = stackSlots[variableIndex]; - if (cachedStackSlot != null) { - TraceRegisterAllocationPhase.globalStackSlots.increment(debug); - assert cachedStackSlot.getValueKind().equals(var.getValueKind()) : "CachedStackSlot: kind mismatch? " + var.getValueKind() + " vs. " + cachedStackSlot.getValueKind(); - return cachedStackSlot; - } - VirtualStackSlot slot = lirGenRes.getFrameMapBuilder().allocateSpillSlot(var.getValueKind()); - stackSlots[variableIndex] = slot; - TraceRegisterAllocationPhase.allocatedStackSlots.increment(debug); - return slot; - } - - @Override - protected void run(@SuppressWarnings("hiding") TargetDescription target, @SuppressWarnings("hiding") LIRGenerationResult lirGenRes, Trace trace, TraceAllocationContext context) { - allocate(trace); - } - - private void allocate(Trace trace) { - if (neverSpillConstants) { - throw JVMCIError.unimplemented("NeverSpillConstant not supported!"); - } - new Allocator().allocateTrace(trace); - assert verify(trace); - } - - private boolean verify(Trace trace) { - for (AbstractBlockBase block : trace.getBlocks()) { - assert LIR.verifyBlock(lirGenRes.getLIR(), block); - } - return true; - } - - private static boolean requiresRegisters(LIRInstruction instruction, Value value, OperandMode mode, EnumSet flags) { - assert isVariable(value) : "Not a variable " + value; - if (instruction instanceof LabelOp) { - // phi and incoming values do not require a register - return false; - } - if (mode == OperandMode.DEF || mode == OperandMode.TEMP) { - return true; - } - return !flags.contains(OperandFlag.STACK); - } - - private void resolveFindInsertPos(AbstractBlockBase fromBlock, AbstractBlockBase toBlock) { - LIR lir = lirGenRes.getLIR(); - if (fromBlock.getSuccessorCount() <= 1) { - if (debug.isLogEnabled()) { - debug.log("inserting moves at end of fromBlock B%d", fromBlock.getId()); - } - - ArrayList instructions = lir.getLIRforBlock(fromBlock); - LIRInstruction instr = instructions.get(instructions.size() - 1); - if (instr instanceof StandardOp.JumpOp) { - // insert moves before branch - moveResolver.setInsertPosition(instructions, instructions.size() - 1); - } else { - moveResolver.setInsertPosition(instructions, instructions.size()); - } - - } else { - if (debug.isLogEnabled()) { - debug.log("inserting moves at beginning of toBlock B%d", toBlock.getId()); - } - - if (Assertions.detailedAssertionsEnabled(getLIR().getOptions())) { - assert lir.getLIRforBlock(fromBlock).get(0) instanceof StandardOp.LabelOp : "block does not start with a label"; - - /* - * Because the number of predecessor edges matches the number of successor edges, - * blocks which are reached by switch statements may have be more than one - * predecessor but it will be guaranteed that all predecessors will be the same. - */ - for (AbstractBlockBase predecessor : toBlock.getPredecessors()) { - assert fromBlock == predecessor : "all critical edges must be broken"; - } - } - - moveResolver.setInsertPosition(lir.getLIRforBlock(toBlock), 1); - } - } - - private final class Allocator { - - /** - * Maps from {@linkplain Register#number register} to the current {@linkplain Variable - * variable}. - */ - private final AllocatableValue[] currentRegisterMapping; - /** - * Maps from {@linkplain Variable#index variable} to its current location. - */ - private final AllocatableValue[] locations; - - private final int[] lastRegisterUsage; - private final int[] lastRegisterKill; - - private ArrayList currentInstructions; - private int currentInstructionIndex; - private int currentOpId; - - private Allocator() { - RegisterArray registers = target.arch.getRegisters(); - int numRegs = registers.size(); - int numVar = getLIR().numVariables(); - currentRegisterMapping = new AllocatableValue[numRegs]; - lastRegisterUsage = new int[numRegs]; - lastRegisterKill = new int[numRegs]; - locations = new AllocatableValue[numVar]; - // we start at offset 2 to distinguish if from the default value - currentOpId = 2; - } - - private void setCurrentValue(Register reg, AllocatableValue val) { - currentRegisterMapping[reg.number] = val; - } - - private AllocatableValue getCurrentValue(Register reg) { - return currentRegisterMapping[reg.number]; - } - - private int getLastRegisterUsage(Register reg) { - return lastRegisterUsage[reg.number]; - } - - private void setLastRegisterUsage(Register reg, int pos) { - debug.log("Register %s last used %d", reg, pos); - lastRegisterUsage[reg.number] = pos; - } - - private int getLastRegisterKill(Register reg) { - return lastRegisterKill[reg.number]; - } - - private void setLastRegisterKill(Register reg, int pos) { - debug.log("Register %s killed %d", reg, pos); - lastRegisterKill[reg.number] = pos; - } - - private void setCurrentLocation(Variable var, AllocatableValue location) { - locations[var.index] = location; - } - - private AllocatableValue getCurrentLocation(Variable var) { - return locations[var.index]; - } - - private void insertSpillMoveBefore(AllocatableValue dst, Value src) { - LIRInstruction move = spillMoveFactory.createMove(dst, src); - insertInstructionsBefore.add(move); - move.setComment(lirGenRes, "BottomUp: spill move before"); - debug.log("insert before %s", move); - } - - private void insertSpillMoveAfter(AllocatableValue dst, Value src) { - LIRInstruction inst = currentInstructions.get(currentInstructionIndex); - if (!(inst instanceof BlockEndOp)) { - LIRInstruction move = spillMoveFactory.createMove(dst, src); - insertInstructionsAfter.add(move); - move.setComment(lirGenRes, "BottomUp: spill move after"); - debug.log("insert after %s", move); - } else { - debug.log("Block end op. No from %s to %s necessary.", src, dst); - requireResolution = true; - } - } - - private void insertInstructions() { - // TODO (je) this is can probably be improved - currentInstructions.ensureCapacity(currentInstructions.size() + insertInstructionsBefore.size() + insertInstructionsAfter.size()); - LIRInstruction inst = currentInstructions.get(currentInstructionIndex); - // insert after - if (insertInstructionsAfter.size() != 0) { - Collections.reverse(insertInstructionsAfter); - assert !(inst instanceof BlockEndOp) : "Cannot insert instruction after the block end op: " + inst; - currentInstructions.addAll(currentInstructionIndex + 1, insertInstructionsAfter); - insertInstructionsAfter.clear(); - } - // insert before - if (insertInstructionsBefore.size() != 0) { - assert !(inst instanceof LabelOp) : "Cannot insert instruction before the label op: " + inst; - currentInstructions.addAll(currentInstructionIndex, insertInstructionsBefore); - insertInstructionsBefore.clear(); - } - } - - @SuppressWarnings("try") - private void allocateTrace(Trace trace) { - try (DebugContext.Scope s = debug.scope("BottomUpAllocator", trace.getBlocks()); Indent indent = debug.logAndIndent("%s (Trace%d)", trace, trace.getId())) { - AbstractBlockBase[] blocks = trace.getBlocks(); - int lastBlockIdx = blocks.length - 1; - AbstractBlockBase successorBlock = blocks[lastBlockIdx]; - // handle last block - allocateBlock(successorBlock); - // handle remaining blocks - for (int i = lastBlockIdx - 1; i >= 0; i--) { - AbstractBlockBase block = blocks[i]; - // handle PHIs - resolvePhis(block, successorBlock); - boolean needResolution = allocateBlock(block); - - if (needResolution) { - // resolve local data flow - resolveIntraTraceEdge(block, successorBlock); - } - successorBlock = block; - } - resolveLoopBackEdge(trace); - } catch (Throwable e) { - throw debug.handle(e); - } - } - - private final ArrayList phiResolutionMoves = new ArrayList<>(); - - /** - * Resolve phi values, i.e., set the current location of values in the predecessors block - * (which is not yet allocated) to the location of the variable defined by the phi in the - * successor (which is already allocated). For constant inputs we insert moves. - */ - private void resolvePhis(AbstractBlockBase from, AbstractBlockBase to) { - if (SSAUtil.isMerge(to)) { - JumpOp jump = SSAUtil.phiOut(getLIR(), from); - LabelOp label = SSAUtil.phiIn(getLIR(), to); - - assert phiResolutionMoves.isEmpty(); - - for (int i = 0; i < label.getPhiSize(); i++) { - visitPhiValuePair(jump.getOutgoingValue(i), label.getIncomingValue(i)); - } - if (!phiResolutionMoves.isEmpty()) { - ArrayList instructions = getLIR().getLIRforBlock(from); - instructions.addAll(instructions.size() - 1, phiResolutionMoves); - phiResolutionMoves.clear(); - } - } - } - - private void visitPhiValuePair(Value phiOut, Value phiIn) { - assert isStackSlotValue(phiIn) || isRegister(phiIn) : "PHI defined values is not a register or stack slot: " + phiIn; - AllocatableValue in = asAllocatableValue(phiIn); - - AllocatableValue dest = isRegister(in) ? getCurrentValue(asRegister(in)) : in; - final LIRInstruction move; - if (isConstantValue(phiOut)) { - // insert move from constant - move = spillMoveFactory.createLoad(dest, LIRValueUtil.asConstant(phiOut)); - } else { - assert isVariable(phiOut) : "Not a variable or constant: " + phiOut; - // insert move from variable - move = spillMoveFactory.createMove(dest, asVariable(phiOut)); - } - debug.log("Inserting load %s", move); - move.setComment(lirGenRes, "BottomUp: phi resolution"); - phiResolutionMoves.add(move); - } - - private boolean requireResolution; - - /** - * Intra-trace edges, i.e., edge where both, the source and the target block are in the same - * trace, are either - *

      - *
    • immediate forward edges, i.e., an edge from {@code i}th block of the trace - * to the {@code (i+1)}th block, or - *
    • a loop back-edge from the last block of the trace to the loop header. - *
    - * This property is guaranteed due to splitting of critical edge. - * - * Since forward edges are handled locally during bottom-up allocation we only need to check - * for the second case. - */ - private void resolveLoopBackEdge(Trace trace) { - AbstractBlockBase[] blocks = trace.getBlocks(); - AbstractBlockBase endBlock = blocks[blocks.length - 1]; - if (endBlock.isLoopEnd()) { - assert endBlock.getSuccessorCount() == 1; - AbstractBlockBase targetBlock = endBlock.getSuccessors()[0]; - assert targetBlock.isLoopHeader() : String.format("Successor %s or loop end %s is not a loop header?", targetBlock, endBlock); - if (resultTraces.getTraceForBlock(targetBlock).equals(trace)) { - resolveLoopBackEdge(endBlock, targetBlock); - } - } - } - - private void resolveLoopBackEdge(AbstractBlockBase from, AbstractBlockBase to) { - assert resultTraces.getTraceForBlock(from).equals(resultTraces.getTraceForBlock(to)) : "Not on the same trace? " + from + " -> " + to; - resolveFindInsertPos(from, to); - LIR lir = getLIR(); - - if (SSAUtil.isMerge(to)) { - JumpOp blockEnd = SSAUtil.phiOut(lir, from); - LabelOp label = SSAUtil.phiIn(lir, to); - - for (int i = 0; i < label.getPhiSize(); i++) { - Value incomingValue = label.getIncomingValue(i); - Value outgoingValue = blockEnd.getOutgoingValue(i); - resolveValuePair(incomingValue, outgoingValue); - } - } - resolveTraceEdge(from, to); - moveResolver.resolveAndAppendMoves(); - } - - private void resolveIntraTraceEdge(AbstractBlockBase from, AbstractBlockBase to) { - assert resultTraces.getTraceForBlock(from).equals(resultTraces.getTraceForBlock(to)) : "Not on the same trace? " + from + " -> " + to; - resolveFindInsertPos(from, to); - resolveTraceEdge(from, to); - moveResolver.resolveAndAppendMoves(); - } - - private void resolveTraceEdge(AbstractBlockBase from, AbstractBlockBase to) { - Value[] out = livenessInfo.getOutLocation(from); - Value[] in = livenessInfo.getInLocation(to); - - assert out != null; - assert in != null; - assert out.length == in.length; - - for (int i = 0; i < out.length; i++) { - Value incomingValue = in[i]; - Value outgoingValue = out[i]; - resolveValuePair(incomingValue, outgoingValue); - } - } - - private void resolveValuePair(Value incomingValue, Value outgoingValue) { - if (!isIllegal(incomingValue) && !TraceGlobalMoveResolver.isMoveToSelf(outgoingValue, incomingValue)) { - TraceGlobalMoveResolutionPhase.addMapping(moveResolver, outgoingValue, incomingValue); - } - } - - /** - * @return {@code true} if the block requires data-flow resolution. - */ - @SuppressWarnings("try") - private boolean allocateBlock(AbstractBlockBase block) { - // might be set in insertSpillMoveAfter - requireResolution = false; - - try (Indent indent = debug.logAndIndent("handle block %s", block)) { - currentInstructions = getLIR().getLIRforBlock(block); - final int lastInstIdx = currentInstructions.size() - 1; - for (currentInstructionIndex = lastInstIdx; currentInstructionIndex >= 0; currentInstructionIndex--) { - LIRInstruction inst = currentInstructions.get(currentInstructionIndex); - if (inst != null) { - inst.setId(currentOpId); - allocateInstruction(inst, block, currentInstructionIndex == 0, currentInstructionIndex == lastInstIdx); - } - } - allocatedBlocks.set(block.getId()); - } - return requireResolution; - } - - @SuppressWarnings("try") - private void allocateInstruction(LIRInstruction op, AbstractBlockBase block, boolean isLabel, boolean isBlockEnd) { - assert op != null && op.id() == currentOpId; - try (Indent indent = debug.logAndIndent("handle inst: %d: %s", op.id(), op)) { - try (Indent indent1 = debug.logAndIndent("output pos")) { - // spill caller saved registers - if (op.destroysCallerSavedRegisters()) { - spillCallerSavedRegisters(); - } - - // fixed - op.forEachOutput(allocFixedRegisterProcedure); - op.forEachTemp(allocFixedRegisterProcedure); - op.forEachAlive(allocFixedRegisterProcedure); - // variable - op.forEachOutput(allocRegisterProcedure); - op.forEachTemp(allocRegisterProcedure); - op.forEachAlive(allocRegisterProcedure); - /* state do never require a register */ - // op.forEachState(allocRegisterProcedure); - - // should have - op.forEachTemp(allocStackOrRegisterProcedure); - op.forEachOutput(allocStackOrRegisterProcedure); - if (isLabel) { - assert op instanceof LabelOp; - processIncoming(block, op); - } - } - try (Indent indent1 = debug.logAndIndent("input pos")) { - - currentOpId++; - - // fixed - op.forEachInput(allocFixedRegisterProcedure); - // variable - op.forEachInput(allocRegisterProcedure); - - op.forEachAlive(allocStackOrRegisterProcedure); - if (isBlockEnd) { - assert op instanceof BlockEndOp; - processOutgoing(block, op); - } - op.forEachState(allocStackOrRegisterProcedure); - op.forEachInput(allocStackOrRegisterProcedure); - } - - // insert spill/load instructions - insertInstructions(); - currentOpId++; - } - } - - private void processIncoming(AbstractBlockBase block, LIRInstruction instruction) { - int[] vars = livenessInfo.getBlockIn(block); - Value[] locs = new Value[vars.length]; - for (int i = 0; i < vars.length; i++) { - int varNum = vars[i]; - if (varNum >= 0) { - locs[i] = allocStackOrRegister(instruction, livenessInfo.getVariable(varNum), OperandMode.DEF, LabelOp.incomingFlags); - } - } - livenessInfo.setInLocations(block, locs); - } - - private void processOutgoing(AbstractBlockBase block, LIRInstruction instruction) { - int[] vars = livenessInfo.getBlockOut(block); - Value[] locs = new Value[vars.length]; - for (int i = 0; i < vars.length; i++) { - locs[i] = allocStackOrRegister(instruction, livenessInfo.getVariable(vars[i]), OperandMode.ALIVE, JumpOp.outgoingFlags); - } - livenessInfo.setOutLocations(block, locs); - } - - private void spillCallerSavedRegisters() { - for (Register reg : callerSaveRegs) { - if (attributes(reg).isAllocatable()) { - evacuateRegisterAndSpill(reg); - assert checkRegisterUsage(reg); - setLastRegisterUsage(reg, currentOpId); - } - } - if (debug.isLogEnabled()) { - debug.log("operation destroys all caller-save registers"); - } - } - - private final InstructionValueProcedure allocFixedRegisterProcedure = new InstructionValueProcedure() { - @Override - public Value doValue(LIRInstruction instruction, Value value, OperandMode mode, EnumSet flags) { - return allocFixedRegister(value); - } - }; - private final InstructionValueProcedure allocRegisterProcedure = new InstructionValueProcedure() { - @Override - public Value doValue(LIRInstruction instruction, Value value, OperandMode mode, EnumSet flags) { - return allocRegister(instruction, value, mode, flags); - } - }; - private final InstructionValueProcedure allocStackOrRegisterProcedure = new InstructionValueProcedure() { - @Override - public Value doValue(LIRInstruction instruction, Value value, OperandMode mode, EnumSet flags) { - return allocStackOrRegister(instruction, value, mode, flags); - } - }; - - private Value allocFixedRegister(Value value) { - if (isRegister(value)) { - Register reg = asRegister(value); - assert checkRegisterUsage(reg); - evacuateRegisterAndSpill(reg); - setRegisterUsage(reg, asAllocatableValue(value)); - } - return value; - } - - private Value allocRegister(LIRInstruction instruction, Value value, OperandMode mode, EnumSet flags) { - if (isVariable(value) && requiresRegisters(instruction, value, mode, flags)) { - Variable var = asVariable(value); - // check if available - AllocatableValue currentLocation = getCurrentLocation(var); - if (currentLocation == null) { - // nothing yet assigned - return allocRegister(var, mode); - } - // already a location assigned - if (isRegister(currentLocation)) { - // register assigned -> nothing todo - setLastRegisterUsage(asRegister(currentLocation), currentOpId); - return currentLocation; - } - assert isStackSlotValue(currentLocation); - // stackSlot assigned but need register -> spill - Value allocatedRegister = allocRegister(var, mode); - if (mode == OperandMode.USE) { - // input might be destroyed at the def position - // but it must be available before the instruction - insertSpillMoveBefore(currentLocation, allocatedRegister); - } else { - insertSpillMoveAfter(currentLocation, allocatedRegister); - } - return allocatedRegister; - } - return value; - } - - private Value allocRegister(Variable var, OperandMode mode) { - PlatformKind platformKind = var.getPlatformKind(); - Register freeRegister = findFreeRegister(platformKind, mode); - if (freeRegister == null) { - // no free register found, looking for a blocked one - freeRegister = findLockedRegister(platformKind, mode); - if (freeRegister == null) { - throw new OutOfRegistersException("TraceRA[BottomUp]: no register found"); - } - } - // found a register - setRegisterUsage(freeRegister, var); - RegisterValue registerValue = freeRegister.asValue(var.getValueKind()); - setCurrentLocation(var, registerValue); - debug.log("AllocateRegister[%5s] %s for %s", mode, freeRegister, var); - return registerValue; - } - - private Value allocStackOrRegister(LIRInstruction instruction, Value value, OperandMode mode, EnumSet flags) { - if (isRegister(value)) { - if ((mode == OperandMode.DEF || mode == OperandMode.TEMP) && !(instruction instanceof LabelOp)) { - freeRegister(asRegister(value)); - } - return value; - } - if (isVariable(value)) { - assert !requiresRegisters(instruction, value, mode, flags) : "Should have a register already: " + value; - Variable var = asVariable(value); - // check if available - AllocatableValue currentLocation = getCurrentLocation(var); - if (currentLocation != null) { - // already a location assigned -> nothing todo - if (isRegister(currentLocation)) { - Register reg = asRegister(currentLocation); - if (mode == OperandMode.ALIVE && killedAtDef(reg)) { - AllocatableValue spillSlot = allocateSpillSlot(var); - insertSpillMoveBefore(spillSlot, currentLocation); - debug.log("AllocateStackOrReg[%5s] temporary use %s for %s since current location %s is destroyed at def", mode, spillSlot, var, currentLocation); - return spillSlot; - } - // update register usage - setLastRegisterUsage(reg, currentOpId); - } - debug.log(3, "AllocateStackOrReg[%5s] %s already in %s", mode, var, currentLocation); - return currentLocation; - } - // no location available - PlatformKind platformKind = var.getPlatformKind(); - Register freeRegister = findFreeRegister(platformKind, mode); - if (freeRegister == null) { - // no free register available -> either spill current or free a register - AllocatableValue spillSlot = allocateSpillSlot(var); - setCurrentLocation(var, spillSlot); - return spillSlot; - } - assert freeRegister != null; - // found a register - setRegisterUsage(freeRegister, var); - RegisterValue registerValue = freeRegister.asValue(var.getValueKind()); - setCurrentLocation(var, registerValue); - debug.log("AllocateStackOrReg[%5s] %s for %s", mode, freeRegister, var); - return registerValue; - } - return value; - } - - private boolean killedAtDef(Register reg) { - return getLastRegisterKill(reg) == currentOpId - 1; - } - - /** - * Searches for a free register. - */ - @SuppressWarnings("try") - private Register findFreeRegister(PlatformKind kind, OperandMode mode) { - AllocatableRegisters allocatableRegisters = registerAllocationConfig.getAllocatableRegisters(kind); - Register[] availableRegs = allocatableRegisters.allocatableRegisters; - for (Register reg : availableRegs) { - AllocatableValue currentVal = getCurrentValue(reg); - if (currentVal == null && !isCurrentlyUsed(reg, mode)) { - return reg; - } - } - if (debug.isLogEnabled()) { - try (Indent i = debug.logAndIndent("All Registers occupied:")) { - for (Register reg : availableRegs) { - debug.log("%6s: last used %4d %s", reg, getLastRegisterUsage(reg), getCurrentValue(reg)); - } - } - } - return null; - } - - /** - * Searches for a occupied register to spill. - */ - @SuppressWarnings("try") - private Register findLockedRegister(PlatformKind kind, OperandMode mode) { - AllocatableRegisters allocatableRegisters = registerAllocationConfig.getAllocatableRegisters(kind); - Register[] availableRegs = allocatableRegisters.allocatableRegisters; - // TODO (je): better strategies for spilling - // TODO (je): we need to ensure that we do not use the register in the current - // instruction! - Register lockedReg = null; - for (Register reg : availableRegs) { - if (!isCurrentlyUsed(reg, mode) && !isActiveFixedRegister(reg)) { - lockedReg = reg; - break; - } - } - if (lockedReg == null) { - return null; - } - evacuateRegisterAndSpill(lockedReg); - return lockedReg; - } - - private boolean isActiveFixedRegister(Register reg) { - return isRegister(getCurrentValue(reg)); - } - - private boolean isCurrentlyUsed(Register reg, OperandMode mode) { - int lastRegUsage = getLastRegisterUsage(reg); - if (lastRegUsage == currentOpId) { - return true; - } - return mode == OperandMode.ALIVE && lastRegUsage == (currentOpId & ~1); - } - - private void freeRegister(Register reg) { - AllocatableValue val = getCurrentValue(reg); - setCurrentValue(reg, null); - setLastRegisterKill(reg, currentOpId); - if (val != null && isVariable(val)) { - Variable var = asVariable(val); - setCurrentLocation(var, null); - debug.log("Free Registers %s (was %s)", reg, var); - } else { - debug.log("Free Registers %s", reg); - } - } - - private void setRegisterUsage(Register reg, AllocatableValue currentValue) { - assert checkRegisterUsage(reg); - setCurrentValue(reg, currentValue); - setLastRegisterUsage(reg, currentOpId); - } - - private boolean checkRegisterUsage(Register reg) { - AllocatableValue currentValue = getCurrentValue(reg); - assert getLastRegisterUsage(reg) < currentOpId || currentValue == null || isRegister(currentValue) && asRegister(currentValue).equals(reg) : String.format("Register %s is occupied", reg); - return true; - } - - /** - * Frees a registers and spill the variable that is currently occupying it. - * - * @return The value that currently occupies the register or {@code null} if there is none. - */ - private AllocatableValue evacuateRegisterAndSpill(Register reg) { - AllocatableValue val = evacuateRegister(reg); - spillVariable(val, reg); - return val; - } - - /** - * Frees a registers. The variable that is currently occupying it is not spilled. - * - * @return The value that currently occupies the register or {@code null} if there is none. - */ - private AllocatableValue evacuateRegister(Register reg) { - AllocatableValue val = getCurrentValue(reg); - if (val == null) { - return null; - } - setCurrentValue(reg, null); - return val; - } - - private void spillVariable(AllocatableValue val, Register reg) { - if (val != null && isVariable(val)) { - Variable var = asVariable(val); - debug.log("Spill Variable %s from %s", var, reg); - // insert reload - AllocatableValue spillSlot = allocateSpillSlot(var); - setCurrentLocation(var, spillSlot); - insertSpillMoveAfter(reg.asValue(var.getValueKind()), spillSlot); - } - } - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/FixedInterval.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/FixedInterval.java deleted file mode 100644 index bab672a149c..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/FixedInterval.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import static jdk.vm.ci.code.ValueUtil.asRegister; -import static jdk.vm.ci.code.ValueUtil.isRegister; - -import org.graalvm.compiler.lir.LIRInstruction; - -import jdk.vm.ci.meta.AllocatableValue; -import jdk.vm.ci.meta.Value; - -/** - * Represents a fixed interval. - */ -final class FixedInterval extends IntervalHint { - - /** - * The fixed operand of this interval. - */ - public final AllocatableValue operand; - - /** - * The head of the list of ranges describing this interval. This list is sorted by - * {@linkplain LIRInstruction#id instruction ids}. - */ - private FixedRange first; - - /** - * Iterator used to traverse the ranges of an interval. - */ - private FixedRange current; - - /** - * Link to next interval in a sorted list of intervals that ends with {@link #EndMarker}. - */ - FixedInterval next; - - private int cachedTo; // cached value: to of last range (-1: not cached) - - public FixedRange first() { - return first; - } - - @Override - public int from() { - return first.from; - } - - public int to() { - if (cachedTo == -1) { - cachedTo = calcTo(); - } - assert cachedTo == calcTo() : "invalid cached value"; - return cachedTo; - } - - // test intersection - boolean intersects(TraceInterval i) { - return first.intersects(i); - } - - int intersectsAt(TraceInterval i) { - return first.intersectsAt(i); - } - - // range iteration - void rewindRange() { - current = first; - } - - void nextRange() { - assert this != EndMarker : "not allowed on sentinel"; - current = current.next; - } - - int currentFrom() { - return current.from; - } - - int currentTo() { - return current.to; - } - - boolean currentAtEnd() { - return current == FixedRange.EndMarker; - } - - boolean currentIntersects(TraceInterval it) { - return current.intersects(it); - } - - int currentIntersectsAt(TraceInterval it) { - return current.intersectsAt(it); - } - - // range creation - public void setFrom(int from) { - assert !isEmpty(); - first().from = from; - } - - private boolean isEmpty() { - return first() == FixedRange.EndMarker; - } - - public void addRange(int from, int to) { - if (isEmpty()) { - first = new FixedRange(from, to, first()); - return; - } - if (to <= to() && from >= from()) { - return; - } - if (from() == to) { - first().from = from; - } else { - first = new FixedRange(from, to, first()); - } - } - - @Override - public AllocatableValue location() { - return operand; - } - - /** - * Sentinel interval to denote the end of an interval list. - */ - static final FixedInterval EndMarker = new FixedInterval(Value.ILLEGAL); - - FixedInterval(AllocatableValue operand) { - assert operand != null; - this.operand = operand; - this.first = FixedRange.EndMarker; - this.current = FixedRange.EndMarker; - this.next = FixedInterval.EndMarker; - this.cachedTo = -1; - } - - int calcTo() { - assert first != FixedRange.EndMarker : "interval has no range"; - - FixedRange r = first; - while (r.next != FixedRange.EndMarker) { - r = r.next; - } - return r.to; - } - - // returns true if the opId is inside the interval - boolean covers(int opId, LIRInstruction.OperandMode mode) { - FixedRange cur = first; - - while (cur != FixedRange.EndMarker && cur.to < opId) { - cur = cur.next; - } - if (cur != FixedRange.EndMarker) { - assert cur.to != cur.next.from : "ranges not separated"; - - if (mode == LIRInstruction.OperandMode.DEF) { - return cur.from <= opId && opId < cur.to; - } else { - return cur.from <= opId && opId <= cur.to; - } - } - return false; - } - - // returns true if the interval has any hole between holeFrom and holeTo - // (even if the hole has only the length 1) - boolean hasHoleBetween(int holeFrom, int holeTo) { - assert holeFrom < holeTo : "check"; - assert from() <= holeFrom && holeTo <= to() : "index out of interval"; - - FixedRange cur = first; - while (cur != FixedRange.EndMarker) { - assert cur.to < cur.next.from : "no space between ranges"; - - // hole-range starts before this range . hole - if (holeFrom < cur.from) { - return true; - - // hole-range completely inside this range . no hole - } else { - if (holeTo <= cur.to) { - return false; - - // overlapping of hole-range with this range . hole - } else { - if (holeFrom <= cur.to) { - return true; - } - } - } - - cur = cur.next; - } - - return false; - } - - @Override - public String toString() { - if (this == EndMarker) { - return "EndMarker [?,?]"; - } - String from = "?"; - String to = "?"; - if (first != null && first != FixedRange.EndMarker) { - from = String.valueOf(from()); - // to() may cache a computed value, modifying the current object, which is a bad idea - // for a printing function. Compute it directly instead. - to = String.valueOf(calcTo()); - } - String locationString = "@" + this.operand; - return asRegister(operand).number + ":" + operand + (isRegister(operand) ? "" : locationString) + "[" + from + "," + to + "]"; - } - - /** - * Gets a single line string for logging the details of this interval to a log stream. - */ - @Override - public String logString() { - StringBuilder buf = new StringBuilder(100); - buf.append("fix ").append(asRegister(operand).number).append(':').append(operand).append(' '); - - buf.append(" ranges{"); - - // print ranges - FixedRange cur = first; - while (cur != FixedRange.EndMarker) { - if (cur != first) { - buf.append(", "); - } - buf.append(cur); - cur = cur.next; - assert cur != null : "range list not closed with range sentinel"; - } - buf.append("}"); - return buf.toString(); - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/FixedRange.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/FixedRange.java deleted file mode 100644 index 071f9e61157..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/FixedRange.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -/** - * Represents a range of integers from a start (inclusive) to an end (exclusive). - */ -final class FixedRange { - - public static final FixedRange EndMarker = new FixedRange(Integer.MAX_VALUE, Integer.MAX_VALUE, null); - - /** - * The start of the range, inclusive. - */ - public int from; - - /** - * The end of the range, exclusive. - */ - public int to; - - /** - * A link to allow the range to be put into a singly linked list. - */ - public FixedRange next; - - boolean intersects(TraceInterval i) { - return intersectsAt(i) != -1; - } - - /** - * Creates a new range. - * - * @param from the start of the range, inclusive - * @param to the end of the range, exclusive - * @param next link to the next range in a linked list - */ - FixedRange(int from, int to, FixedRange next) { - this.from = from; - this.to = to; - this.next = next; - } - - int intersectsAt(TraceInterval other) { - FixedRange range = this; - assert other != null : "null ranges not allowed"; - assert range != EndMarker && other != TraceInterval.EndMarker : "empty ranges not allowed"; - int intervalFrom = other.from(); - int intervalTo = other.to(); - - do { - if (range.from < intervalFrom) { - if (range.to <= intervalFrom) { - range = range.next; - if (range == EndMarker) { - return -1; - } - } else { - return intervalFrom; - } - } else { - if (intervalFrom < range.from) { - if (intervalTo <= range.from) { - return -1; - } - return range.from; - } else { - assert range.from == intervalFrom; - if (range.from == range.to) { - range = range.next; - if (range == EndMarker) { - return -1; - } - } else { - if (intervalFrom == intervalTo) { - return -1; - } - return range.from; - } - } - } - } while (true); - } - - @Override - public String toString() { - return "[" + from + ", " + to + "]"; - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/RegisterVerifier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/RegisterVerifier.java deleted file mode 100644 index 63d01730d5d..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/RegisterVerifier.java +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import static jdk.vm.ci.code.ValueUtil.asRegister; -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static org.graalvm.compiler.lir.LIRValueUtil.asVariable; -import static org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.isVariableOrRegister; - -import java.util.ArrayList; -import java.util.EnumSet; - -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.core.common.cfg.BlockMap; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.InstructionValueConsumer; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.LIRInstruction.OperandFlag; -import org.graalvm.compiler.lir.LIRInstruction.OperandMode; -import org.graalvm.compiler.lir.Variable; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; - -import jdk.vm.ci.code.Register; -import jdk.vm.ci.meta.Value; - -final class RegisterVerifier { - - TraceLinearScan allocator; - ArrayList> workList; // all blocks that must be processed - BlockMap savedStates; // saved information of previous check - - // simplified access to methods of LinearScan - TraceInterval intervalAt(Variable operand) { - return allocator.intervalFor(operand); - } - - // currently, only registers are processed - int stateSize() { - return allocator.numRegisters(); - } - - // accessors - TraceInterval[] stateForBlock(AbstractBlockBase block) { - return savedStates.get(block); - } - - void setStateForBlock(AbstractBlockBase block, TraceInterval[] savedState) { - savedStates.put(block, savedState); - } - - void addToWorkList(AbstractBlockBase block) { - if (!workList.contains(block)) { - workList.add(block); - } - } - - RegisterVerifier(TraceLinearScan allocator) { - this.allocator = allocator; - workList = new ArrayList<>(16); - this.savedStates = new BlockMap<>(allocator.getLIR().getControlFlowGraph()); - - } - - @SuppressWarnings("try") - void verify(AbstractBlockBase start) { - DebugContext debug = allocator.getDebug(); - try (DebugContext.Scope s = debug.scope("RegisterVerifier")) { - // setup input registers (method arguments) for first block - TraceInterval[] inputState = new TraceInterval[stateSize()]; - setStateForBlock(start, inputState); - addToWorkList(start); - - // main loop for verification - do { - AbstractBlockBase block = workList.get(0); - workList.remove(0); - - processBlock(block); - } while (!workList.isEmpty()); - } - } - - @SuppressWarnings("try") - private void processBlock(AbstractBlockBase block) { - DebugContext debug = allocator.getDebug(); - try (Indent indent = debug.logAndIndent("processBlock B%d", block.getId())) { - // must copy state because it is modified - TraceInterval[] inputState = copy(stateForBlock(block)); - - try (Indent indent2 = debug.logAndIndent("Input-State of intervals:")) { - printState(inputState); - } - - // process all operations of the block - processOperations(block, inputState); - - try (Indent indent2 = debug.logAndIndent("Output-State of intervals:")) { - printState(inputState); - } - - // iterate all successors - for (AbstractBlockBase succ : block.getSuccessors()) { - processSuccessor(succ, inputState); - } - } - } - - protected void printState(TraceInterval[] inputState) { - DebugContext debug = allocator.getDebug(); - for (int i = 0; i < stateSize(); i++) { - Register reg = allocator.getRegisters().get(i); - assert reg.number == i; - if (inputState[i] != null) { - debug.log(" %6s %4d -- %s", reg, inputState[i].operandNumber, inputState[i]); - } else { - debug.log(" %6s __", reg); - } - } - } - - private void processSuccessor(AbstractBlockBase block, TraceInterval[] inputState) { - TraceInterval[] savedState = stateForBlock(block); - - DebugContext debug = allocator.getDebug(); - if (savedState != null) { - // this block was already processed before. - // check if new inputState is consistent with savedState - - boolean savedStateCorrect = true; - for (int i = 0; i < stateSize(); i++) { - if (inputState[i] != savedState[i]) { - // current inputState and previous savedState assume a different - // interval in this register . assume that this register is invalid - if (savedState[i] != null) { - // invalidate old calculation only if it assumed that - // register was valid. when the register was already invalid, - // then the old calculation was correct. - savedStateCorrect = false; - savedState[i] = null; - - debug.log("processSuccessor B%d: invalidating slot %d", block.getId(), i); - } - } - } - - if (savedStateCorrect) { - // already processed block with correct inputState - debug.log("processSuccessor B%d: previous visit already correct", block.getId()); - } else { - // must re-visit this block - debug.log("processSuccessor B%d: must re-visit because input state changed", block.getId()); - addToWorkList(block); - } - - } else { - // block was not processed before, so set initial inputState - debug.log("processSuccessor B%d: initial visit", block.getId()); - - setStateForBlock(block, copy(inputState)); - addToWorkList(block); - } - } - - static TraceInterval[] copy(TraceInterval[] inputState) { - return inputState.clone(); - } - - static void statePut(DebugContext debug, TraceInterval[] inputState, Value location, TraceInterval interval) { - if (location != null && isRegister(location)) { - Register reg = asRegister(location); - int regNum = reg.number; - if (interval != null) { - debug.log("%s = v%d", reg, interval.operandNumber); - } else if (inputState[regNum] != null) { - debug.log("%s = null", reg); - } - - inputState[regNum] = interval; - } - } - - static boolean checkState(AbstractBlockBase block, LIRInstruction op, TraceInterval[] inputState, Value operand, Value reg, TraceInterval interval) { - if (reg != null && isRegister(reg)) { - if (inputState[asRegister(reg).number] != interval) { - throw new GraalError( - "Error in register allocation: operation (%s) in block %s expected register %s (operand %s) to contain the value of interval %s but data-flow says it contains interval %s", - op, block, reg, operand, interval, inputState[asRegister(reg).number]); - } - } - return true; - } - - void processOperations(AbstractBlockBase block, final TraceInterval[] inputState) { - ArrayList ops = allocator.getLIR().getLIRforBlock(block); - DebugContext debug = allocator.getDebug(); - InstructionValueConsumer useConsumer = new InstructionValueConsumer() { - - @Override - public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet flags) { - // we skip spill moves inserted by the spill position optimization - if (isVariableOrRegister(operand) && allocator.isProcessed(operand) && op.id() != TraceLinearScanPhase.DOMINATOR_SPILL_MOVE_ID) { - TraceInterval interval = intervalAt(asVariable(operand)); - if (op.id() != -1) { - interval = interval.getSplitChildAtOpId(op.id(), mode); - } - - assert checkState(block, op, inputState, allocator.getOperand(interval), interval.location(), interval.splitParent()); - } - } - }; - - InstructionValueConsumer defConsumer = (op, operand, mode, flags) -> { - if (isVariableOrRegister(operand) && allocator.isProcessed(operand)) { - TraceInterval interval = intervalAt(asVariable(operand)); - if (op.id() != -1) { - interval = interval.getSplitChildAtOpId(op.id(), mode); - } - - statePut(debug, inputState, interval.location(), interval.splitParent()); - } - }; - - // visit all instructions of the block - for (int i = 0; i < ops.size(); i++) { - final LIRInstruction op = ops.get(i); - - if (debug.isLogEnabled()) { - debug.log("%s", op.toStringWithIdPrefix()); - } - - // check if input operands are correct - op.visitEachInput(useConsumer); - // invalidate all caller save registers at calls - if (op.destroysCallerSavedRegisters()) { - for (Register r : allocator.getRegisterAllocationConfig().getRegisterConfig().getCallerSaveRegisters()) { - statePut(debug, inputState, r.asValue(), null); - } - } - op.visitEachAlive(useConsumer); - // set temp operands (some operations use temp operands also as output operands, so - // can't set them null) - op.visitEachTemp(defConsumer); - // set output operands - op.visitEachOutput(defConsumer); - } - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceInterval.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceInterval.java deleted file mode 100644 index ea062c331c7..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceInterval.java +++ /dev/null @@ -1,986 +0,0 @@ -/* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import static jdk.vm.ci.code.ValueUtil.asRegister; -import static jdk.vm.ci.code.ValueUtil.isIllegal; -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static jdk.vm.ci.code.ValueUtil.isStackSlot; -import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isVariable; -import static org.graalvm.compiler.lir.LIRValueUtil.isVirtualStackSlot; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.EnumSet; -import java.util.List; - -import org.graalvm.compiler.core.common.LIRKind; -import org.graalvm.compiler.core.common.util.Util; -import org.graalvm.compiler.debug.Assertions; -import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.Variable; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; -import org.graalvm.compiler.options.OptionValues; - -import jdk.vm.ci.code.RegisterValue; -import jdk.vm.ci.code.StackSlot; -import jdk.vm.ci.meta.AllocatableValue; -import jdk.vm.ci.meta.JavaConstant; -import jdk.vm.ci.meta.Value; -import jdk.vm.ci.meta.ValueKind; - -/** - * Represents an interval in the {@linkplain TraceLinearScan linear scan register allocator}. - */ -final class TraceInterval extends IntervalHint { - - /** - * Constants denoting the register usage priority for an interval. The constants are declared in - * increasing order of priority are are used to optimize spilling when multiple overlapping - * intervals compete for limited registers. - */ - public enum RegisterPriority { - /** - * No special reason for an interval to be allocated a register. - */ - None, - - /** - * Priority level for intervals live at the end of a loop. - */ - LiveAtLoopEnd, - - /** - * Priority level for intervals that should be allocated to a register. - */ - ShouldHaveRegister, - - /** - * Priority level for intervals that must be allocated to a register. - */ - MustHaveRegister; - - public static final RegisterPriority[] VALUES = values(); - - /** - * Determines if this priority is higher than or equal to a given priority. - */ - public boolean greaterEqual(RegisterPriority other) { - return ordinal() >= other.ordinal(); - } - - /** - * Determines if this priority is lower than a given priority. - */ - public boolean lessThan(RegisterPriority other) { - return ordinal() < other.ordinal(); - } - - public CharSequence shortName() { - return name().subSequence(0, 1); - } - } - - /** - * Constants denoting whether an interval is bound to a specific register. This models platform - * dependencies on register usage for certain instructions. - */ - enum RegisterBinding { - /** - * Interval is bound to a specific register as required by the platform. - */ - Fixed, - - /** - * Interval has no specific register requirements. - */ - Any, - - /** - * Interval is bound to a stack slot. - */ - Stack; - - public static final RegisterBinding[] VALUES = values(); - } - - /** - * Constants denoting the linear-scan states an interval may be in with respect to the - * {@linkplain TraceInterval#from() start} {@code position} of the interval being processed. - */ - enum State { - /** - * An interval that starts after {@code position}. - */ - Unhandled, - - /** - * An interval that {@linkplain TraceInterval#covers covers} {@code position} and has an - * assigned register. - */ - Active, - - /** - * An interval that starts before and ends after {@code position} but does not - * {@linkplain TraceInterval#covers cover} it due to a lifetime hole. - */ - Inactive, - - /** - * An interval that ends before {@code position} or is spilled to memory. - */ - Handled; - } - - /** - * Constants used in optimization of spilling of an interval. - */ - public enum SpillState { - /** - * Starting state of calculation: no definition found yet. - */ - NoDefinitionFound, - - /** - * One definition has already been found. Two consecutive definitions are treated as one - * (e.g. a consecutive move and add because of two-operand LIR form). The position of this - * definition is given by {@link TraceInterval#spillDefinitionPos()}. - */ - NoSpillStore, - - /** - * A spill move has already been inserted. - */ - SpillStore, - - /** - * The interval starts in memory (e.g. method parameter), so a store is never necessary. - */ - StartInMemory, - - /** - * The interval has more than one definition (e.g. resulting from phi moves), so stores to - * memory are not optimized. - */ - NoOptimization; - - public static final EnumSet IN_MEMORY = EnumSet.of(SpillStore, StartInMemory); - } - - /** - * The {@linkplain RegisterValue register} or {@linkplain Variable variable} for this interval - * prior to register allocation. - */ - public final Variable operand; - - /** - * The operand number for this interval's {@linkplain #operand operand}. - */ - public final int operandNumber; - - /** - * The {@linkplain RegisterValue register} or {@linkplain StackSlot spill slot} assigned to this - * interval. In case of a spilled interval which is re-materialized this is - * {@link Value#ILLEGAL}. - */ - private AllocatableValue location; - - /** - * The stack slot to which all splits of this interval are spilled if necessary. - */ - private AllocatableValue spillSlot; - - /** - * The start of the range, inclusive. - */ - private int intFrom; - - /** - * The end of the range, exclusive. - */ - private int intTo; - - /** - * List of (use-positions, register-priorities) pairs, sorted by use-positions. - */ - private int[] usePosListArray; - private int usePosListSize; - - /** - * Link to next interval in a sorted list of intervals that ends with {@link #EndMarker}. - */ - TraceInterval next; - - /** - * The interval from which this one is derived. If this is a {@linkplain #isSplitParent() split - * parent}, it points to itself. - */ - private TraceInterval splitParent; - - /** - * List of all intervals that are split off from this interval. This is only used if this is a - * {@linkplain #isSplitParent() split parent}. - */ - private ArrayList splitChildren = null; - - /** - * Current split child that has been active or inactive last (always stored in split parents). - */ - private TraceInterval currentSplitChild; - - /** - * Specifies if move is inserted between currentSplitChild and this interval when interval gets - * active the first time. - */ - private boolean insertMoveWhenActivated; - - /** - * For spill move optimization. - */ - private SpillState spillState; - - /** - * Position where this interval is defined (if defined only once). - */ - private int spillDefinitionPos; - - /** - * This interval should be assigned the same location as the hint interval. - */ - private IntervalHint locationHint; - - /** - * The value with which a spilled child interval can be re-materialized. Currently this must be - * a Constant. - */ - private JavaConstant materializedValue; - - /** - * Sentinel interval to denote the end of an interval list. - */ - static final TraceInterval EndMarker = new TraceInterval(new Variable(ValueKind.Illegal, Integer.MAX_VALUE), -1); - - TraceInterval(Variable operand) { - this(operand, operand.index); - } - - private TraceInterval(Variable operand, int operandNumber) { - assert operand != null; - this.operand = operand; - this.operandNumber = operandNumber; - if (isRegister(operand)) { - location = operand; - } else { - assert isIllegal(operand) || isVariable(operand); - } - this.intFrom = Integer.MAX_VALUE; - this.intTo = Integer.MAX_VALUE; - this.usePosListArray = new int[4 * 2]; - this.next = EndMarker; - this.spillState = SpillState.NoDefinitionFound; - this.spillDefinitionPos = -1; - splitParent = this; - currentSplitChild = this; - } - - private boolean splitChildrenEmpty() { - assert splitChildren == null || !splitChildren.isEmpty(); - return splitChildren == null; - } - - void assignLocation(AllocatableValue newLocation) { - if (isRegister(newLocation)) { - assert this.location == null : "cannot re-assign location for " + this; - if (newLocation.getValueKind().equals(LIRKind.Illegal) && !kind().equals(LIRKind.Illegal)) { - this.location = asRegister(newLocation).asValue(kind()); - return; - } - } else if (isIllegal(newLocation)) { - assert canMaterialize(); - } else { - assert this.location == null || isRegister(this.location) || (isVirtualStackSlot(this.location) && isStackSlot(newLocation)) : "cannot re-assign location for " + this; - assert isStackSlotValue(newLocation); - assert !newLocation.getValueKind().equals(LIRKind.Illegal); - assert newLocation.getValueKind().equals(this.kind()); - } - this.location = newLocation; - } - - /** - * Gets the {@linkplain RegisterValue register} or {@linkplain StackSlot spill slot} assigned to - * this interval. - */ - @Override - public AllocatableValue location() { - return location; - } - - private ValueKind kind() { - return operand.getValueKind(); - } - - public boolean isEmpty() { - return intFrom == Integer.MAX_VALUE && intTo == Integer.MAX_VALUE; - } - - public void setTo(int pos) { - assert intFrom == Integer.MAX_VALUE || intFrom < pos; - intTo = pos; - } - - public void setFrom(int pos) { - assert intTo == Integer.MAX_VALUE || pos < intTo; - intFrom = pos; - } - - @Override - public int from() { - return intFrom; - } - - int to() { - return intTo; - } - - public void setLocationHint(IntervalHint interval) { - locationHint = interval; - } - - public boolean hasHint() { - return locationHint != null; - } - - public boolean isSplitParent() { - return splitParent == this; - } - - boolean isSplitChild() { - return splitParent != this; - } - - /** - * Gets the split parent for this interval. - */ - public TraceInterval splitParent() { - assert splitParent.isSplitParent() : "not a split parent: " + this; - return splitParent; - } - - /** - * Gets the canonical spill slot for this interval. - */ - public AllocatableValue spillSlot() { - return splitParent().spillSlot; - } - - public void setSpillSlot(AllocatableValue slot) { - assert isStackSlotValue(slot); - assert spillSlot() == null || (isVirtualStackSlot(spillSlot()) && isStackSlot(slot)) : String.format("cannot overwrite existing spill slot %s of interval %s with %s", spillSlot(), this, slot); - splitParent().spillSlot = slot; - } - - TraceInterval currentSplitChild() { - return splitParent().currentSplitChild; - } - - void makeCurrentSplitChild() { - splitParent().currentSplitChild = this; - } - - boolean insertMoveWhenActivated() { - return insertMoveWhenActivated; - } - - void setInsertMoveWhenActivated(boolean b) { - insertMoveWhenActivated = b; - } - - // for spill optimization - public SpillState spillState() { - return splitParent().spillState; - } - - public int spillDefinitionPos() { - return splitParent().spillDefinitionPos; - } - - public void setSpillState(SpillState state) { - assert state.ordinal() >= spillState().ordinal() : "state cannot decrease"; - splitParent().spillState = state; - } - - public void setSpillDefinitionPos(int pos) { - assert spillState() == SpillState.NoDefinitionFound || spillState() == SpillState.NoSpillStore || spillDefinitionPos() == -1 : "cannot set the position twice"; - int to = to(); - assert pos < to : String.format("Cannot spill %s at %d", this, pos); - splitParent().spillDefinitionPos = pos; - } - - /** - * Returns true if this interval has a shadow copy on the stack that is correct after - * {@code opId}. - */ - public boolean inMemoryAt(int opId) { - SpillState spillSt = spillState(); - return spillSt == SpillState.StartInMemory || (spillSt == SpillState.SpillStore && opId > spillDefinitionPos() && !canMaterialize()); - } - - public boolean preSpilledAllocated() { - return spillState() == SpillState.StartInMemory && numUsePos() == 0 && !hasHint(); - } - - // test intersection - boolean intersects(TraceInterval i) { - return intersectsAt(i) != -1; - } - - int intersectsAt(TraceInterval i) { - TraceInterval i1; - TraceInterval i2; - if (i.from() < this.from()) { - i1 = i; - i2 = this; - } else { - i1 = this; - i2 = i; - } - assert i1.from() <= i2.from(); - - if (i1.to() <= i2.from()) { - return -1; - } - return i2.from(); - } - - /** - * Sets the value which is used for re-materialization. - */ - public void addMaterializationValue(JavaConstant value) { - if (materializedValue != null) { - throw GraalError.shouldNotReachHere(String.format("Multiple materialization values for %s?", this)); - } - materializedValue = value; - } - - /** - * Returns true if this interval can be re-materialized when spilled. This means that no - * spill-moves are needed. Instead of restore-moves the {@link #materializedValue} is restored. - */ - public boolean canMaterialize() { - return getMaterializedValue() != null; - } - - /** - * Returns a value which can be moved to a register instead of a restore-move from stack. - */ - public JavaConstant getMaterializedValue() { - return splitParent().materializedValue; - } - - // consistency check of split-children - boolean checkSplitChildren() { - if (!splitChildrenEmpty()) { - assert isSplitParent() : "only split parents can have children"; - - for (int i = 0; i < splitChildren.size(); i++) { - TraceInterval i1 = splitChildren.get(i); - - assert i1.splitParent() == this : "not a split child of this interval"; - assert i1.kind().equals(kind()) : "must be equal for all split children"; - assert (i1.spillSlot() == null && spillSlot == null) || i1.spillSlot().equals(spillSlot()) : "must be equal for all split children"; - - for (int j = i + 1; j < splitChildren.size(); j++) { - TraceInterval i2 = splitChildren.get(j); - - assert i1.operandNumber != i2.operandNumber : "same register number"; - - if (i1.from() < i2.from()) { - assert i1.to() <= i2.from() && i1.to() < i2.to() : "intervals overlapping"; - } else { - assert i2.from() < i1.from() : "intervals start at same opId"; - assert i2.to() <= i1.from() && i2.to() < i1.to() : "intervals overlapping"; - } - } - } - } - - return true; - } - - public IntervalHint locationHint(boolean searchSplitChild) { - if (!searchSplitChild) { - return locationHint; - } - - if (locationHint != null) { - assert !(locationHint instanceof TraceInterval) || ((TraceInterval) locationHint).isSplitParent() : "ony split parents are valid hint registers"; - - if (locationHint.location() != null && isRegister(locationHint.location())) { - return locationHint; - } else if (locationHint instanceof TraceInterval) { - TraceInterval hint = (TraceInterval) locationHint; - if (!hint.splitChildrenEmpty()) { - // search the first split child that has a register assigned - int len = hint.splitChildren.size(); - for (int i = 0; i < len; i++) { - TraceInterval interval = hint.splitChildren.get(i); - if (interval.location != null && isRegister(interval.location)) { - return interval; - } - } - } - } - } - - // no hint interval found that has a register assigned - return null; - } - - TraceInterval getSplitChildAtOpIdOrNull(int opId, LIRInstruction.OperandMode mode) { - /* - * TODO(je) could be replace by a simple range check by caching `to` in the split parent - * when creating split children. - */ - return getSplitChildAtOpIdIntern(opId, mode, true); - } - - TraceInterval getSplitChildAtOpId(int opId, LIRInstruction.OperandMode mode) { - return getSplitChildAtOpIdIntern(opId, mode, false); - } - - private TraceInterval getSplitChildAtOpIdIntern(int opId, LIRInstruction.OperandMode mode, boolean returnNull) { - assert isSplitParent() : "can only be called for split parents"; - assert opId >= 0 : "invalid opId (method cannot be called for spill moves)"; - - if (splitChildrenEmpty()) { - if (returnNull) { - return covers(opId, mode) ? this : null; - } - assert this.covers(opId, mode) : this + " does not cover " + opId; - return this; - } else { - TraceInterval result = null; - int len = splitChildren.size(); - - // in outputMode, the end of the interval (opId == cur.to()) is not valid - int toOffset = (mode == LIRInstruction.OperandMode.DEF ? 0 : 1); - - int i; - for (i = 0; i < len; i++) { - TraceInterval cur = splitChildren.get(i); - if (cur.from() <= opId && opId < cur.to() + toOffset) { - if (i > 0) { - // exchange current split child to start of list (faster access for next - // call) - Util.atPutGrow(splitChildren, i, splitChildren.get(0), null); - Util.atPutGrow(splitChildren, 0, cur, null); - } - - // interval found - result = cur; - break; - } - } - - assert returnNull || checkSplitChild(result, opId, toOffset, mode); - return result; - } - } - - private boolean checkSplitChild(TraceInterval result, int opId, int toOffset, LIRInstruction.OperandMode mode) { - if (result == null) { - // this is an error - StringBuilder msg = new StringBuilder(this.toString()).append(" has no child at ").append(opId); - if (!splitChildrenEmpty()) { - TraceInterval firstChild = splitChildren.get(0); - TraceInterval lastChild = splitChildren.get(splitChildren.size() - 1); - msg.append(" (first = ").append(firstChild).append(", last = ").append(lastChild).append(")"); - } - throw new GraalError("Linear Scan Error: %s", msg); - } - - if (!splitChildrenEmpty()) { - for (TraceInterval interval : splitChildren) { - if (interval != result && interval.from() <= opId && opId < interval.to() + toOffset) { - /* - * Should not happen: Try another compilation as it is very unlikely to happen - * again. - */ - throw new GraalError("two valid result intervals found for opId %d: %d and %d\n%s\n", opId, result.operandNumber, interval.operandNumber, - result.logString(), interval.logString()); - } - } - } - assert result.covers(opId, mode) : "opId not covered by interval"; - return true; - } - - // returns the last split child that ends before the given opId - TraceInterval getSplitChildBeforeOpId(int opId) { - assert opId >= 0 : "invalid opId"; - - TraceInterval parent = splitParent(); - TraceInterval result = null; - - assert !parent.splitChildrenEmpty() : "no split children available"; - int len = parent.splitChildren.size(); - - for (int i = len - 1; i >= 0; i--) { - TraceInterval cur = parent.splitChildren.get(i); - if (cur.to() <= opId && (result == null || result.to() < cur.to())) { - result = cur; - } - } - - assert result != null : "no split child found"; - return result; - } - - private RegisterPriority adaptPriority(RegisterPriority priority) { - /* - * In case of re-materialized values we require that use-operands are registers, because we - * don't have the value in a stack location. (Note that ShouldHaveRegister means that the - * operand can also be a StackSlot). - */ - if (priority == RegisterPriority.ShouldHaveRegister && canMaterialize()) { - return RegisterPriority.MustHaveRegister; - } - return priority; - } - - // Note: use positions are sorted descending . first use has highest index - int firstUsage(RegisterPriority minRegisterPriority) { - for (int i = numUsePos() - 1; i >= 0; --i) { - RegisterPriority registerPriority = adaptPriority(getUsePosRegisterPriority(i)); - if (registerPriority.greaterEqual(minRegisterPriority)) { - return getUsePos(i); - } - } - return Integer.MAX_VALUE; - } - - int nextUsage(RegisterPriority minRegisterPriority, int from) { - for (int i = numUsePos() - 1; i >= 0; --i) { - int usePos = getUsePos(i); - if (usePos >= from && adaptPriority(getUsePosRegisterPriority(i)).greaterEqual(minRegisterPriority)) { - return usePos; - } - } - return Integer.MAX_VALUE; - } - - int nextUsageExact(RegisterPriority exactRegisterPriority, int from) { - - for (int i = numUsePos() - 1; i >= 0; --i) { - int usePos = getUsePos(i); - if (usePos >= from && adaptPriority(getUsePosRegisterPriority(i)) == exactRegisterPriority) { - return usePos; - } - } - return Integer.MAX_VALUE; - } - - int previousUsage(RegisterPriority minRegisterPriority, int from) { - int prev = -1; - for (int i = numUsePos() - 1; i >= 0; --i) { - int usePos = getUsePos(i); - if (usePos > from) { - return prev; - } - if (adaptPriority(getUsePosRegisterPriority(i)).greaterEqual(minRegisterPriority)) { - prev = usePos; - } - } - return prev; - } - - public void addUsePos(int pos, RegisterPriority registerPriority, OptionValues options) { - assert isEmpty() || covers(pos, LIRInstruction.OperandMode.USE) : String.format("use position %d not covered by live range of interval %s", pos, this); - - // do not add use positions for precolored intervals because they are never used - if (registerPriority != RegisterPriority.None) { - if (Assertions.detailedAssertionsEnabled(options)) { - for (int i = 0; i < numUsePos(); i++) { - assert pos <= getUsePos(i) : "already added a use-position with lower position"; - if (i > 0) { - assert getUsePos(i) < getUsePos(i - 1) : "not sorted descending"; - } - } - } - - // Note: addUse is called in descending order, so list gets sorted - // automatically by just appending new use positions - int len = numUsePos(); - if (len == 0 || getUsePos(len - 1) > pos) { - usePosAdd(pos, registerPriority); - } else if (getUsePosRegisterPriority(len - 1).lessThan(registerPriority)) { - assert getUsePos(len - 1) == pos : "list not sorted correctly"; - setUsePosRegisterPriority(len - 1, registerPriority); - } - } - } - - public void addRange(int from, int to) { - assert from < to : "invalid range"; - - if (from < intFrom) { - setFrom(from); - } - if (intTo == Integer.MAX_VALUE || intTo < to) { - setTo(to); - } - } - - TraceInterval newSplitChild(TraceLinearScan allocator) { - // allocate new interval - TraceInterval parent = splitParent(); - TraceInterval result = allocator.createDerivedInterval(parent); - - result.splitParent = parent; - result.setLocationHint(parent); - - // insert new interval in children-list of parent - if (parent.splitChildrenEmpty()) { - assert isSplitParent() : "list must be initialized at first split"; - - // Create new non-shared list - parent.splitChildren = new ArrayList<>(4); - parent.splitChildren.add(this); - } - parent.splitChildren.add(result); - - return result; - } - - /** - * Splits this interval at a specified position and returns the remainder as a new child - * interval of this interval's {@linkplain #splitParent() parent} interval. - *

    - * When an interval is split, a bi-directional link is established between the original - * parent interval and the children intervals that are split off this interval. - * When a split child is split again, the new created interval is a direct child of the original - * parent. That is, there is no tree of split children stored, just a flat list. All split - * children are spilled to the same {@linkplain #spillSlot spill slot}. - * - * @param splitPos the position at which to split this interval - * @param allocator the register allocator context - * @return the child interval split off from this interval - */ - TraceInterval split(int splitPos, TraceLinearScan allocator) { - - // allocate new interval - TraceInterval result = newSplitChild(allocator); - - // split the ranges - result.setTo(intTo); - result.setFrom(splitPos); - intTo = splitPos; - - // split list of use positions - splitUsePosAt(result, splitPos); - - if (Assertions.detailedAssertionsEnabled(allocator.getOptions())) { - for (int i = 0; i < numUsePos(); i++) { - assert getUsePos(i) < splitPos; - } - for (int i = 0; i < result.numUsePos(); i++) { - assert result.getUsePos(i) >= splitPos; - } - } - return result; - } - - // returns true if the opId is inside the interval - boolean covers(int opId, LIRInstruction.OperandMode mode) { - if (mode == LIRInstruction.OperandMode.DEF) { - return from() <= opId && opId < to(); - } - return from() <= opId && opId <= to(); - } - - @Override - public String toString() { - String from = "?"; - String to = "?"; - if (!isEmpty()) { - from = String.valueOf(from()); - to = String.valueOf(to()); - } - String locationString = this.location == null ? "" : "@" + this.location; - return operandNumber + ":" + operand + (isRegister(operand) ? "" : locationString) + "[" + from + "," + to + "]"; - } - - /** - * Gets a single line string for logging the details of this interval to a log stream. - */ - @Override - public String logString() { - StringBuilder buf = new StringBuilder(100); - buf.append("any ").append(operandNumber).append(':').append(operand).append(' '); - if (!isRegister(operand)) { - if (location != null) { - buf.append("location{").append(location).append("} "); - } - } - - buf.append("hints{").append(splitParent.operandNumber); - IntervalHint hint = locationHint(false); - if (hint != null) { - buf.append(", ").append(hint.location()); - } - buf.append("} ranges{"); - - // print range - buf.append("[" + from() + ", " + to() + "]"); - buf.append("} uses{"); - - // print use positions - int prev = -1; - for (int i = numUsePos() - 1; i >= 0; --i) { - assert prev < getUsePos(i) : "use positions not sorted"; - if (i != numUsePos() - 1) { - buf.append(", "); - } - buf.append(getUsePos(i)).append(':').append(getUsePosRegisterPriority(i).shortName()); - prev = getUsePos(i); - } - buf.append("} spill-state{").append(spillState()).append("}"); - if (canMaterialize()) { - buf.append(" (remat:").append(getMaterializedValue().toString()).append(")"); - } - return buf.toString(); - } - - List getSplitChildren() { - return Collections.unmodifiableList(splitChildren); - } - - /* - * UsePos - * - * List of use positions. Each entry in the list records the use position and register priority - * associated with the use position. The entries in the list are in descending order of use - * position. - * - */ - - /** - * Gets the use position at a specified index in this list. - * - * @param index the index of the entry for which the use position is returned - * @return the use position of entry {@code index} in this list - */ - int getUsePos(int index) { - return intListGet(index << 1); - } - - int numUsePos() { - return usePosListSize >> 1; - } - - /** - * Gets the register priority for the use position at a specified index in this list. - * - * @param index the index of the entry for which the register priority is returned - * @return the register priority of entry {@code index} in this list - */ - RegisterPriority getUsePosRegisterPriority(int index) { - return RegisterPriority.VALUES[intListGet((index << 1) + 1)]; - } - - void removeFirstUsePos() { - intListSetSize(usePosListSize - 2); - } - - // internal - - private void setUsePosRegisterPriority(int pos, RegisterPriority registerPriority) { - int index = (pos << 1) + 1; - int value = registerPriority.ordinal(); - intListSet(index, value); - } - - private void usePosAdd(int pos, RegisterPriority registerPriority) { - assert usePosListSize == 0 || getUsePos(numUsePos() - 1) > pos; - intListAdd(pos); - intListAdd(registerPriority.ordinal()); - } - - private void splitUsePosAt(TraceInterval result, int splitPos) { - int i = numUsePos() - 1; - int len = 0; - while (i >= 0 && getUsePos(i) < splitPos) { - --i; - len += 2; - } - int listSplitIndex = (i + 1) * 2; - int[] array = new int[len]; - System.arraycopy(usePosListArray, listSplitIndex, array, 0, len); - if (listSplitIndex < usePosListSize) { - usePosListSize = listSplitIndex; - } else { - assert listSplitIndex == usePosListSize : "splitting cannot grow the use position array!"; - } - result.usePosListArray = usePosListArray; - result.usePosListSize = usePosListSize; - usePosListArray = array; - usePosListSize = len; - } - - // IntList - - private int intListGet(int index) { - if (index >= usePosListSize) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + usePosListSize); - } - return usePosListArray[index]; - } - - private void intListSet(int index, int value) { - if (index >= usePosListSize) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + usePosListSize); - } - usePosListArray[index] = value; - } - - private void intListAdd(int pos) { - if (usePosListSize == usePosListArray.length) { - int newSize = (usePosListSize * 3) / 2 + 1; - usePosListArray = Arrays.copyOf(usePosListArray, newSize); - } - usePosListArray[usePosListSize++] = pos; - } - - private void intListSetSize(int newSize) { - if (newSize < usePosListSize) { - usePosListSize = newSize; - } else if (newSize > usePosListSize) { - usePosListArray = Arrays.copyOf(usePosListArray, newSize); - } - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanAllocationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanAllocationPhase.java deleted file mode 100644 index 5d4f5b50060..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanAllocationPhase.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.lir.phases.LIRPhase; - -import jdk.vm.ci.code.TargetDescription; - -abstract class TraceLinearScanAllocationPhase { - - final CharSequence getName() { - return LIRPhase.createName(getClass()); - } - - @Override - public final String toString() { - return getName().toString(); - } - - final void apply(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, - TraceBuilderResult traceBuilderResult, TraceLinearScan allocator) { - apply(target, lirGenRes, trace, spillMoveFactory, registerAllocationConfig, traceBuilderResult, allocator, true); - } - - final void apply(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, - TraceBuilderResult traceBuilderResult, TraceLinearScan allocator, boolean dumpLIR) { - run(target, lirGenRes, trace, spillMoveFactory, registerAllocationConfig, traceBuilderResult, allocator); - if (dumpLIR) { - DebugContext debug = lirGenRes.getLIR().getDebug(); - if (debug.isDumpEnabled(DebugContext.DETAILED_LEVEL)) { - debug.dump(DebugContext.DETAILED_LEVEL, trace, "After %s (Trace%s)", getName(), trace.getId()); - } - } - } - - abstract void run(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, - TraceBuilderResult traceBuilderResult, TraceLinearScan allocator); - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanAssignLocationsPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanAssignLocationsPhase.java deleted file mode 100644 index 7017d768709..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanAssignLocationsPhase.java +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import static jdk.vm.ci.code.ValueUtil.isIllegal; -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static org.graalvm.compiler.lir.LIRValueUtil.asVariable; -import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isVariable; -import static org.graalvm.compiler.lir.LIRValueUtil.isVirtualStackSlot; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.EnumSet; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.ConstantValue; -import org.graalvm.compiler.lir.InstructionValueProcedure; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.LIRInstruction.OperandFlag; -import org.graalvm.compiler.lir.LIRInstruction.OperandMode; -import org.graalvm.compiler.lir.StandardOp; -import org.graalvm.compiler.lir.StandardOp.LabelOp; -import org.graalvm.compiler.lir.StandardOp.MoveOp; -import org.graalvm.compiler.lir.StandardOp.ValueMoveOp; -import org.graalvm.compiler.lir.Variable; -import org.graalvm.compiler.lir.alloc.trace.GlobalLivenessInfo; -import org.graalvm.compiler.lir.alloc.trace.ShadowedRegisterValue; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; - -import jdk.vm.ci.code.RegisterValue; -import jdk.vm.ci.code.StackSlot; -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.meta.AllocatableValue; -import jdk.vm.ci.meta.Value; - -/** - * Specialization of {@link org.graalvm.compiler.lir.alloc.lsra.LinearScanAssignLocationsPhase} that - * inserts {@link ShadowedRegisterValue}s to describe {@link RegisterValue}s that are also available - * on the {@link StackSlot stack}. - */ -final class TraceLinearScanAssignLocationsPhase extends TraceLinearScanAllocationPhase { - - @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, - TraceBuilderResult traceBuilderResult, TraceLinearScan allocator) { - new Assigner(allocator, spillMoveFactory).assign(); - } - - private static final class Assigner { - private final TraceLinearScan allocator; - private final MoveFactory spillMoveFactory; - - private Assigner(TraceLinearScan allocator, MoveFactory spillMoveFactory) { - this.allocator = allocator; - this.spillMoveFactory = spillMoveFactory; - } - - /** - * Assigns the allocated location for an LIR instruction operand back into the instruction. - * - * @param op current {@link LIRInstruction} - * @param operand an LIR instruction operand - * @param mode the usage mode for {@code operand} by the instruction - * @return the location assigned for the operand - */ - private Value colorLirOperand(LIRInstruction op, Variable operand, OperandMode mode) { - int opId = op.id(); - TraceInterval interval = allocator.intervalFor(operand); - assert interval != null : "interval must exist"; - - if (opId != -1) { - /* - * Operands are not changed when an interval is split during allocation, so search - * the right interval here. - */ - interval = allocator.splitChildAtOpId(interval, opId, mode); - } - - return getLocation(op, interval, mode); - } - - private Value getLocation(LIRInstruction op, TraceInterval interval, OperandMode mode) { - if (isIllegal(interval.location()) && interval.canMaterialize()) { - if (op instanceof LabelOp) { - /* - * Spilled materialized value in a LabelOp (i.e. incoming): no need for move - * resolution so we can ignore it. - */ - return Value.ILLEGAL; - } - assert mode != OperandMode.DEF; - return new ConstantValue(allocator.getKind(interval), interval.getMaterializedValue()); - } - return interval.location(); - } - - /** - * @param op - * @param operand - * @param valueMode - * @param flags - * @see InstructionValueProcedure#doValue(LIRInstruction, Value, OperandMode, EnumSet) - */ - private Value debugInfoProcedure(LIRInstruction op, Value operand, OperandMode valueMode, EnumSet flags) { - if (isVirtualStackSlot(operand)) { - return operand; - } - int tempOpId = op.id(); - OperandMode mode = OperandMode.USE; - AbstractBlockBase block = allocator.blockForId(tempOpId); - if (block.getSuccessorCount() == 1 && tempOpId == allocator.getLastLirInstructionId(block)) { - /* - * Generating debug information for the last instruction of a block. If this - * instruction is a branch, spill moves are inserted before this branch and so the - * wrong operand would be returned (spill moves at block boundaries are not - * considered in the live ranges of intervals). - * - * Solution: use the first opId of the branch target block instead. - */ - final LIRInstruction instr = allocator.getLIR().getLIRforBlock(block).get(allocator.getLIR().getLIRforBlock(block).size() - 1); - if (instr instanceof StandardOp.JumpOp) { - throw GraalError.unimplemented("DebugInfo on jumps are not supported!"); - } - } - - /* - * Get current location of operand. The operand must be live because debug information - * is considered when building the intervals if the interval is not live, - * colorLirOperand will cause an assert on failure. - */ - Value result = colorLirOperand(op, (Variable) operand, mode); - assert !allocator.hasCall(tempOpId) || isStackSlotValue(result) || isConstantValue(result) || !allocator.isCallerSave(result) : "cannot have caller-save register operands at calls"; - return result; - } - - @SuppressWarnings("try") - private void assignBlock(AbstractBlockBase block) { - DebugContext debug = allocator.getDebug(); - try (Indent indent2 = debug.logAndIndent("assign locations in block B%d", block.getId())) { - ArrayList instructions = allocator.getLIR().getLIRforBlock(block); - handleBlockBegin(block, instructions); - int numInst = instructions.size(); - boolean hasDead = false; - - for (int j = 0; j < numInst; j++) { - final LIRInstruction op = instructions.get(j); - if (op == null) { - /* - * this can happen when spill-moves are removed in eliminateSpillMoves - */ - hasDead = true; - } else if (assignLocations(op, instructions, j)) { - hasDead = true; - } - } - handleBlockEnd(block, instructions); - - if (hasDead) { - // Remove null values from the list. - instructions.removeAll(Collections.singleton(null)); - } - } - } - - private void handleBlockBegin(AbstractBlockBase block, ArrayList instructions) { - if (allocator.hasInterTracePredecessor(block)) { - /* Only materialize the locations array if there is an incoming inter-trace edge. */ - assert instructions.equals(allocator.getLIR().getLIRforBlock(block)); - GlobalLivenessInfo li = allocator.getGlobalLivenessInfo(); - LIRInstruction instruction = instructions.get(0); - OperandMode mode = OperandMode.DEF; - int[] live = li.getBlockIn(block); - Value[] values = calculateBlockBoundaryValues(instruction, live, mode); - li.setInLocations(block, values); - } - } - - private void handleBlockEnd(AbstractBlockBase block, ArrayList instructions) { - if (allocator.hasInterTraceSuccessor(block)) { - /* Only materialize the locations array if there is an outgoing inter-trace edge. */ - assert instructions.equals(allocator.getLIR().getLIRforBlock(block)); - GlobalLivenessInfo li = allocator.getGlobalLivenessInfo(); - LIRInstruction instruction = instructions.get(instructions.size() - 1); - OperandMode mode = OperandMode.USE; - int[] live = li.getBlockOut(block); - Value[] values = calculateBlockBoundaryValues(instruction, live, mode); - li.setOutLocations(block, values); - } - } - - private Value[] calculateBlockBoundaryValues(LIRInstruction instruction, int[] live, OperandMode mode) { - Value[] values = new Value[live.length]; - for (int i = 0; i < live.length; i++) { - TraceInterval interval = allocator.intervalFor(live[i]); - Value val = valueAtBlockBoundary(instruction, interval, mode); - values[i] = val; - } - return values; - } - - private Value valueAtBlockBoundary(LIRInstruction instruction, TraceInterval interval, OperandMode mode) { - if (mode == OperandMode.DEF && interval == null) { - // not needed in this trace - return Value.ILLEGAL; - } - assert interval != null : "interval must exist"; - TraceInterval splitInterval = interval.getSplitChildAtOpIdOrNull(instruction.id(), mode); - if (splitInterval == null) { - assert mode == OperandMode.DEF : String.format("Not split child at %d for interval %s", instruction.id(), interval); - // not needed in this branch - return Value.ILLEGAL; - } - - if (splitInterval.inMemoryAt(instruction.id()) && isRegister(splitInterval.location())) { - return new ShadowedRegisterValue((RegisterValue) splitInterval.location(), splitInterval.spillSlot()); - } - return getLocation(instruction, splitInterval, mode); - } - - private final InstructionValueProcedure assignProc = new InstructionValueProcedure() { - @Override - public Value doValue(LIRInstruction instruction, Value value, OperandMode mode, EnumSet flags) { - if (isVariable(value)) { - return colorLirOperand(instruction, (Variable) value, mode); - } - return value; - } - }; - private final InstructionValueProcedure debugInfoValueProc = new InstructionValueProcedure() { - @Override - public Value doValue(LIRInstruction instruction, Value value, OperandMode mode, EnumSet flags) { - return debugInfoProcedure(instruction, value, mode, flags); - } - }; - - /** - * Assigns the operand of an {@link LIRInstruction}. - * - * @param op The {@link LIRInstruction} that should be colored. - * @param j The index of {@code op} in the {@code instructions} list. - * @param instructions The instructions of the current block. - * @return {@code true} if the instruction was deleted. - */ - private boolean assignLocations(LIRInstruction op, ArrayList instructions, int j) { - assert op != null && instructions.get(j) == op; - - // remove useless moves - if (MoveOp.isMoveOp(op)) { - AllocatableValue result = MoveOp.asMoveOp(op).getResult(); - if (isVariable(result) && allocator.isMaterialized(asVariable(result), op.id(), OperandMode.DEF)) { - /* - * This happens if a materializable interval is originally not spilled but then - * kicked out in LinearScanWalker.splitForSpilling(). When kicking out such an - * interval this move operation was already generated. - */ - instructions.set(j, null); - return true; - } - } - - op.forEachInput(assignProc); - op.forEachAlive(assignProc); - op.forEachTemp(assignProc); - op.forEachOutput(assignProc); - - // compute reference map and debug information - op.forEachState(debugInfoValueProc); - - // remove useless moves - if (ValueMoveOp.isValueMoveOp(op)) { - ValueMoveOp move = ValueMoveOp.asValueMoveOp(op); - if (move.getInput().equals(move.getResult())) { - instructions.set(j, null); - return true; - } - if (isStackSlotValue(move.getInput()) && isStackSlotValue(move.getResult())) { - // rewrite stack to stack moves - instructions.set(j, spillMoveFactory.createStackMove(move.getResult(), move.getInput())); - } - } - return false; - } - - @SuppressWarnings("try") - private void assign() { - try (Indent indent = allocator.getDebug().logAndIndent("assign locations")) { - for (AbstractBlockBase block : allocator.sortedBlocks()) { - assignBlock(block); - } - } - } - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanEliminateSpillMovePhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanEliminateSpillMovePhase.java deleted file mode 100644 index 6cf6b29906c..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanEliminateSpillMovePhase.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static org.graalvm.compiler.lir.LIRValueUtil.asVariable; -import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isVariable; - -import java.util.ArrayList; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.debug.Assertions; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.LIRInsertionBuffer; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.LIRInstruction.OperandMode; -import org.graalvm.compiler.lir.StandardOp.LoadConstantOp; -import org.graalvm.compiler.lir.StandardOp.MoveOp; -import org.graalvm.compiler.lir.StandardOp.ValueMoveOp; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceInterval.SpillState; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.IntervalPredicate; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; - -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.meta.AllocatableValue; - -final class TraceLinearScanEliminateSpillMovePhase extends TraceLinearScanAllocationPhase { - - private static final IntervalPredicate spilledIntervals = new TraceLinearScanPhase.IntervalPredicate() { - - @Override - public boolean apply(TraceInterval i) { - return i.isSplitParent() && SpillState.IN_MEMORY.contains(i.spillState()); - } - }; - - @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, - TraceBuilderResult traceBuilderResult, TraceLinearScan allocator) { - boolean shouldEliminateSpillMoves = shouldEliminateSpillMoves(traceBuilderResult, allocator); - eliminateSpillMoves(allocator, shouldEliminateSpillMoves, traceBuilderResult, lirGenRes); - } - - private static boolean shouldEliminateSpillMoves(TraceBuilderResult traceBuilderResult, TraceLinearScan allocator) { - return !traceBuilderResult.incomingSideEdges(traceBuilderResult.getTraceForBlock(allocator.blockAt(0))); - } - - // called once before assignment of register numbers - @SuppressWarnings("try") - private static void eliminateSpillMoves(TraceLinearScan allocator, boolean shouldEliminateSpillMoves, TraceBuilderResult traceBuilderResult, LIRGenerationResult res) { - DebugContext debug = allocator.getDebug(); - try (Indent indent = debug.logAndIndent("Eliminating unnecessary spill moves: Trace%d", traceBuilderResult.getTraceForBlock(allocator.blockAt(0)).getId())) { - allocator.sortIntervalsBySpillPos(); - - /* - * collect all intervals that must be stored after their definition. The list is sorted - * by Interval.spillDefinitionPos. - */ - TraceInterval interval = allocator.createUnhandledListBySpillPos(spilledIntervals); - if (Assertions.detailedAssertionsEnabled(allocator.getOptions())) { - checkIntervals(debug, interval); - } - if (debug.isLogEnabled()) { - try (Indent indent2 = debug.logAndIndent("Sorted intervals")) { - for (TraceInterval i = interval; i != null; i = i.next) { - debug.log("%5d: %s", i.spillDefinitionPos(), i); - } - } - } - - LIRInsertionBuffer insertionBuffer = new LIRInsertionBuffer(); - for (AbstractBlockBase block : allocator.sortedBlocks()) { - try (Indent indent1 = debug.logAndIndent("Handle %s", block)) { - ArrayList instructions = allocator.getLIR().getLIRforBlock(block); - int numInst = instructions.size(); - - int lastOpId = -1; - // iterate all instructions of the block. - for (int j = 0; j < numInst; j++) { - LIRInstruction op = instructions.get(j); - int opId = op.id(); - try (Indent indent2 = debug.logAndIndent("%5d %s", opId, op)) { - - if (opId == -1) { - MoveOp move = MoveOp.asMoveOp(op); - /* - * Remove move from register to stack if the stack slot is - * guaranteed to be correct. Only moves that have been inserted by - * LinearScan can be removed. - */ - if (shouldEliminateSpillMoves && canEliminateSpillMove(allocator, block, move, lastOpId)) { - /* - * Move target is a stack slot that is always correct, so - * eliminate instruction. - */ - if (debug.isLogEnabled()) { - if (ValueMoveOp.isValueMoveOp(op)) { - ValueMoveOp vmove = ValueMoveOp.asValueMoveOp(op); - debug.log("eliminating move from interval %s to %s in block %s", vmove.getInput(), vmove.getResult(), block); - } else { - LoadConstantOp load = LoadConstantOp.asLoadConstantOp(op); - debug.log("eliminating constant load from %s to %s in block %s", load.getConstant(), load.getResult(), - block); - } - } - - // null-instructions are deleted by assignRegNum - instructions.set(j, null); - } - - } else { - lastOpId = opId; - /* - * Insert move from register to stack just after the beginning of - * the interval. - */ - // assert interval == TraceInterval.EndMarker || - // interval.spillDefinitionPos() >= opId : "invalid order"; - assert interval == TraceInterval.EndMarker || (interval.isSplitParent() && SpillState.IN_MEMORY.contains(interval.spillState())) : "invalid interval"; - - while (interval != TraceInterval.EndMarker && interval.spillDefinitionPos() == opId) { - debug.log("handle %s", interval); - if (!interval.canMaterialize() && interval.spillState() != SpillState.StartInMemory) { - - AllocatableValue fromLocation = interval.getSplitChildAtOpId(opId, OperandMode.DEF).location(); - AllocatableValue toLocation = allocator.canonicalSpillOpr(interval); - if (!fromLocation.equals(toLocation)) { - - if (!insertionBuffer.initialized()) { - /* - * prepare insertion buffer (appended when all - * instructions in the block are processed) - */ - insertionBuffer.init(instructions); - } - - assert isRegister(fromLocation) : "from operand must be a register but is: " + fromLocation + " toLocation=" + toLocation + " spillState=" + - interval.spillState(); - assert isStackSlotValue(toLocation) : "to operand must be a stack slot"; - - LIRInstruction move = allocator.getSpillMoveFactory().createMove(toLocation, fromLocation); - insertionBuffer.append(j + 1, move); - move.setComment(res, "TraceLSRAEliminateSpillMove: spill def pos"); - - if (debug.isLogEnabled()) { - debug.log("inserting move after definition of interval %d to stack slot %s at opId %d", interval.operandNumber, interval.spillSlot(), opId); - } - } - } - interval = interval.next; - } - } - } - } // end of instruction iteration - - if (insertionBuffer.initialized()) { - insertionBuffer.finish(); - } - } - } // end of block iteration - - assert interval == TraceInterval.EndMarker : "missed an interval"; - } - } - - /** - * @param allocator - * @param block The block {@code move} is located in. - * @param move Spill move. - * @param lastOpId The id of last "normal" instruction before the spill move. (Spill moves have - * no valid opId but -1.) - */ - private static boolean canEliminateSpillMove(TraceLinearScan allocator, AbstractBlockBase block, MoveOp move, int lastOpId) { - assert ((LIRInstruction) move).id() == -1 : "Not a spill move: " + move; - assert isVariable(move.getResult()) : "LinearScan inserts only moves to variables: " + move; - assert lastOpId >= 0 : "Invalid lastOpId: " + lastOpId; - - TraceInterval curInterval = allocator.intervalFor(asVariable(move.getResult())); - - if (!isRegister(curInterval.location()) && curInterval.inMemoryAt(lastOpId) && !isPhiResolutionMove(allocator, move)) { - /* Phi resolution moves cannot be removed because they define the value. */ - // TODO (je) check if the comment is still valid! - assert isStackSlotValue(curInterval.location()) : "Not a stack slot: " + curInterval.location(); - return true; - } - return false; - } - - /** - * Checks if a (spill or split) move is a Phi resolution move. - * - * A spill or split move connects a split parent or a split child with another split child. - * Therefore the destination of the move is always a split child. Phi resolution moves look like - * spill moves (i.e. {@link LIRInstruction#id() id} is {@code 0}, but they define a new - * variable. As a result the destination interval is a split parent. - */ - private static boolean isPhiResolutionMove(TraceLinearScan allocator, MoveOp move) { - assert ((LIRInstruction) move).id() == -1 : "Not a spill move: " + move; - TraceInterval curInterval = allocator.intervalFor(asVariable(move.getResult())); - return curInterval.isSplitParent(); - } - - private static void checkIntervals(DebugContext debug, TraceInterval interval) { - TraceInterval prev = null; - TraceInterval temp = interval; - while (temp != TraceInterval.EndMarker) { - assert temp.spillDefinitionPos() >= 0 : "invalid spill definition pos " + temp; - if (prev != null) { - // assert temp.from() >= prev.from() : "intervals not sorted"; - assert temp.spillDefinitionPos() >= prev.spillDefinitionPos() : "when intervals are sorted by from : then they must also be sorted by spillDefinitionPos"; - } - - assert temp.spillSlot() != null || temp.canMaterialize() : "interval has no spill slot assigned"; - assert temp.spillDefinitionPos() >= temp.from() : "invalid order"; - // assert temp.spillDefinitionPos() <= temp.from() + 2 : - // "only intervals defined once at their start-pos can be optimized"; - - if (debug.isLogEnabled()) { - debug.log("interval %d (from %d to %d) must be stored at %d", temp.operandNumber, temp.from(), temp.to(), temp.spillDefinitionPos()); - } - - prev = temp; - temp = temp.next; - } - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanLifetimeAnalysisPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanLifetimeAnalysisPhase.java deleted file mode 100644 index 80bb27ebb65..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanLifetimeAnalysisPhase.java +++ /dev/null @@ -1,754 +0,0 @@ -/* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import static jdk.vm.ci.code.ValueUtil.asRegisterValue; -import static jdk.vm.ci.code.ValueUtil.asStackSlot; -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static jdk.vm.ci.code.ValueUtil.isStackSlot; -import static org.graalvm.compiler.lir.LIRValueUtil.asVariable; -import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isVariable; -import static org.graalvm.compiler.lir.alloc.trace.TraceRegisterAllocationPhase.Options.TraceRAshareSpillInformation; -import static org.graalvm.compiler.lir.alloc.trace.TraceRegisterAllocationPhase.Options.TraceRAuseInterTraceHints; -import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.asShadowedRegisterValue; -import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.isShadowedRegisterValue; -import static org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.isVariableOrRegister; - -import java.util.ArrayList; -import java.util.EnumSet; - -import org.graalvm.compiler.core.common.LIRKind; -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.InstructionValueConsumer; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.LIRInstruction.OperandFlag; -import org.graalvm.compiler.lir.LIRInstruction.OperandMode; -import org.graalvm.compiler.lir.LIRValueUtil; -import org.graalvm.compiler.lir.StandardOp.JumpOp; -import org.graalvm.compiler.lir.StandardOp.LabelOp; -import org.graalvm.compiler.lir.StandardOp.LoadConstantOp; -import org.graalvm.compiler.lir.StandardOp.ValueMoveOp; -import org.graalvm.compiler.lir.ValueProcedure; -import org.graalvm.compiler.lir.Variable; -import org.graalvm.compiler.lir.alloc.trace.GlobalLivenessInfo; -import org.graalvm.compiler.lir.alloc.trace.ShadowedRegisterValue; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceInterval.RegisterPriority; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceInterval.SpillState; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.lir.ssa.SSAUtil; - -import jdk.vm.ci.code.Register; -import jdk.vm.ci.code.RegisterArray; -import jdk.vm.ci.code.RegisterValue; -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.meta.AllocatableValue; -import jdk.vm.ci.meta.JavaConstant; -import jdk.vm.ci.meta.Value; - -public final class TraceLinearScanLifetimeAnalysisPhase extends TraceLinearScanAllocationPhase { - - @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, - TraceBuilderResult traceBuilderResult, TraceLinearScan allocator) { - new Analyser(allocator, traceBuilderResult).analyze(); - } - - public static final class Analyser { - private final TraceLinearScan allocator; - private final DebugContext debug; - private final TraceBuilderResult traceBuilderResult; - private int numInstructions; - - public Analyser(TraceLinearScan allocator, TraceBuilderResult traceBuilderResult) { - this.allocator = allocator; - this.debug = allocator.getDebug(); - this.traceBuilderResult = traceBuilderResult; - } - - private AbstractBlockBase[] sortedBlocks() { - return allocator.sortedBlocks(); - } - - private LIR getLIR() { - return allocator.getLIR(); - } - - private RegisterArray getCallerSavedRegisters() { - return allocator.getRegisterAllocationConfig().getRegisterConfig().getCallerSaveRegisters(); - } - - public void analyze() { - countInstructions(); - buildIntervals(); - } - - /** - * Count instructions in all blocks. The numbering follows the - * {@linkplain TraceLinearScan#sortedBlocks() register allocation order}. - */ - private void countInstructions() { - - allocator.initIntervals(); - - int numberInstructions = 0; - for (AbstractBlockBase block : sortedBlocks()) { - numberInstructions += getLIR().getLIRforBlock(block).size(); - } - numInstructions = numberInstructions; - - // initialize with correct length - allocator.initOpIdMaps(numberInstructions); - } - - private final InstructionValueConsumer outputConsumer = new InstructionValueConsumer() { - @Override - public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet flags) { - if (isVariableOrRegister(operand)) { - addDef((AllocatableValue) operand, op, registerPriorityOfOutputOperand(op)); - addRegisterHint(op, operand, mode, flags, true); - } - } - }; - - private final InstructionValueConsumer tempConsumer = new InstructionValueConsumer() { - @Override - public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet flags) { - if (isVariableOrRegister(operand)) { - addTemp((AllocatableValue) operand, op.id(), RegisterPriority.MustHaveRegister); - addRegisterHint(op, operand, mode, flags, false); - } - } - }; - private final InstructionValueConsumer aliveConsumer = new InstructionValueConsumer() { - @Override - public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet flags) { - if (isVariableOrRegister(operand)) { - RegisterPriority p = registerPriorityOfInputOperand(flags); - int opId = op.id(); - int blockFrom = 0; - addUse((AllocatableValue) operand, blockFrom, opId + 1, p); - addRegisterHint(op, operand, mode, flags, false); - } - } - }; - - private final InstructionValueConsumer inputConsumer = new InstructionValueConsumer() { - @Override - public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet flags) { - if (isVariableOrRegister(operand)) { - int opId = op.id(); - RegisterPriority p = registerPriorityOfInputOperand(flags); - int blockFrom = 0; - addUse((AllocatableValue) operand, blockFrom, opId, p); - addRegisterHint(op, operand, mode, flags, false); - } - } - - }; - - private final InstructionValueConsumer stateProc = new InstructionValueConsumer() { - @Override - public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet flags) { - if (isVariableOrRegister(operand)) { - int opId = op.id(); - int blockFrom = 0; - addUse((AllocatableValue) operand, blockFrom, opId + 1, RegisterPriority.None); - } - } - }; - - private void addUse(AllocatableValue operand, int from, int to, RegisterPriority registerPriority) { - if (isRegister(operand)) { - RegisterValue reg = asRegisterValue(operand); - if (allocator.isAllocatable(reg)) { - addFixedUse(reg, from, to); - } - } else { - assert isVariable(operand) : operand; - addVariableUse(asVariable(operand), from, to, registerPriority); - } - } - - private void addFixedUse(RegisterValue reg, int from, int to) { - FixedInterval interval = allocator.getOrCreateFixedInterval(reg); - interval.addRange(from, to); - if (debug.isLogEnabled()) { - debug.log("add fixed use: %s, at %d", interval, to); - } - } - - private void addVariableUse(Variable operand, int from, int to, RegisterPriority registerPriority) { - TraceInterval interval = allocator.getOrCreateInterval(operand); - interval.addRange(from, to); - - // Register use position at even instruction id. - interval.addUsePos(to & ~1, registerPriority, allocator.getOptions()); - - if (debug.isLogEnabled()) { - debug.log("add use: %s, at %d (%s)", interval, to, registerPriority.name()); - } - } - - private void addDef(AllocatableValue operand, LIRInstruction op, RegisterPriority registerPriority) { - if (isRegister(operand)) { - RegisterValue reg = asRegisterValue(operand); - if (allocator.isAllocatable(reg)) { - addFixedDef(reg, op); - } - } else { - assert isVariable(operand) : operand; - addVariableDef(asVariable(operand), op, registerPriority); - } - } - - private void addFixedDef(RegisterValue reg, LIRInstruction op) { - FixedInterval interval = allocator.getOrCreateFixedInterval(reg); - int defPos = op.id(); - if (interval.from() <= defPos) { - /* - * Update the starting point (when a range is first created for a use, its start is - * the beginning of the current block until a def is encountered). - */ - interval.setFrom(defPos); - - } else { - /* - * Dead value - make vacuous interval also add register priority for dead intervals - */ - interval.addRange(defPos, defPos + 1); - if (debug.isLogEnabled()) { - debug.log("Warning: def of operand %s at %d occurs without use", reg, defPos); - } - } - if (debug.isLogEnabled()) { - debug.log("add fixed def: %s, at %d", interval, defPos); - } - } - - private TraceInterval addVariableDef(Variable operand, LIRInstruction op, RegisterPriority registerPriority) { - int defPos = op.id(); - - TraceInterval interval = allocator.getOrCreateInterval(operand); - - if (interval.isEmpty()) { - /* - * Dead value - make vacuous interval also add register priority for dead intervals - */ - interval.addRange(defPos, defPos + 1); - if (debug.isLogEnabled()) { - debug.log("Warning: def of operand %s at %d occurs without use", operand, defPos); - } - } else { - /* - * Update the starting point (when a range is first created for a use, its start is - * the beginning of the current block until a def is encountered). - */ - interval.setFrom(defPos); - } - if (!(op instanceof LabelOp)) { - // no use positions for labels - interval.addUsePos(defPos, registerPriority, allocator.getOptions()); - } - - changeSpillDefinitionPos(op, operand, interval, defPos); - if (registerPriority == RegisterPriority.None && interval.spillState().ordinal() <= SpillState.StartInMemory.ordinal() && isStackSlot(operand)) { - // detection of method-parameters and roundfp-results - interval.setSpillState(SpillState.StartInMemory); - } - interval.addMaterializationValue(getMaterializedValue(op, operand, interval, allocator.neverSpillConstants(), allocator.getSpillMoveFactory())); - - if (debug.isLogEnabled()) { - debug.log("add def: %s defPos %d (%s)", interval, defPos, registerPriority.name()); - } - return interval; - } - - private void addTemp(AllocatableValue operand, int tempPos, RegisterPriority registerPriority) { - if (isRegister(operand)) { - RegisterValue reg = asRegisterValue(operand); - if (allocator.isAllocatable(reg)) { - addFixedTemp(reg, tempPos); - } - } else { - assert isVariable(operand) : operand; - addVariableTemp(asVariable(operand), tempPos, registerPriority); - } - } - - private void addFixedTemp(RegisterValue reg, int tempPos) { - FixedInterval interval = allocator.getOrCreateFixedInterval(reg); - interval.addRange(tempPos, tempPos + 1); - if (debug.isLogEnabled()) { - debug.log("add fixed temp: %s, at %d", interval, tempPos); - } - } - - private void addVariableTemp(Variable operand, int tempPos, RegisterPriority registerPriority) { - TraceInterval interval = allocator.getOrCreateInterval(operand); - - if (interval.isEmpty()) { - interval.addRange(tempPos, tempPos + 1); - } else if (interval.from() > tempPos) { - interval.setFrom(tempPos); - } - - interval.addUsePos(tempPos, registerPriority, allocator.getOptions()); - interval.addMaterializationValue(null); - - if (debug.isLogEnabled()) { - debug.log("add temp: %s tempPos %d (%s)", interval, tempPos, RegisterPriority.MustHaveRegister.name()); - } - } - - /** - * Eliminates moves from register to stack if the stack slot is known to be correct. - * - * @param op - * @param operand - */ - private void changeSpillDefinitionPos(LIRInstruction op, AllocatableValue operand, TraceInterval interval, int defPos) { - assert interval.isSplitParent() : "can only be called for split parents"; - - switch (interval.spillState()) { - case NoDefinitionFound: - // assert interval.spillDefinitionPos() == -1 : "must no be set before"; - interval.setSpillDefinitionPos(defPos); - if (!(op instanceof LabelOp)) { - // Do not update state for labels. This will be done afterwards. - interval.setSpillState(SpillState.NoSpillStore); - } - break; - - case NoSpillStore: - assert defPos <= interval.spillDefinitionPos() : "positions are processed in reverse order when intervals are created"; - if (defPos < interval.spillDefinitionPos() - 2) { - /* - * Second definition found, so no spill optimization possible for this - * interval. - */ - interval.setSpillState(SpillState.NoOptimization); - } else { - // two consecutive definitions (because of two-operand LIR form) - assert allocator.blockForId(defPos) == allocator.blockForId(interval.spillDefinitionPos()) : "block must be equal"; - } - break; - - case NoOptimization: - // nothing to do - break; - - default: - throw GraalError.shouldNotReachHere("other states not allowed at this time"); - } - } - - private void addRegisterHint(final LIRInstruction op, final Value targetValue, OperandMode mode, EnumSet flags, final boolean hintAtDef) { - if (flags.contains(OperandFlag.HINT) && isVariableOrRegister(targetValue)) { - - ValueProcedure registerHintProc = new ValueProcedure() { - @Override - public Value doValue(Value registerHint, OperandMode valueMode, EnumSet valueFlags) { - if (isVariableOrRegister(registerHint)) { - /* - * TODO (je): clean up - */ - final AllocatableValue fromValue; - final AllocatableValue toValue; - /* hints always point from def to use */ - if (hintAtDef) { - fromValue = (AllocatableValue) registerHint; - toValue = (AllocatableValue) targetValue; - } else { - fromValue = (AllocatableValue) targetValue; - toValue = (AllocatableValue) registerHint; - } - debug.log("addRegisterHint %s to %s", fromValue, toValue); - final TraceInterval to; - final IntervalHint from; - if (isRegister(toValue)) { - if (isRegister(fromValue)) { - // fixed to fixed move - return null; - } - from = getIntervalHint(toValue); - to = allocator.getOrCreateInterval(asVariable(fromValue)); - } else { - to = allocator.getOrCreateInterval(asVariable(toValue)); - from = getIntervalHint(fromValue); - } - - to.setLocationHint(from); - if (debug.isLogEnabled()) { - debug.log("operation at opId %d: added hint from interval %s to %s", op.id(), from, to); - } - - return registerHint; - } - return null; - } - }; - op.forEachRegisterHint(targetValue, mode, registerHintProc); - } - } - - private static boolean optimizeMethodArgument(Value value) { - /* - * Object method arguments that are passed on the stack are currently not optimized - * because this requires that the runtime visits method arguments during stack walking. - */ - return isStackSlot(value) && asStackSlot(value).isInCallerFrame() && LIRKind.isValue(value); - } - - /** - * Determines the register priority for an instruction's output/result operand. - */ - private static RegisterPriority registerPriorityOfOutputOperand(LIRInstruction op) { - if (op instanceof LabelOp) { - // skip method header - return RegisterPriority.None; - } - if (ValueMoveOp.isValueMoveOp(op)) { - ValueMoveOp move = ValueMoveOp.asValueMoveOp(op); - if (optimizeMethodArgument(move.getInput())) { - return RegisterPriority.None; - } - } - - // all other operands require a register - return RegisterPriority.MustHaveRegister; - } - - /** - * Determines the priority which with an instruction's input operand will be allocated a - * register. - */ - private static RegisterPriority registerPriorityOfInputOperand(EnumSet flags) { - if (flags.contains(OperandFlag.OUTGOING)) { - return RegisterPriority.None; - } - if (flags.contains(OperandFlag.STACK)) { - return RegisterPriority.ShouldHaveRegister; - } - // all other operands require a register - return RegisterPriority.MustHaveRegister; - } - - @SuppressWarnings("try") - private void buildIntervals() { - - try (Indent indent = debug.logAndIndent("build intervals")) { - - // create a list with all caller-save registers (cpu, fpu, xmm) - RegisterArray callerSaveRegs = getCallerSavedRegisters(); - int instructionIndex = numInstructions; - - // iterate all blocks in reverse order - AbstractBlockBase[] blocks = sortedBlocks(); - for (int blockId = blocks.length - 1; blockId >= 0; blockId--) { - final AbstractBlockBase block = blocks[blockId]; - - try (Indent indent2 = debug.logAndIndent("handle block %d", block.getId())) { - handleBlockEnd(block, (instructionIndex - 1) << 1); - - /* - * Iterate all instructions of the block in reverse order. definitions of - * intervals are processed before uses. - */ - ArrayList instructions = getLIR().getLIRforBlock(block); - for (int instIdx = instructions.size() - 1; instIdx >= 1; instIdx--) { - final LIRInstruction op = instructions.get(instIdx); - // number instruction - instructionIndex--; - numberInstruction(block, op, instructionIndex); - final int opId = op.id(); - - try (Indent indent3 = debug.logAndIndent("handle inst %d: %s", opId, op)) { - - /* - * Add a temp range for each register if operation destroys - * caller-save registers. - */ - if (op.destroysCallerSavedRegisters()) { - for (Register r : callerSaveRegs) { - if (allocator.attributes(r).isAllocatable()) { - addTemp(r.asValue(), opId, RegisterPriority.None); - } - } - if (debug.isLogEnabled()) { - debug.log("operation destroys all caller-save registers"); - } - } - - op.visitEachOutput(outputConsumer); - op.visitEachTemp(tempConsumer); - op.visitEachAlive(aliveConsumer); - op.visitEachInput(inputConsumer); - - /* - * Add uses of live locals from interpreter's point of view for - * proper debug information generation. Treat these operands as temp - * values (if the live range is extended to a call site, the value - * would be in a register at the call otherwise). - */ - op.visitEachState(stateProc); - } - - } // end of instruction iteration - // number label instruction - instructionIndex--; - numberInstruction(block, instructions.get(0), instructionIndex); - AbstractBlockBase pred = blockId == 0 ? null : blocks[blockId - 1]; - handleBlockBegin(block, pred); - } - if (debug.isDumpEnabled(DebugContext.VERY_DETAILED_LEVEL)) { - allocator.printIntervals("After Block " + block); - } - } // end of block iteration - assert instructionIndex == 0 : "not at start?" + instructionIndex; - handleTraceBegin(blocks[0]); - - if (TraceRAuseInterTraceHints.getValue(allocator.getLIR().getOptions())) { - addInterTraceHints(); - } - // fix spill state for phi/incoming intervals - for (TraceInterval interval : allocator.intervals()) { - if (interval != null) { - if (interval.spillState().equals(SpillState.NoDefinitionFound) && interval.spillDefinitionPos() != -1) { - // there was a definition in a phi/incoming - interval.setSpillState(SpillState.NoSpillStore); - } - if (interval.preSpilledAllocated()) { - // pre-spill unused, start in memory intervals - allocator.assignSpillSlot(interval); - } - } - } - - for (FixedInterval interval1 : allocator.fixedIntervals()) { - if (interval1 != null) { - /* We use [-1, 0] to avoid intersection with incoming values. */ - interval1.addRange(-1, 0); - } - } - } - } - - private void handleTraceBegin(AbstractBlockBase block) { - LIRInstruction op = getLIR().getLIRforBlock(block).get(0); - GlobalLivenessInfo livenessInfo = allocator.getGlobalLivenessInfo(); - for (int varNum : livenessInfo.getBlockIn(block)) { - if (isAliveAtBlockBegin(varNum)) { - addVariableDef(livenessInfo.getVariable(varNum), op, RegisterPriority.None); - } - } - } - - private boolean isAliveAtBlockBegin(int varNum) { - return allocator.intervalFor(varNum) != null; - } - - private void handleBlockBegin(AbstractBlockBase block, AbstractBlockBase pred) { - if (SSAUtil.isMerge(block)) { - // handle phis - // method parameters are fixed later on (see end of #buildIntervals) - LabelOp label = SSAUtil.phiIn(getLIR(), block); - JumpOp jump = pred == null ? null : SSAUtil.phiOut(getLIR(), pred); - for (int i = 0; i < label.getPhiSize(); i++) { - Variable var = asVariable(label.getIncomingValue(i)); - TraceInterval toInterval = addVariableDef(var, label, RegisterPriority.ShouldHaveRegister); - // set hint for phis - if (jump != null) { - Value out = jump.getOutgoingValue(i); - if (isVariable(out)) { - TraceInterval fromInterval = allocator.getOrCreateInterval(asVariable(out)); - toInterval.setLocationHint(fromInterval); - } - } - } - } - } - - private void handleBlockEnd(AbstractBlockBase block, int opId) { - // always alive until the end of the block - int aliveOpId = opId + 1; - GlobalLivenessInfo livenessInfo = allocator.getGlobalLivenessInfo(); - for (int varNum : livenessInfo.getBlockOut(block)) { - if (allocator.intervalFor(varNum) == null) { - addVariableUse(livenessInfo.getVariable(varNum), 0, aliveOpId, RegisterPriority.None); - } - } - } - - private void numberInstruction(AbstractBlockBase block, LIRInstruction op, int index) { - int opId = index << 1; - assert op.id() == -1 || op.id() == opId : "must match"; - op.setId(opId); - allocator.putOpIdMaps(index, op, block); - assert allocator.instructionForId(opId) == op : "must match"; - } - - /** - * Add register hints for incoming values, i.e., values that are not defined in the trace. - * - * Due to the dominance property of SSA form, all values live at some point in the trace - * that are not defined in the trace are live at the beginning of it. - */ - @SuppressWarnings("try") - private void addInterTraceHints() { - try (DebugContext.Scope s = debug.scope("InterTraceHints", allocator)) { - AbstractBlockBase traceHeadBlock = sortedBlocks()[0]; - if (traceHeadBlock.getPredecessorCount() == 0) { - return; - } - assert traceHeadBlock.getPredecessorCount() == 1 : "Trace head with more than one predecessor?!" + traceHeadBlock; - - AbstractBlockBase pred = traceHeadBlock.getPredecessors()[0]; - assert traceBuilderResult.getTraceForBlock(pred).getId() < traceBuilderResult.getTraceForBlock(traceHeadBlock).getId() : "Not yet allocated? " + pred; - - GlobalLivenessInfo livenessInfo = allocator.getGlobalLivenessInfo(); - LabelOp label = (LabelOp) getLIR().getLIRforBlock(traceHeadBlock).get(0); - - int[] liveVars = livenessInfo.getBlockIn(traceHeadBlock); - Value[] outLocation = livenessInfo.getOutLocation(pred); - - for (int i = 0; i < liveVars.length; i++) { - int varNum = liveVars[i]; - TraceInterval toInterval = allocator.intervalFor(varNum); - if (toInterval != null && !toInterval.hasHint()) { - Value fromValue = outLocation[i]; - if (!LIRValueUtil.isConstantValue(fromValue)) { - addInterTraceHint(label, varNum, fromValue); - } - } - } - } catch (Throwable e) { - throw debug.handle(e); - } - } - - private void addInterTraceHint(LabelOp label, int varNum, Value fromValue) { - assert isRegister(fromValue) || isStackSlotValue(fromValue) || isShadowedRegisterValue(fromValue) : "Wrong fromValue: " + fromValue; - TraceInterval to = allocator.intervalFor(varNum); - if (to == null) { - // variable not live -> do nothing - return; - } - if (isRegister(fromValue)) { - IntervalHint from = allocator.getOrCreateFixedInterval(asRegisterValue(fromValue)); - setHint(label, to, from, debug); - } else if (isStackSlotValue(fromValue)) { - setSpillSlot(label, to, (AllocatableValue) fromValue, debug); - } else if (TraceRAshareSpillInformation.getValue(allocator.getLIR().getOptions()) && isShadowedRegisterValue(fromValue)) { - ShadowedRegisterValue shadowedRegisterValue = asShadowedRegisterValue(fromValue); - IntervalHint from = getIntervalHint(shadowedRegisterValue.getRegister()); - setHint(label, to, from, debug); - setSpillSlot(label, to, shadowedRegisterValue.getStackSlot(), debug); - } - } - - private static void setHint(final LIRInstruction op, TraceInterval to, IntervalHint from, DebugContext debug) { - IntervalHint currentHint = to.locationHint(false); - if (currentHint == null) { - /* - * Update hint if there was none or if the hint interval starts after the hinted - * interval. - */ - to.setLocationHint(from); - if (debug.isLogEnabled()) { - debug.log("operation at opId %d: added hint from interval %s to %s", op.id(), from, to); - } - } - } - - private static void setSpillSlot(LIRInstruction op, TraceInterval interval, AllocatableValue spillSlot, DebugContext debug) { - if (interval.spillSlot() == null) { - interval.setSpillSlot(spillSlot); - interval.setSpillState(SpillState.StartInMemory); - if (debug.isLogEnabled()) { - debug.log("operation at opId %d: added spill slot %s to interval %s", op.id(), spillSlot, interval); - } - } else if (debug.isLogEnabled()) { - debug.log("operation at opId %d: has already a slot assigned %s", op.id(), interval.spillSlot()); - } - } - - private IntervalHint getIntervalHint(AllocatableValue from) { - if (isRegister(from)) { - return allocator.getOrCreateFixedInterval(asRegisterValue(from)); - } - return allocator.getOrCreateInterval(asVariable(from)); - } - - } - - /** - * Returns a value for a interval definition, which can be used for re-materialization. - * - * @param op An instruction which defines a value - * @param operand The destination operand of the instruction - * @param interval The interval for this defined value. - * @return Returns the value which is moved to the instruction and which can be reused at all - * reload-locations in case the interval of this instruction is spilled. Currently this - * can only be a {@link JavaConstant}. - */ - private static JavaConstant getMaterializedValue(LIRInstruction op, Value operand, TraceInterval interval, boolean neverSpillConstants, MoveFactory spillMoveFactory) { - if (LoadConstantOp.isLoadConstantOp(op)) { - LoadConstantOp move = LoadConstantOp.asLoadConstantOp(op); - if (move.getConstant() instanceof JavaConstant) { - if (!neverSpillConstants) { - if (!spillMoveFactory.allowConstantToStackMove(move.getConstant())) { - return null; - } - /* - * Check if the interval has any uses which would accept an stack location - * (priority == ShouldHaveRegister). Rematerialization of such intervals can - * result in a degradation, because rematerialization always inserts a constant - * load, even if the value is not needed in a register. - */ - int numUsePos = interval.numUsePos(); - for (int useIdx = 0; useIdx < numUsePos; useIdx++) { - TraceInterval.RegisterPriority priority = interval.getUsePosRegisterPriority(useIdx); - if (priority == TraceInterval.RegisterPriority.ShouldHaveRegister) { - return null; - } - } - } - return (JavaConstant) move.getConstant(); - } - } - return null; - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanPhase.java deleted file mode 100644 index 13e4ab96d22..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanPhase.java +++ /dev/null @@ -1,1164 +0,0 @@ -/* - * Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import static jdk.vm.ci.code.CodeUtil.isEven; -import static jdk.vm.ci.code.ValueUtil.asRegister; -import static jdk.vm.ci.code.ValueUtil.isIllegal; -import static jdk.vm.ci.code.ValueUtil.isLegal; -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static org.graalvm.compiler.lir.LIRValueUtil.isVariable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; - -import org.graalvm.compiler.core.common.LIRKind; -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.debug.Assertions; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.LIRInstruction.OperandMode; -import org.graalvm.compiler.lir.StandardOp.BlockEndOp; -import org.graalvm.compiler.lir.Variable; -import org.graalvm.compiler.lir.VirtualStackSlot; -import org.graalvm.compiler.lir.alloc.trace.GlobalLivenessInfo; -import org.graalvm.compiler.lir.alloc.trace.TraceAllocationPhase; -import org.graalvm.compiler.lir.alloc.trace.TraceAllocationPhase.TraceAllocationContext; -import org.graalvm.compiler.lir.alloc.trace.TraceRegisterAllocationPhase; -import org.graalvm.compiler.lir.alloc.trace.TraceUtil; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceInterval.RegisterPriority; -import org.graalvm.compiler.lir.debug.IntervalDumper; -import org.graalvm.compiler.lir.debug.IntervalDumper.IntervalVisitor; -import org.graalvm.compiler.lir.framemap.FrameMapBuilder; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.lir.phases.LIRPhase; -import org.graalvm.compiler.options.NestedBooleanOptionKey; -import org.graalvm.compiler.options.Option; -import org.graalvm.compiler.options.OptionKey; -import org.graalvm.compiler.options.OptionType; -import org.graalvm.compiler.options.OptionValues; - -import jdk.vm.ci.code.Register; -import jdk.vm.ci.code.RegisterArray; -import jdk.vm.ci.code.RegisterAttributes; -import jdk.vm.ci.code.RegisterValue; -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.meta.AllocatableValue; -import jdk.vm.ci.meta.Value; -import jdk.vm.ci.meta.ValueKind; - -/** - * Implementation of the Linear Scan allocation approach for traces described in - * "Trace-based Register Allocation in a JIT - * Compiler" by Josef Eisl et al. It is derived from - * "Optimized Interval Splitting in a Linear - * Scan Register Allocator" by Christian Wimmer and Hanspeter Moessenboeck. - */ -public final class TraceLinearScanPhase extends TraceAllocationPhase { - - public static class Options { - // @formatter:off - @Option(help = "Enable spill position optimization", type = OptionType.Debug) - public static final OptionKey LIROptTraceRAEliminateSpillMoves = new NestedBooleanOptionKey(LIRPhase.Options.LIROptimization, true); - // @formatter:on - } - - private static final TraceLinearScanRegisterAllocationPhase TRACE_LINEAR_SCAN_REGISTER_ALLOCATION_PHASE = new TraceLinearScanRegisterAllocationPhase(); - private static final TraceLinearScanAssignLocationsPhase TRACE_LINEAR_SCAN_ASSIGN_LOCATIONS_PHASE = new TraceLinearScanAssignLocationsPhase(); - private static final TraceLinearScanEliminateSpillMovePhase TRACE_LINEAR_SCAN_ELIMINATE_SPILL_MOVE_PHASE = new TraceLinearScanEliminateSpillMovePhase(); - private static final TraceLinearScanResolveDataFlowPhase TRACE_LINEAR_SCAN_RESOLVE_DATA_FLOW_PHASE = new TraceLinearScanResolveDataFlowPhase(); - private static final TraceLinearScanLifetimeAnalysisPhase TRACE_LINEAR_SCAN_LIFETIME_ANALYSIS_PHASE = new TraceLinearScanLifetimeAnalysisPhase(); - - public static final int DOMINATOR_SPILL_MOVE_ID = -2; - - private final FrameMapBuilder frameMapBuilder; - private final RegisterAttributes[] registerAttributes; - private final RegisterArray registers; - private final RegisterAllocationConfig regAllocConfig; - private final MoveFactory moveFactory; - - protected final TraceBuilderResult traceBuilderResult; - - private final boolean neverSpillConstants; - - /** - * Maps from {@link Variable#index} to a spill stack slot. If - * {@linkplain org.graalvm.compiler.lir.alloc.trace.TraceRegisterAllocationPhase.Options#TraceRACacheStackSlots - * enabled} a {@link Variable} is always assigned to the same stack slot. - */ - private final AllocatableValue[] cachedStackSlots; - - private final LIRGenerationResult res; - private final GlobalLivenessInfo livenessInfo; - - public TraceLinearScanPhase(TargetDescription target, LIRGenerationResult res, MoveFactory spillMoveFactory, RegisterAllocationConfig regAllocConfig, TraceBuilderResult traceBuilderResult, - boolean neverSpillConstants, AllocatableValue[] cachedStackSlots, GlobalLivenessInfo livenessInfo) { - this.res = res; - this.moveFactory = spillMoveFactory; - this.frameMapBuilder = res.getFrameMapBuilder(); - this.registerAttributes = regAllocConfig.getRegisterConfig().getAttributesMap(); - this.regAllocConfig = regAllocConfig; - - this.registers = target.arch.getRegisters(); - this.traceBuilderResult = traceBuilderResult; - this.neverSpillConstants = neverSpillConstants; - this.cachedStackSlots = cachedStackSlots; - this.livenessInfo = livenessInfo; - assert livenessInfo != null; - } - - protected DebugContext getDebug() { - return res.getLIR().getDebug(); - } - - public static boolean isVariableOrRegister(Value value) { - return isVariable(value) || isRegister(value); - } - - abstract static class IntervalPredicate { - - abstract boolean apply(TraceInterval i); - } - - static final IntervalPredicate IS_VARIABLE_INTERVAL = new IntervalPredicate() { - - @Override - public boolean apply(TraceInterval i) { - // all TraceIntervals are variable intervals - return !i.preSpilledAllocated(); - } - }; - private static final Comparator SORT_BY_FROM_COMP = new Comparator() { - - @Override - public int compare(TraceInterval a, TraceInterval b) { - return a.from() - b.from(); - } - }; - private static final Comparator SORT_BY_SPILL_POS_COMP = new Comparator() { - - @Override - public int compare(TraceInterval a, TraceInterval b) { - return a.spillDefinitionPos() - b.spillDefinitionPos(); - } - }; - - public TraceLinearScan createAllocator(Trace trace) { - return new TraceLinearScan(trace); - } - - @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, TraceAllocationContext traceContext) { - createAllocator(trace).allocate(target, lirGenRes, traceContext); - } - - private static boolean isSortedByFrom(T[] intervals) { - int from = -1; - for (T interval : intervals) { - if (interval == null) { - continue; - } - assert from <= interval.from(); - from = interval.from(); - } - return true; - } - - private static boolean isSortedBySpillPos(TraceInterval[] intervals) { - int from = -1; - for (TraceInterval interval : intervals) { - assert interval != null; - assert from <= interval.spillDefinitionPos(); - from = interval.spillDefinitionPos(); - } - return true; - } - - private static TraceInterval[] sortIntervalsBeforeAllocation(TraceInterval[] intervals, TraceInterval[] sortedList) { - int sortedIdx = 0; - int sortedFromMax = -1; - - // special sorting algorithm: the original interval-list is almost sorted, - // only some intervals are swapped. So this is much faster than a complete QuickSort - for (TraceInterval interval : intervals) { - if (interval != null) { - int from = interval.from(); - - if (sortedFromMax <= from) { - sortedList[sortedIdx++] = interval; - sortedFromMax = interval.from(); - } else { - // the assumption that the intervals are already sorted failed, - // so this interval must be sorted in manually - int j; - for (j = sortedIdx - 1; j >= 0 && from < sortedList[j].from(); j--) { - sortedList[j + 1] = sortedList[j]; - } - sortedList[j + 1] = interval; - sortedIdx++; - } - } - } - return sortedList; - } - - public final class TraceLinearScan implements IntervalDumper { - - /** - * Intervals sorted by {@link TraceInterval#from()}. - */ - private TraceInterval[] sortedIntervals; - - private final Trace trace; - - public TraceLinearScan(Trace trace) { - this.trace = trace; - this.fixedIntervals = new FixedInterval[registers.size()]; - } - - GlobalLivenessInfo getGlobalLivenessInfo() { - return livenessInfo; - } - - /** - * @return {@link Variable#index} - */ - int operandNumber(Variable operand) { - return operand.index; - } - - OptionValues getOptions() { - return getLIR().getOptions(); - } - - DebugContext getDebug() { - return getLIR().getDebug(); - } - - /** - * Gets the number of operands. This value will increase by 1 for new variable. - */ - int operandSize() { - return getLIR().numVariables(); - } - - /** - * Gets the number of registers. This value will never change. - */ - int numRegisters() { - return registers.size(); - } - - public int getFirstLirInstructionId(AbstractBlockBase block) { - int result = getLIR().getLIRforBlock(block).get(0).id(); - assert result >= 0; - return result; - } - - public int getLastLirInstructionId(AbstractBlockBase block) { - ArrayList instructions = getLIR().getLIRforBlock(block); - int result = instructions.get(instructions.size() - 1).id(); - assert result >= 0; - return result; - } - - /** - * Gets an object describing the attributes of a given register according to this register - * configuration. - */ - public RegisterAttributes attributes(Register reg) { - return registerAttributes[reg.number]; - } - - public boolean isAllocatable(RegisterValue register) { - return attributes(register.getRegister()).isAllocatable(); - } - - public MoveFactory getSpillMoveFactory() { - return moveFactory; - } - - protected TraceLocalMoveResolver createMoveResolver() { - TraceLocalMoveResolver moveResolver = new TraceLocalMoveResolver(this); - assert moveResolver.checkEmpty(); - return moveResolver; - } - - void assignSpillSlot(TraceInterval interval) { - /* - * Assign the canonical spill slot of the parent (if a part of the interval is already - * spilled) or allocate a new spill slot. - */ - if (interval.canMaterialize()) { - interval.assignLocation(Value.ILLEGAL); - } else if (interval.spillSlot() != null) { - interval.assignLocation(interval.spillSlot()); - } else { - AllocatableValue slot = allocateSpillSlot(interval); - interval.setSpillSlot(slot); - interval.assignLocation(slot); - } - } - - /** - * Returns a new spill slot or a cached entry if there is already one for the - * {@linkplain TraceInterval variable}. - */ - private AllocatableValue allocateSpillSlot(TraceInterval interval) { - DebugContext debug = res.getLIR().getDebug(); - int variableIndex = interval.splitParent().operandNumber; - OptionValues options = getOptions(); - if (TraceRegisterAllocationPhase.Options.TraceRACacheStackSlots.getValue(options)) { - AllocatableValue cachedStackSlot = cachedStackSlots[variableIndex]; - if (cachedStackSlot != null) { - TraceRegisterAllocationPhase.globalStackSlots.increment(debug); - assert cachedStackSlot.getValueKind().equals(getKind(interval)) : "CachedStackSlot: kind mismatch? " + getKind(interval) + " vs. " + cachedStackSlot.getValueKind(); - return cachedStackSlot; - } - } - VirtualStackSlot slot = frameMapBuilder.allocateSpillSlot(getKind(interval)); - if (TraceRegisterAllocationPhase.Options.TraceRACacheStackSlots.getValue(options)) { - cachedStackSlots[variableIndex] = slot; - } - TraceRegisterAllocationPhase.allocatedStackSlots.increment(debug); - return slot; - } - - // access to block list (sorted in linear scan order) - public int blockCount() { - return sortedBlocks().length; - } - - public AbstractBlockBase blockAt(int index) { - return sortedBlocks()[index]; - } - - int numLoops() { - return getLIR().getControlFlowGraph().getLoops().size(); - } - - boolean isBlockBegin(int opId) { - return opId == 0 || blockForId(opId) != blockForId(opId - 1); - } - - boolean isBlockEnd(int opId) { - boolean isBlockBegin = isBlockBegin(opId + 2); - assert isBlockBegin == (instructionForId(opId & (~1)) instanceof BlockEndOp); - return isBlockBegin; - } - - boolean coversBlockBegin(int opId1, int opId2) { - return blockForId(opId1) != blockForId(opId2); - } - - /** - * Determines if an {@link LIRInstruction} destroys all caller saved registers. - * - * @param opId an instruction {@linkplain LIRInstruction#id id} - * @return {@code true} if the instruction denoted by {@code id} destroys all caller saved - * registers. - */ - boolean hasCall(int opId) { - assert isEven(opId) : "opId not even"; - return instructionForId(opId).destroysCallerSavedRegisters(); - } - - public boolean isProcessed(Value operand) { - return !isRegister(operand) || attributes(asRegister(operand)).isAllocatable(); - } - - // * Phase 5: actual register allocation - - private TraceInterval addToList(TraceInterval first, TraceInterval prev, TraceInterval interval) { - TraceInterval newFirst = first; - if (prev != null) { - prev.next = interval; - } else { - newFirst = interval; - } - return newFirst; - } - - TraceInterval createUnhandledListByFrom(IntervalPredicate isList1) { - assert isSortedByFrom(sortedIntervals) : "interval list is not sorted"; - return createUnhandledList(isList1); - } - - TraceInterval createUnhandledListBySpillPos(IntervalPredicate isList1) { - assert isSortedBySpillPos(sortedIntervals) : "interval list is not sorted"; - return createUnhandledList(isList1); - } - - private TraceInterval createUnhandledList(IntervalPredicate isList1) { - - TraceInterval list1 = TraceInterval.EndMarker; - - TraceInterval list1Prev = null; - TraceInterval v; - - int n = sortedIntervals.length; - for (int i = 0; i < n; i++) { - v = sortedIntervals[i]; - if (v == null) { - continue; - } - - if (isList1.apply(v)) { - list1 = addToList(list1, list1Prev, v); - list1Prev = v; - } - } - - if (list1Prev != null) { - list1Prev.next = TraceInterval.EndMarker; - } - - assert list1Prev == null || list1Prev.next == TraceInterval.EndMarker : "linear list ends not with sentinel"; - - return list1; - } - - private FixedInterval addToList(FixedInterval first, FixedInterval prev, FixedInterval interval) { - FixedInterval newFirst = first; - if (prev != null) { - prev.next = interval; - } else { - newFirst = interval; - } - return newFirst; - } - - FixedInterval createFixedUnhandledList() { - assert isSortedByFrom(fixedIntervals) : "interval list is not sorted"; - - FixedInterval list1 = FixedInterval.EndMarker; - - FixedInterval list1Prev = null; - for (FixedInterval v : fixedIntervals) { - - if (v == null) { - continue; - } - - v.rewindRange(); - list1 = addToList(list1, list1Prev, v); - list1Prev = v; - } - - if (list1Prev != null) { - list1Prev.next = FixedInterval.EndMarker; - } - - assert list1Prev == null || list1Prev.next == FixedInterval.EndMarker : "linear list ends not with sentinel"; - - return list1; - } - - // SORTING - - protected void sortIntervalsBeforeAllocation() { - int sortedLen = 0; - for (TraceInterval interval : intervals()) { - if (interval != null) { - sortedLen++; - } - } - sortedIntervals = TraceLinearScanPhase.sortIntervalsBeforeAllocation(intervals(), new TraceInterval[sortedLen]); - } - - void sortIntervalsAfterAllocation() { - if (hasDerivedIntervals()) { - // no intervals have been added during allocation, so sorted list is already up to - // date - return; - } - - TraceInterval[] oldList = sortedIntervals; - TraceInterval[] newList = Arrays.copyOfRange(intervals(), firstDerivedIntervalIndex(), intervalsSize()); - int oldLen = oldList.length; - int newLen = newList.length; - - // conventional sort-algorithm for new intervals - Arrays.sort(newList, SORT_BY_FROM_COMP); - - // merge old and new list (both already sorted) into one combined list - TraceInterval[] combinedList = new TraceInterval[oldLen + newLen]; - int oldIdx = 0; - int newIdx = 0; - - while (oldIdx + newIdx < combinedList.length) { - if (newIdx >= newLen || (oldIdx < oldLen && oldList[oldIdx].from() <= newList[newIdx].from())) { - combinedList[oldIdx + newIdx] = oldList[oldIdx]; - oldIdx++; - } else { - combinedList[oldIdx + newIdx] = newList[newIdx]; - newIdx++; - } - } - - sortedIntervals = combinedList; - } - - void sortIntervalsBySpillPos() { - // TODO (JE): better algorithm? - // conventional sort-algorithm for new intervals - Arrays.sort(sortedIntervals, SORT_BY_SPILL_POS_COMP); - } - - // wrapper for Interval.splitChildAtOpId that performs a bailout in product mode - // instead of returning null - public TraceInterval splitChildAtOpId(TraceInterval interval, int opId, LIRInstruction.OperandMode mode) { - TraceInterval result = interval.getSplitChildAtOpId(opId, mode); - - if (result != null) { - if (getDebug().isLogEnabled()) { - getDebug().log("Split child at pos %d of interval %s is %s", opId, interval, result); - } - return result; - } - throw new GraalError("LinearScan: interval is null"); - } - - AllocatableValue canonicalSpillOpr(TraceInterval interval) { - assert interval.spillSlot() != null : "canonical spill slot not set"; - return interval.spillSlot(); - } - - boolean isMaterialized(Variable operand, int opId, OperandMode mode) { - TraceInterval interval = intervalFor(operand); - assert interval != null : "interval must exist"; - - if (opId != -1) { - /* - * Operands are not changed when an interval is split during allocation, so search - * the right interval here. - */ - interval = splitChildAtOpId(interval, opId, mode); - } - - return isIllegal(interval.location()) && interval.canMaterialize(); - } - - boolean isCallerSave(Value operand) { - return attributes(asRegister(operand)).isCallerSave(); - } - - @SuppressWarnings("try") - protected void allocate(TargetDescription target, LIRGenerationResult lirGenRes, TraceAllocationContext traceContext) { - MoveFactory spillMoveFactory = traceContext.spillMoveFactory; - RegisterAllocationConfig registerAllocationConfig = traceContext.registerAllocationConfig; - /* - * This is the point to enable debug logging for the whole register allocation. - */ - DebugContext debug = res.getLIR().getDebug(); - try (Indent indent = debug.logAndIndent("LinearScan allocate")) { - TRACE_LINEAR_SCAN_LIFETIME_ANALYSIS_PHASE.apply(target, lirGenRes, trace, spillMoveFactory, registerAllocationConfig, traceBuilderResult, this, false); - - try (DebugContext.Scope s = debug.scope("AfterLifetimeAnalysis", this)) { - - printLir("After instruction numbering"); - printIntervals("Before register allocation"); - - sortIntervalsBeforeAllocation(); - - TRACE_LINEAR_SCAN_REGISTER_ALLOCATION_PHASE.apply(target, lirGenRes, trace, spillMoveFactory, registerAllocationConfig, traceBuilderResult, this, false); - printIntervals("After register allocation"); - - // resolve intra-trace data-flow - TRACE_LINEAR_SCAN_RESOLVE_DATA_FLOW_PHASE.apply(target, lirGenRes, trace, spillMoveFactory, registerAllocationConfig, traceBuilderResult, this); - - // eliminate spill moves - OptionValues options = getOptions(); - if (Options.LIROptTraceRAEliminateSpillMoves.getValue(options)) { - TRACE_LINEAR_SCAN_ELIMINATE_SPILL_MOVE_PHASE.apply(target, lirGenRes, trace, spillMoveFactory, registerAllocationConfig, traceBuilderResult, this); - } - - TRACE_LINEAR_SCAN_ASSIGN_LOCATIONS_PHASE.apply(target, lirGenRes, trace, spillMoveFactory, registerAllocationConfig, traceBuilderResult, this, false); - - if (Assertions.detailedAssertionsEnabled(options)) { - verifyIntervals(); - } - } catch (Throwable e) { - throw debug.handle(e); - } - } - } - - public void printLir(String label) { - if (getDebug().isDumpEnabled(DebugContext.DETAILED_LEVEL)) { - getDebug().dump(DebugContext.DETAILED_LEVEL, sortedBlocks(), "%s (Trace%d)", label, trace.getId()); - } - } - - boolean verify() { - // (check that all intervals have a correct register and that no registers are - // overwritten) - verifyIntervals(); - - verifyRegisters(); - - getDebug().log("no errors found"); - - return true; - } - - @SuppressWarnings("try") - private void verifyRegisters() { - // Enable this logging to get output for the verification process. - try (Indent indent = getDebug().logAndIndent("verifying register allocation")) { - RegisterVerifier verifier = new RegisterVerifier(this); - verifier.verify(blockAt(0)); - } - } - - @SuppressWarnings("try") - protected void verifyIntervals() { - DebugContext debug = getDebug(); - try (Indent indent = debug.logAndIndent("verifying intervals")) { - int len = intervalsSize(); - - for (int i = 0; i < len; i++) { - final TraceInterval i1 = intervals()[i]; - if (i1 == null) { - continue; - } - - i1.checkSplitChildren(); - - if (i1.operandNumber != i) { - debug.log("Interval %d is on position %d in list", i1.operandNumber, i); - debug.log(i1.logString()); - throw new GraalError(""); - } - - if (getKind(i1).equals(LIRKind.Illegal)) { - debug.log("Interval %d has no type assigned", i1.operandNumber); - debug.log(i1.logString()); - throw new GraalError(""); - } - - if (i1.location() == null) { - debug.log("Interval %d has no register assigned", i1.operandNumber); - debug.log(i1.logString()); - throw new GraalError(""); - } - - if (i1.isEmpty()) { - debug.log("Interval %d has no Range", i1.operandNumber); - debug.log(i1.logString()); - throw new GraalError(""); - } - - if (i1.from() >= i1.to()) { - debug.log("Interval %d has zero length range", i1.operandNumber); - debug.log(i1.logString()); - throw new GraalError(""); - } - - // special intervals that are created in MoveResolver - // . ignore them because the range information has no meaning there - if (i1.from() == 1 && i1.to() == 2) { - continue; - } - // check any intervals - for (int j = i + 1; j < len; j++) { - final TraceInterval i2 = intervals()[j]; - if (i2 == null) { - continue; - } - - // special intervals that are created in MoveResolver - // . ignore them because the range information has no meaning there - if (i2.from() == 1 && i2.to() == 2) { - continue; - } - Value l1 = i1.location(); - Value l2 = i2.location(); - boolean intersects = i1.intersects(i2); - if (intersects && !isIllegal(l1) && (l1.equals(l2))) { - throw GraalError.shouldNotReachHere(String.format("Intervals %s and %s overlap and have the same register assigned\n%s\n%s", i1, i2, i1.logString(), i2.logString())); - } - } - // check fixed intervals - for (FixedInterval i2 : fixedIntervals()) { - if (i2 == null) { - continue; - } - - Value l1 = i1.location(); - Value l2 = i2.location(); - boolean intersects = i2.intersects(i1); - if (intersects && !isIllegal(l1) && (l1.equals(l2))) { - throw GraalError.shouldNotReachHere(String.format("Intervals %s and %s overlap and have the same register assigned\n%s\n%s", i1, i2, i1.logString(), i2.logString())); - } - } - } - } - } - - public LIR getLIR() { - return res.getLIR(); - } - - public FrameMapBuilder getFrameMapBuilder() { - return frameMapBuilder; - } - - public AbstractBlockBase[] sortedBlocks() { - return trace.getBlocks(); - } - - public RegisterArray getRegisters() { - return registers; - } - - public RegisterAllocationConfig getRegisterAllocationConfig() { - return regAllocConfig; - } - - public boolean callKillsRegisters() { - return regAllocConfig.getRegisterConfig().areAllAllocatableRegistersCallerSaved(); - } - - boolean neverSpillConstants() { - return neverSpillConstants; - } - - // IntervalData - - private static final int SPLIT_INTERVALS_CAPACITY_RIGHT_SHIFT = 1; - - /** - * The index of the first entry in {@link #intervals} for a - * {@linkplain #createDerivedInterval(TraceInterval) derived interval}. - */ - private int firstDerivedIntervalIndex = -1; - - /** - * @see #fixedIntervals() - */ - private final FixedInterval[] fixedIntervals; - - /** - * @see #intervals() - */ - private TraceInterval[] intervals; - - /** - * The number of valid entries in {@link #intervals}. - */ - private int intervalsSize; - - /** - * Map from an instruction {@linkplain LIRInstruction#id id} to the instruction. Entries - * should be retrieved with {@link #instructionForId(int)} as the id is not simply an index - * into this array. - */ - private LIRInstruction[] opIdToInstructionMap; - - /** - * Map from an instruction {@linkplain LIRInstruction#id id} to the - * {@linkplain AbstractBlockBase block} containing the instruction. Entries should be - * retrieved with {@link #blockForId(int)} as the id is not simply an index into this array. - */ - private AbstractBlockBase[] opIdToBlockMap; - - /** - * Map from {@linkplain #operandNumber operand numbers} to intervals. - */ - TraceInterval[] intervals() { - return intervals; - } - - /** - * Map from {@linkplain Register#number} to fixed intervals. - */ - FixedInterval[] fixedIntervals() { - return fixedIntervals; - } - - void initIntervals() { - intervalsSize = operandSize(); - intervals = new TraceInterval[intervalsSize + (intervalsSize >> SPLIT_INTERVALS_CAPACITY_RIGHT_SHIFT)]; - } - - /** - * Creates a new fixed interval. - * - * @param reg the operand for the interval - * @return the created interval - */ - private FixedInterval createFixedInterval(RegisterValue reg) { - FixedInterval interval = new FixedInterval(reg); - int operandNumber = reg.getRegister().number; - assert fixedIntervals[operandNumber] == null; - fixedIntervals[operandNumber] = interval; - return interval; - } - - /** - * Creates a new interval. - * - * @param operand the operand for the interval - * @return the created interval - */ - private TraceInterval createInterval(Variable operand) { - assert isLegal(operand); - int operandNumber = operandNumber(operand); - assert operand.index == operandNumber; - TraceInterval interval = new TraceInterval(operand); - assert operandNumber < intervalsSize; - assert intervals[operandNumber] == null; - intervals[operandNumber] = interval; - return interval; - } - - /** - * Creates an interval as a result of splitting or spilling another interval. - * - * @param source an interval being split of spilled - * @return a new interval derived from {@code source} - */ - TraceInterval createDerivedInterval(TraceInterval source) { - if (firstDerivedIntervalIndex == -1) { - firstDerivedIntervalIndex = intervalsSize; - } - if (intervalsSize == intervals.length) { - intervals = Arrays.copyOf(intervals, intervals.length + (intervals.length >> SPLIT_INTERVALS_CAPACITY_RIGHT_SHIFT) + 1); - } - // increments intervalsSize - Variable variable = createVariable(getKind(source)); - - assert intervalsSize <= intervals.length; - - TraceInterval interval = createInterval(variable); - assert intervals[intervalsSize - 1] == interval; - return interval; - } - - /** - * Creates a new variable for a derived interval. Note that the variable is not - * {@linkplain LIR#numVariables() managed} so it must not be inserted into the {@link LIR}. - */ - private Variable createVariable(ValueKind kind) { - return new Variable(kind, intervalsSize++); - } - - boolean hasDerivedIntervals() { - return firstDerivedIntervalIndex != -1; - } - - int firstDerivedIntervalIndex() { - return firstDerivedIntervalIndex; - } - - public int intervalsSize() { - return intervalsSize; - } - - FixedInterval fixedIntervalFor(RegisterValue reg) { - return fixedIntervals[reg.getRegister().number]; - } - - FixedInterval getOrCreateFixedInterval(RegisterValue reg) { - FixedInterval ret = fixedIntervalFor(reg); - if (ret == null) { - return createFixedInterval(reg); - } else { - return ret; - } - } - - TraceInterval intervalFor(Variable operand) { - return intervalFor(operandNumber(operand)); - } - - TraceInterval intervalFor(int operandNumber) { - assert operandNumber < intervalsSize; - return intervals[operandNumber]; - } - - TraceInterval getOrCreateInterval(Variable operand) { - TraceInterval ret = intervalFor(operand); - if (ret == null) { - return createInterval(operand); - } else { - return ret; - } - } - - void initOpIdMaps(int numInstructions) { - opIdToInstructionMap = new LIRInstruction[numInstructions]; - opIdToBlockMap = new AbstractBlockBase[numInstructions]; - } - - void putOpIdMaps(int index, LIRInstruction op, AbstractBlockBase block) { - opIdToInstructionMap[index] = op; - opIdToBlockMap[index] = block; - } - - /** - * Gets the highest instruction id allocated by this object. - */ - int maxOpId() { - assert opIdToInstructionMap.length > 0 : "no operations"; - return (opIdToInstructionMap.length - 1) << 1; - } - - /** - * Converts an {@linkplain LIRInstruction#id instruction id} to an instruction index. All - * LIR instructions in a method have an index one greater than their linear-scan order - * predecessor with the first instruction having an index of 0. - */ - private int opIdToIndex(int opId) { - return opId >> 1; - } - - /** - * Retrieves the {@link LIRInstruction} based on its {@linkplain LIRInstruction#id id}. - * - * @param opId an instruction {@linkplain LIRInstruction#id id} - * @return the instruction whose {@linkplain LIRInstruction#id} {@code == id} - */ - LIRInstruction instructionForId(int opId) { - assert isEven(opId) : "opId not even"; - LIRInstruction instr = opIdToInstructionMap[opIdToIndex(opId)]; - assert instr.id() == opId; - return instr; - } - - /** - * Gets the block containing a given instruction. - * - * @param opId an instruction {@linkplain LIRInstruction#id id} - * @return the block containing the instruction denoted by {@code opId} - */ - AbstractBlockBase blockForId(int opId) { - assert opIdToBlockMap.length > 0 && opId >= 0 && opId <= maxOpId() + 1 : "opId out of range: " + opId; - return opIdToBlockMap[opIdToIndex(opId)]; - } - - @SuppressWarnings("try") - public void printIntervals(String label) { - DebugContext debug = getDebug(); - if (debug.isDumpEnabled(DebugContext.DETAILED_LEVEL)) { - if (debug.isLogEnabled()) { - try (Indent indent = debug.logAndIndent("intervals %s", label)) { - for (FixedInterval interval : fixedIntervals) { - if (interval != null) { - debug.log("%s", interval.logString()); - } - } - - for (TraceInterval interval : intervals) { - if (interval != null) { - debug.log("%s", interval.logString()); - } - } - - try (Indent indent2 = debug.logAndIndent("Basic Blocks")) { - for (AbstractBlockBase block : trace.getBlocks()) { - debug.log("B%d [%d, %d, %s] ", block.getId(), getFirstLirInstructionId(block), getLastLirInstructionId(block), block.getLoop()); - } - } - } - } - debug.dump(DebugContext.DETAILED_LEVEL, this, "%s (Trace%d)", label, trace.getId()); - } - } - - @Override - public void visitIntervals(IntervalVisitor visitor) { - for (FixedInterval interval : fixedIntervals) { - if (interval != null) { - printFixedInterval(interval, visitor); - } - } - for (TraceInterval interval : intervals) { - if (interval != null) { - printInterval(interval, visitor); - } - } - } - - boolean hasInterTracePredecessor(AbstractBlockBase block) { - return TraceUtil.hasInterTracePredecessor(traceBuilderResult, trace, block); - } - - boolean hasInterTraceSuccessor(AbstractBlockBase block) { - return TraceUtil.hasInterTraceSuccessor(traceBuilderResult, trace, block); - } - - private void printInterval(TraceInterval interval, IntervalVisitor visitor) { - Value hint = interval.locationHint(false) != null ? interval.locationHint(false).location() : null; - AllocatableValue operand = getOperand(interval); - String type = getKind(interval).getPlatformKind().toString(); - visitor.visitIntervalStart(getOperand(interval.splitParent()), operand, interval.location(), hint, type); - - // print ranges - visitor.visitRange(interval.from(), interval.to()); - - // print use positions - int prev = -1; - for (int i = interval.numUsePos() - 1; i >= 0; --i) { - assert prev < interval.getUsePos(i) : "use positions not sorted"; - visitor.visitUsePos(interval.getUsePos(i), interval.getUsePosRegisterPriority(i)); - prev = interval.getUsePos(i); - } - - visitor.visitIntervalEnd(interval.spillState()); - } - - AllocatableValue getOperand(TraceInterval interval) { - return interval.operand; - } - - ValueKind getKind(TraceInterval interval) { - return getOperand(interval).getValueKind(); - } - - } - - public static boolean verifyEquals(TraceLinearScan a, TraceLinearScan b) { - assert compareFixed(a.fixedIntervals(), b.fixedIntervals()); - assert compareIntervals(a.intervals(), b.intervals()); - return true; - } - - private static boolean compareIntervals(TraceInterval[] a, TraceInterval[] b) { - for (int i = 0; i < Math.max(a.length, b.length); i++) { - if (i >= a.length) { - assert b[i] == null : "missing a interval: " + i + " b: " + b[i]; - continue; - } - if (i >= b.length) { - assert a[i] == null : "missing b interval: " + i + " a: " + a[i]; - continue; - } - compareInterval(a[i], b[i]); - } - return true; - } - - private static void compareInterval(TraceInterval a, TraceInterval b) { - if (a == null) { - assert b == null : "First interval is null but second is: " + b; - return; - } - assert b != null : "Second interval is null but forst is: " + a; - assert a.operandNumber == b.operandNumber : "Operand mismatch: " + a + " vs. " + b; - assert a.from() == b.from() : "From mismatch: " + a + " vs. " + b; - assert a.to() == b.to() : "To mismatch: " + a + " vs. " + b; - assert verifyIntervalsEquals(a, b); - } - - private static boolean verifyIntervalsEquals(TraceInterval a, TraceInterval b) { - for (int i = 0; i < Math.max(a.numUsePos(), b.numUsePos()); i++) { - assert i < a.numUsePos() : "missing a usepos: " + i + " b: " + b; - assert i < b.numUsePos() : "missing b usepos: " + i + " a: " + a; - int aPos = a.getUsePos(i); - int bPos = b.getUsePos(i); - assert aPos == bPos : "Use Positions differ: " + aPos + " vs. " + bPos; - RegisterPriority aReg = a.getUsePosRegisterPriority(i); - RegisterPriority bReg = b.getUsePosRegisterPriority(i); - assert aReg == bReg : "Register priority differ: " + aReg + " vs. " + bReg; - } - return true; - } - - private static boolean compareFixed(FixedInterval[] a, FixedInterval[] b) { - for (int i = 0; i < Math.max(a.length, b.length); i++) { - if (i >= a.length) { - assert b[i] == null : "missing a interval: " + i + " b: " + b[i]; - continue; - } - if (i >= b.length) { - assert a[i] == null : "missing b interval: " + i + " a: " + a[i]; - continue; - } - compareFixedInterval(a[i], b[i]); - } - return true; - } - - private static void compareFixedInterval(FixedInterval a, FixedInterval b) { - if (a == null) { - assert b == null || isEmptyInterval(b) : "First interval is null but second is: " + b; - return; - } - if (b == null) { - assert isEmptyInterval(a) : "Second interval is null but first is: " + a; - return; - } - assert a.operand.equals(b.operand) : "Operand mismatch: " + a + " vs. " + b; - assert a.from() == b.from() : "From mismatch: " + a + " vs. " + b; - assert a.to() == b.to() : "To mismatch: " + a + " vs. " + b; - assert verifyFixeEquas(a, b); - } - - private static boolean verifyFixeEquas(FixedInterval a, FixedInterval b) { - a.rewindRange(); - b.rewindRange(); - while (!a.currentAtEnd()) { - assert !b.currentAtEnd() : "Fixed range mismatch: " + a + " vs. " + b; - assert a.currentFrom() == b.currentFrom() : "From range mismatch: " + a + " vs. " + b + " from: " + a.currentFrom() + " vs. " + b.currentFrom(); - assert a.currentTo() == b.currentTo() : "To range mismatch: " + a + " vs. " + b + " from: " + a.currentTo() + " vs. " + b.currentTo(); - a.nextRange(); - b.nextRange(); - } - assert b.currentAtEnd() : "Fixed range mismatch: " + a + " vs. " + b; - return true; - } - - private static boolean isEmptyInterval(FixedInterval fixed) { - return fixed.from() == -1 && fixed.to() == 0; - } - - private static void printFixedInterval(FixedInterval interval, IntervalVisitor visitor) { - Value hint = null; - AllocatableValue operand = interval.operand; - String type = "fixed"; - visitor.visitIntervalStart(operand, operand, operand, hint, type); - - // print ranges - for (FixedRange range = interval.first(); range != FixedRange.EndMarker; range = range.next) { - visitor.visitRange(range.from, range.to); - } - - // no use positions - - visitor.visitIntervalEnd("NOT_SUPPORTED"); - - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanRegisterAllocationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanRegisterAllocationPhase.java deleted file mode 100644 index 344416f219d..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanRegisterAllocationPhase.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; - -import jdk.vm.ci.code.TargetDescription; - -final class TraceLinearScanRegisterAllocationPhase extends TraceLinearScanAllocationPhase { - - @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, - TraceBuilderResult traceBuilderResult, TraceLinearScan allocator) { - allocateRegisters(allocator); - } - - @SuppressWarnings("try") - private static void allocateRegisters(TraceLinearScan allocator) { - DebugContext debug = allocator.getDebug(); - try (Indent indent = debug.logAndIndent("allocate registers")) { - FixedInterval precoloredIntervals = allocator.createFixedUnhandledList(); - TraceInterval notPrecoloredIntervals = allocator.createUnhandledListByFrom(TraceLinearScanPhase.IS_VARIABLE_INTERVAL); - - // allocate cpu registers - TraceLinearScanWalker lsw = new TraceLinearScanWalker(allocator, precoloredIntervals, notPrecoloredIntervals); - lsw.walk(); - lsw.finishAllocation(); - } - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanResolveDataFlowPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanResolveDataFlowPhase.java deleted file mode 100644 index 002778a49cb..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanResolveDataFlowPhase.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static org.graalvm.compiler.lir.LIRValueUtil.asConstant; -import static org.graalvm.compiler.lir.LIRValueUtil.asVariable; -import static org.graalvm.compiler.lir.LIRValueUtil.isConstantValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isVirtualStackSlot; - -import java.util.ArrayList; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.debug.Assertions; -import org.graalvm.compiler.debug.CounterKey; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.StandardOp; -import org.graalvm.compiler.lir.StandardOp.JumpOp; -import org.graalvm.compiler.lir.StandardOp.LabelOp; -import org.graalvm.compiler.lir.alloc.trace.GlobalLivenessInfo; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.lir.ssa.SSAUtil; - -import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.meta.Value; - -/** - * Phase 6: resolve data flow - * - * Insert moves at edges between blocks if intervals have been split. - */ -final class TraceLinearScanResolveDataFlowPhase extends TraceLinearScanAllocationPhase { - - @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, Trace trace, MoveFactory spillMoveFactory, RegisterAllocationConfig registerAllocationConfig, - TraceBuilderResult traceBuilderResult, TraceLinearScan allocator) { - new Resolver(allocator, traceBuilderResult).resolveDataFlow(trace, allocator.sortedBlocks()); - } - - private static final class Resolver { - private final TraceLinearScan allocator; - private final TraceBuilderResult traceBuilderResult; - private final DebugContext debug; - - private Resolver(TraceLinearScan allocator, TraceBuilderResult traceBuilderResult) { - this.allocator = allocator; - this.traceBuilderResult = traceBuilderResult; - this.debug = allocator.getDebug(); - } - - private void resolveFindInsertPos(AbstractBlockBase fromBlock, AbstractBlockBase toBlock, TraceLocalMoveResolver moveResolver) { - if (fromBlock.getSuccessorCount() <= 1) { - if (debug.isLogEnabled()) { - debug.log("inserting moves at end of fromBlock B%d", fromBlock.getId()); - } - - ArrayList instructions = allocator.getLIR().getLIRforBlock(fromBlock); - LIRInstruction instr = instructions.get(instructions.size() - 1); - if (instr instanceof StandardOp.JumpOp) { - // insert moves before branch - moveResolver.setInsertPosition(instructions, instructions.size() - 1); - } else { - moveResolver.setInsertPosition(instructions, instructions.size()); - } - - } else { - if (debug.isLogEnabled()) { - debug.log("inserting moves at beginning of toBlock B%d", toBlock.getId()); - } - - if (Assertions.detailedAssertionsEnabled(allocator.getOptions())) { - assert allocator.getLIR().getLIRforBlock(fromBlock).get(0) instanceof StandardOp.LabelOp : "block does not start with a label"; - - /* - * Because the number of predecessor edges matches the number of successor - * edges, blocks which are reached by switch statements may have be more than - * one predecessor but it will be guaranteed that all predecessors will be the - * same. - */ - for (AbstractBlockBase predecessor : toBlock.getPredecessors()) { - assert fromBlock == predecessor : "all critical edges must be broken"; - } - } - - moveResolver.setInsertPosition(allocator.getLIR().getLIRforBlock(toBlock), 1); - } - } - - /** - * Inserts necessary moves (spilling or reloading) at edges between blocks for intervals - * that have been split. - */ - @SuppressWarnings("try") - private void resolveDataFlow(Trace currentTrace, AbstractBlockBase[] blocks) { - if (blocks.length < 2) { - // no resolution necessary - return; - } - try (Indent indent = debug.logAndIndent("resolve data flow")) { - - TraceLocalMoveResolver moveResolver = allocator.createMoveResolver(); - AbstractBlockBase toBlock = null; - for (int i = 0; i < blocks.length - 1; i++) { - AbstractBlockBase fromBlock = blocks[i]; - toBlock = blocks[i + 1]; - assert containedInTrace(currentTrace, fromBlock) : "Not in Trace: " + fromBlock; - assert containedInTrace(currentTrace, toBlock) : "Not in Trace: " + toBlock; - resolveCollectMappings(fromBlock, toBlock, moveResolver); - } - assert blocks[blocks.length - 1].equals(toBlock); - if (toBlock.isLoopEnd()) { - assert toBlock.getSuccessorCount() == 1; - AbstractBlockBase loopHeader = toBlock.getSuccessors()[0]; - if (containedInTrace(currentTrace, loopHeader)) { - resolveCollectMappings(toBlock, loopHeader, moveResolver); - } - } - - } - } - - @SuppressWarnings("try") - private void resolveCollectMappings(AbstractBlockBase fromBlock, AbstractBlockBase toBlock, TraceLocalMoveResolver moveResolver) { - try (Indent indent0 = debug.logAndIndent("Edge %s -> %s", fromBlock, toBlock)) { - // collect all intervals that have been split between - // fromBlock and toBlock - int toId = allocator.getFirstLirInstructionId(toBlock); - int fromId = allocator.getLastLirInstructionId(fromBlock); - assert fromId >= 0; - LIR lir = allocator.getLIR(); - if (SSAUtil.isMerge(toBlock)) { - JumpOp blockEnd = SSAUtil.phiOut(lir, fromBlock); - LabelOp label = SSAUtil.phiIn(lir, toBlock); - for (int i = 0; i < label.getPhiSize(); i++) { - addMapping(blockEnd.getOutgoingValue(i), label.getIncomingValue(i), fromId, toId, moveResolver); - } - } - GlobalLivenessInfo livenessInfo = allocator.getGlobalLivenessInfo(); - int[] locTo = livenessInfo.getBlockIn(toBlock); - for (int i = 0; i < locTo.length; i++) { - TraceInterval interval = allocator.intervalFor(locTo[i]); - addMapping(interval, interval, fromId, toId, moveResolver); - } - - if (moveResolver.hasMappings()) { - resolveFindInsertPos(fromBlock, toBlock, moveResolver); - moveResolver.resolveAndAppendMoves(); - } - } - } - - private boolean containedInTrace(Trace currentTrace, AbstractBlockBase block) { - return currentTrace.getId() == traceBuilderResult.getTraceForBlock(block).getId(); - } - - private static final CounterKey numResolutionMoves = DebugContext.counter("TraceRA[numTraceLSRAResolutionMoves]"); - private static final CounterKey numStackToStackMoves = DebugContext.counter("TraceRA[numTraceLSRAStackToStackMoves]"); - - private void addMapping(Value phiFrom, Value phiTo, int fromId, int toId, TraceLocalMoveResolver moveResolver) { - assert !isRegister(phiFrom) : "Out is a register: " + phiFrom; - assert !isRegister(phiTo) : "In is a register: " + phiTo; - assert !Value.ILLEGAL.equals(phiTo) : "The value not needed in this branch? " + phiFrom; - if (isVirtualStackSlot(phiTo) && isVirtualStackSlot(phiFrom) && phiTo.equals(phiFrom)) { - // no need to handle virtual stack slots - return; - } - TraceInterval toParent = allocator.intervalFor(asVariable(phiTo)); - if (isConstantValue(phiFrom)) { - numResolutionMoves.increment(debug); - TraceInterval toInterval = allocator.splitChildAtOpId(toParent, toId, LIRInstruction.OperandMode.DEF); - moveResolver.addMapping(asConstant(phiFrom), toInterval); - } else { - addMapping(allocator.intervalFor(asVariable(phiFrom)), toParent, fromId, toId, moveResolver); - } - } - - private void addMapping(TraceInterval fromParent, TraceInterval toParent, int fromId, int toId, TraceLocalMoveResolver moveResolver) { - TraceInterval fromInterval = allocator.splitChildAtOpId(fromParent, fromId, LIRInstruction.OperandMode.USE); - TraceInterval toInterval = toParent.getSplitChildAtOpIdOrNull(toId, LIRInstruction.OperandMode.DEF); - if (toInterval == null) { - // not alive - return; - } - if (fromInterval != toInterval) { - numResolutionMoves.increment(debug); - if (isStackSlotValue(toInterval.location()) && isStackSlotValue(fromInterval.location())) { - numStackToStackMoves.increment(debug); - } - moveResolver.addMapping(fromInterval, toInterval); - } - } - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanWalker.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanWalker.java deleted file mode 100644 index 35dcbeb1f8c..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLinearScanWalker.java +++ /dev/null @@ -1,1536 +0,0 @@ -/* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import static jdk.vm.ci.code.CodeUtil.isOdd; -import static jdk.vm.ci.code.ValueUtil.asRegister; -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isVariable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.BitSet; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig.AllocatableRegisters; -import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; -import org.graalvm.compiler.core.common.util.Util; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.LIRValueUtil; -import org.graalvm.compiler.lir.StandardOp.BlockEndOp; -import org.graalvm.compiler.lir.StandardOp.LabelOp; -import org.graalvm.compiler.lir.StandardOp.ValueMoveOp; -import org.graalvm.compiler.lir.alloc.OutOfRegistersException; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceInterval.RegisterPriority; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceInterval.SpillState; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceInterval.State; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; -import org.graalvm.compiler.lir.ssa.SSAUtil; - -import jdk.vm.ci.code.Register; -import jdk.vm.ci.meta.Value; - -/** - */ -final class TraceLinearScanWalker { - - /** - * Adds an interval to a list sorted by {@linkplain FixedInterval#currentFrom() current from} - * positions. - * - * @param list the list - * @param interval the interval to add - * @return the new head of the list - */ - private static FixedInterval addToListSortedByCurrentFromPositions(FixedInterval list, FixedInterval interval) { - FixedInterval prev = null; - FixedInterval cur = list; - while (cur.currentFrom() < interval.currentFrom()) { - prev = cur; - cur = cur.next; - } - FixedInterval result = list; - if (prev == null) { - // add to head of list - result = interval; - } else { - // add before 'cur' - prev.next = interval; - } - interval.next = cur; - return result; - } - - /** - * Adds an interval to a list sorted by {@linkplain TraceInterval#from() current from} - * positions. - * - * @param list the list - * @param interval the interval to add - * @return the new head of the list - */ - private static TraceInterval addToListSortedByFromPositions(TraceInterval list, TraceInterval interval) { - TraceInterval prev = null; - TraceInterval cur = list; - while (cur.from() < interval.from()) { - prev = cur; - cur = cur.next; - } - TraceInterval result = list; - if (prev == null) { - // add to head of list - result = interval; - } else { - // add before 'cur' - prev.next = interval; - } - interval.next = cur; - return result; - } - - /** - * Adds an interval to a list sorted by {@linkplain TraceInterval#from() start} positions and - * {@linkplain TraceInterval#firstUsage(RegisterPriority) first usage} positions. - * - * @param list the list - * @param interval the interval to add - * @return the new head of the list - */ - private static TraceInterval addToListSortedByStartAndUsePositions(TraceInterval list, TraceInterval interval) { - TraceInterval newHead = list; - TraceInterval prev = null; - TraceInterval cur = newHead; - while (cur.from() < interval.from() || (cur.from() == interval.from() && cur.firstUsage(RegisterPriority.None) < interval.firstUsage(RegisterPriority.None))) { - prev = cur; - cur = cur.next; - } - if (prev == null) { - newHead = interval; - } else { - prev.next = interval; - } - interval.next = cur; - return newHead; - } - - /** - * Removes an interval from a list. - * - * @param list the list - * @param interval the interval to remove - * @return the new head of the list - */ - private static TraceInterval removeAny(TraceInterval list, TraceInterval interval) { - TraceInterval newHead = list; - TraceInterval prev = null; - TraceInterval cur = newHead; - while (cur != interval) { - assert cur != null && cur != TraceInterval.EndMarker : "interval has not been found in list: " + interval; - prev = cur; - cur = cur.next; - } - if (prev == null) { - newHead = cur.next; - } else { - prev.next = cur.next; - } - return newHead; - } - - private Register[] availableRegs; - - private final int[] usePos; - private final int[] blockPos; - private final BitSet isInMemory; - - private final ArrayList[] spillIntervals; - - private TraceLocalMoveResolver moveResolver; // for ordering spill moves - - private int minReg; - - private int maxReg; - - private final TraceLinearScan allocator; - private final DebugContext debug; - - /** - * Sorted list of intervals, not live before the current position. - */ - private TraceInterval unhandledAnyList; - - /** - * Sorted list of intervals, live at the current position. - */ - private TraceInterval activeAnyList; - - private FixedInterval activeFixedList; - - /** - * Sorted list of intervals in a life time hole at the current position. - */ - private FixedInterval inactiveFixedList; - - /** - * The current position (intercept point through the intervals). - */ - private int currentPosition; - - /** - * Only 10% of the lists in {@link #spillIntervals} are actually used. But when they are used, - * they can grow quite long. The maximum length observed was 45 (all numbers taken from a - * bootstrap run of Graal). Therefore, we initialize {@link #spillIntervals} with this marker - * value, and allocate a "real" list only on demand in {@link #setUsePos}. - */ - private static final ArrayList EMPTY_LIST = new ArrayList<>(0); - - // accessors mapped to same functions in class LinearScan - private int blockCount() { - return allocator.blockCount(); - } - - private AbstractBlockBase blockAt(int idx) { - return allocator.blockAt(idx); - } - - @SuppressWarnings("unused") - private AbstractBlockBase blockOfOpWithId(int opId) { - return allocator.blockForId(opId); - } - - TraceLinearScanWalker(TraceLinearScan allocator, FixedInterval unhandledFixedFirst, TraceInterval unhandledAnyFirst) { - this.allocator = allocator; - this.debug = allocator.getDebug(); - - unhandledAnyList = unhandledAnyFirst; - activeAnyList = TraceInterval.EndMarker; - activeFixedList = FixedInterval.EndMarker; - // we don't need a separate unhandled list for fixed. - inactiveFixedList = unhandledFixedFirst; - currentPosition = -1; - - moveResolver = allocator.createMoveResolver(); - int numRegs = allocator.getRegisters().size(); - spillIntervals = Util.uncheckedCast(new ArrayList[numRegs]); - for (int i = 0; i < numRegs; i++) { - spillIntervals[i] = EMPTY_LIST; - } - usePos = new int[numRegs]; - blockPos = new int[numRegs]; - isInMemory = new BitSet(numRegs); - } - - private void initUseLists(boolean onlyProcessUsePos) { - for (Register register : availableRegs) { - int i = register.number; - usePos[i] = Integer.MAX_VALUE; - - if (!onlyProcessUsePos) { - blockPos[i] = Integer.MAX_VALUE; - spillIntervals[i].clear(); - isInMemory.clear(i); - } - } - } - - private int maxRegisterNumber() { - return maxReg; - } - - private int minRegisterNumber() { - return minReg; - } - - private boolean isRegisterInRange(int reg) { - return reg >= minRegisterNumber() && reg <= maxRegisterNumber(); - } - - private void excludeFromUse(IntervalHint i) { - Value location = i.location(); - int i1 = asRegister(location).number; - if (isRegisterInRange(i1)) { - usePos[i1] = 0; - } - } - - private void setUsePos(TraceInterval interval, int usePos, boolean onlyProcessUsePos) { - if (usePos != -1) { - assert usePos != 0 : "must use excludeFromUse to set usePos to 0"; - int i = asRegister(interval.location()).number; - if (isRegisterInRange(i)) { - if (this.usePos[i] > usePos) { - this.usePos[i] = usePos; - } - if (!onlyProcessUsePos) { - ArrayList list = spillIntervals[i]; - if (list == EMPTY_LIST) { - list = new ArrayList<>(2); - spillIntervals[i] = list; - } - list.add(interval); - // set is in memory flag - if (interval.inMemoryAt(currentPosition)) { - isInMemory.set(i); - } - } - } - } - } - - private void setUsePos(FixedInterval interval, int usePos, boolean onlyProcessUsePos) { - assert onlyProcessUsePos; - if (usePos != -1) { - assert usePos != 0 : "must use excludeFromUse to set usePos to 0"; - int i = asRegister(interval.location()).number; - if (isRegisterInRange(i)) { - if (this.usePos[i] > usePos) { - this.usePos[i] = usePos; - } - } - } - } - - private void setBlockPos(IntervalHint i, int blockPos) { - if (blockPos != -1) { - int reg = asRegister(i.location()).number; - if (isRegisterInRange(reg)) { - if (this.blockPos[reg] > blockPos) { - this.blockPos[reg] = blockPos; - } - if (usePos[reg] > blockPos) { - usePos[reg] = blockPos; - } - } - } - } - - private void freeExcludeActiveFixed() { - FixedInterval interval = activeFixedList; - while (interval != FixedInterval.EndMarker) { - assert isRegister(interval.location()) : "active interval must have a register assigned"; - excludeFromUse(interval); - interval = interval.next; - } - } - - private void freeExcludeActiveAny() { - TraceInterval interval = activeAnyList; - while (interval != TraceInterval.EndMarker) { - assert isRegister(interval.location()) : "active interval must have a register assigned"; - excludeFromUse(interval); - interval = interval.next; - } - } - - private void freeCollectInactiveFixed(TraceInterval current) { - FixedInterval interval = inactiveFixedList; - while (interval != FixedInterval.EndMarker) { - if (current.to() <= interval.from()) { - assert interval.intersectsAt(current) == -1 : "must not intersect"; - setUsePos(interval, interval.from(), true); - } else { - setUsePos(interval, interval.currentIntersectsAt(current), true); - } - interval = interval.next; - } - } - - private void spillExcludeActiveFixed() { - FixedInterval interval = activeFixedList; - while (interval != FixedInterval.EndMarker) { - excludeFromUse(interval); - interval = interval.next; - } - } - - private void spillBlockInactiveFixed(TraceInterval current) { - FixedInterval interval = inactiveFixedList; - while (interval != FixedInterval.EndMarker) { - if (current.to() > interval.currentFrom()) { - setBlockPos(interval, interval.currentIntersectsAt(current)); - } else { - assert interval.currentIntersectsAt(current) == -1 : "invalid optimization: intervals intersect"; - } - - interval = interval.next; - } - } - - private void spillCollectActiveAny(RegisterPriority registerPriority) { - TraceInterval interval = activeAnyList; - while (interval != TraceInterval.EndMarker) { - setUsePos(interval, Math.min(interval.nextUsage(registerPriority, currentPosition), interval.to()), false); - interval = interval.next; - } - } - - @SuppressWarnings("unused") - private int insertIdAtBasicBlockBoundary(int opId) { - assert allocator.isBlockBegin(opId) : "Not a block begin: " + opId; - assert allocator.instructionForId(opId) instanceof LabelOp; - assert allocator.instructionForId(opId - 2) instanceof BlockEndOp; - - AbstractBlockBase toBlock = allocator.blockForId(opId); - AbstractBlockBase fromBlock = allocator.blockForId(opId - 2); - - if (fromBlock.getSuccessorCount() == 1) { - // insert move in predecessor - return opId - 2; - } - assert toBlock.getPredecessorCount() == 1 : String.format("Critical Edge? %s->%s", fromBlock, toBlock); - // insert move in successor - return opId + 2; - } - - private void insertMove(int operandId, TraceInterval srcIt, TraceInterval dstIt) { - // output all moves here. When source and target are equal, the move is - // optimized away later in assignRegNums - - int opId = (operandId + 1) & ~1; - AbstractBlockBase opBlock = allocator.blockForId(opId); - assert opId > 0 && allocator.blockForId(opId - 2) == opBlock : "cannot insert move at block boundary"; - - // calculate index of instruction inside instruction list of current block - // the minimal index (for a block with no spill moves) can be calculated because the - // numbering of instructions is known. - // When the block already contains spill moves, the index must be increased until the - // correct index is reached. - ArrayList instructions = allocator.getLIR().getLIRforBlock(opBlock); - int index = (opId - instructions.get(0).id()) >> 1; - assert instructions.get(index).id() <= opId : "error in calculation"; - - while (instructions.get(index).id() != opId) { - index++; - assert 0 <= index && index < instructions.size() : "index out of bounds"; - } - assert 1 <= index && index < instructions.size() : "index out of bounds"; - assert instructions.get(index).id() == opId : "error in calculation"; - - // insert new instruction before instruction at position index - moveResolver.moveInsertPosition(instructions, index); - moveResolver.addMapping(srcIt, dstIt); - } - - private int findOptimalSplitPos(AbstractBlockBase minBlock, AbstractBlockBase maxBlock, int maxSplitPos) { - int fromBlockNr = minBlock.getLinearScanNumber(); - int toBlockNr = maxBlock.getLinearScanNumber(); - - assert 0 <= fromBlockNr && fromBlockNr < blockCount() : "out of range"; - assert 0 <= toBlockNr && toBlockNr < blockCount() : "out of range"; - assert fromBlockNr < toBlockNr : "must cross block boundary"; - - // Try to split at end of maxBlock. If this would be after - // maxSplitPos, then use the begin of maxBlock - int optimalSplitPos = allocator.getLastLirInstructionId(maxBlock) + 2; - if (optimalSplitPos > maxSplitPos) { - optimalSplitPos = allocator.getFirstLirInstructionId(maxBlock); - } - - // minimal block frequency - double minFrequency = maxBlock.getRelativeFrequency(); - for (int i = toBlockNr - 1; i >= fromBlockNr; i--) { - AbstractBlockBase cur = blockAt(i); - - if (cur.getRelativeFrequency() < minFrequency) { - // Block with lower frequency found. Split at the end of this block. - minFrequency = cur.getRelativeFrequency(); - optimalSplitPos = allocator.getLastLirInstructionId(cur) + 2; - } - } - assert optimalSplitPos > allocator.maxOpId() || allocator.isBlockBegin(optimalSplitPos) : "algorithm must move split pos to block boundary"; - - return optimalSplitPos; - } - - @SuppressWarnings({"unused"}) - private int findOptimalSplitPos(TraceInterval interval, int minSplitPos, int maxSplitPos, boolean doLoopOptimization) { - int optimalSplitPos = findOptimalSplitPos0(minSplitPos, maxSplitPos); - if (debug.isLogEnabled()) { - debug.log("optimal split position: %d", optimalSplitPos); - } - return optimalSplitPos; - } - - private int findOptimalSplitPos0(int minSplitPos, int maxSplitPos) { - if (minSplitPos == maxSplitPos) { - // trivial case, no optimization of split position possible - if (debug.isLogEnabled()) { - debug.log("min-pos and max-pos are equal, no optimization possible"); - } - return minSplitPos; - - } - assert minSplitPos < maxSplitPos : "must be true then"; - assert minSplitPos > 0 : "cannot access minSplitPos - 1 otherwise"; - - // reason for using minSplitPos - 1: when the minimal split pos is exactly at the - // beginning of a block, then minSplitPos is also a possible split position. - // Use the block before as minBlock, because then minBlock.lastLirInstructionId() + 2 == - // minSplitPos - AbstractBlockBase minBlock = allocator.blockForId(minSplitPos - 1); - - // reason for using maxSplitPos - 1: otherwise there would be an assert on failure - // when an interval ends at the end of the last block of the method - // (in this case, maxSplitPos == allocator().maxLirOpId() + 2, and there is no - // block at this opId) - AbstractBlockBase maxBlock = allocator.blockForId(maxSplitPos - 1); - - assert minBlock.getLinearScanNumber() <= maxBlock.getLinearScanNumber() : "invalid order"; - if (minBlock == maxBlock) { - // split position cannot be moved to block boundary : so split as late as possible - if (debug.isLogEnabled()) { - debug.log("cannot move split pos to block boundary because minPos and maxPos are in same block"); - } - return maxSplitPos; - - } - // seach optimal block boundary between minSplitPos and maxSplitPos - if (debug.isLogEnabled()) { - debug.log("moving split pos to optimal block boundary between block B%d and B%d", minBlock.getId(), maxBlock.getId()); - } - - return findOptimalSplitPos(minBlock, maxBlock, maxSplitPos); - } - - // split an interval at the optimal position between minSplitPos and - // maxSplitPos in two parts: - // 1) the left part has already a location assigned - // 2) the right part is sorted into to the unhandled-list - @SuppressWarnings("try") - private void splitBeforeUsage(TraceInterval interval, int minSplitPos, int maxSplitPos) { - - try (Indent indent = debug.logAndIndent("splitting interval %s between %d and %d", interval, minSplitPos, maxSplitPos)) { - - assert interval.from() < minSplitPos : "cannot split at start of interval"; - assert currentPosition < minSplitPos : "cannot split before current position"; - assert minSplitPos <= maxSplitPos : "invalid order"; - assert maxSplitPos <= interval.to() : "cannot split after end of interval"; - - final int optimalSplitPos = findOptimalSplitPos(interval, minSplitPos, maxSplitPos, true); - - if (optimalSplitPos == interval.to() && interval.nextUsage(RegisterPriority.MustHaveRegister, minSplitPos) == Integer.MAX_VALUE) { - // the split position would be just before the end of the interval - // . no split at all necessary - if (debug.isLogEnabled()) { - debug.log("no split necessary because optimal split position is at end of interval"); - } - return; - } - // must calculate this before the actual split is performed and before split position is - // moved to odd opId - final int optimalSplitPosFinal; - boolean blockBegin = allocator.isBlockBegin(optimalSplitPos); - assert blockBegin || !allocator.isBlockBegin(optimalSplitPos - 1); - boolean moveNecessary = !blockBegin; - if (blockBegin) { - optimalSplitPosFinal = optimalSplitPos; - } else { - // move position before actual instruction (odd opId) - optimalSplitPosFinal = (optimalSplitPos - 1) | 1; - } - - // TODO( je) better define what min split pos max split pos mean. - assert minSplitPos <= optimalSplitPosFinal && optimalSplitPosFinal <= maxSplitPos || minSplitPos == maxSplitPos && optimalSplitPosFinal == minSplitPos - 1 : "out of range"; - assert optimalSplitPosFinal <= interval.to() : "cannot split after end of interval"; - assert optimalSplitPosFinal > interval.from() : "cannot split at start of interval"; - - if (debug.isLogEnabled()) { - debug.log("splitting at position %d", optimalSplitPosFinal); - } - assert optimalSplitPosFinal > currentPosition : "Can not split interval " + interval + " at current position: " + currentPosition; - - assert blockBegin || ((optimalSplitPosFinal & 1) == 1) : "split pos must be odd when not on block boundary"; - assert !blockBegin || ((optimalSplitPosFinal & 1) == 0) : "split pos must be even on block boundary"; - - // TODO (je) duplicate code. try to fold - if (optimalSplitPosFinal == interval.to() && interval.nextUsage(RegisterPriority.MustHaveRegister, minSplitPos) == Integer.MAX_VALUE) { - // the split position would be just before the end of the interval - // . no split at all necessary - if (debug.isLogEnabled()) { - debug.log("no split necessary because optimal split position is at end of interval"); - } - return; - } - TraceInterval splitPart = interval.split(optimalSplitPosFinal, allocator); - - splitPart.setInsertMoveWhenActivated(moveNecessary); - - assert splitPart.from() >= currentPosition : "cannot append new interval before current walk position"; - unhandledAnyList = TraceLinearScanWalker.addToListSortedByStartAndUsePositions(unhandledAnyList, splitPart); - - if (debug.isLogEnabled()) { - debug.log("left interval %s: %s", moveNecessary ? " " : "", interval.logString()); - debug.log("right interval %s: %s", moveNecessary ? "(move)" : "", splitPart.logString()); - } - } - } - - // split an interval at the optimal position between minSplitPos and - // maxSplitPos in two parts: - // 1) the left part has already a location assigned - // 2) the right part is always on the stack and therefore ignored in further processing - @SuppressWarnings("try") - private void splitForSpilling(TraceInterval interval) { - // calculate allowed range of splitting position - int maxSplitPos = currentPosition; - int previousUsage = interval.previousUsage(RegisterPriority.ShouldHaveRegister, maxSplitPos); - if (previousUsage == currentPosition) { - /* - * If there is a usage with ShouldHaveRegister priority at the current position fall - * back to MustHaveRegister priority. This only happens if register priority was - * downgraded to MustHaveRegister in #allocLockedRegister. - */ - previousUsage = interval.previousUsage(RegisterPriority.MustHaveRegister, maxSplitPos); - } - int minSplitPos = Math.max(previousUsage + 1, interval.from()); - - try (Indent indent = debug.logAndIndent("splitting and spilling interval %s between %d and %d", interval, minSplitPos, maxSplitPos)) { - - assert interval.from() <= minSplitPos : "cannot split before start of interval"; - assert minSplitPos <= maxSplitPos : "invalid order"; - assert maxSplitPos < interval.to() : "cannot split at end end of interval"; - assert currentPosition < interval.to() : "interval must not end before current position"; - - if (minSplitPos == interval.from()) { - // the whole interval is never used, so spill it entirely to memory - - try (Indent indent2 = debug.logAndIndent("spilling entire interval because split pos is at beginning of interval (use positions: %d)", interval.numUsePos())) { - - assert interval.firstUsage(RegisterPriority.MustHaveRegister) > currentPosition : String.format("interval %s must not have use position before currentPosition %d", interval, - currentPosition); - - allocator.assignSpillSlot(interval); - handleSpillSlot(interval); - changeSpillState(interval, minSplitPos); - - // Also kick parent intervals out of register to memory when they have no use - // position. This avoids short interval in register surrounded by intervals in - // memory . avoid useless moves from memory to register and back - TraceInterval parent = interval; - while (parent != null && parent.isSplitChild()) { - parent = parent.getSplitChildBeforeOpId(parent.from()); - - if (isRegister(parent.location())) { - if (parent.firstUsage(RegisterPriority.ShouldHaveRegister) == Integer.MAX_VALUE) { - // parent is never used, so kick it out of its assigned register - if (debug.isLogEnabled()) { - debug.log("kicking out interval %d out of its register because it is never used", parent.operandNumber); - } - allocator.assignSpillSlot(parent); - handleSpillSlot(parent); - } else { - // do not go further back because the register is actually used by - // the interval - parent = null; - } - } - } - } - - } else { - // search optimal split pos, split interval and spill only the right hand part - int optimalSplitPos = findOptimalSplitPos(interval, minSplitPos, maxSplitPos, false); - - assert minSplitPos <= optimalSplitPos && optimalSplitPos <= maxSplitPos : "out of range"; - assert optimalSplitPos < interval.to() : "cannot split at end of interval"; - assert optimalSplitPos >= interval.from() : "cannot split before start of interval"; - - if (!allocator.isBlockBegin(optimalSplitPos)) { - // move position before actual instruction (odd opId) - optimalSplitPos = (optimalSplitPos - 1) | 1; - } - - try (Indent indent2 = debug.logAndIndent("splitting at position %d", optimalSplitPos)) { - assert allocator.isBlockBegin(optimalSplitPos) || ((optimalSplitPos & 1) == 1) : "split pos must be odd when not on block boundary"; - assert !allocator.isBlockBegin(optimalSplitPos) || ((optimalSplitPos & 1) == 0) : "split pos must be even on block boundary"; - - TraceInterval spilledPart = interval.split(optimalSplitPos, allocator); - allocator.assignSpillSlot(spilledPart); - handleSpillSlot(spilledPart); - changeSpillState(spilledPart, optimalSplitPos); - - if (!allocator.isBlockBegin(optimalSplitPos)) { - if (debug.isLogEnabled()) { - debug.log("inserting move from interval %s to %s", interval, spilledPart); - } - insertMove(optimalSplitPos, interval, spilledPart); - } else { - if (debug.isLogEnabled()) { - debug.log("no need to insert move. done by data-flow resolution"); - } - } - - // the currentSplitChild is needed later when moves are inserted for reloading - assert spilledPart.currentSplitChild() == interval : "overwriting wrong currentSplitChild"; - spilledPart.makeCurrentSplitChild(); - - if (debug.isLogEnabled()) { - debug.log("left interval: %s", interval.logString()); - debug.log("spilled interval : %s", spilledPart.logString()); - } - } - } - } - } - - /** - * Change spill state of an interval. - * - * Note: called during register allocation. - * - * @param spillPos position of the spill - */ - private void changeSpillState(TraceInterval interval, int spillPos) { - if (TraceLinearScanPhase.Options.LIROptTraceRAEliminateSpillMoves.getValue(allocator.getOptions())) { - switch (interval.spillState()) { - case NoSpillStore: - final int minSpillPos = calculateMinSpillPos(interval.spillDefinitionPos(), spillPos); - final int maxSpillPos = calculateMaxSpillPos(minSpillPos, spillPos); - - final int optimalSpillPos = findOptimalSpillPos(minSpillPos, maxSpillPos); - - /* Cannot spill at block begin since it interferes with move resolution. */ - assert isNotBlockBeginOrMerge(optimalSpillPos) : "Spill pos at block begin: " + optimalSpillPos; - assert !allocator.isBlockEnd(optimalSpillPos) : "Spill pos at block end: " + optimalSpillPos; - assert (optimalSpillPos & 1) == 0 : "Spill pos must be even " + optimalSpillPos; - - interval.setSpillDefinitionPos(optimalSpillPos); - interval.setSpillState(SpillState.SpillStore); - break; - case SpillStore: - case StartInMemory: - case NoOptimization: - case NoDefinitionFound: - // nothing to do - break; - - default: - throw GraalError.shouldNotReachHere("other states not allowed at this time"); - } - } else { - interval.setSpillState(SpillState.NoOptimization); - } - } - - private int calculateMinSpillPos(int spillDefinitionPos, int spillPos) { - int spillDefinitionPosEven = spillDefinitionPos & ~1; - if (spillDefinitionPosEven == 0 || !allocator.isBlockBegin(spillDefinitionPosEven) || spillDefinitionPos == spillPos) { - assert !allocator.isBlockEnd(spillDefinitionPosEven) : "Defintion at block end? " + spillDefinitionPos; - return spillDefinitionPos; - } - assert allocator.isBlockBegin(spillDefinitionPosEven); - if (SSAUtil.isMerge(allocator.blockForId(spillDefinitionPos))) { - /* Spill at merge are OK since there will be no resolution moves. */ - return spillDefinitionPos; - } - int minSpillPos = spillDefinitionPosEven + 2; - while (allocator.isBlockEnd(minSpillPos)) { - // +2 is block begin, +4 is the instruction afterwards - minSpillPos += 4; - } - assert minSpillPos <= spillPos : String.format("No minSpillPos found. defPos: %d, spillPos: %d, minSpillPos, %d", spillDefinitionPos, spillPos, minSpillPos); - return minSpillPos; - } - - private int calculateMaxSpillPos(final int minSpillPos, int spillPos) { - int spillPosEven = spillPos & ~1; - if (spillPosEven == 0) { - return spillPos; - } - if ((minSpillPos & ~1) == spillPosEven) { - assert isNotBlockBeginOrMerge(spillPos); - return spillPos; - } - int maxSpillPos; - /* Move away from block end. */ - if (allocator.isBlockEnd(spillPosEven)) { - /* Block end. Use instruction before. */ - maxSpillPos = spillPosEven - 2; - } else if (allocator.isBlockBegin(spillPosEven)) { - /* Block begin. Use instruction before previous block end. */ - maxSpillPos = spillPosEven - 4; - } else { - return spillPos; - } - assert !allocator.isBlockEnd(maxSpillPos) : "Can no longer be a block end! " + maxSpillPos; - - /* Skip block begins. */ - while (allocator.isBlockBegin(maxSpillPos) && maxSpillPos > minSpillPos) { - // -2 is block end, -4 is the instruction before - maxSpillPos -= 4; - } - assert minSpillPos <= maxSpillPos; - return maxSpillPos; - } - - private boolean isNotBlockBeginOrMerge(int spillPos) { - int spillPosEven = spillPos & ~1; - return spillPosEven == 0 || !allocator.isBlockBegin(spillPosEven) || SSAUtil.isMerge(allocator.blockForId(spillPosEven)); - } - - /** - * @param minSpillPos minimal spill position - * @param maxSpillPos maximal spill position - */ - private int findOptimalSpillPos(int minSpillPos, int maxSpillPos) { - int optimalSpillPos = findOptimalSpillPos0(minSpillPos, maxSpillPos) & (~1); - if (debug.isLogEnabled()) { - debug.log("optimal spill position: %d", optimalSpillPos); - } - return optimalSpillPos; - } - - private int findOptimalSpillPos0(int minSpillPos, int maxSpillPos) { - if (minSpillPos == maxSpillPos) { - // trivial case, no optimization of split position possible - if (debug.isLogEnabled()) { - debug.log("min-pos and max-pos are equal, no optimization possible"); - } - return minSpillPos; - - } - assert minSpillPos < maxSpillPos : "must be true then"; - assert minSpillPos >= 0 : "cannot access minSplitPos - 1 otherwise"; - - AbstractBlockBase minBlock = allocator.blockForId(minSpillPos); - AbstractBlockBase maxBlock = allocator.blockForId(maxSpillPos); - - assert minBlock.getLinearScanNumber() <= maxBlock.getLinearScanNumber() : "invalid order"; - if (minBlock == maxBlock) { - // split position cannot be moved to block boundary : so split as late as possible - if (debug.isLogEnabled()) { - debug.log("cannot move split pos to block boundary because minPos and maxPos are in same block"); - } - return maxSpillPos; - - } - // search optimal block boundary between minSplitPos and maxSplitPos - if (debug.isLogEnabled()) { - debug.log("moving split pos to optimal block boundary between block B%d and B%d", minBlock.getId(), maxBlock.getId()); - } - - // currently using the same heuristic as for splitting - return findOptimalSpillPos(minBlock, maxBlock, maxSpillPos); - } - - private int findOptimalSpillPos(AbstractBlockBase minBlock, AbstractBlockBase maxBlock, int maxSplitPos) { - int fromBlockNr = minBlock.getLinearScanNumber(); - int toBlockNr = maxBlock.getLinearScanNumber(); - - assert 0 <= fromBlockNr && fromBlockNr < blockCount() : "out of range"; - assert 0 <= toBlockNr && toBlockNr < blockCount() : "out of range"; - assert fromBlockNr < toBlockNr : "must cross block boundary"; - - /* - * Try to split at end of maxBlock. We use last instruction -2 because we want to insert the - * move before the block end op. If this would be after maxSplitPos, then use the - * maxSplitPos. - */ - int optimalSplitPos = allocator.getLastLirInstructionId(maxBlock) - 2; - if (optimalSplitPos > maxSplitPos) { - optimalSplitPos = maxSplitPos; - } - - // minimal block frequency - double minFrequency = maxBlock.getRelativeFrequency(); - for (int i = toBlockNr - 1; i >= fromBlockNr; i--) { - AbstractBlockBase cur = blockAt(i); - - if (cur.getRelativeFrequency() < minFrequency) { - // Block with lower frequency found. Split at the end of this block. - int opIdBeforeBlockEnd = allocator.getLastLirInstructionId(cur) - 2; - if (allocator.getLIR().getLIRforBlock(cur).size() > 2) { - minFrequency = cur.getRelativeFrequency(); - optimalSplitPos = opIdBeforeBlockEnd; - } else { - /* - * Skip blocks with only LabelOp and BlockEndOp since they cause move ordering - * problems. - */ - assert allocator.isBlockBegin(opIdBeforeBlockEnd); - } - } - } - assert optimalSplitPos > allocator.maxOpId() || optimalSplitPos == maxSplitPos || allocator.isBlockEnd(optimalSplitPos + 2) : "algorithm must move split pos to block boundary"; - assert !allocator.isBlockBegin(optimalSplitPos); - return optimalSplitPos; - } - - /** - * This is called for every interval that is assigned to a stack slot. - */ - private static void handleSpillSlot(TraceInterval interval) { - assert interval.location() != null && (interval.canMaterialize() || isStackSlotValue(interval.location())) : "interval not assigned to a stack slot " + interval; - // Do nothing. Stack slots are not processed in this implementation. - } - - private void splitStackInterval(TraceInterval interval) { - int minSplitPos = currentPosition + 1; - int maxSplitPos = Math.min(interval.firstUsage(RegisterPriority.ShouldHaveRegister), interval.to()); - - splitBeforeUsage(interval, minSplitPos, maxSplitPos); - } - - private void splitWhenPartialRegisterAvailable(TraceInterval interval, int registerAvailableUntil) { - int minSplitPos = Math.max(interval.previousUsage(RegisterPriority.ShouldHaveRegister, registerAvailableUntil), interval.from() + 1); - splitBeforeUsage(interval, minSplitPos, registerAvailableUntil); - } - - private void splitAndSpillInterval(TraceInterval interval) { - int currentPos = currentPosition; - /* - * Search the position where the interval must have a register and split at the optimal - * position before. The new created part is added to the unhandled list and will get a - * register when it is activated. - */ - int minSplitPos = currentPos + 1; - int maxSplitPos = interval.nextUsage(RegisterPriority.MustHaveRegister, minSplitPos); - - if (maxSplitPos <= interval.to()) { - splitBeforeUsage(interval, minSplitPos, maxSplitPos); - } else { - debug.log("No more usage, no need to split: %s", interval); - } - - assert interval.nextUsage(RegisterPriority.MustHaveRegister, currentPos) == Integer.MAX_VALUE : "the remaining part is spilled to stack and therefore has no register"; - splitForSpilling(interval); - } - - @SuppressWarnings("try") - private boolean allocFreeRegister(TraceInterval interval) { - try (Indent indent = debug.logAndIndent("trying to find free register for %s", interval)) { - - initUseLists(true); - freeExcludeActiveFixed(); - freeCollectInactiveFixed(interval); - freeExcludeActiveAny(); - // freeCollectUnhandled(fixedKind, cur); - - // usePos contains the start of the next interval that has this register assigned - // (either as a fixed register or a normal allocated register in the past) - // only intervals overlapping with cur are processed, non-overlapping invervals can be - // ignored safely - if (debug.isLogEnabled()) { - // Enable this logging to see all register states - try (Indent indent2 = debug.logAndIndent("state of registers:")) { - for (Register register : availableRegs) { - int i = register.number; - debug.log("reg %d (%s): usePos: %d", register.number, register, usePos[i]); - } - } - } - - Register hint = null; - IntervalHint locationHint = interval.locationHint(true); - if (locationHint != null && locationHint.location() != null && isRegister(locationHint.location())) { - hint = asRegister(locationHint.location()); - if (debug.isLogEnabled()) { - debug.log("hint register %3d (%4s) from interval %s", hint.number, hint, locationHint); - } - } - assert interval.location() == null : "register already assigned to interval"; - - // the register must be free at least until this position - int regNeededUntil = interval.from() + 1; - int intervalTo = interval.to(); - - boolean needSplit = false; - int splitPos = -1; - - Register reg = null; - Register minFullReg = null; - Register maxPartialReg = null; - - for (Register availableReg : availableRegs) { - int number = availableReg.number; - if (usePos[number] >= intervalTo) { - // this register is free for the full interval - if (minFullReg == null || availableReg.equals(hint) || (usePos[number] < usePos[minFullReg.number] && !minFullReg.equals(hint))) { - minFullReg = availableReg; - } - } else if (usePos[number] > regNeededUntil) { - // this register is at least free until regNeededUntil - if (maxPartialReg == null || availableReg.equals(hint) || (usePos[number] > usePos[maxPartialReg.number] && !maxPartialReg.equals(hint))) { - maxPartialReg = availableReg; - } - } - } - - if (minFullReg != null) { - reg = minFullReg; - } else if (maxPartialReg != null) { - needSplit = true; - reg = maxPartialReg; - } else { - return false; - } - - splitPos = usePos[reg.number]; - interval.assignLocation(reg.asValue(allocator.getKind(interval))); - if (debug.isLogEnabled()) { - debug.log("selected register %d (%s)", reg.number, reg); - } - - assert splitPos > 0 : "invalid splitPos"; - if (needSplit) { - // register not available for full interval, so split it - splitWhenPartialRegisterAvailable(interval, splitPos); - } - // only return true if interval is completely assigned - return true; - } - } - - private void splitAndSpillIntersectingIntervals(Register reg) { - assert reg != null : "no register assigned"; - - for (int i = 0; i < spillIntervals[reg.number].size(); i++) { - TraceInterval interval = spillIntervals[reg.number].get(i); - removeFromList(interval); - splitAndSpillInterval(interval); - } - } - - // Split an Interval and spill it to memory so that cur can be placed in a register - @SuppressWarnings("try") - private void allocLockedRegister(TraceInterval interval) { - try (Indent indent = debug.logAndIndent("alloc locked register: need to split and spill to get register for %s", interval)) { - - // the register must be free at least until this position - int firstUsage = interval.firstUsage(RegisterPriority.MustHaveRegister); - int firstShouldHaveUsage = interval.firstUsage(RegisterPriority.ShouldHaveRegister); - int regNeededUntil = Math.min(firstUsage, interval.from() + 1); - int intervalTo = interval.to(); - assert regNeededUntil >= 0 && regNeededUntil < Integer.MAX_VALUE : "interval has no use"; - - Register reg; - Register ignore; - /* - * In the common case we don't spill registers that have _any_ use position that is - * closer than the next use of the current interval, but if we can't spill the current - * interval we weaken this strategy and also allow spilling of intervals that have a - * non-mandatory requirements (no MustHaveRegister use position). - */ - for (RegisterPriority registerPriority = RegisterPriority.LiveAtLoopEnd; true; registerPriority = RegisterPriority.MustHaveRegister) { - // collect current usage of registers - initUseLists(false); - spillExcludeActiveFixed(); - // spillBlockUnhandledFixed(cur); - spillBlockInactiveFixed(interval); - spillCollectActiveAny(registerPriority); - if (debug.isLogEnabled()) { - printRegisterState(); - } - - reg = null; - ignore = interval.location() != null && isRegister(interval.location()) ? asRegister(interval.location()) : null; - - for (Register availableReg : availableRegs) { - int number = availableReg.number; - if (availableReg.equals(ignore)) { - // this register must be ignored - } else if (usePos[number] > regNeededUntil) { - /* - * If the use position is the same, prefer registers (active intervals) - * where the value is already on the stack. - */ - if (reg == null || (usePos[number] > usePos[reg.number]) || (usePos[number] == usePos[reg.number] && (!isInMemory.get(reg.number) && isInMemory.get(number)))) { - reg = availableReg; - } - } - } - - if (debug.isLogEnabled()) { - debug.log("Register Selected: %s", reg); - } - - int regUsePos = (reg == null ? 0 : usePos[reg.number]); - if (regUsePos <= firstShouldHaveUsage) { - /* Check if there is another interval that is already in memory. */ - if (reg == null || interval.inMemoryAt(currentPosition) || !isInMemory.get(reg.number)) { - if (debug.isLogEnabled()) { - debug.log("able to spill current interval. firstUsage(register): %d, usePos: %d", firstUsage, regUsePos); - } - - if (firstUsage <= interval.from() + 1) { - if (registerPriority.equals(RegisterPriority.LiveAtLoopEnd)) { - /* - * Tool of last resort: we can not spill the current interval so we - * try to spill an active interval that has a usage but do not - * require a register. - */ - debug.log("retry with register priority must have register"); - continue; - } - String description = "cannot spill interval (" + interval + ") that is used in first instruction (possible reason: no register found) firstUsage=" + firstUsage + - ", interval.from()=" + interval.from() + "; already used candidates: " + Arrays.toString(availableRegs); - /* - * assign a reasonable register and do a bailout in product mode to - * avoid errors - */ - allocator.assignSpillSlot(interval); - if (debug.isDumpEnabled(DebugContext.INFO_LEVEL)) { - dumpLIRAndIntervals(description); - } - throw new OutOfRegistersException("LinearScan: no register found", description); - } - - splitAndSpillInterval(interval); - return; - } - } - // common case: break out of the loop - break; - } - - boolean needSplit = blockPos[reg.number] <= intervalTo; - - int splitPos = blockPos[reg.number]; - - if (debug.isLogEnabled()) { - debug.log("decided to use register %d", reg.number); - } - assert splitPos > 0 : "invalid splitPos"; - assert needSplit || splitPos > interval.from() : "splitting interval at from"; - - interval.assignLocation(reg.asValue(allocator.getKind(interval))); - if (needSplit) { - // register not available for full interval : so split it - splitWhenPartialRegisterAvailable(interval, splitPos); - } - - // perform splitting and spilling for all affected intervals - splitAndSpillIntersectingIntervals(reg); - return; - } - } - - private void dumpLIRAndIntervals(String description) { - debug.dump(DebugContext.INFO_LEVEL, allocator.getLIR(), description); - allocator.printIntervals(description); - } - - @SuppressWarnings("try") - private void printRegisterState() { - try (Indent indent2 = debug.logAndIndent("state of registers:")) { - for (Register reg : availableRegs) { - int i = reg.number; - try (Indent indent3 = debug.logAndIndent("reg %d: usePos: %d, blockPos: %d, inMemory: %b, intervals: ", i, usePos[i], blockPos[i], isInMemory.get(i))) { - for (int j = 0; j < spillIntervals[i].size(); j++) { - debug.log("%s", spillIntervals[i].get(j)); - } - } - } - } - } - - private boolean noAllocationPossible(TraceInterval interval) { - if (allocator.callKillsRegisters()) { - // fast calculation of intervals that can never get a register because the - // the next instruction is a call that blocks all registers - // Note: this only works if a call kills all registers - - // check if this interval is the result of a split operation - // (an interval got a register until this position) - int pos = interval.from(); - if (isOdd(pos)) { - // the current instruction is a call that blocks all registers - if (pos < allocator.maxOpId() && allocator.hasCall(pos + 1) && interval.to() > pos + 1) { - if (debug.isLogEnabled()) { - debug.log("free register cannot be available because all registers blocked by following call"); - } - - // safety check that there is really no register available - assert !allocFreeRegister(interval) : "found a register for this interval"; - return true; - } - } - } - return false; - } - - private void initVarsForAlloc(TraceInterval interval) { - AllocatableRegisters allocatableRegisters = allocator.getRegisterAllocationConfig().getAllocatableRegisters(allocator.getKind(interval).getPlatformKind()); - availableRegs = allocatableRegisters.allocatableRegisters; - minReg = allocatableRegisters.minRegisterNumber; - maxReg = allocatableRegisters.maxRegisterNumber; - } - - private static boolean isMove(LIRInstruction op, TraceInterval from, TraceInterval to) { - if (ValueMoveOp.isValueMoveOp(op)) { - ValueMoveOp move = ValueMoveOp.asValueMoveOp(op); - if (isVariable(move.getInput()) && isVariable(move.getResult())) { - return move.getInput() != null && LIRValueUtil.asVariable(move.getInput()).index == from.operandNumber && move.getResult() != null && - LIRValueUtil.asVariable(move.getResult()).index == to.operandNumber; - } - } - return false; - } - - // optimization (especially for phi functions of nested loops): - // assign same spill slot to non-intersecting intervals - private void combineSpilledIntervals(TraceInterval interval) { - if (interval.isSplitChild()) { - // optimization is only suitable for split parents - return; - } - - IntervalHint locationHint = interval.locationHint(false); - if (locationHint == null || !(locationHint instanceof TraceInterval)) { - return; - } - TraceInterval registerHint = (TraceInterval) locationHint; - assert registerHint.isSplitParent() : "register hint must be split parent"; - - if (interval.spillState() != SpillState.NoOptimization || registerHint.spillState() != SpillState.NoOptimization) { - // combining the stack slots for intervals where spill move optimization is applied - // is not benefitial and would cause problems - return; - } - - int beginPos = interval.from(); - int endPos = interval.to(); - if (endPos > allocator.maxOpId() || isOdd(beginPos) || isOdd(endPos)) { - // safety check that lirOpWithId is allowed - return; - } - - if (!isMove(allocator.instructionForId(beginPos), registerHint, interval) || !isMove(allocator.instructionForId(endPos), interval, registerHint)) { - // cur and registerHint are not connected with two moves - return; - } - - TraceInterval beginHint = registerHint.getSplitChildAtOpId(beginPos, LIRInstruction.OperandMode.USE); - TraceInterval endHint = registerHint.getSplitChildAtOpId(endPos, LIRInstruction.OperandMode.DEF); - if (beginHint == endHint || beginHint.to() != beginPos || endHint.from() != endPos) { - // registerHint must be split : otherwise the re-writing of use positions does not work - return; - } - - assert beginHint.location() != null : "must have register assigned"; - assert endHint.location() == null : "must not have register assigned"; - assert interval.firstUsage(RegisterPriority.MustHaveRegister) == beginPos : "must have use position at begin of interval because of move"; - assert endHint.firstUsage(RegisterPriority.MustHaveRegister) == endPos : "must have use position at begin of interval because of move"; - - if (isRegister(beginHint.location())) { - // registerHint is not spilled at beginPos : so it would not be benefitial to - // immediately spill cur - return; - } - assert registerHint.spillSlot() != null : "must be set when part of interval was spilled"; - - // modify intervals such that cur gets the same stack slot as registerHint - // delete use positions to prevent the intervals to get a register at beginning - interval.setSpillSlot(registerHint.spillSlot()); - interval.removeFirstUsePos(); - endHint.removeFirstUsePos(); - } - - // allocate a physical register or memory location to an interval - @SuppressWarnings("try") - private boolean activateCurrent(TraceInterval interval) { - if (debug.isLogEnabled()) { - logCurrentStatus(); - } - boolean result = true; - - try (Indent indent = debug.logAndIndent("activating interval %s, splitParent: %d", interval, interval.splitParent().operandNumber)) { - - if (interval.location() != null && isStackSlotValue(interval.location())) { - // activating an interval that has a stack slot assigned . split it at first use - // position - // used for method parameters - if (debug.isLogEnabled()) { - debug.log("interval has spill slot assigned (method parameter) . split it before first use"); - } - splitStackInterval(interval); - result = false; - - } else { - if (interval.location() == null) { - // interval has not assigned register . normal allocation - // (this is the normal case for most intervals) - if (debug.isLogEnabled()) { - debug.log("normal allocation of register"); - } - - // assign same spill slot to non-intersecting intervals - combineSpilledIntervals(interval); - - initVarsForAlloc(interval); - if (noAllocationPossible(interval) || !allocFreeRegister(interval)) { - // no empty register available. - // split and spill another interval so that this interval gets a register - allocLockedRegister(interval); - } - - // spilled intervals need not be move to active-list - if (!isRegister(interval.location())) { - result = false; - } - } - } - - // load spilled values that become active from stack slot to register - if (interval.insertMoveWhenActivated()) { - assert interval.isSplitChild(); - assert interval.currentSplitChild() != null; - assert interval.currentSplitChild().operandNumber != interval.operandNumber : "cannot insert move between same interval"; - if (debug.isLogEnabled()) { - debug.log("Inserting move from interval %d to %d because insertMoveWhenActivated is set", interval.currentSplitChild().operandNumber, interval.operandNumber); - } - - insertMove(interval.from(), interval.currentSplitChild(), interval); - } - interval.makeCurrentSplitChild(); - - } - - return result; // true = interval is moved to active list - } - - void finishAllocation() { - // must be called when all intervals are allocated - moveResolver.resolveAndAppendMoves(); - } - - @SuppressWarnings("try") - private void logCurrentStatus() { - try (Indent i = debug.logAndIndent("active:")) { - logList(debug, activeFixedList); - logList(debug, activeAnyList); - } - try (Indent i = debug.logAndIndent("inactive(fixed):")) { - logList(debug, inactiveFixedList); - } - } - - void walk() { - walkTo(Integer.MAX_VALUE); - } - - private void removeFromList(TraceInterval interval) { - activeAnyList = TraceLinearScanWalker.removeAny(activeAnyList, interval); - } - - /** - * Walks up to {@code from} and updates the state of {@link FixedInterval fixed intervals}. - * - * Fixed intervals can switch back and forth between the states {@link State#Active} and - * {@link State#Inactive} (and eventually to {@link State#Handled} but handled intervals are not - * managed). - */ - @SuppressWarnings("try") - private void walkToFixed(State state, int from) { - assert state == State.Active || state == State.Inactive : "wrong state"; - FixedInterval prevprev = null; - FixedInterval prev = (state == State.Active) ? activeFixedList : inactiveFixedList; - FixedInterval next = prev; - if (debug.isLogEnabled()) { - try (Indent i = debug.logAndIndent("walkToFixed(%s, %d):", state, from)) { - logList(debug, next); - } - } - while (next.currentFrom() <= from) { - FixedInterval cur = next; - next = cur.next; - - boolean rangeHasChanged = false; - while (cur.currentTo() <= from) { - cur.nextRange(); - rangeHasChanged = true; - } - - // also handle move from inactive list to active list - rangeHasChanged = rangeHasChanged || (state == State.Inactive && cur.currentFrom() <= from); - - if (rangeHasChanged) { - // remove cur from list - if (prevprev == null) { - if (state == State.Active) { - activeFixedList = next; - } else { - inactiveFixedList = next; - } - } else { - prevprev.next = next; - } - prev = next; - TraceInterval.State newState; - if (cur.currentAtEnd()) { - // move to handled state (not maintained as a list) - newState = State.Handled; - } else { - if (cur.currentFrom() <= from) { - // sort into active list - activeFixedList = TraceLinearScanWalker.addToListSortedByCurrentFromPositions(activeFixedList, cur); - newState = State.Active; - } else { - // sort into inactive list - inactiveFixedList = TraceLinearScanWalker.addToListSortedByCurrentFromPositions(inactiveFixedList, cur); - newState = State.Inactive; - } - if (prev == cur) { - assert state == newState; - prevprev = prev; - prev = cur.next; - } - } - intervalMoved(debug, cur, state, newState); - } else { - prevprev = prev; - prev = cur.next; - } - } - } - - /** - * Walks up to {@code from} and updates the state of {@link TraceInterval intervals}. - * - * Trace intervals can switch once from {@link State#Unhandled} to {@link State#Active} and then - * to {@link State#Handled} but handled intervals are not managed. - */ - @SuppressWarnings("try") - private void walkToAny(int from) { - TraceInterval prevprev = null; - TraceInterval prev = activeAnyList; - TraceInterval next = prev; - if (debug.isLogEnabled()) { - try (Indent i = debug.logAndIndent("walkToAny(%d):", from)) { - logList(debug, next); - } - } - while (next.from() <= from) { - TraceInterval cur = next; - next = cur.next; - - if (cur.to() <= from) { - // remove cur from list - if (prevprev == null) { - activeAnyList = next; - } else { - prevprev.next = next; - } - intervalMoved(debug, cur, State.Active, State.Handled); - } else { - prevprev = prev; - } - prev = next; - } - } - - /** - * Get the next interval from {@linkplain #unhandledAnyList} which starts before or at - * {@code toOpId}. The returned interval is removed. - * - * @postcondition all intervals in {@linkplain #unhandledAnyList} start after {@code toOpId}. - * - * @return The next interval or null if there is no {@linkplain #unhandledAnyList unhandled} - * interval at position {@code toOpId}. - */ - private TraceInterval nextInterval(int toOpId) { - TraceInterval any = unhandledAnyList; - - if (any != TraceInterval.EndMarker) { - TraceInterval currentInterval = unhandledAnyList; - if (toOpId < currentInterval.from()) { - return null; - } - - unhandledAnyList = currentInterval.next; - currentInterval.next = TraceInterval.EndMarker; - return currentInterval; - } - return null; - - } - - /** - * Walk up to {@code toOpId}. - * - * @postcondition {@link #currentPosition} is set to {@code toOpId}, {@link #activeFixedList} - * and {@link #inactiveFixedList} are populated. - */ - @SuppressWarnings("try") - private void walkTo(int toOpId) { - assert currentPosition <= toOpId : "can not walk backwards"; - for (TraceInterval currentInterval = nextInterval(toOpId); currentInterval != null; currentInterval = nextInterval(toOpId)) { - int opId = currentInterval.from(); - - // set currentPosition prior to call of walkTo - currentPosition = opId; - - // update unhandled stack intervals - // updateUnhandledStackIntervals(opId); - - // call walkTo even if currentPosition == id - walkToFixed(State.Active, opId); - walkToFixed(State.Inactive, opId); - walkToAny(opId); - - try (Indent indent = debug.logAndIndent("walk to op %d", opId)) { - if (activateCurrent(currentInterval)) { - activeAnyList = TraceLinearScanWalker.addToListSortedByFromPositions(activeAnyList, currentInterval); - intervalMoved(debug, currentInterval, State.Unhandled, State.Active); - } - } - } - // set currentPosition prior to call of walkTo - currentPosition = toOpId; - - if (currentPosition <= allocator.maxOpId()) { - // update unhandled stack intervals - // updateUnhandledStackIntervals(toOpId); - - // call walkTo if still in range - walkToFixed(State.Active, toOpId); - walkToFixed(State.Inactive, toOpId); - walkToAny(toOpId); - } - } - - private static void logList(DebugContext debug, FixedInterval i) { - for (FixedInterval interval = i; interval != FixedInterval.EndMarker; interval = interval.next) { - debug.log("%s", interval.logString()); - } - } - - private static void logList(DebugContext debug, TraceInterval i) { - for (TraceInterval interval = i; interval != TraceInterval.EndMarker; interval = interval.next) { - debug.log("%s", interval.logString()); - } - } - - private static void intervalMoved(DebugContext debug, IntervalHint interval, State from, State to) { - // intervalMoved() is called whenever an interval moves from one interval list to another. - // In the implementation of this method it is prohibited to move the interval to any list. - if (debug.isLogEnabled()) { - debug.log("interval moved from %s to %s: %s", from, to, interval.logString()); - } - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLocalMoveResolver.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLocalMoveResolver.java deleted file mode 100644 index ba42178e2da..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/lsra/TraceLocalMoveResolver.java +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.lir.alloc.trace.lsra; - -import static jdk.vm.ci.code.ValueUtil.asRegister; -import static jdk.vm.ci.code.ValueUtil.asStackSlot; -import static jdk.vm.ci.code.ValueUtil.isIllegal; -import static jdk.vm.ci.code.ValueUtil.isRegister; -import static jdk.vm.ci.code.ValueUtil.isStackSlot; -import static org.graalvm.compiler.lir.LIRValueUtil.asVirtualStackSlot; -import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue; -import static org.graalvm.compiler.lir.LIRValueUtil.isVirtualStackSlot; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; - -import org.graalvm.compiler.core.common.LIRKind; -import org.graalvm.compiler.debug.CounterKey; -import org.graalvm.compiler.debug.DebugContext; -import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.debug.Indent; -import org.graalvm.compiler.lir.LIRInsertionBuffer; -import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.VirtualStackSlot; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; -import org.graalvm.compiler.lir.framemap.FrameMap; -import org.graalvm.compiler.lir.framemap.FrameMapBuilderTool; - -import jdk.vm.ci.code.StackSlot; -import jdk.vm.ci.meta.AllocatableValue; -import jdk.vm.ci.meta.Constant; -import jdk.vm.ci.meta.JavaConstant; -import jdk.vm.ci.meta.Value; - -final class TraceLocalMoveResolver { - - private static final CounterKey cycleBreakingSlotsAllocated = DebugContext.counter("TraceRA[cycleBreakingSlotsAllocated(local)]"); - - private static final int STACK_SLOT_IN_CALLER_FRAME_IDX = -1; - private final TraceLinearScan allocator; - - private int insertIdx; - private LIRInsertionBuffer insertionBuffer; // buffer where moves are inserted - - private final ArrayList mappingFrom; - private final ArrayList mappingFromOpr; - private final ArrayList mappingTo; - private final int[] registerBlocked; - - private int[] stackBlocked; - private final int firstVirtualStackIndex; - - private final DebugContext debug; - - private int getStackArrayIndex(Value stackSlotValue) { - if (isStackSlot(stackSlotValue)) { - return getStackArrayIndex(asStackSlot(stackSlotValue)); - } - if (isVirtualStackSlot(stackSlotValue)) { - return getStackArrayIndex(asVirtualStackSlot(stackSlotValue)); - } - throw GraalError.shouldNotReachHere("value is not a stack slot: " + stackSlotValue); - } - - private int getStackArrayIndex(StackSlot stackSlot) { - int stackIdx; - if (stackSlot.isInCallerFrame()) { - // incoming stack arguments can be ignored - stackIdx = STACK_SLOT_IN_CALLER_FRAME_IDX; - } else { - assert stackSlot.getRawAddFrameSize() : "Unexpected stack slot: " + stackSlot; - int offset = -stackSlot.getRawOffset(); - assert 0 <= offset && offset < firstVirtualStackIndex : String.format("Wrong stack slot offset: %d (first virtual stack slot index: %d", offset, firstVirtualStackIndex); - stackIdx = offset; - } - return stackIdx; - } - - private int getStackArrayIndex(VirtualStackSlot virtualStackSlot) { - return firstVirtualStackIndex + virtualStackSlot.getId(); - } - - protected void setValueBlocked(Value location, int direction) { - assert direction == 1 || direction == -1 : "out of bounds"; - if (isStackSlotValue(location)) { - int stackIdx = getStackArrayIndex(location); - if (stackIdx == STACK_SLOT_IN_CALLER_FRAME_IDX) { - // incoming stack arguments can be ignored - return; - } - if (stackIdx >= stackBlocked.length) { - stackBlocked = Arrays.copyOf(stackBlocked, stackIdx + 1); - } - stackBlocked[stackIdx] += direction; - } else { - assert direction == 1 || direction == -1 : "out of bounds"; - if (isRegister(location)) { - registerBlocked[asRegister(location).number] += direction; - } else { - throw GraalError.shouldNotReachHere("unhandled value " + location); - } - } - } - - protected TraceInterval getMappingFrom(int i) { - return mappingFrom.get(i); - } - - protected int mappingFromSize() { - return mappingFrom.size(); - } - - protected int valueBlocked(Value location) { - if (isStackSlotValue(location)) { - int stackIdx = getStackArrayIndex(location); - if (stackIdx == STACK_SLOT_IN_CALLER_FRAME_IDX) { - // incoming stack arguments are always blocked (aka they can not be written) - return 1; - } - if (stackIdx >= stackBlocked.length) { - return 0; - } - return stackBlocked[stackIdx]; - } - if (isRegister(location)) { - return registerBlocked[asRegister(location).number]; - } - throw GraalError.shouldNotReachHere("unhandled value " + location); - } - - /* - * TODO (je) remove? - */ - protected static boolean areMultipleReadsAllowed() { - return true; - } - - boolean hasMappings() { - return mappingFrom.size() > 0; - } - - protected TraceLinearScan getAllocator() { - return allocator; - } - - protected TraceLocalMoveResolver(TraceLinearScan allocator) { - - this.allocator = allocator; - this.debug = allocator.getDebug(); - this.mappingFrom = new ArrayList<>(8); - this.mappingFromOpr = new ArrayList<>(8); - this.mappingTo = new ArrayList<>(8); - this.insertIdx = -1; - this.insertionBuffer = new LIRInsertionBuffer(); - this.registerBlocked = new int[allocator.getRegisters().size()]; - FrameMapBuilderTool frameMapBuilderTool = (FrameMapBuilderTool) allocator.getFrameMapBuilder(); - FrameMap frameMap = frameMapBuilderTool.getFrameMap(); - this.stackBlocked = new int[frameMapBuilderTool.getNumberOfStackSlots()]; - this.firstVirtualStackIndex = !frameMap.frameNeedsAllocating() ? 0 : frameMap.currentFrameSize() + 1; - } - - protected boolean checkEmpty() { - assert mappingFrom.size() == 0 && mappingFromOpr.size() == 0 && mappingTo.size() == 0 : "list must be empty before and after processing"; - for (int i = 0; i < stackBlocked.length; i++) { - assert stackBlocked[i] == 0 : "stack map must be empty before and after processing"; - } - for (int i = 0; i < getAllocator().getRegisters().size(); i++) { - assert registerBlocked[i] == 0 : "register map must be empty before and after processing"; - } - checkMultipleReads(); - return true; - } - - protected void checkMultipleReads() { - // multiple reads are allowed in SSA LSRA - } - - private boolean verifyBeforeResolve() { - assert mappingFrom.size() == mappingFromOpr.size() : "length must be equal"; - assert mappingFrom.size() == mappingTo.size() : "length must be equal"; - assert insertIdx != -1 : "insert position not set"; - - int i; - int j; - if (!areMultipleReadsAllowed()) { - for (i = 0; i < mappingFrom.size(); i++) { - for (j = i + 1; j < mappingFrom.size(); j++) { - assert mappingFrom.get(i) == null || mappingFrom.get(i) != mappingFrom.get(j) : "cannot read from same interval twice"; - } - } - } - - for (i = 0; i < mappingTo.size(); i++) { - for (j = i + 1; j < mappingTo.size(); j++) { - assert mappingTo.get(i) != mappingTo.get(j) : "cannot write to same interval twice"; - } - } - - HashSet usedRegs = new HashSet<>(); - if (!areMultipleReadsAllowed()) { - for (i = 0; i < mappingFrom.size(); i++) { - TraceInterval interval = mappingFrom.get(i); - if (interval != null && !isIllegal(interval.location())) { - boolean unique = usedRegs.add(interval.location()); - assert unique : "cannot read from same register twice"; - } - } - } - - usedRegs.clear(); - for (i = 0; i < mappingTo.size(); i++) { - TraceInterval interval = mappingTo.get(i); - if (isIllegal(interval.location())) { - // After insertion the location may become illegal, so don't check it since multiple - // intervals might be illegal. - continue; - } - boolean unique = usedRegs.add(interval.location()); - assert unique : "cannot write to same register twice"; - } - - verifyStackSlotMapping(); - - return true; - } - - protected void verifyStackSlotMapping() { - // relax disjoint stack maps invariant - } - - // mark assignedReg and assignedRegHi of the interval as blocked - private void blockRegisters(TraceInterval interval) { - Value location = interval.location(); - if (mightBeBlocked(location)) { - assert areMultipleReadsAllowed() || valueBlocked(location) == 0 : "location already marked as used: " + location; - int direction = 1; - setValueBlocked(location, direction); - debug.log("block %s", location); - } - } - - // mark assignedReg and assignedRegHi of the interval as unblocked - private void unblockRegisters(TraceInterval interval) { - Value location = interval.location(); - if (mightBeBlocked(location)) { - assert valueBlocked(location) > 0 : "location already marked as unused: " + location; - setValueBlocked(location, -1); - debug.log("unblock %s", location); - } - } - - /** - * Checks if the {@linkplain TraceInterval#location() location} of {@code to} is not blocked or - * is only blocked by {@code from}. - */ - private boolean safeToProcessMove(TraceInterval from, TraceInterval to) { - Value fromReg = from != null ? from.location() : null; - - Value location = to.location(); - if (mightBeBlocked(location)) { - if ((valueBlocked(location) > 1 || (valueBlocked(location) == 1 && !isMoveToSelf(fromReg, location)))) { - return false; - } - } - - return true; - } - - protected static boolean isMoveToSelf(Value from, Value to) { - assert to != null; - if (to.equals(from)) { - return true; - } - if (from != null && isRegister(from) && isRegister(to) && asRegister(from).equals(asRegister(to))) { - return true; - } - return false; - } - - protected static boolean mightBeBlocked(Value location) { - if (isRegister(location)) { - return true; - } - if (isStackSlotValue(location)) { - return true; - } - return false; - } - - private void createInsertionBuffer(List list) { - assert !insertionBuffer.initialized() : "overwriting existing buffer"; - insertionBuffer.init(list); - } - - private void appendInsertionBuffer() { - if (insertionBuffer.initialized()) { - insertionBuffer.finish(); - } - assert !insertionBuffer.initialized() : "must be uninitialized now"; - - insertIdx = -1; - } - - private void insertMove(TraceInterval fromInterval, TraceInterval toInterval) { - assert fromInterval.operandNumber != toInterval.operandNumber : "from and to interval equal: " + fromInterval; - assert LIRKind.verifyMoveKinds(allocator.getKind(toInterval), allocator.getKind(fromInterval), allocator.getRegisterAllocationConfig()) : "move between different types"; - assert insertIdx != -1 : "must setup insert position first"; - - insertionBuffer.append(insertIdx, createMove(allocator.getOperand(fromInterval), allocator.getOperand(toInterval), fromInterval.location(), toInterval.location())); - - if (debug.isLogEnabled()) { - debug.log("insert move from %s to %s at %d", fromInterval, toInterval, insertIdx); - } - } - - /** - * @param fromOpr {@link TraceInterval operand} of the {@code from} interval - * @param toOpr {@link TraceInterval operand} of the {@code to} interval - * @param fromLocation {@link TraceInterval#location() location} of the {@code to} interval - * @param toLocation {@link TraceInterval#location() location} of the {@code to} interval - */ - protected LIRInstruction createMove(AllocatableValue fromOpr, AllocatableValue toOpr, AllocatableValue fromLocation, AllocatableValue toLocation) { - if (isStackSlotValue(toLocation) && isStackSlotValue(fromLocation)) { - return getAllocator().getSpillMoveFactory().createStackMove(toOpr, fromOpr); - } - return getAllocator().getSpillMoveFactory().createMove(toOpr, fromOpr); - } - - private void insertMove(Constant fromOpr, TraceInterval toInterval) { - assert insertIdx != -1 : "must setup insert position first"; - - AllocatableValue toOpr = allocator.getOperand(toInterval); - LIRInstruction move = getAllocator().getSpillMoveFactory().createLoad(toOpr, fromOpr); - insertionBuffer.append(insertIdx, move); - - if (debug.isLogEnabled()) { - debug.log("insert move from value %s to %s at %d", fromOpr, toInterval, insertIdx); - } - } - - @SuppressWarnings("try") - private void resolveMappings() { - try (Indent indent = debug.logAndIndent("resolveMapping")) { - assert verifyBeforeResolve(); - if (debug.isLogEnabled()) { - printMapping(); - } - - // Block all registers that are used as input operands of a move. - // When a register is blocked, no move to this register is emitted. - // This is necessary for detecting cycles in moves. - int i; - for (i = mappingFrom.size() - 1; i >= 0; i--) { - TraceInterval fromInterval = mappingFrom.get(i); - if (fromInterval != null) { - blockRegisters(fromInterval); - } - } - - ArrayList busySpillSlots = null; - while (mappingFrom.size() > 0) { - boolean processedInterval = false; - - int spillCandidate = -1; - for (i = mappingFrom.size() - 1; i >= 0; i--) { - TraceInterval fromInterval = mappingFrom.get(i); - TraceInterval toInterval = mappingTo.get(i); - - if (safeToProcessMove(fromInterval, toInterval)) { - // this interval can be processed because target is free - if (fromInterval != null) { - insertMove(fromInterval, toInterval); - unblockRegisters(fromInterval); - } else { - insertMove(mappingFromOpr.get(i), toInterval); - } - if (isStackSlotValue(toInterval.location())) { - if (busySpillSlots == null) { - busySpillSlots = new ArrayList<>(2); - } - busySpillSlots.add(toInterval.location()); - } - mappingFrom.remove(i); - mappingFromOpr.remove(i); - mappingTo.remove(i); - - processedInterval = true; - } else if (fromInterval != null && isRegister(fromInterval.location()) && (busySpillSlots == null || !busySpillSlots.contains(fromInterval.spillSlot()))) { - // this interval cannot be processed now because target is not free - // it starts in a register, so it is a possible candidate for spilling - spillCandidate = i; - } - } - - if (!processedInterval) { - breakCycle(spillCandidate); - } - } - } - - // check that all intervals have been processed - assert checkEmpty(); - } - - protected void breakCycle(int spillCandidate) { - if (spillCandidate != -1) { - // no move could be processed because there is a cycle in the move list - // (e.g. r1 . r2, r2 . r1), so one interval must be spilled to memory - assert spillCandidate != -1 : "no interval in register for spilling found"; - - // create a new spill interval and assign a stack slot to it - TraceInterval fromInterval1 = mappingFrom.get(spillCandidate); - // do not allocate a new spill slot for temporary interval, but - // use spill slot assigned to fromInterval. Otherwise moves from - // one stack slot to another can happen (not allowed by LIRAssembler - AllocatableValue spillSlot1 = fromInterval1.spillSlot(); - if (spillSlot1 == null) { - spillSlot1 = getAllocator().getFrameMapBuilder().allocateSpillSlot(allocator.getKind(fromInterval1)); - fromInterval1.setSpillSlot(spillSlot1); - cycleBreakingSlotsAllocated.increment(debug); - } - spillInterval(spillCandidate, fromInterval1, spillSlot1); - return; - } - assert mappingFromSize() > 1; - // Arbitrarily select the first entry for spilling. - int stackSpillCandidate = 0; - TraceInterval fromInterval = getMappingFrom(stackSpillCandidate); - // allocate new stack slot - VirtualStackSlot spillSlot = getAllocator().getFrameMapBuilder().allocateSpillSlot(allocator.getKind(fromInterval)); - spillInterval(stackSpillCandidate, fromInterval, spillSlot); - } - - protected void spillInterval(int spillCandidate, TraceInterval fromInterval, AllocatableValue spillSlot) { - assert mappingFrom.get(spillCandidate).equals(fromInterval); - TraceInterval spillInterval = getAllocator().createDerivedInterval(fromInterval); - - // add a dummy range because real position is difficult to calculate - // Note: this range is a special case when the integrity of the allocation is - // checked - spillInterval.addRange(1, 2); - - spillInterval.assignLocation(spillSlot); - - if (debug.isLogEnabled()) { - debug.log("created new Interval for spilling: %s", spillInterval); - } - blockRegisters(spillInterval); - - // insert a move from register to stack and update the mapping - insertMove(fromInterval, spillInterval); - mappingFrom.set(spillCandidate, spillInterval); - unblockRegisters(fromInterval); - } - - @SuppressWarnings("try") - private void printMapping() { - try (Indent indent = debug.logAndIndent("Mapping")) { - for (int i = mappingFrom.size() - 1; i >= 0; i--) { - TraceInterval fromInterval = mappingFrom.get(i); - TraceInterval toInterval = mappingTo.get(i); - String from; - Value to = toInterval.location(); - if (fromInterval == null) { - from = mappingFromOpr.get(i).toString(); - } else { - from = fromInterval.location().toString(); - } - debug.log("move %s <- %s", from, to); - } - } - } - - void setInsertPosition(List insertList, int insertIdx) { - assert this.insertIdx == -1 : "use moveInsertPosition instead of setInsertPosition when data already set"; - - createInsertionBuffer(insertList); - this.insertIdx = insertIdx; - } - - void moveInsertPosition(List newInsertList, int newInsertIdx) { - if (insertionBuffer.lirList() != null && (insertionBuffer.lirList() != newInsertList || this.insertIdx != newInsertIdx)) { - // insert position changed . resolve current mappings - resolveMappings(); - } - - assert insertionBuffer.lirList() != newInsertList || newInsertIdx >= insertIdx : String.format("Decreasing insert index: old=%d new=%d", insertIdx, newInsertIdx); - - if (insertionBuffer.lirList() != newInsertList) { - // block changed . append insertionBuffer because it is - // bound to a specific block and create a new insertionBuffer - appendInsertionBuffer(); - createInsertionBuffer(newInsertList); - } - - this.insertIdx = newInsertIdx; - } - - public void addMapping(TraceInterval fromInterval, TraceInterval toInterval) { - - if (isIllegal(toInterval.location()) && toInterval.canMaterialize()) { - if (debug.isLogEnabled()) { - debug.log("no store to rematerializable interval %s needed", toInterval); - } - return; - } - if (isIllegal(fromInterval.location()) && fromInterval.canMaterialize()) { - // Instead of a reload, re-materialize the value - JavaConstant rematValue = fromInterval.getMaterializedValue(); - addMapping(rematValue, toInterval); - return; - } - if (debug.isLogEnabled()) { - debug.log("add move mapping from %s to %s", fromInterval, toInterval); - } - - assert fromInterval.operandNumber != toInterval.operandNumber : "from and to interval equal: " + fromInterval; - assert LIRKind.verifyMoveKinds(allocator.getKind(toInterval), allocator.getKind(fromInterval), allocator.getRegisterAllocationConfig()) : String.format( - "Kind mismatch: %s vs. %s, from=%s, to=%s", allocator.getKind(fromInterval), allocator.getKind(toInterval), fromInterval, toInterval); - mappingFrom.add(fromInterval); - mappingFromOpr.add(null); - mappingTo.add(toInterval); - } - - public void addMapping(Constant fromOpr, TraceInterval toInterval) { - if (debug.isLogEnabled()) { - debug.log("add move mapping from %s to %s", fromOpr, toInterval); - } - - mappingFrom.add(null); - mappingFromOpr.add(fromOpr); - mappingTo.add(toInterval); - } - - void resolveAndAppendMoves() { - if (hasMappings()) { - resolveMappings(); - } - appendInsertionBuffer(); - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/ArrayDataPointerConstant.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/ArrayDataPointerConstant.java index ef59ebf21c4..c9219c6c895 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/ArrayDataPointerConstant.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/ArrayDataPointerConstant.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/CompilationResultBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/CompilationResultBuilder.java index f0261d34af4..3978704d812 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/CompilationResultBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/CompilationResultBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/CompilationResultBuilderFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/CompilationResultBuilderFactory.java index fdeb766e2c9..d75aac75bab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/CompilationResultBuilderFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/CompilationResultBuilderFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/DataBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/DataBuilder.java index 0af30905f1f..dde6e263418 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/DataBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/DataBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/FrameContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/FrameContext.java index 1e6a71496b3..b46b2032c93 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/FrameContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/FrameContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantLoadOptimization.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantLoadOptimization.java index 596086af8c4..7d6e62daa59 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantLoadOptimization.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantLoadOptimization.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantTree.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantTree.java index f911e8d2bab..b35aedba475 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantTree.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantTreeAnalyzer.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantTreeAnalyzer.java index 49c48647348..80f08fb5c77 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantTreeAnalyzer.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/ConstantTreeAnalyzer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/DefUseTree.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/DefUseTree.java index fb7ab0d6ba9..4689bf21b05 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/DefUseTree.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/DefUseTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/UseEntry.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/UseEntry.java index 51ced314113..c1b36d6d4e4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/UseEntry.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/UseEntry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/VariableMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/VariableMap.java index ebc9083c25b..dde07febc4a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/VariableMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/constopt/VariableMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/debug/IntervalDumper.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/debug/IntervalDumper.java index 868c4424255..c4a36a34ef3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/debug/IntervalDumper.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/debug/IntervalDumper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/debug/LIRGenerationDebugContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/debug/LIRGenerationDebugContext.java index c746b698286..15c160e5d3a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/debug/LIRGenerationDebugContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/debug/LIRGenerationDebugContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/LocationMarker.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/LocationMarker.java index bf8cee35671..b1b95a34bc0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/LocationMarker.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/LocationMarker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/LocationMarkerPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/LocationMarkerPhase.java index 415277fb722..a880c6e52ba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/LocationMarkerPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/LocationMarkerPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/MarkBasePointersPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/MarkBasePointersPhase.java index a81aaaa4899..3e48b8f8582 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/MarkBasePointersPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/MarkBasePointersPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/RegStackValueSet.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/RegStackValueSet.java index fe44a5b423f..c7245be0ff5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/RegStackValueSet.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/RegStackValueSet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/UniqueWorkList.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/UniqueWorkList.java index 7c846b4330f..63899ffe85a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/UniqueWorkList.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/dfa/UniqueWorkList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMap.java index 2d555febe92..940a6b2b8e6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilder.java index 92ef88f0d51..17548627f39 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilderImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilderImpl.java index 512b9e6dc18..624b3a2f9cf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilderImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilderTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilderTool.java index 24f12d55ffd..e6dec8495d4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilderTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/FrameMapBuilderTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/ReferenceMapBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/ReferenceMapBuilder.java index a7109acb758..8a5171e8388 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/ReferenceMapBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/ReferenceMapBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/SimpleVirtualStackSlot.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/SimpleVirtualStackSlot.java index ec8f40c6afa..3a32d188ff8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/SimpleVirtualStackSlot.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/SimpleVirtualStackSlot.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/VirtualStackSlotRange.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/VirtualStackSlotRange.java index 379d302fa27..f440213913e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/VirtualStackSlotRange.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/framemap/VirtualStackSlotRange.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/ArithmeticLIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/ArithmeticLIRGenerator.java index 264a728edfb..ac8fcc99e91 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/ArithmeticLIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/ArithmeticLIRGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/ArithmeticLIRGeneratorTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/ArithmeticLIRGeneratorTool.java index a2475896fc7..5e1c7e677b8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/ArithmeticLIRGeneratorTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/ArithmeticLIRGeneratorTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/BlockValueMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/BlockValueMap.java index 9abe25bb68a..43f0a3c7223 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/BlockValueMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/BlockValueMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/DiagnosticLIRGeneratorTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/DiagnosticLIRGeneratorTool.java index 2ed5c00e234..a1b8c5d9046 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/DiagnosticLIRGeneratorTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/DiagnosticLIRGeneratorTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGenerationResult.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGenerationResult.java index 4dfc97a054e..e1ad42e1b45 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGenerationResult.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGenerationResult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGenerator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGenerator.java index a920614d56f..7dc8f9c6fa6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGenerator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGeneratorTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGeneratorTool.java index f89280f2eb0..a5e1343b576 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGeneratorTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/LIRGeneratorTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/PhiResolver.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/PhiResolver.java index ef0b2b9ec6b..85342d675c8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/PhiResolver.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/PhiResolver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/VerifyingMoveFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/VerifyingMoveFactory.java index a7b3e0bfba0..795a240783b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/VerifyingMoveFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/gen/VerifyingMoveFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/AllocationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/AllocationPhase.java index e7c14d91caf..5556e666e7b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/AllocationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/AllocationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/AllocationStage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/AllocationStage.java index 38998803e10..273df5fd6d5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/AllocationStage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/AllocationStage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,12 +24,9 @@ package org.graalvm.compiler.lir.phases; -import static org.graalvm.compiler.core.common.GraalOptions.TraceRA; - import org.graalvm.compiler.debug.Assertions; import org.graalvm.compiler.lir.alloc.AllocationStageVerifier; import org.graalvm.compiler.lir.alloc.lsra.LinearScanPhase; -import org.graalvm.compiler.lir.alloc.trace.TraceRegisterAllocationPhase; import org.graalvm.compiler.lir.dfa.LocationMarkerPhase; import org.graalvm.compiler.lir.dfa.MarkBasePointersPhase; import org.graalvm.compiler.lir.phases.AllocationPhase.AllocationContext; @@ -41,11 +38,7 @@ public class AllocationStage extends LIRPhaseSuite { public AllocationStage(OptionValues options) { appendPhase(new MarkBasePointersPhase()); - if (TraceRA.getValue(options)) { - appendPhase(new TraceRegisterAllocationPhase()); - } else { - appendPhase(new LinearScanPhase()); - } + appendPhase(new LinearScanPhase()); // build frame map if (LSStackSlotAllocator.Options.LIROptLSStackSlotAllocator.getValue(options)) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyAllocationStage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyAllocationStage.java index c34d305ecf7..dddaba7cec7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyAllocationStage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyAllocationStage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,22 +24,15 @@ package org.graalvm.compiler.lir.phases; -import static org.graalvm.compiler.core.common.GraalOptions.TraceRA; - import org.graalvm.compiler.lir.alloc.lsra.LinearScanPhase; -import org.graalvm.compiler.lir.alloc.trace.TraceRegisterAllocationPhase; import org.graalvm.compiler.lir.dfa.LocationMarkerPhase; import org.graalvm.compiler.lir.phases.AllocationPhase.AllocationContext; import org.graalvm.compiler.lir.stackslotalloc.SimpleStackSlotAllocator; import org.graalvm.compiler.options.OptionValues; public class EconomyAllocationStage extends LIRPhaseSuite { - public EconomyAllocationStage(OptionValues options) { - if (TraceRA.getValue(options)) { - appendPhase(new TraceRegisterAllocationPhase()); - } else { - appendPhase(new LinearScanPhase()); - } + public EconomyAllocationStage(@SuppressWarnings("unused") OptionValues options) { + appendPhase(new LinearScanPhase()); // build frame map appendPhase(new SimpleStackSlotAllocator()); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyPostAllocationOptimizationStage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyPostAllocationOptimizationStage.java index 7b31374dec4..604a8b9303b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyPostAllocationOptimizationStage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyPostAllocationOptimizationStage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyPreAllocationOptimizationStage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyPreAllocationOptimizationStage.java index ebd7944f70e..4cc5fbbe6e6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyPreAllocationOptimizationStage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/EconomyPreAllocationOptimizationStage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/GenericContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/GenericContext.java index 1a495e6a500..eac1889e785 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/GenericContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/GenericContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRPhase.java index b034ab51aab..b19748639e8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRPhaseSuite.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRPhaseSuite.java index 0f034511897..15b797ba43c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRPhaseSuite.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRPhaseSuite.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRSuites.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRSuites.java index d9d01427ee4..d0b1f7ac975 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRSuites.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/LIRSuites.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PostAllocationOptimizationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PostAllocationOptimizationPhase.java index 1e9a4436a22..b96b0b987b5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PostAllocationOptimizationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PostAllocationOptimizationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PostAllocationOptimizationStage.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PostAllocationOptimizationStage.java index a3727b80d53..b556951244f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PostAllocationOptimizationStage.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PostAllocationOptimizationStage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PreAllocationOptimizationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PreAllocationOptimizationPhase.java index a06cb2ac540..450a52acb5a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PreAllocationOptimizationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/phases/PreAllocationOptimizationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MethodProfilingPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MethodProfilingPhase.java index d34d9974ddb..bd01c7be368 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MethodProfilingPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MethodProfilingPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveProfiler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveProfiler.java index a970603edea..1172df71932 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveProfiler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveProfiler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveProfilingPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveProfilingPhase.java index 59a2ac187c7..327107ddba5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveProfilingPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveProfilingPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveType.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveType.java index 8ccfdef37dc..84e29a6550e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveType.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/profiling/MoveType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ssa/SSAUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ssa/SSAUtil.java index 4bf512d72ad..5cddac5c814 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ssa/SSAUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ssa/SSAUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ssa/SSAVerifier.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ssa/SSAVerifier.java index 674fb2b1105..54fb6e889e2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ssa/SSAVerifier.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/ssa/SSAVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/FixPointIntervalBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/FixPointIntervalBuilder.java index 3c5a975ac04..c2a11954e1e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/FixPointIntervalBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/FixPointIntervalBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/LSStackSlotAllocator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/LSStackSlotAllocator.java index d06023ad7d9..041580df798 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/LSStackSlotAllocator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/LSStackSlotAllocator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/SimpleStackSlotAllocator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/SimpleStackSlotAllocator.java index 5a233f5528b..8ff0495d7ac 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/SimpleStackSlotAllocator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/SimpleStackSlotAllocator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackInterval.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackInterval.java index d8328ea29eb..aeb36ca6541 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackInterval.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackInterval.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackIntervalDumper.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackIntervalDumper.java index 16661cffb9d..ec46b5768e7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackIntervalDumper.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackIntervalDumper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackSlotAllocatorUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackSlotAllocatorUtil.java index 3b74677f0b7..c43b4e3259f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackSlotAllocatorUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/stackslotalloc/StackSlotAllocatorUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/GenericValueMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/GenericValueMap.java index 00cea853610..a6369fa62bb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/GenericValueMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/GenericValueMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/IndexedValueMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/IndexedValueMap.java index 094b5ebfd03..0e5e6bdc028 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/IndexedValueMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/IndexedValueMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/RegisterMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/RegisterMap.java index eec0d1202bf..dda149489da 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/RegisterMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/RegisterMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/ValueMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/ValueMap.java index 913ea7d3d8c..c5fb986f0cd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/ValueMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/ValueMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/ValueSet.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/ValueSet.java index d658d777e01..6b4f6eb2278 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/ValueSet.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/ValueSet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/VariableVirtualStackValueMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/VariableVirtualStackValueMap.java index 75d7a220981..4dd50e007b8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/VariableVirtualStackValueMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/util/VariableVirtualStackValueMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/ContextlessLoopPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/ContextlessLoopPhase.java index 38b00dbbcfd..9c04b2ce25f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/ContextlessLoopPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/ContextlessLoopPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopFullUnrollPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopFullUnrollPhase.java index 5368aa5fa44..2c6078173bd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopFullUnrollPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopFullUnrollPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPartialUnrollPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPartialUnrollPhase.java index 37c0bdeae8c..a7b85e709c3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPartialUnrollPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPartialUnrollPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPeelingPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPeelingPhase.java index 0f445533fb5..877fc54d367 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPeelingPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPeelingPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPhase.java index 5640727c2b9..e5fc261b514 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopSafepointEliminationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopSafepointEliminationPhase.java index 3c2416eabe6..05183ebb43e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopSafepointEliminationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopSafepointEliminationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopTransformations.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopTransformations.java index 3448116b269..e38887e1c63 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopTransformations.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopTransformations.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopUnswitchingPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopUnswitchingPhase.java index 6998b21751b..d239b700dba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopUnswitchingPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopUnswitchingPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/ReassociateInvariantPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/ReassociateInvariantPhase.java index 9ab603012ce..635fb3b0714 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/ReassociateInvariantPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/ReassociateInvariantPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.test/src/org/graalvm/compiler/loop/test/LoopPartialUnrollTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.test/src/org/graalvm/compiler/loop/test/LoopPartialUnrollTest.java index 68ee5c5c55c..2aa74e85eab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.test/src/org/graalvm/compiler/loop/test/LoopPartialUnrollTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.test/src/org/graalvm/compiler/loop/test/LoopPartialUnrollTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.test/src/org/graalvm/compiler/loop/test/LoopsDataTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.test/src/org/graalvm/compiler/loop/test/LoopsDataTest.java index afbefa4db21..cfda87dcc04 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.test/src/org/graalvm/compiler/loop/test/LoopsDataTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.test/src/org/graalvm/compiler/loop/test/LoopsDataTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/BasicInductionVariable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/BasicInductionVariable.java index 33481426a3e..ae3cee6c3de 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/BasicInductionVariable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/BasicInductionVariable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/CountedLoopInfo.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/CountedLoopInfo.java index ffa489b3731..cb983ffcc71 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/CountedLoopInfo.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/CountedLoopInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DefaultLoopPolicies.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DefaultLoopPolicies.java index 21a6154e2ed..b0e6e414ed6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DefaultLoopPolicies.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DefaultLoopPolicies.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedConvertedInductionVariable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedConvertedInductionVariable.java index c406c008ef3..c8766f6505c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedConvertedInductionVariable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedConvertedInductionVariable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedInductionVariable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedInductionVariable.java index e6b0ca326fb..6bb3d3b9f7f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedInductionVariable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedInductionVariable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedOffsetInductionVariable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedOffsetInductionVariable.java index 280b9cbf1dc..e3d59eae197 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedOffsetInductionVariable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedOffsetInductionVariable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedScaledInductionVariable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedScaledInductionVariable.java index 9cb1662751c..39842450c12 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedScaledInductionVariable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DerivedScaledInductionVariable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/InductionVariable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/InductionVariable.java index d099ef4b229..c399e2ccc05 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/InductionVariable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/InductionVariable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java index 2a2baa7d47c..534d1746ce8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragment.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragment.java index 6a295a36f7a..278f408788a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragment.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInside.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInside.java index e9f4bc8422b..64c72699f07 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInside.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInside.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInsideBefore.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInsideBefore.java index a307131c41d..0089cc98705 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInsideBefore.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInsideBefore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInsideFrom.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInsideFrom.java index 014e8ead869..d7b8bac8259 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInsideFrom.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentInsideFrom.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java index 0b633b88c0d..df1bd76ef7a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopPolicies.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopPolicies.java index a01d51c72b8..b16bd6d7689 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopPolicies.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopPolicies.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopsData.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopsData.java index 84b847b95ff..ec5813f1bb4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopsData.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopsData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/MathUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/MathUtil.java index 766e6500482..37f58174f06 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/MathUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/MathUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/ConditionalEliminationBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/ConditionalEliminationBenchmark.java index c8094bf9237..e2ab127372c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/ConditionalEliminationBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/ConditionalEliminationBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/FrameStateAssigmentPhaseBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/FrameStateAssigmentPhaseBenchmark.java index e976c533b5b..549b6d26f46 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/FrameStateAssigmentPhaseBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/FrameStateAssigmentPhaseBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/GraalBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/GraalBenchmark.java index 5e75579e88e..f1d3b31ee26 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/GraalBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/GraalBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/GraphCopyBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/GraphCopyBenchmark.java index 05796e0174c..a2852d9eb57 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/GraphCopyBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/GraphCopyBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/NodeBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/NodeBenchmark.java index 5444864c252..110364e9a1f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/NodeBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/NodeBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/SchedulePhaseBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/SchedulePhaseBenchmark.java index 476c5797c7d..4f4ba4b8ad9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/SchedulePhaseBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/SchedulePhaseBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/TestJMHWhitebox.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/TestJMHWhitebox.java index e63a90f6dca..5bf5995a619 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/TestJMHWhitebox.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/TestJMHWhitebox.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/FrameStateAssignmentState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/FrameStateAssignmentState.java index cb65b9f488b..90a2d470fef 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/FrameStateAssignmentState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/FrameStateAssignmentState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraalState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraalState.java index 95520bec4e4..08369b78493 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraalState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraalState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraalUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraalUtil.java index 5e03d3068f3..5ad5345dd74 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraalUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraalUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraphState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraphState.java index 13334588b1a..50b1ea05dca 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraphState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/GraphState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/MethodSpec.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/MethodSpec.java index 5e1abdc211c..e516ff42501 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/MethodSpec.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/MethodSpec.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/NodesState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/NodesState.java index 89c6d25aa10..4ebb4021f19 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/NodesState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/NodesState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/ScheduleState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/ScheduleState.java index ce3650a7516..a0fc7688e12 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/ScheduleState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/graal/util/ScheduleState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/CompileTimeBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/CompileTimeBenchmark.java index fdee24a9bfe..05069b5823f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/CompileTimeBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/CompileTimeBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/GraalCompilerState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/GraalCompilerState.java index 65aae01a25d..65693974720 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/GraalCompilerState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/GraalCompilerState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/RegisterAllocationTimeBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/RegisterAllocationTimeBenchmark.java index 272c6960f77..75ca95dd170 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/RegisterAllocationTimeBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/RegisterAllocationTimeBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/trace/TraceBuilderBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/trace/TraceBuilderBenchmark.java deleted file mode 100644 index 75b0573f5e8..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/trace/TraceBuilderBenchmark.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.microbenchmarks.lir.trace; - -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Warmup; - -import org.graalvm.compiler.core.common.alloc.BiDirectionalTraceBuilder; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.core.common.alloc.UniDirectionalTraceBuilder; -import org.graalvm.compiler.lir.alloc.trace.TraceBuilderPhase; -import org.graalvm.compiler.microbenchmarks.graal.GraalBenchmark; - -@Warmup(iterations = 15) -public class TraceBuilderBenchmark extends GraalBenchmark { - - public static class State extends ControlFlowGraphState { - @MethodDescString @Param({ - "java.lang.String#equals", - "java.util.HashMap#computeIfAbsent" - }) public String method; - } - - @Benchmark - public TraceBuilderResult uniDirectionalTraceBuilder(State s) { - return UniDirectionalTraceBuilder.computeTraces(s.getLIR().getDebug(), s.cfg.getStartBlock(), s.cfg.getBlocks(), TraceBuilderPhase.getTrivialTracePredicate(s.getLIR())); - } - - @Benchmark - public TraceBuilderResult biDirectionalTraceBuilder(State s) { - return BiDirectionalTraceBuilder.computeTraces(s.getLIR().getDebug(), s.cfg.getStartBlock(), s.cfg.getBlocks(), TraceBuilderPhase.getTrivialTracePredicate(s.getLIR())); - } - -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/trace/TraceLSRAIntervalBuildingBench.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/trace/TraceLSRAIntervalBuildingBench.java deleted file mode 100644 index 242aa685f5a..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/trace/TraceLSRAIntervalBuildingBench.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.microbenchmarks.lir.trace; - -import org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig; -import org.graalvm.compiler.core.common.alloc.Trace; -import org.graalvm.compiler.core.common.alloc.TraceBuilderResult; -import org.graalvm.compiler.lir.alloc.trace.GlobalLivenessAnalysisPhase; -import org.graalvm.compiler.lir.alloc.trace.GlobalLivenessInfo; -import org.graalvm.compiler.lir.alloc.trace.TraceBuilderPhase; -import org.graalvm.compiler.lir.alloc.trace.TraceRegisterAllocationPhase; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanLifetimeAnalysisPhase; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanLifetimeAnalysisPhase.Analyser; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase; -import org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan; -import org.graalvm.compiler.lir.gen.LIRGenerationResult; -import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory; -import org.graalvm.compiler.lir.phases.AllocationPhase; -import org.graalvm.compiler.lir.phases.AllocationPhase.AllocationContext; -import org.graalvm.compiler.lir.phases.LIRPhaseSuite; -import org.graalvm.compiler.lir.phases.LIRSuites; -import org.graalvm.compiler.microbenchmarks.graal.GraalBenchmark; -import org.graalvm.compiler.microbenchmarks.lir.GraalCompilerState; -import org.graalvm.compiler.options.OptionValues; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Level; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Setup; - -import jdk.vm.ci.code.TargetDescription; - -/** - * Benchmarks {@link TraceLinearScan TraceRA} {@link TraceLinearScanLifetimeAnalysisPhase lifetime - * analysis phase}. - */ -public class TraceLSRAIntervalBuildingBench extends GraalBenchmark { - - private static class DummyTraceAllocatorPhase extends AllocationPhase { - private TraceLinearScan allocator; - - @Override - @SuppressWarnings("try") - protected void run(TargetDescription target, LIRGenerationResult lirGenRes, AllocationContext context) { - MoveFactory spillMoveFactory = context.spillMoveFactory; - RegisterAllocationConfig registerAllocationConfig = context.registerAllocationConfig; - TraceBuilderResult resultTraces = context.contextLookup(TraceBuilderResult.class); - GlobalLivenessInfo livenessInfo = context.contextLookup(GlobalLivenessInfo.class); - assert livenessInfo != null; - TraceLinearScanPhase phase = new TraceLinearScanPhase(target, lirGenRes, spillMoveFactory, registerAllocationConfig, resultTraces, false, null, livenessInfo); - for (Trace trace : resultTraces.getTraces()) { - allocator = phase.createAllocator(trace); - Analyser a = new TraceLinearScanLifetimeAnalysisPhase.Analyser(allocator, resultTraces); - a.analyze(); - } - } - } - - public abstract static class AllocationState extends GraalCompilerState { - - private static final DummyTraceAllocatorPhase LTA_PHASE = new DummyTraceAllocatorPhase(); - private static final GlobalLivenessAnalysisPhase LIVENESS_ANALYSIS_PHASE = new GlobalLivenessAnalysisPhase(); - private static final TraceBuilderPhase TRACE_BUILDER_PHASE = new TraceBuilderPhase(); - - private AllocationContext allocationContext; - - @Override - protected LIRSuites getLIRSuites() { - LIRSuites ls = super.getLIRSuites(); - LIRPhaseSuite allocationStage = new LIRPhaseSuite<>(); - allocationStage.appendPhase(TRACE_BUILDER_PHASE); - allocationStage.appendPhase(LIVENESS_ANALYSIS_PHASE); - return new LIRSuites(ls.getPreAllocationOptimizationStage(), allocationStage, ls.getPostAllocationOptimizationStage()); - } - - @Override - protected OptionValues getGraphOptions() { - return new OptionValues(super.getGraphOptions(), TraceRegisterAllocationPhase.Options.TraceRAuseInterTraceHints, false); - } - - @Setup(Level.Trial) - public void setup() { - initializeMethod(); - prepareRequest(); - emitFrontEnd(); - generateLIR(); - preAllocationStage(); - // context for all allocation phases - allocationContext = createAllocationContext(); - applyLIRPhase(TRACE_BUILDER_PHASE, allocationContext); - applyLIRPhase(LIVENESS_ANALYSIS_PHASE, allocationContext); - } - - public TraceLinearScan compile() { - applyLIRPhase(LTA_PHASE, allocationContext); - return LTA_PHASE.allocator; - } - - } - - public static class State extends AllocationState { - @MethodDescString @Param({ - "java.lang.String#equals", - "java.util.HashMap#computeIfAbsent" - }) public String method; - } - - @Benchmark - public TraceLinearScan buildIntervals(State s) { - return s.compile(); - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo.processor/src/org/graalvm/compiler/nodeinfo/processor/ElementException.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo.processor/src/org/graalvm/compiler/nodeinfo/processor/ElementException.java index 87d43389020..a7bc64bf1a6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo.processor/src/org/graalvm/compiler/nodeinfo/processor/ElementException.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo.processor/src/org/graalvm/compiler/nodeinfo/processor/ElementException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo.processor/src/org/graalvm/compiler/nodeinfo/processor/GraphNodeProcessor.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo.processor/src/org/graalvm/compiler/nodeinfo/processor/GraphNodeProcessor.java index 81a6ed60776..6f63d2baf92 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo.processor/src/org/graalvm/compiler/nodeinfo/processor/GraphNodeProcessor.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo.processor/src/org/graalvm/compiler/nodeinfo/processor/GraphNodeProcessor.java @@ -153,12 +153,6 @@ public class GraphNodeProcessor extends AbstractProcessor { TypeElement typeElement = (TypeElement) element; Set modifiers = typeElement.getModifiers(); - if (!modifiers.contains(Modifier.FINAL) && !modifiers.contains(Modifier.ABSTRACT)) { - // TODO(thomaswue): Reenable this check. - // errorMessage(element, "%s annotated class must be either final or abstract", - // getSimpleName(NODE_INFO_CLASS_NAME)); - // continue; - } boolean found = false; for (Element e : typeElement.getEnclosedElements()) { if (e.getKind() == ElementKind.FIELD) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/InputType.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/InputType.java index daed952faff..689b8b8eb4f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/InputType.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/InputType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeCycles.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeCycles.java index 84aac6c9c49..797a330c45b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeCycles.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeCycles.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeInfo.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeInfo.java index 320430f4479..d7e8fc3e8dd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeInfo.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeSize.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeSize.java index dc44e6acd6b..ef49bdc68af 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeSize.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/NodeSize.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/StructuralInput.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/StructuralInput.java index 562755bef8f..750296b44c9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/StructuralInput.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/StructuralInput.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/Verbosity.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/Verbosity.java index c9fcf0c04b5..047b249fe5b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/Verbosity.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodeinfo/src/org/graalvm/compiler/nodeinfo/Verbosity.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/AbstractObjectStampTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/AbstractObjectStampTest.java index d0b25fba695..a4738b149d8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/AbstractObjectStampTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/AbstractObjectStampTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/AddNodeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/AddNodeTest.java index 2e12cfd23aa..19674540d9a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/AddNodeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/AddNodeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/IfNodeCanonicalizationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/IfNodeCanonicalizationTest.java index 64bdce5e0fd..a513a5348d4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/IfNodeCanonicalizationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/IfNodeCanonicalizationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/IntegerStampTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/IntegerStampTest.java index 43fd56357f2..d3652c00094 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/IntegerStampTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/IntegerStampTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/LoopLivenessTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/LoopLivenessTest.java index 243c2a02f28..ecf4560bbb2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/LoopLivenessTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/LoopLivenessTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/LoopPhiCanonicalizerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/LoopPhiCanonicalizerTest.java index 3d4c6450687..3b28890baef 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/LoopPhiCanonicalizerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/LoopPhiCanonicalizerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/NegateNodeCanonicalizationTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/NegateNodeCanonicalizationTest.java index 594930bfbf8..285f0770988 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/NegateNodeCanonicalizationTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/NegateNodeCanonicalizationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampJoinTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampJoinTest.java index e973ea3c677..dfd3722496d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampJoinTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampJoinTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampMeetTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampMeetTest.java index 36238fecefa..464d07ad193 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampMeetTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampMeetTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampTest.java index 733a742beae..6483434e988 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ObjectStampTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/PrimitiveStampBoundaryTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/PrimitiveStampBoundaryTest.java index 21784b1b57a..08bf59bd8b4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/PrimitiveStampBoundaryTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/PrimitiveStampBoundaryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampDoubleToLongTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampDoubleToLongTest.java index 8bf4b634230..b4c183c9e58 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampDoubleToLongTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampDoubleToLongTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampFloatToIntTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampFloatToIntTest.java index fc982b718d1..54b364639b0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampFloatToIntTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampFloatToIntTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampIntToFloatTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampIntToFloatTest.java index efb578c47eb..edf4094b1f5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampIntToFloatTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampIntToFloatTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampLongToDoubleTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampLongToDoubleTest.java index 4c2f6698164..13dc3bda384 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampLongToDoubleTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampLongToDoubleTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampTest.java index 2801df263c3..6270b5a471f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ReinterpretStampTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ShortCircuitOrNodeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ShortCircuitOrNodeTest.java index b2f176efd71..2535fcc2b22 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ShortCircuitOrNodeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/ShortCircuitOrNodeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/StaticFieldAccessTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/StaticFieldAccessTest.java index 86fe4de3689..e63db5cf396 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/StaticFieldAccessTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/StaticFieldAccessTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/StructuredGraphTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/StructuredGraphTest.java index 841efc2341d..ae69ad61e73 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/StructuredGraphTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes.test/src/org/graalvm/compiler/nodes/test/StructuredGraphTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractBeginNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractBeginNode.java index ced7ccfc480..d6cbb4fcaea 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractBeginNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractBeginNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractDeoptimizeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractDeoptimizeNode.java index e57ab2b0d79..913d9ff3067 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractDeoptimizeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractDeoptimizeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractEndNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractEndNode.java index f80aa53f8f1..5977e66024e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractEndNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractEndNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractFixedGuardNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractFixedGuardNode.java index 7983fdbe982..fdbb939957b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractFixedGuardNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractFixedGuardNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractLocalNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractLocalNode.java index 0c3ae51d245..2a6f07a20f5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractLocalNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractLocalNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractMergeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractMergeNode.java index 520ba88ee53..05b586271e1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractMergeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractMergeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractStateSplit.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractStateSplit.java index ef9cefb53ce..8506477ee71 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractStateSplit.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/AbstractStateSplit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ArithmeticOperation.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ArithmeticOperation.java index a9422e879d9..8e2f58f19cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ArithmeticOperation.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ArithmeticOperation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BeginNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BeginNode.java index b1ef777d77f..8e5f9261f1b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BeginNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BeginNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BeginStateSplitNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BeginStateSplitNode.java index b7622a35ac0..6c734cd8b26 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BeginStateSplitNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BeginStateSplitNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BinaryOpLogicNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BinaryOpLogicNode.java index e0454542dec..b9754e5ac72 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BinaryOpLogicNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BinaryOpLogicNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BreakpointNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BreakpointNode.java index f7f5a82526f..08ae2506bce 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BreakpointNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/BreakpointNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CallTargetNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CallTargetNode.java index 1e1ed79c40e..33522114035 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CallTargetNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CallTargetNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/Cancellable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/Cancellable.java index 32c98b42f02..7278748151f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/Cancellable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/Cancellable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CanonicalizableLocation.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CanonicalizableLocation.java index 4f05a9d2fa4..f1f6f2679d5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CanonicalizableLocation.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CanonicalizableLocation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CompressionNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CompressionNode.java index 12553434aeb..de06f3516f3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CompressionNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/CompressionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/ComputeObjectAddressNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ComputeObjectAddressNode.java similarity index 92% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/ComputeObjectAddressNode.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ComputeObjectAddressNode.java index 5ed6acbae80..9704f4ca73e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/ComputeObjectAddressNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ComputeObjectAddressNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.hotspot.nodes; +package org.graalvm.compiler.nodes; import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_1; @@ -30,8 +30,6 @@ import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.graph.NodeClass; import org.graalvm.compiler.nodeinfo.NodeInfo; import org.graalvm.compiler.nodeinfo.NodeSize; -import org.graalvm.compiler.nodes.FixedWithNextNode; -import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.nodes.debug.ControlFlowAnchored; import org.graalvm.compiler.nodes.spi.Lowerable; import org.graalvm.compiler.nodes.spi.LoweringTool; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ConditionAnchorNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ConditionAnchorNode.java index b5ce021e2ab..233f7ee5418 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ConditionAnchorNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ConditionAnchorNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ConstantNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ConstantNode.java index 1e0cd630f7e..8b059fc4b37 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ConstantNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ConstantNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ControlSinkNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ControlSinkNode.java index cd5e53134aa..f594c03ce25 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ControlSinkNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ControlSinkNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ControlSplitNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ControlSplitNode.java index 1d3e9d08c5c..4647ee1af8e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ControlSplitNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ControlSplitNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizeNode.java index 3b1516060fe..07142f8365e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingFixedWithNextNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingFixedWithNextNode.java index b98d0d387be..db0281891ef 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingFixedWithNextNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingFixedWithNextNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingGuard.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingGuard.java index e2981f49670..8ad85b175ce 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingGuard.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingGuard.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingNode.java index 03c1b29a1ee..50312d35849 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DeoptimizingNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DirectCallTargetNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DirectCallTargetNode.java index 7258a42d0c3..a05b668cd7e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DirectCallTargetNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DirectCallTargetNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DynamicDeoptimizeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DynamicDeoptimizeNode.java index 328a0f8fcf9..0daeed67998 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DynamicDeoptimizeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DynamicDeoptimizeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DynamicPiNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DynamicPiNode.java index 975e3e30c79..a1f56e456eb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DynamicPiNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/DynamicPiNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EncodedGraph.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EncodedGraph.java index a54429c6c11..439c6c476ca 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EncodedGraph.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EncodedGraph.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EndNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EndNode.java index 79a9108e1d7..7abf263f896 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EndNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EndNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EntryMarkerNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EntryMarkerNode.java index 0157d91431b..b00bc712854 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EntryMarkerNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EntryMarkerNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EntryProxyNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EntryProxyNode.java index 74c7d674270..fd4f56052e6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EntryProxyNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/EntryProxyNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FieldLocationIdentity.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FieldLocationIdentity.java index 824a48f6190..7abba8e19d6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FieldLocationIdentity.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FieldLocationIdentity.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedGuardNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedGuardNode.java index c29e75e75ce..7969241b7cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedGuardNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedGuardNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedNode.java index cdc2d6a7f61..00a608c0057 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedNodeInterface.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedNodeInterface.java index 4b1d66135d0..250fa9666b4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedNodeInterface.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedNodeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedWithNextNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedWithNextNode.java index bea554c2d5c..1359e311b95 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedWithNextNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FixedWithNextNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FloatingAnchoredNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FloatingAnchoredNode.java index dc2d8801b73..9a1d7687e6d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FloatingAnchoredNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FloatingAnchoredNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FloatingGuardedNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FloatingGuardedNode.java index 52ff38e5601..ac26847ebe0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FloatingGuardedNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FloatingGuardedNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FrameState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FrameState.java index dcfbdd69de4..e2b46417d8b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FrameState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FrameState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FullInfopointNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FullInfopointNode.java index d43353b8b81..0350e318c75 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FullInfopointNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/FullInfopointNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/GetObjectAddressNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GetObjectAddressNode.java similarity index 93% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/GetObjectAddressNode.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GetObjectAddressNode.java index 3e2c075cdf5..39f13cffcc5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/nodes/GetObjectAddressNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GetObjectAddressNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.hotspot.nodes; +package org.graalvm.compiler.nodes; import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_2; import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_1; @@ -32,8 +32,6 @@ import org.graalvm.compiler.core.common.LIRKind; import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.graph.NodeClass; import org.graalvm.compiler.nodeinfo.NodeInfo; -import org.graalvm.compiler.nodes.FixedWithNextNode; -import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.nodes.spi.LIRLowerable; import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphDecoder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphDecoder.java index 0f1d5400203..6807f9dea06 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphDecoder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphEncoder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphEncoder.java index b3e334c8580..a9db63e3d36 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphEncoder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GraphEncoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -440,11 +440,9 @@ public class GraphEncoder { StructuredGraph decodedGraph = new StructuredGraph.Builder(originalGraph.getOptions(), debug, AllowAssumptions.YES). method(originalGraph.method()). setIsSubstitution(originalGraph.isSubstitution()). + trackNodeSourcePosition(originalGraph.trackNodeSourcePosition()). build(); // @formatter:off - if (originalGraph.trackNodeSourcePosition()) { - decodedGraph.setTrackNodeSourcePosition(); - } GraphDecoder decoder = new GraphDecoder(architecture, decodedGraph); decoder.decode(encodedGraph); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardNode.java index f6799df6c89..ed2660a2d64 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardPhiNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardPhiNode.java index 3d88e8909ae..b10a533d5a6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardPhiNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardPhiNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardProxyNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardProxyNode.java index a37b4fe52cc..ce4182d4600 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardProxyNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardProxyNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardedValueNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardedValueNode.java index 1443133bae2..2de46431d4a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardedValueNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/GuardedValueNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java index c294dbe9a8a..2ec3e71f974 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IndirectCallTargetNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IndirectCallTargetNode.java index 987429a2d9d..a85437fb74d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IndirectCallTargetNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IndirectCallTargetNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InliningLog.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InliningLog.java index 140fffe9215..03f46b6a194 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InliningLog.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InliningLog.java @@ -117,9 +117,23 @@ public class InliningLog { public String positionString() { if (parent == null) { - return "compilation of " + target.format("%H.%n(%p)"); + if (target != null) { + return "compilation of " + target.format("%H.%n(%p)"); + } else if (invoke != null && invoke.getTargetMethod() != null) { + return "compilation of " + invoke.getTargetMethod().getName() + "(bci: " + getBci() + ")"; + } else { + return "unknown method (bci: " + getBci() + ")"; + } } - return "at " + MetaUtil.appendLocation(new StringBuilder(100), parent.target, getBci()).toString(); + String position; + if (parent.target != null) { + position = MetaUtil.appendLocation(new StringBuilder(100), parent.target, getBci()).toString(); + } else if (invoke != null && invoke.getTargetMethod() != null) { + position = invoke.getTargetMethod().getName() + "(bci: " + getBci() + ")"; + } else { + position = "unknown method (bci: " + getBci() + ")"; + } + return "at " + position; } public int getBci() { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/Invoke.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/Invoke.java index a04c2e0bf0f..1a9be662944 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/Invoke.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/Invoke.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,13 +27,14 @@ package org.graalvm.compiler.nodes; import org.graalvm.compiler.graph.Node; import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind; import org.graalvm.compiler.nodes.java.MethodCallTargetNode; +import org.graalvm.compiler.nodes.memory.MemoryCheckpoint; import org.graalvm.compiler.nodes.spi.Lowerable; import org.graalvm.compiler.nodes.type.StampTool; import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaType; -public interface Invoke extends StateSplit, Lowerable, DeoptimizingNode.DeoptDuring, FixedNodeInterface, Invokable { +public interface Invoke extends StateSplit, Lowerable, MemoryCheckpoint.Single, DeoptimizingNode.DeoptDuring, FixedNodeInterface, Invokable { FixedNode next(); @@ -50,8 +51,6 @@ public interface Invoke extends StateSplit, Lowerable, DeoptimizingNode.DeoptDur void setClassInit(ValueNode node); - void intrinsify(Node node); - boolean useForInlining(); void setUseForInlining(boolean value); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InvokeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InvokeNode.java index 3c371fb3064..5d14709258e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InvokeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InvokeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,6 @@ import org.graalvm.compiler.nodeinfo.NodeCycles; import org.graalvm.compiler.nodeinfo.NodeInfo; import org.graalvm.compiler.nodeinfo.NodeSize; import org.graalvm.compiler.nodeinfo.Verbosity; -import org.graalvm.compiler.nodes.extended.ForeignCallNode; import org.graalvm.compiler.nodes.java.MethodCallTargetNode; import org.graalvm.compiler.nodes.memory.AbstractMemoryCheckpoint; import org.graalvm.compiler.nodes.memory.MemoryCheckpoint; @@ -54,7 +53,6 @@ import org.graalvm.compiler.nodes.spi.LIRLowerable; import org.graalvm.compiler.nodes.spi.LoweringTool; import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool; import org.graalvm.compiler.nodes.spi.UncheckedInterfaceProvider; -import org.graalvm.compiler.nodes.util.GraphUtil; import jdk.internal.vm.compiler.word.LocationIdentity; import jdk.vm.ci.meta.JavaKind; @@ -67,9 +65,9 @@ import jdk.vm.ci.meta.JavaKind; allowedUsageTypes = {Memory}, cycles = CYCLES_UNKNOWN, cyclesRationale = "We cannot estimate the runtime cost of a call, it is a blackhole." + - "However, we can estimate, dyanmically, the cost of the call operation itself based on the type of the call.", + "However, we can estimate, dynamically, the cost of the call operation itself based on the type of the call.", size = SIZE_UNKNOWN, - sizeRationale = "We can only dyanmically, based on the type of the call (special, static, virtual, interface) decide" + + sizeRationale = "We can only dynamically, based on the type of the call (special, static, virtual, interface) decide" + "how much code is generated for the call.") // @formatter:on public final class InvokeNode extends AbstractMemoryCheckpoint implements Invoke, LIRLowerable, MemoryCheckpoint.Single, UncheckedInterfaceProvider { @@ -81,17 +79,38 @@ public final class InvokeNode extends AbstractMemoryCheckpoint implements Invoke protected final int bci; protected boolean polymorphic; protected boolean useForInlining; + protected final LocationIdentity identity; public InvokeNode(CallTargetNode callTarget, int bci) { this(callTarget, bci, callTarget.returnStamp().getTrustedStamp()); } + public InvokeNode(CallTargetNode callTarget, int bci, LocationIdentity identity) { + this(callTarget, bci, callTarget.returnStamp().getTrustedStamp(), identity); + } + public InvokeNode(CallTargetNode callTarget, int bci, Stamp stamp) { + this(callTarget, bci, stamp, LocationIdentity.any()); + } + + public InvokeNode(CallTargetNode callTarget, int bci, Stamp stamp, LocationIdentity identity) { super(TYPE, stamp); this.callTarget = callTarget; this.bci = bci; this.polymorphic = false; this.useForInlining = true; + this.identity = identity; + } + + public InvokeNode replaceWithNewBci(int newBci) { + InvokeNode newInvoke = graph().add(new InvokeNode(callTarget, newBci, stamp, identity)); + newInvoke.setUseForInlining(useForInlining); + newInvoke.setPolymorphic(polymorphic); + newInvoke.setStateAfter(stateAfter); + newInvoke.setStateDuring(stateDuring); + newInvoke.setClassInit(classInit); + graph().replaceFixedWithFixed(this, newInvoke); + return newInvoke; } @Override @@ -158,7 +177,7 @@ public final class InvokeNode extends AbstractMemoryCheckpoint implements Invoke @Override public LocationIdentity getLocationIdentity() { - return LocationIdentity.any(); + return identity; } @Override @@ -187,35 +206,6 @@ public final class InvokeNode extends AbstractMemoryCheckpoint implements Invoke return bci; } - @Override - public void intrinsify(Node node) { - assert !(node instanceof ValueNode) || node.isAllowedUsageType(InputType.Value) == isAllowedUsageType(InputType.Value) : "replacing " + this + " with " + node; - CallTargetNode call = callTarget; - FrameState currentStateAfter = stateAfter(); - if (node instanceof StateSplit) { - StateSplit stateSplit = (StateSplit) node; - stateSplit.setStateAfter(currentStateAfter); - } - if (node instanceof ForeignCallNode) { - ForeignCallNode foreign = (ForeignCallNode) node; - foreign.setBci(bci()); - } - if (node instanceof FixedWithNextNode) { - graph().replaceFixedWithFixed(this, (FixedWithNextNode) node); - } else if (node instanceof ControlSinkNode) { - this.replaceAtPredecessor(node); - this.replaceAtUsages(null); - GraphUtil.killCFG(this); - return; - } else { - graph().replaceFixed(this, node); - } - GraphUtil.killWithUnusedFloatingInputs(call); - if (currentStateAfter.hasNoUsages()) { - GraphUtil.killWithUnusedFloatingInputs(currentStateAfter); - } - } - @Override public boolean canDeoptimize() { return true; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InvokeWithExceptionNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InvokeWithExceptionNode.java index 0e30a23dcfc..ba68cf25557 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InvokeWithExceptionNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/InvokeWithExceptionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,14 +24,11 @@ package org.graalvm.compiler.nodes; -import jdk.vm.ci.meta.JavaKind; - import org.graalvm.compiler.core.common.type.Stamp; import org.graalvm.compiler.graph.Node; import org.graalvm.compiler.graph.NodeClass; import org.graalvm.compiler.nodeinfo.NodeInfo; import org.graalvm.compiler.nodeinfo.Verbosity; -import org.graalvm.compiler.nodes.extended.ForeignCallNode; import org.graalvm.compiler.nodes.java.MethodCallTargetNode; import org.graalvm.compiler.nodes.memory.MemoryCheckpoint; import org.graalvm.compiler.nodes.spi.LIRLowerable; @@ -226,39 +223,6 @@ public final class InvokeWithExceptionNode extends ControlSplitNode implements I this.markDeleted(); } - @Override - public void intrinsify(Node node) { - assert !(node instanceof ValueNode) || (((ValueNode) node).getStackKind() == JavaKind.Void) == (getStackKind() == JavaKind.Void); - CallTargetNode call = callTarget; - FrameState state = stateAfter(); - if (exceptionEdge != null) { - killExceptionEdge(); - } - if (node instanceof StateSplit) { - StateSplit stateSplit = (StateSplit) node; - stateSplit.setStateAfter(state); - } - if (node instanceof ForeignCallNode) { - ForeignCallNode foreign = (ForeignCallNode) node; - foreign.setBci(bci()); - } - if (node == null) { - assert getStackKind() == JavaKind.Void && hasNoUsages(); - graph().removeSplit(this, next()); - } else if (node instanceof ControlSinkNode) { - this.replaceAtPredecessor(node); - this.replaceAtUsages(null); - GraphUtil.killCFG(this); - return; - } else { - graph().replaceSplit(this, node, next()); - } - GraphUtil.killWithUnusedFloatingInputs(call); - if (state.hasNoUsages()) { - GraphUtil.killWithUnusedFloatingInputs(state); - } - } - @Override public double probability(AbstractBeginNode successor) { return successor == next ? 1 - exceptionProbability : exceptionProbability; @@ -317,10 +281,12 @@ public final class InvokeWithExceptionNode extends ControlSplitNode implements I * code. */ public InvokeNode replaceWithInvoke() { - InvokeNode invokeNode = graph().add(new InvokeNode(callTarget, bci)); + InvokeNode newInvoke = graph().add(new InvokeNode(callTarget, bci, stamp, getLocationIdentity())); + newInvoke.setStateAfter(stateAfter); + newInvoke.setStateDuring(stateDuring); AbstractBeginNode oldException = this.exceptionEdge; - graph().replaceSplitWithFixed(this, invokeNode, this.next()); + graph().replaceSplitWithFixed(this, newInvoke, this.next()); GraphUtil.killCFG(oldException); - return invokeNode; + return newInvoke; } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/KillingBeginNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/KillingBeginNode.java index 1ecc5e345ae..95045aba513 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/KillingBeginNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/KillingBeginNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicConstantNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicConstantNode.java index e8a53ecd98b..fe1d03575b1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicConstantNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicConstantNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicNegationNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicNegationNode.java index 8ce7d8c5967..c4364124192 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicNegationNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicNegationNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicNode.java index 394483e2010..8cb8f847904 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LogicNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopBeginNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopBeginNode.java index 88a41651641..ee4d2834401 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopBeginNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopBeginNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopEndNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopEndNode.java index 373b7cad9f6..6d66c94f8d5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopEndNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopEndNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopExitNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopExitNode.java index 538f6fb48a2..895e16e7421 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopExitNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopExitNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoweredCallTargetNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoweredCallTargetNode.java index 617650ac110..b73113a30a5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoweredCallTargetNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoweredCallTargetNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/MergeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/MergeNode.java index 0dd73feb4e4..fe5f4afed39 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/MergeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/MergeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/NamedLocationIdentity.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/NamedLocationIdentity.java index cc8f853b8f5..6bb83d846f1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/NamedLocationIdentity.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/NamedLocationIdentity.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/NodeView.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/NodeView.java index 386a7e447a8..6191b5d1d38 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/NodeView.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/NodeView.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ParameterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ParameterNode.java index afe0fbc6237..5459bcd5e7c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ParameterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ParameterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PauseNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PauseNode.java index db1587dec7f..64accc89054 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PauseNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PauseNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PhiNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PhiNode.java index 2c464cf1d2b..a19a7094fe5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PhiNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PhiNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PiArrayNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PiArrayNode.java index 8e5d3801d7a..9d0f3c6cf88 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PiArrayNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PiArrayNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PiNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PiNode.java index 87d2c29def3..8c351a68ce2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PiNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PiNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PrefetchAllocateNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PrefetchAllocateNode.java index c4ef2e71378..5b048584538 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PrefetchAllocateNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/PrefetchAllocateNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ProxyNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ProxyNode.java index 70cc23709ba..f6216379ff8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ProxyNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ProxyNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ReturnNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ReturnNode.java index d530d671eed..0a914c179d6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ReturnNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ReturnNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SafepointNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SafepointNode.java index 358407af3b0..0bb36daf736 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SafepointNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SafepointNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ShortCircuitOrNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ShortCircuitOrNode.java index 8bcb6bd5068..789f4c11959 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ShortCircuitOrNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ShortCircuitOrNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SimplifyingGraphDecoder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SimplifyingGraphDecoder.java index acc9db9ce5b..cc653e4df44 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SimplifyingGraphDecoder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SimplifyingGraphDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SnippetAnchorNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SnippetAnchorNode.java index 954929ce740..c004c2c1700 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SnippetAnchorNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/SnippetAnchorNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StartNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StartNode.java index 517033aee16..5b9d7448998 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StartNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StartNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StateSplit.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StateSplit.java index a0eacd6ce25..b89a149e1d6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StateSplit.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StateSplit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StaticDeoptimizingNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StaticDeoptimizingNode.java index a62deb2565f..ee25be8dbae 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StaticDeoptimizingNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StaticDeoptimizingNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StructuredGraph.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StructuredGraph.java index aabebe46569..d88b5f4e2db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StructuredGraph.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/StructuredGraph.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,8 +24,6 @@ package org.graalvm.compiler.nodes; -import static org.graalvm.compiler.graph.Graph.SourcePositionTracking.Default; - import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -184,7 +182,7 @@ public final class StructuredGraph extends Graph implements JavaMethodContext { private int entryBCI = JVMCICompiler.INVOCATION_ENTRY_BCI; private boolean useProfilingInfo = true; private boolean recordInlinedMethods = true; - private SourcePositionTracking trackNodeSourcePosition = Default; + private boolean trackNodeSourcePosition; private final OptionValues options; private Cancellable cancellable = null; private final DebugContext debug; @@ -295,14 +293,9 @@ public final class StructuredGraph extends Graph implements JavaMethodContext { return this; } - public Builder trackNodeSourcePosition(SourcePositionTracking tracking) { - this.trackNodeSourcePosition = tracking; - return this; - } - public Builder trackNodeSourcePosition(boolean flag) { if (flag) { - this.trackNodeSourcePosition = SourcePositionTracking.Track; + this.trackNodeSourcePosition = true; } return this; } @@ -398,13 +391,13 @@ public final class StructuredGraph extends Graph implements JavaMethodContext { boolean useProfilingInfo, boolean isSubstitution, List methods, - SourcePositionTracking trackNodeSourcePosition, + boolean trackNodeSourcePosition, CompilationIdentifier compilationId, OptionValues options, DebugContext debug, Cancellable cancellable, NodeSourcePosition context) { - super(name, options, debug); + super(name, options, debug, trackNodeSourcePosition); this.setStart(add(new StartNode())); this.rootMethod = method; this.graphId = uniqueGraphIds.incrementAndGet(); @@ -416,8 +409,6 @@ public final class StructuredGraph extends Graph implements JavaMethodContext { this.useProfilingInfo = useProfilingInfo; this.isSubstitution = isSubstitution; assert checkIsSubstitutionInvariants(method, isSubstitution); - this.trackNodeSourcePosition = trackNodeSourcePosition; - assert trackNodeSourcePosition != null; this.cancellable = cancellable; this.inliningLog = new InliningLog(rootMethod, GraalOptions.TraceInlining.getValue(options)); this.callerContext = context; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/TypeCheckHints.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/TypeCheckHints.java index f483c968b86..f90d5695efe 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/TypeCheckHints.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/TypeCheckHints.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/UnaryOpLogicNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/UnaryOpLogicNode.java index 427223e83dc..efca1f7b2a8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/UnaryOpLogicNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/UnaryOpLogicNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/UnwindNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/UnwindNode.java index 9e1db34c3aa..958ec066012 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/UnwindNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/UnwindNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNode.java index 55d3bbb7d95..afea2e1e759 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNodeInterface.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNodeInterface.java index bd6c416e0ae..17e296602c6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNodeInterface.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNodeInterface.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNodeUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNodeUtil.java index 98ced364378..e264cb8f06e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNodeUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueNodeUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValuePhiNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValuePhiNode.java index d2d4b26b81d..92818c84715 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValuePhiNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValuePhiNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueProxyNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueProxyNode.java index a6093a902c6..8d414c27214 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueProxyNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/ValueProxyNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/VirtualState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/VirtualState.java index 07b5eda4c52..c74ad9541f6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/VirtualState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/VirtualState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/AbsNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/AbsNode.java index 96665773b1d..33e450ba78e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/AbsNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/AbsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/AndNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/AndNode.java index b1856d88e46..c419e04009a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/AndNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/AndNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/BinaryArithmeticNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/BinaryArithmeticNode.java index ab857e4e003..83acfbf47c8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/BinaryArithmeticNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/BinaryArithmeticNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/BinaryNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/BinaryNode.java index 58625666685..70caed8f275 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/BinaryNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/BinaryNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ConvertNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ConvertNode.java index b17ef35fb6c..3bb1a0f53a3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ConvertNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ConvertNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FixedBinaryNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FixedBinaryNode.java index a47d3849764..ed4adc789fb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FixedBinaryNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FixedBinaryNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatConvertNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatConvertNode.java index 5b748da5b7b..7ed8bb85b02 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatConvertNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatConvertNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatDivNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatDivNode.java index 55213640a22..284fd2f4994 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatDivNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatDivNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatEqualsNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatEqualsNode.java index 078daf01dbf..0df61aa0660 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatEqualsNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatEqualsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatLessThanNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatLessThanNode.java index f1460aeca1f..f87f213827d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatLessThanNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatLessThanNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatingNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatingNode.java index 2aadd400569..607c807983b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatingNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/FloatingNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerBelowNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerBelowNode.java index cdfe52f9fce..3c6f939f09e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerBelowNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerBelowNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerConvertNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerConvertNode.java index 4c7b61342eb..2b0dfc4d68c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerConvertNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerConvertNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerDivRemNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerDivRemNode.java index 2ca9f6d8027..3da24d4c6d5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerDivRemNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerDivRemNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerEqualsNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerEqualsNode.java index e5187f2ef69..c42a15e19cc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerEqualsNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerEqualsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerTestNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerTestNode.java index fa672cce39f..665a6301e96 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerTestNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerTestNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IsNullNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IsNullNode.java index 1c59540eb4a..dd284480581 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IsNullNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IsNullNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/LeftShiftNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/LeftShiftNode.java index b98e47be781..a9150d97857 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/LeftShiftNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/LeftShiftNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/MulNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/MulNode.java index 0da9505efcd..8b026ed6eb2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/MulNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/MulNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NarrowNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NarrowNode.java index 3cb0a0cfa48..c70f0a9ffc4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NarrowNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NarrowNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NarrowableArithmeticNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NarrowableArithmeticNode.java index ae2978e3d08..17897524c15 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NarrowableArithmeticNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NarrowableArithmeticNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NegateNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NegateNode.java index c21ea0b9dfa..0435ddac769 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NegateNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NegateNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NormalizeCompareNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NormalizeCompareNode.java index a06ff4a4c42..c69b362f07d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NormalizeCompareNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NormalizeCompareNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NotNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NotNode.java index e030b2cc08a..941370ce8f9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NotNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/NotNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ObjectEqualsNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ObjectEqualsNode.java index 0f0ef8f6211..20e6e277dd4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ObjectEqualsNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ObjectEqualsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/OrNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/OrNode.java index a9894fcad7f..74f5435d504 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/OrNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/OrNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/PointerEqualsNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/PointerEqualsNode.java index aab88d50b84..f36e437826d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/PointerEqualsNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/PointerEqualsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ReinterpretNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ReinterpretNode.java index ecb61d72c43..d0848dc675b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ReinterpretNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ReinterpretNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/RemNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/RemNode.java index 092c5d915bb..fe48892ad88 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/RemNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/RemNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/RightShiftNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/RightShiftNode.java index 30083bb6d2a..9b27d849f27 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/RightShiftNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/RightShiftNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ShiftNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ShiftNode.java index a3c0f0d60bf..148bf9d8652 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ShiftNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ShiftNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignExtendNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignExtendNode.java index 7c31645b708..4c23f3e822f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignExtendNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignExtendNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignedDivNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignedDivNode.java index 0def494827e..a64bcaf6695 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignedDivNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignedDivNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignedRemNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignedRemNode.java index 2c1130f95ae..19ca38c507a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignedRemNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignedRemNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SqrtNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SqrtNode.java index 6de39cf0ef4..d9af8edd85d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SqrtNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SqrtNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SubNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SubNode.java index 98d27dc28f9..74755c1ea6f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SubNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SubNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnaryArithmeticNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnaryArithmeticNode.java index 6c548a78f27..2137e8aca68 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnaryArithmeticNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnaryArithmeticNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnaryNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnaryNode.java index 43f9a37c793..8d0c027c53a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnaryNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnaryNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnpackEndianHalfNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnpackEndianHalfNode.java index af68c601b0c..89a8c3a02a4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnpackEndianHalfNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnpackEndianHalfNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedDivNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedDivNode.java index 67af7baec36..39f4a2a67bd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedDivNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedDivNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedRemNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedRemNode.java index 5ddb1576a58..aef897c4c9a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedRemNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedRemNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedRightShiftNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedRightShiftNode.java index fe619d540bb..c28a04e5384 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedRightShiftNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/UnsignedRightShiftNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/XorNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/XorNode.java index d93c9efa4f7..dd782d43bdc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/XorNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/XorNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ZeroExtendNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ZeroExtendNode.java index 040332f6fd2..a0b02d2fa4f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ZeroExtendNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/ZeroExtendNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/Block.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/Block.java index 01607ccac3d..a09de19dfab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/Block.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/Block.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/ControlFlowGraph.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/ControlFlowGraph.java index f86b829a27f..d1431467eb9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/ControlFlowGraph.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/ControlFlowGraph.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/HIRLoop.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/HIRLoop.java index b32d8b2d9bd..6b80b6e0e8e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/HIRLoop.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/HIRLoop.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/LocationSet.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/LocationSet.java index f74866c198f..2c63166f3e7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/LocationSet.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/cfg/LocationSet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/BindToRegisterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/BindToRegisterNode.java index 507e65bb883..b8d69e824a0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/BindToRegisterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/BindToRegisterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/BlackholeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/BlackholeNode.java index 4e9f3a5b3d0..ffb72068616 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/BlackholeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/BlackholeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/ControlFlowAnchorNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/ControlFlowAnchorNode.java index 6169cc0bf95..041328d747f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/ControlFlowAnchorNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/ControlFlowAnchorNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/ControlFlowAnchored.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/ControlFlowAnchored.java index 7470aa9cea8..13fb77e1a53 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/ControlFlowAnchored.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/ControlFlowAnchored.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/DynamicCounterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/DynamicCounterNode.java index 90817af8818..c222688218c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/DynamicCounterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/DynamicCounterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/SpillRegistersNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/SpillRegistersNode.java index fd17acc95b8..3e0eb04d63c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/SpillRegistersNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/SpillRegistersNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/StringToBytesNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/StringToBytesNode.java index ecae19feebc..11c9a1b351b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/StringToBytesNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/StringToBytesNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/VerifyHeapNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/VerifyHeapNode.java index 6be3ad341c2..f4bc85ec1d3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/VerifyHeapNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/VerifyHeapNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/WeakCounterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/WeakCounterNode.java index 64a1bac63cd..c30188aa30b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/WeakCounterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/debug/WeakCounterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/AnchoringNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/AnchoringNode.java index 8788afe1e15..646b6302814 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/AnchoringNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/AnchoringNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ArrayRangeWrite.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ArrayRangeWrite.java index 5adaab704a7..32e721441c5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ArrayRangeWrite.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ArrayRangeWrite.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/BoxNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/BoxNode.java index 02426b7ee77..2481ddbf556 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/BoxNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/BoxNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/BranchProbabilityNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/BranchProbabilityNode.java index c6c49cfe9d4..7af6041c3f7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/BranchProbabilityNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/BranchProbabilityNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/FixedValueAnchorNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/FixedValueAnchorNode.java index c50474a2d9e..7a2339b7c31 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/FixedValueAnchorNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/FixedValueAnchorNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ForeignCallNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ForeignCallNode.java index 76c0365cbe8..f5fbe46534f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ForeignCallNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ForeignCallNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GetClassNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GetClassNode.java index 0f11a76072d..c70cfdc3916 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GetClassNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GetClassNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardedNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardedNode.java index b2d571d4a44..65431cba6a5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardedNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardedNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardedUnsafeLoadNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardedUnsafeLoadNode.java index 8871fef1f33..2c4c0ccd8ae 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardedUnsafeLoadNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardedUnsafeLoadNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardingNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardingNode.java index d067fcd3668..9a0e75822c7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardingNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/GuardingNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/test/hotspot/jtreg/compiler/graalunit/Replacements9_11Test.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/HubGetClassNodeInterface.java similarity index 69% rename from test/hotspot/jtreg/compiler/graalunit/Replacements9_11Test.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/HubGetClassNodeInterface.java index 9dc845016c6..e8ec1835df4 100644 --- a/test/hotspot/jtreg/compiler/graalunit/Replacements9_11Test.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/HubGetClassNodeInterface.java @@ -21,18 +21,16 @@ * questions. */ -/* - * @test - * @summary - * @requires vm.opt.final.EnableJVMCI == true - * - * @modules jdk.internal.vm.compiler - * - * @library /test/lib /compiler/graalunit / - * - * @build compiler.graalunit.common.GraalUnitTestLauncher - * - * @run driver jdk.test.lib.FileInstaller ../../ProblemList-graal.txt ExcludeList.txt - * - * @run main/othervm compiler.graalunit.common.GraalUnitTestLauncher -prefix org.graalvm.compiler.replacements.jdk9_11.test -exclude ExcludeList.txt + +package org.graalvm.compiler.nodes.extended; + +import org.graalvm.compiler.nodes.ValueNode; +import org.graalvm.compiler.nodes.ValueNodeInterface; + +/** + * In some systems, the hub and the class are different objects, and this is a base interface for + * operations that converts a hub to the class. */ +public interface HubGetClassNodeInterface extends ValueNodeInterface { + ValueNode getHub(); +} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/IntegerSwitchNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/IntegerSwitchNode.java index ecb3ecbf838..44fdf46ae84 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/IntegerSwitchNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/IntegerSwitchNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/JavaReadNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/JavaReadNode.java index af35cf38fa4..a5a1403dc0b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/JavaReadNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/JavaReadNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/JavaWriteNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/JavaWriteNode.java index ef6d292f57e..88738afce32 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/JavaWriteNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/JavaWriteNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadArrayComponentHubNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadArrayComponentHubNode.java index 8589979397e..594056173a1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadArrayComponentHubNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadArrayComponentHubNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadHubNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadHubNode.java index 6b5d9bb8839..b23121b6395 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadHubNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadHubNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadMethodNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadMethodNode.java index 76a681a81dc..d9795ffb779 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadMethodNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/LoadMethodNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MembarNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MembarNode.java index 09f91169cee..ea25e3908f6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MembarNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MembarNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MonitorEnter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MonitorEnter.java index 8f7c4d90bc4..274dc0f616b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MonitorEnter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MonitorEnter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MonitorExit.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MonitorExit.java index 268c542a45c..bf0995a2e38 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MonitorExit.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/MonitorExit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/NullCheckNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/NullCheckNode.java index 577d9745a15..288179463bb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/NullCheckNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/NullCheckNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRLocalNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRLocalNode.java index 1e635d689e9..4a1ba924f85 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRLocalNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRLocalNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRLockNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRLockNode.java index 541bc4e7588..f26a994aa8f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRLockNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRLockNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRMonitorEnterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRMonitorEnterNode.java index 80b081c35aa..f61f89ea361 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRMonitorEnterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRMonitorEnterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRStartNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRStartNode.java index 3ea8ad88fd6..f5b1edbd4fd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRStartNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OSRStartNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OpaqueNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OpaqueNode.java index c967f097c07..ecb35d195f2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OpaqueNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/OpaqueNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/RawLoadNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/RawLoadNode.java index f4bf68a12f3..10d8679c6d8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/RawLoadNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/RawLoadNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/RawStoreNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/RawStoreNode.java index eb1db203225..e39e6d61b54 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/RawStoreNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/RawStoreNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/StateSplitProxyNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/StateSplitProxyNode.java index e5578d5ec6d..284ddc178d2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/StateSplitProxyNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/StateSplitProxyNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/StoreHubNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/StoreHubNode.java index ebb0307d294..f8d371ec31e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/StoreHubNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/StoreHubNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/SwitchNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/SwitchNode.java index 31f6ef6f029..e445db82d1c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/SwitchNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/SwitchNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnboxNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnboxNode.java index 56430e72fa8..b73795dcb92 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnboxNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnboxNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeAccessNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeAccessNode.java index e04b75b9a84..5c3fac1d7f3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeAccessNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeAccessNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeCopyNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeCopyNode.java index 971d7672ed7..9a5bac87dae 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeCopyNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeCopyNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeMemoryLoadNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeMemoryLoadNode.java index 587aba27124..264aef9ea27 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeMemoryLoadNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeMemoryLoadNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeMemoryStoreNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeMemoryStoreNode.java index b79faca2199..4e67c5cf319 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeMemoryStoreNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/UnsafeMemoryStoreNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ValueAnchorNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ValueAnchorNode.java index bc122de28e6..e429f7ac2b8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ValueAnchorNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/ValueAnchorNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ClassInitializationPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ClassInitializationPlugin.java index 8c1aa35017c..2804c775d4a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ClassInitializationPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ClassInitializationPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,19 +24,62 @@ package org.graalvm.compiler.nodes.graphbuilderconf; +import java.util.function.Supplier; + import org.graalvm.compiler.nodes.FrameState; import org.graalvm.compiler.nodes.ValueNode; import jdk.vm.ci.meta.ConstantPool; import jdk.vm.ci.meta.ResolvedJavaType; +/** + * Plugin for emitting a class initialization barrier (i.e., initializes a class if it's not already + * initialized). + * + * This plugin also supports separating class resolution from class initialization with + * {@link #supportsLazyInitialization(ConstantPool)} and + * {@link #loadReferencedType(GraphBuilderContext, ConstantPool, int, int)}. + * + * @see "https://bugs.openjdk.java.net/browse/JDK-8146201" + */ public interface ClassInitializationPlugin extends GraphBuilderPlugin { - boolean shouldApply(GraphBuilderContext builder, ResolvedJavaType type); - ValueNode apply(GraphBuilderContext builder, ResolvedJavaType type, FrameState frameState); + /** + * Emits a class initialization barrier for {@code type}. + * + * @param frameState supplier to create a frame state representing the state just prior to + * execution of the class initialization barrier + * @param classInit if non-null, the node representing the class initialization barrier should + * be returned in element 0 of this array + * @return {@code true} if this method emitted a barrier,{@code false} if not + */ + boolean apply(GraphBuilderContext builder, ResolvedJavaType type, Supplier frameState, ValueNode[] classInit); + /** + * Emits a class initialization barrier for {@code type}. + * + * @param frameState supplier to create a frame state representing the state just prior to + * execution of the class initialization barrier + * @return {@code true} if this method emitted a barrier,{@code false} if not + */ + default boolean apply(GraphBuilderContext builder, ResolvedJavaType type, Supplier frameState) { + return apply(builder, type, frameState, null); + } + + /** + * Determines if {@code cp} has a variation of {@link ConstantPool#loadReferencedType} that can + * resolved a type without initializing it. + */ boolean supportsLazyInitialization(ConstantPool cp); + /** + * Ensures that the type referenced by the constant pool entry specified by {@code cp} and + * {@code cpi} is loaded. If {@code cp} does not support + * {@linkplain #supportsLazyInitialization(ConstantPool) lazy} initialization, then the type is + * initialized after resolution. + * + * @param cpi the index of the constant pool entry that references the type + * @param bytecode the opcode of the instruction that references the type + */ void loadReferencedType(GraphBuilderContext builder, ConstantPool cp, int cpi, int bytecode); - } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ForeignCallPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ForeignCallPlugin.java index f82305b6b87..bc346933f0a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ForeignCallPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ForeignCallPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GeneratedInvocationPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GeneratedInvocationPlugin.java index 235f52c391d..548c679a9c0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GeneratedInvocationPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GeneratedInvocationPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderConfiguration.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderConfiguration.java index ff0fa72f8fe..fa5044ecf38 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderConfiguration.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderContext.java index ad88675537e..1cfe75f7180 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderContext.java @@ -41,6 +41,7 @@ import org.graalvm.compiler.nodes.AbstractMergeNode; import org.graalvm.compiler.nodes.CallTargetNode; import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind; import org.graalvm.compiler.nodes.ConstantNode; +import org.graalvm.compiler.nodes.DynamicPiNode; import org.graalvm.compiler.nodes.FixedGuardNode; import org.graalvm.compiler.nodes.LogicNode; import org.graalvm.compiler.nodes.NodeView; @@ -52,6 +53,7 @@ import org.graalvm.compiler.nodes.calc.NarrowNode; import org.graalvm.compiler.nodes.calc.SignExtendNode; import org.graalvm.compiler.nodes.calc.ZeroExtendNode; import org.graalvm.compiler.nodes.extended.BytecodeExceptionNode.BytecodeExceptionKind; +import org.graalvm.compiler.nodes.java.InstanceOfDynamicNode; import org.graalvm.compiler.nodes.type.StampTool; import jdk.vm.ci.code.BailoutException; @@ -291,6 +293,17 @@ public interface GraphBuilderContext extends GraphBuilderTool { return value; } + default void genCheckcastDynamic(ValueNode object, ValueNode javaClass) { + LogicNode condition = InstanceOfDynamicNode.create(getAssumptions(), getConstantReflection(), javaClass, object, true); + if (condition.isTautology()) { + addPush(JavaKind.Object, object); + } else { + append(condition); + FixedGuardNode fixedGuard = add(new FixedGuardNode(condition, DeoptimizationReason.ClassCastException, DeoptimizationAction.InvalidateReprofile, false)); + addPush(JavaKind.Object, DynamicPiNode.create(getAssumptions(), getConstantReflection(), object, fixedGuard, javaClass)); + } + } + @SuppressWarnings("unused") default void notifyReplacedCall(ResolvedJavaMethod targetMethod, ConstantNode node) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderPlugin.java index d9d6e1d6df9..3ceb2788465 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderTool.java index 51a89715385..43e553c5ca0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InlineInvokePlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InlineInvokePlugin.java index 3eef1f9c3f8..deb8bbf10a8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InlineInvokePlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InlineInvokePlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/IntrinsicContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/IntrinsicContext.java index 94042eea570..513daad5003 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/IntrinsicContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/IntrinsicContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugin.java index 41001434e25..c04a5831594 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java index 24a67d4cf33..069f170026c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvokeDynamicPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvokeDynamicPlugin.java index 09bedc06322..bc2fe372d86 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvokeDynamicPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvokeDynamicPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/LoopExplosionPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/LoopExplosionPlugin.java index c0b11f9322f..1874aa9fcbc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/LoopExplosionPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/LoopExplosionPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/MethodSubstitutionPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/MethodSubstitutionPlugin.java index fba41e2efb6..a0ca9598eb2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/MethodSubstitutionPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/MethodSubstitutionPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/NodeIntrinsicPluginFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/NodeIntrinsicPluginFactory.java index f543f581349..2abaa077a48 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/NodeIntrinsicPluginFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/NodeIntrinsicPluginFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/NodePlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/NodePlugin.java index d93f06b9359..d0e2dfddaef 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/NodePlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/NodePlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ParameterPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ParameterPlugin.java index eb29d02a43d..7e007c465f3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ParameterPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ParameterPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ProfilingPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ProfilingPlugin.java index f8943df06ab..97dbbb2d559 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ProfilingPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/ProfilingPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/TypePlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/TypePlugin.java index ee26be4ec1c..15fd0142d70 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/TypePlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/TypePlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractCompareAndSwapNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractCompareAndSwapNode.java index e27b1f5087a..f889918074b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractCompareAndSwapNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractCompareAndSwapNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractNewArrayNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractNewArrayNode.java index 0f7368a24c3..9b0418cfddf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractNewArrayNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractNewArrayNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractNewObjectNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractNewObjectNode.java index 3ed82d96c3b..2a2415273df 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractNewObjectNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractNewObjectNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractUnsafeCompareAndSwapNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractUnsafeCompareAndSwapNode.java index 07cdbdb424a..7279d2e461b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractUnsafeCompareAndSwapNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AbstractUnsafeCompareAndSwapNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessArrayNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessArrayNode.java index 40c84f4883f..5f4d992fd61 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessArrayNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessArrayNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessFieldNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessFieldNode.java index 39c7c6e9499..508bf561178 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessFieldNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessFieldNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessIndexedNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessIndexedNode.java index a0780dccf7c..94f3efcb56c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessIndexedNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessIndexedNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessMonitorNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessMonitorNode.java index 2be5bddeffd..8fb58e1dac0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessMonitorNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AccessMonitorNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ArrayLengthNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ArrayLengthNode.java index 22470c265a4..c6452125f6f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ArrayLengthNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ArrayLengthNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AtomicReadAndAddNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AtomicReadAndAddNode.java index 7f3482a5f36..f555c47f4d4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AtomicReadAndAddNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AtomicReadAndAddNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AtomicReadAndWriteNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AtomicReadAndWriteNode.java index e2a2f5fff13..1364b9f764d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AtomicReadAndWriteNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/AtomicReadAndWriteNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ClassIsAssignableFromNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ClassIsAssignableFromNode.java index f478f33d74c..62b6b05c713 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ClassIsAssignableFromNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ClassIsAssignableFromNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/DynamicNewArrayNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/DynamicNewArrayNode.java index 8e2e139a647..b35df1e1c92 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/DynamicNewArrayNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/DynamicNewArrayNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/DynamicNewInstanceNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/DynamicNewInstanceNode.java index 28e9ca813aa..51bd453237a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/DynamicNewInstanceNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/DynamicNewInstanceNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ExceptionObjectNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ExceptionObjectNode.java index ef333ae36fa..c4ff17d6af9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ExceptionObjectNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ExceptionObjectNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/FinalFieldBarrierNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/FinalFieldBarrierNode.java index 6b7569dbc7f..4940e682189 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/FinalFieldBarrierNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/FinalFieldBarrierNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ForeignCallDescriptors.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ForeignCallDescriptors.java index 5aeb8a7b9d2..ca1b667818f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ForeignCallDescriptors.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ForeignCallDescriptors.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/InstanceOfDynamicNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/InstanceOfDynamicNode.java index 12bd2c2e6d2..6a091dbbd99 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/InstanceOfDynamicNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/InstanceOfDynamicNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/InstanceOfNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/InstanceOfNode.java index 4f1dad75ab8..160ee51ad8e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/InstanceOfNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/InstanceOfNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadExceptionObjectNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadExceptionObjectNode.java index 72ec17a329c..c7fc759dd12 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadExceptionObjectNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadExceptionObjectNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadFieldNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadFieldNode.java index 8a1e2729996..88350dea1e9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadFieldNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadFieldNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadIndexedNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadIndexedNode.java index c48e098300a..af836d8b384 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadIndexedNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadIndexedNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LogicCompareAndSwapNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LogicCompareAndSwapNode.java index 353be027de3..c155989323f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LogicCompareAndSwapNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LogicCompareAndSwapNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoweredAtomicReadAndWriteNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoweredAtomicReadAndWriteNode.java index 8367edf258e..121892d471c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoweredAtomicReadAndWriteNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoweredAtomicReadAndWriteNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MethodCallTargetNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MethodCallTargetNode.java index 93cf4766a49..92c9d1581d9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MethodCallTargetNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MethodCallTargetNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorEnterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorEnterNode.java index 75451eb4151..13c19feedb9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorEnterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorEnterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorExitNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorExitNode.java index 7d2f53d15d1..0d2cfedf767 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorExitNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorExitNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorIdNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorIdNode.java index 0a6b1cd55ab..ce56ddab4b6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorIdNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/MonitorIdNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewArrayNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewArrayNode.java index 841e7f4af92..736f7dc297b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewArrayNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewArrayNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewInstanceNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewInstanceNode.java index 10895ff2eba..3894eb60dfc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewInstanceNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewInstanceNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewMultiArrayNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewMultiArrayNode.java index 36ae1b4e773..072c969e891 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewMultiArrayNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/NewMultiArrayNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/RawMonitorEnterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/RawMonitorEnterNode.java index 6dfa48a502a..c76d2de6b52 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/RawMonitorEnterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/RawMonitorEnterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/RegisterFinalizerNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/RegisterFinalizerNode.java index 3504b649384..99b9f177526 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/RegisterFinalizerNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/RegisterFinalizerNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/StoreFieldNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/StoreFieldNode.java index 3443d4453b6..5e291a5ea59 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/StoreFieldNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/StoreFieldNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/StoreIndexedNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/StoreIndexedNode.java index a03cfa60d4c..0021b061e75 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/StoreIndexedNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/StoreIndexedNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/TypeSwitchNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/TypeSwitchNode.java index 503ae57c15e..79d4c0d6222 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/TypeSwitchNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/TypeSwitchNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/UnsafeCompareAndExchangeNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/UnsafeCompareAndExchangeNode.java index 65250622a97..8c73a6c412f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/UnsafeCompareAndExchangeNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/UnsafeCompareAndExchangeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ValueCompareAndSwapNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ValueCompareAndSwapNode.java index fdad49f8c18..9911c1d7271 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ValueCompareAndSwapNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/ValueCompareAndSwapNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/AbstractMemoryCheckpoint.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/AbstractMemoryCheckpoint.java index 4e00b11e2a4..c7465a48303 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/AbstractMemoryCheckpoint.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/AbstractMemoryCheckpoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/AbstractWriteNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/AbstractWriteNode.java index 85df8a64b70..27c59240356 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/AbstractWriteNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/AbstractWriteNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/Access.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/Access.java index b27d1199956..5095a1d6e6d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/Access.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/Access.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FixedAccessNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FixedAccessNode.java index bc78493f087..4992dc4d1a7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FixedAccessNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FixedAccessNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatableAccessNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatableAccessNode.java index 8f2fa51eaaf..ada1e3afea2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatableAccessNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatableAccessNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatingAccessNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatingAccessNode.java index 5354d428011..c4fae1ed00c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatingAccessNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatingAccessNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatingReadNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatingReadNode.java index dd46f64c7f1..530aa4442f2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatingReadNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/FloatingReadNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/HeapAccess.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/HeapAccess.java index 81c494c2778..29b5948378e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/HeapAccess.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/HeapAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/LIRLowerableAccess.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/LIRLowerableAccess.java index af31ecc5337..09ebe293a6b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/LIRLowerableAccess.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/LIRLowerableAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryAccess.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryAccess.java index 0de9a9b67c8..103695aaeba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryAccess.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryAnchorNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryAnchorNode.java index 99c6a9a7b3c..a3370989abb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryAnchorNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryAnchorNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryCheckpoint.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryCheckpoint.java index b76f56694f0..ffd094804d9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryCheckpoint.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryCheckpoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryMap.java index e2e33881395..b403fb91a31 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryMapNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryMapNode.java index bc0000a2303..4068abbdb58 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryMapNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryMapNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryNode.java index a1707864974..882d1e09b08 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryPhiNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryPhiNode.java index b13e2dbd581..07970849553 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryPhiNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/MemoryPhiNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/ReadNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/ReadNode.java index 31d268f26ca..68b4317996c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/ReadNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/ReadNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/WriteNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/WriteNode.java index b0fef5d259c..778caf3ee42 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/WriteNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/WriteNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/address/AddressNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/address/AddressNode.java index 2c546f99465..ae7d5131cfc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/address/AddressNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/address/AddressNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/address/OffsetAddressNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/address/OffsetAddressNode.java index 15f36abf485..088cd6bea97 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/address/OffsetAddressNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/address/OffsetAddressNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ArithmeticLIRLowerable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ArithmeticLIRLowerable.java index 8f93a36527e..433dd0713f8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ArithmeticLIRLowerable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ArithmeticLIRLowerable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ArrayLengthProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ArrayLengthProvider.java index 5507bc5b572..54b02188219 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ArrayLengthProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ArrayLengthProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LIRLowerable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LIRLowerable.java index 937d5955dee..70c8b9c3d2e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LIRLowerable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LIRLowerable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LimitedValueProxy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LimitedValueProxy.java index 2991aaf601f..c21abb0e566 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LimitedValueProxy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LimitedValueProxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Lowerable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Lowerable.java index bef354421d6..0bee87ec782 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Lowerable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Lowerable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LoweringProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LoweringProvider.java index aeb8a647f3c..122d37fca91 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LoweringProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LoweringProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LoweringTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LoweringTool.java index 5f2128153aa..e5d1134aad8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LoweringTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/LoweringTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/MemoryProxy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/MemoryProxy.java index 5aaed7e9b92..5175340cab1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/MemoryProxy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/MemoryProxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeLIRBuilderTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeLIRBuilderTool.java index 044f45ff63a..3f3b6693cad 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeLIRBuilderTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeLIRBuilderTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeValueMap.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeValueMap.java index 8e8d9c3d8d6..e5ac29aac35 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeValueMap.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeValueMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeWithState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeWithState.java index f501b0a81ee..6eca617c61e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeWithState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/NodeWithState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Proxy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Proxy.java index 9bb09079071..59364cd0508 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Proxy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Proxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Replacements.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Replacements.java index 61162c638df..f6e95a35f8c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Replacements.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Replacements.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/StampInverter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/StampInverter.java index 10c994964c2..87398499aa8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/StampInverter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/StampInverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/StampProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/StampProvider.java index b9acbe9a9f3..3627017c27d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/StampProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/StampProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/UncheckedInterfaceProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/UncheckedInterfaceProvider.java index 1e228c347c8..38a7be04bc7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/UncheckedInterfaceProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/UncheckedInterfaceProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ValueProxy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ValueProxy.java index 8b69d912256..12ffa4cd173 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ValueProxy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/ValueProxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Virtualizable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Virtualizable.java index f89bb84669c..ad98db1db9b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Virtualizable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/Virtualizable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/VirtualizableAllocation.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/VirtualizableAllocation.java index f52bed6f9e7..2a3baa1cd34 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/VirtualizableAllocation.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/VirtualizableAllocation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/VirtualizerTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/VirtualizerTool.java index 4848cd1fd72..f9c2003442c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/VirtualizerTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/spi/VirtualizerTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/type/NarrowOopStamp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/type/NarrowOopStamp.java index 1d211019ba0..512c0b92444 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/type/NarrowOopStamp.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/type/NarrowOopStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/type/StampTool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/type/StampTool.java index f1f97bd71f7..de83352378e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/type/StampTool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/type/StampTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/ConstantFoldUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/ConstantFoldUtil.java index c3f544f15e9..fb715af3162 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/ConstantFoldUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/ConstantFoldUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/GraphUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/GraphUtil.java index f6b46b32258..be968d299f2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/GraphUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/GraphUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -80,6 +80,7 @@ import org.graalvm.compiler.nodes.spi.LimitedValueProxy; import org.graalvm.compiler.nodes.spi.LoweringProvider; import org.graalvm.compiler.nodes.spi.ValueProxy; import org.graalvm.compiler.nodes.spi.VirtualizerTool; +import org.graalvm.compiler.nodes.type.StampTool; import org.graalvm.compiler.nodes.virtual.VirtualArrayNode; import org.graalvm.compiler.nodes.virtual.VirtualObjectNode; import org.graalvm.compiler.options.Option; @@ -1049,11 +1050,26 @@ public class GraphUtil { if (sourceAlias instanceof VirtualObjectNode) { /* The source array is virtualized, just copy over the values. */ VirtualObjectNode sourceVirtual = (VirtualObjectNode) sourceAlias; + boolean alwaysAssignable = newComponentType.getJavaKind() == JavaKind.Object && newComponentType.isJavaLangObject(); for (int i = 0; i < readLength; i++) { - newEntryState[i] = tool.getEntry(sourceVirtual, fromInt + i); + ValueNode entry = tool.getEntry(sourceVirtual, fromInt + i); + if (!alwaysAssignable) { + ResolvedJavaType entryType = StampTool.typeOrNull(entry, tool.getMetaAccess()); + if (entryType == null) { + return; + } + if (!newComponentType.isAssignableFrom(entryType)) { + return; + } + } + newEntryState[i] = entry; } } else { /* The source array is not virtualized, emit index loads. */ + ResolvedJavaType sourceType = StampTool.typeOrNull(sourceAlias, tool.getMetaAccess()); + if (sourceType == null || !sourceType.isArray() || !newComponentType.isAssignableFrom(sourceType.getElementalType())) { + return; + } for (int i = 0; i < readLength; i++) { LoadIndexedNode load = new LoadIndexedNode(null, sourceAlias, ConstantNode.forInt(i + fromInt, graph), null, elementKind); tool.addNode(load); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/JavaConstantFormattable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/JavaConstantFormattable.java index 0dbc1e3af31..da483eb3c12 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/JavaConstantFormattable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/JavaConstantFormattable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/JavaConstantFormatter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/JavaConstantFormatter.java index 7a4173a2683..3be1cb5896b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/JavaConstantFormatter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/JavaConstantFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/AllocatedObjectNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/AllocatedObjectNode.java index b64d47003bd..a3d97b22648 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/AllocatedObjectNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/AllocatedObjectNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/CommitAllocationNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/CommitAllocationNode.java index 3ee60054dd7..4e58ef5302a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/CommitAllocationNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/CommitAllocationNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/EnsureVirtualizedNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/EnsureVirtualizedNode.java index 8084cc3a3ad..67e9e27576d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/EnsureVirtualizedNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/EnsureVirtualizedNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/EscapeObjectState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/EscapeObjectState.java index 334e94d2e30..434a2e7b0c2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/EscapeObjectState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/EscapeObjectState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/LockState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/LockState.java index bbd63d912bd..fbe3933e91f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/LockState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/LockState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualArrayNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualArrayNode.java index 45364fc4d26..06dc5c5f2fb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualArrayNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualArrayNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualBoxingNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualBoxingNode.java index fbebc334b23..e42d8a35c8d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualBoxingNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualBoxingNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualInstanceNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualInstanceNode.java index 92706ad345b..d763925b025 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualInstanceNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualInstanceNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualObjectNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualObjectNode.java index 1fea61012bb..5caf4582694 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualObjectNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/virtual/VirtualObjectNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.processor/src/org/graalvm/compiler/options/processor/OptionProcessor.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.processor/src/org/graalvm/compiler/options/processor/OptionProcessor.java index 731bc99bad6..cb31ee6e2f5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.processor/src/org/graalvm/compiler/options/processor/OptionProcessor.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.processor/src/org/graalvm/compiler/options/processor/OptionProcessor.java @@ -375,7 +375,6 @@ public class OptionProcessor extends AbstractProcessor { private static Element topDeclaringType(Element element) { Element enclosing = element.getEnclosingElement(); if (enclosing == null || enclosing.getKind() == ElementKind.PACKAGE) { - assert element.getKind() == ElementKind.CLASS || element.getKind() == ElementKind.INTERFACE; return element; } return topDeclaringType(enclosing); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.test/src/org/graalvm/compiler/options/test/NestedBooleanOptionKeyTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.test/src/org/graalvm/compiler/options/test/NestedBooleanOptionKeyTest.java index a63d98a3b06..201d8868f00 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.test/src/org/graalvm/compiler/options/test/NestedBooleanOptionKeyTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.test/src/org/graalvm/compiler/options/test/NestedBooleanOptionKeyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.test/src/org/graalvm/compiler/options/test/TestOptionKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.test/src/org/graalvm/compiler/options/test/TestOptionKey.java index 2e4a544becd..7c72db39a86 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.test/src/org/graalvm/compiler/options/test/TestOptionKey.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.test/src/org/graalvm/compiler/options/test/TestOptionKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/EnumOptionKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/EnumOptionKey.java index 4d585c44ea5..0a94e9311a7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/EnumOptionKey.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/EnumOptionKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/ModifiableOptionValues.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/ModifiableOptionValues.java index 9b7dcecfe89..e50a2acf2b8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/ModifiableOptionValues.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/ModifiableOptionValues.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/NestedBooleanOptionKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/NestedBooleanOptionKey.java index 17cd94fa4bd..1b130c8bccf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/NestedBooleanOptionKey.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/NestedBooleanOptionKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/Option.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/Option.java index 01e4a8d6539..3535d816132 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/Option.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/Option.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionDescriptor.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionDescriptor.java index 70ee5445c04..dbcd2e915d3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionDescriptor.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionDescriptors.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionDescriptors.java index 5202d5b9887..8e36e3bdcb3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionDescriptors.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionDescriptors.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionKey.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionKey.java index 4de7b39eb28..836b71f96e8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionKey.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionType.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionType.java index c0dc5fc2438..4e19ebe1204 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionType.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionValues.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionValues.java index a84d410c857..72dd07bca22 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionValues.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionValues.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionsParser.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionsParser.java index c44ddd71431..42d994a60cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionsParser.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionsParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common.test/src/org/graalvm/compiler/phases/common/test/StampFactoryTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common.test/src/org/graalvm/compiler/phases/common/test/StampFactoryTest.java index fffa97cbb6d..2afd5479a31 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common.test/src/org/graalvm/compiler/phases/common/test/StampFactoryTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common.test/src/org/graalvm/compiler/phases/common/test/StampFactoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AbstractInliningPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AbstractInliningPhase.java index 888babc9437..e472a97de57 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AbstractInliningPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AbstractInliningPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AddressLoweringByUsePhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AddressLoweringByUsePhase.java index bde94e19ef5..6c34fce8ebf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AddressLoweringByUsePhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AddressLoweringByUsePhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AddressLoweringPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AddressLoweringPhase.java index e20eff1f7dd..c54723a5727 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AddressLoweringPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/AddressLoweringPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java index 538ae40ccd6..1a581cb4dd1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -348,6 +348,9 @@ public class CanonicalizerPhase extends BasePhase { debug.log(DebugContext.VERBOSE_LEVEL, "Canonicalizer: simplifying %s", node); COUNTER_SIMPLIFICATION_CONSIDERED_NODES.increment(debug); node.simplify(tool); + if (node.isDeleted()) { + debug.log("Canonicalizer: simplified %s", node); + } return node.isDeleted(); } return false; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConditionalEliminationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConditionalEliminationPhase.java index d6c0bd4c456..b12e035862b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConditionalEliminationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConditionalEliminationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConvertDeoptimizeToGuardPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConvertDeoptimizeToGuardPhase.java index 9feb4c0485c..e075da33750 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConvertDeoptimizeToGuardPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConvertDeoptimizeToGuardPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/DeadCodeEliminationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/DeadCodeEliminationPhase.java index 049bdd9dd57..303f5e1b1c8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/DeadCodeEliminationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/DeadCodeEliminationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/DeoptimizationGroupingPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/DeoptimizationGroupingPhase.java index 71e0fefc942..b48b39e437c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/DeoptimizationGroupingPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/DeoptimizationGroupingPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ExpandLogicPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ExpandLogicPhase.java index 2e3809a579b..55d8fca8e14 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ExpandLogicPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ExpandLogicPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FixReadsPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FixReadsPhase.java index f7e7b4d0d51..a99d90a87a5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FixReadsPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FixReadsPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FloatingReadPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FloatingReadPhase.java index 83495e6f70a..4d31246554b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FloatingReadPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FloatingReadPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FrameStateAssignmentPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FrameStateAssignmentPhase.java index f51f90f9b58..2150ce86cb2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FrameStateAssignmentPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FrameStateAssignmentPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/GuardLoweringPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/GuardLoweringPhase.java index a07faf76dfc..6fa53af1c33 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/GuardLoweringPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/GuardLoweringPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/IncrementalCanonicalizerPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/IncrementalCanonicalizerPhase.java index 3f7376e7fe1..1e7e847df5a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/IncrementalCanonicalizerPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/IncrementalCanonicalizerPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/InsertGuardFencesPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/InsertGuardFencesPhase.java index 774e49ca7fe..1babc585654 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/InsertGuardFencesPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/InsertGuardFencesPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/IterativeConditionalEliminationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/IterativeConditionalEliminationPhase.java index f824fc6142b..c77e8083f6e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/IterativeConditionalEliminationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/IterativeConditionalEliminationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LazyValue.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LazyValue.java index dbe730fbd11..4dafa73184d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LazyValue.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LazyValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LockEliminationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LockEliminationPhase.java index f45df261f0d..87736675761 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LockEliminationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LockEliminationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LoopSafepointInsertionPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LoopSafepointInsertionPhase.java index f7c4a56fb80..8db3e5cd5b5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LoopSafepointInsertionPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LoopSafepointInsertionPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LoweringPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LoweringPhase.java index 643e6f491b4..017295722ce 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LoweringPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/LoweringPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/NonNullParametersPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/NonNullParametersPhase.java index 10f55232faa..69d228443ac 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/NonNullParametersPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/NonNullParametersPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ProfileCompiledMethodsPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ProfileCompiledMethodsPhase.java index 663d5cf288f..55b4cf51274 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ProfileCompiledMethodsPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ProfileCompiledMethodsPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/PropagateDeoptimizeProbabilityPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/PropagateDeoptimizeProbabilityPhase.java index b957e49a6f3..e97be9185af 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/PropagateDeoptimizeProbabilityPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/PropagateDeoptimizeProbabilityPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/RemoveValueProxyPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/RemoveValueProxyPhase.java index 9f85be4356e..abe5075443a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/RemoveValueProxyPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/RemoveValueProxyPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/UseTrappingNullChecksPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/UseTrappingNullChecksPhase.java index 6dbf61b4ea2..d030982e84a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/UseTrappingNullChecksPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/UseTrappingNullChecksPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/VerifyHeapAtReturnPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/VerifyHeapAtReturnPhase.java index 768353f00ec..82ddb51e298 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/VerifyHeapAtReturnPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/VerifyHeapAtReturnPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/InliningPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/InliningPhase.java index 7c06700313c..082c5ceaaba 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/InliningPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/InliningPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,14 @@ package org.graalvm.compiler.phases.common.inlining; import java.util.LinkedList; -import java.util.Map; import org.graalvm.compiler.nodes.Invoke; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.options.Option; -import org.graalvm.compiler.options.OptionType; import org.graalvm.compiler.options.OptionKey; +import org.graalvm.compiler.options.OptionType; import org.graalvm.compiler.phases.common.AbstractInliningPhase; import org.graalvm.compiler.phases.common.CanonicalizerPhase; -import org.graalvm.compiler.phases.common.inlining.policy.GreedyInliningPolicy; import org.graalvm.compiler.phases.common.inlining.policy.InliningPolicy; import org.graalvm.compiler.phases.common.inlining.walker.InliningData; import org.graalvm.compiler.phases.tiers.HighTierContext; @@ -61,14 +59,6 @@ public class InliningPhase extends AbstractInliningPhase { private int maxMethodPerInlining = Integer.MAX_VALUE; - public InliningPhase(CanonicalizerPhase canonicalizer) { - this(new GreedyInliningPolicy(null), canonicalizer); - } - - public InliningPhase(Map hints, CanonicalizerPhase canonicalizer) { - this(new GreedyInliningPolicy(hints), canonicalizer); - } - public InliningPhase(InliningPolicy policy, CanonicalizerPhase canonicalizer) { this.inliningPolicy = policy; this.canonicalizer = canonicalizer; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/InliningUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/InliningUtil.java index 936e5d096fe..eae26ed3cfa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/InliningUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/InliningUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,6 @@ import static jdk.vm.ci.meta.DeoptimizationAction.InvalidateReprofile; import static jdk.vm.ci.meta.DeoptimizationReason.NullCheckException; import static org.graalvm.compiler.core.common.GraalOptions.HotSpotPrintInlining; -import java.lang.reflect.Constructor; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.List; @@ -49,7 +48,6 @@ import org.graalvm.compiler.core.common.util.Util; import org.graalvm.compiler.debug.DebugCloseable; import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.graph.GraalGraphError; import org.graalvm.compiler.graph.Graph.DuplicationReplacement; import org.graalvm.compiler.graph.Graph.Mark; import org.graalvm.compiler.graph.Graph.NodeEventScope; @@ -63,14 +61,12 @@ import org.graalvm.compiler.nodes.AbstractBeginNode; import org.graalvm.compiler.nodes.AbstractEndNode; import org.graalvm.compiler.nodes.AbstractMergeNode; import org.graalvm.compiler.nodes.BeginNode; -import org.graalvm.compiler.nodes.CallTargetNode; import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind; import org.graalvm.compiler.nodes.DeoptimizeNode; import org.graalvm.compiler.nodes.DeoptimizingGuard; import org.graalvm.compiler.nodes.EndNode; import org.graalvm.compiler.nodes.FixedGuardNode; import org.graalvm.compiler.nodes.FixedNode; -import org.graalvm.compiler.nodes.FixedWithNextNode; import org.graalvm.compiler.nodes.FrameState; import org.graalvm.compiler.nodes.InliningLog; import org.graalvm.compiler.nodes.Invoke; @@ -471,8 +467,7 @@ public class InliningUtil extends ValueMergeUtil { // the intrinsified method. Invoke dup = (Invoke) duplicates.get(exit.asNode()); if (dup instanceof InvokeNode) { - InvokeNode repl = graph.add(new InvokeNode(invoke.callTarget(), invoke.bci())); - dup.intrinsify(repl.asNode()); + ((InvokeNode) dup).replaceWithNewBci(invoke.bci()); } else { ((InvokeWithExceptionNode) dup).replaceWithNewBci(invoke.bci()); } @@ -915,9 +910,7 @@ public class InliningUtil extends ValueMergeUtil { // replace the InvokeWithExceptionNode with a normal // InvokeNode -- the deoptimization occurs when the invoke throws. InvokeWithExceptionNode oldInvoke = (InvokeWithExceptionNode) fixedStateSplit.predecessor(); - FrameState oldFrameState = oldInvoke.stateAfter(); InvokeNode newInvoke = oldInvoke.replaceWithInvoke(); - newInvoke.setStateAfter(oldFrameState.duplicate()); if (replacements != null) { replacements.put(oldInvoke, newInvoke); } @@ -1020,36 +1013,6 @@ public class InliningUtil extends ValueMergeUtil { return replacements.getSubstitution(target, invokeBci, trackNodeSourcePosition, replaceePosition); } - public static FixedWithNextNode inlineMacroNode(Invoke invoke, ResolvedJavaMethod concrete, Class macroNodeClass) throws GraalError { - StructuredGraph graph = invoke.asNode().graph(); - if (!concrete.equals(((MethodCallTargetNode) invoke.callTarget()).targetMethod())) { - assert ((MethodCallTargetNode) invoke.callTarget()).invokeKind().hasReceiver(); - InliningUtil.replaceInvokeCallTarget(invoke, graph, InvokeKind.Special, concrete); - } - - FixedWithNextNode macroNode = createMacroNodeInstance(macroNodeClass, invoke); - - CallTargetNode callTarget = invoke.callTarget(); - if (invoke instanceof InvokeNode) { - graph.replaceFixedWithFixed((InvokeNode) invoke, graph.add(macroNode)); - } else { - InvokeWithExceptionNode invokeWithException = (InvokeWithExceptionNode) invoke; - invokeWithException.killExceptionEdge(); - graph.replaceSplitWithFixed(invokeWithException, graph.add(macroNode), invokeWithException.next()); - } - GraphUtil.killWithUnusedFloatingInputs(callTarget); - return macroNode; - } - - private static FixedWithNextNode createMacroNodeInstance(Class macroNodeClass, Invoke invoke) throws GraalError { - try { - Constructor cons = macroNodeClass.getDeclaredConstructor(Invoke.class); - return (FixedWithNextNode) cons.newInstance(invoke); - } catch (ReflectiveOperationException | IllegalArgumentException | SecurityException e) { - throw new GraalGraphError(e).addContext(invoke.asNode()).addContext("macroSubstitution", macroNodeClass); - } - } - /** * This method exclude InstrumentationNode from inlining heuristics. */ diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/AbstractInlineInfo.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/AbstractInlineInfo.java index 23ccec39691..24093653ed0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/AbstractInlineInfo.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/AbstractInlineInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/AssumptionInlineInfo.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/AssumptionInlineInfo.java index acde4aa1a44..6ab652dfb48 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/AssumptionInlineInfo.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/AssumptionInlineInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/ExactInlineInfo.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/ExactInlineInfo.java index b71ea43b727..231600da40f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/ExactInlineInfo.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/ExactInlineInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/InlineInfo.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/InlineInfo.java index ba94bcb97f2..4f93cc6c065 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/InlineInfo.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/InlineInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/MultiTypeGuardInlineInfo.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/MultiTypeGuardInlineInfo.java index 9139ee2f7be..ba4e10dd1dd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/MultiTypeGuardInlineInfo.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/MultiTypeGuardInlineInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/TypeGuardInlineInfo.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/TypeGuardInlineInfo.java index 42fc950edc3..efea0840f62 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/TypeGuardInlineInfo.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/TypeGuardInlineInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/elem/Inlineable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/elem/Inlineable.java index 3ba22fad526..3abc782c14b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/elem/Inlineable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/elem/Inlineable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/elem/InlineableGraph.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/elem/InlineableGraph.java index 3655750ccd8..c4b840ac341 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/elem/InlineableGraph.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/elem/InlineableGraph.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/AbstractInliningPolicy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/AbstractInliningPolicy.java index a26a3af6798..1f9a0dab0cc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/AbstractInliningPolicy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/AbstractInliningPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -86,7 +86,7 @@ public abstract class AbstractInliningPolicy implements InliningPolicy { return true; } - protected static int previousLowLevelGraphSize(InlineInfo info) { + protected int previousLowLevelGraphSize(InlineInfo info) { int size = 0; for (int i = 0; i < info.numberOfMethods(); i++) { ResolvedJavaMethod m = info.methodAt(i); @@ -99,7 +99,7 @@ public abstract class AbstractInliningPolicy implements InliningPolicy { return size; } - protected static double determineInvokeProbability(InlineInfo info) { + protected double determineInvokeProbability(InlineInfo info) { double invokeProbability = 0; for (int i = 0; i < info.numberOfMethods(); i++) { Inlineable callee = info.inlineableElementAt(i); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/GreedyInliningPolicy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/GreedyInliningPolicy.java index dcc690de5ab..6ba39ae80a4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/GreedyInliningPolicy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/GreedyInliningPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InlineEverythingPolicy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InlineEverythingPolicy.java index f7646c4fae4..a8c7a567fbd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InlineEverythingPolicy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InlineEverythingPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InlineMethodSubstitutionsPolicy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InlineMethodSubstitutionsPolicy.java index 904f4a0afaf..5ed79772a6a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InlineMethodSubstitutionsPolicy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InlineMethodSubstitutionsPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InliningPolicy.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InliningPolicy.java index 3f1fe939798..8b6698b6450 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InliningPolicy.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/policy/InliningPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/CallsiteHolder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/CallsiteHolder.java index fedc7d3b44d..9cf71efa0b9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/CallsiteHolder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/CallsiteHolder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/CallsiteHolderExplorable.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/CallsiteHolderExplorable.java index 1c27504febe..0fdf597831e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/CallsiteHolderExplorable.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/CallsiteHolderExplorable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/ComputeInliningRelevance.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/ComputeInliningRelevance.java index 207721055d2..1189f8a15b5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/ComputeInliningRelevance.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/ComputeInliningRelevance.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/InliningData.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/InliningData.java index f2f2d3fe14b..894a73d2e5f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/InliningData.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/InliningData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/InliningIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/InliningIterator.java index 34189cfaf7d..e428bd32cc0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/InliningIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/InliningIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/MethodInvocation.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/MethodInvocation.java index 86d9f8727ad..4f187a5cf06 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/MethodInvocation.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/walker/MethodInvocation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/jmx/HotSpotMBeanOperationProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/jmx/HotSpotMBeanOperationProvider.java index 00e88c92977..335caeb1e7b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/jmx/HotSpotMBeanOperationProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/jmx/HotSpotMBeanOperationProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/util/EconomicSetNodeEventListener.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/util/EconomicSetNodeEventListener.java index 0a7c59ea74a..33c29da2778 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/util/EconomicSetNodeEventListener.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/util/EconomicSetNodeEventListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/BasePhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/BasePhase.java index 2409e485558..10ddf0e9f39 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/BasePhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/BasePhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/ClassTypeSequence.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/ClassTypeSequence.java index 6c8bd955c11..ead2025515a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/ClassTypeSequence.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/ClassTypeSequence.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/LazyName.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/LazyName.java index 31050510452..db7a5bf8c49 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/LazyName.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/LazyName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/OptimisticOptimizations.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/OptimisticOptimizations.java index 80c6f980f53..6fae655b7e4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/OptimisticOptimizations.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/OptimisticOptimizations.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/Phase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/Phase.java index e9f486349ab..c55d25e095b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/Phase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/Phase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/PhaseSuite.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/PhaseSuite.java index 3d7dc26def4..f7df9c2db79 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/PhaseSuite.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/PhaseSuite.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/VerifyPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/VerifyPhase.java index 82aafce79dc..74ab3c4f03b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/VerifyPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/VerifyPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/NodeCostUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/NodeCostUtil.java index 7f8957e4c46..ce8c53bab7f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/NodeCostUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/NodeCostUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/PhaseSizeContract.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/PhaseSizeContract.java index d660c36c99f..afc91c24052 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/PhaseSizeContract.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/PhaseSizeContract.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/VerifyNodeCosts.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/VerifyNodeCosts.java index 7665f176656..e439c7a5f3f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/VerifyNodeCosts.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/contract/VerifyNodeCosts.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/FixedNodeRelativeFrequencyCache.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/FixedNodeRelativeFrequencyCache.java index 43c5bfc454c..1b320d7a36b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/FixedNodeRelativeFrequencyCache.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/FixedNodeRelativeFrequencyCache.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/InferStamps.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/InferStamps.java index da33e3f36ba..bec15459a63 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/InferStamps.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/InferStamps.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/MergeableState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/MergeableState.java index 867426edc12..46ed182b9c5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/MergeableState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/MergeableState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/PostOrderNodeIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/PostOrderNodeIterator.java index 0000077393c..c214dba4ec1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/PostOrderNodeIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/PostOrderNodeIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ReentrantBlockIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ReentrantBlockIterator.java index 4b2242c511a..daf636870dd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ReentrantBlockIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ReentrantBlockIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ReentrantNodeIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ReentrantNodeIterator.java index c6888d2b7f6..9b211d942df 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ReentrantNodeIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ReentrantNodeIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ScheduledNodeIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ScheduledNodeIterator.java index 08c0ec6ac65..460274b483b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ScheduledNodeIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ScheduledNodeIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ScopedPostOrderNodeIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ScopedPostOrderNodeIterator.java index b7863fb002b..f776b60dbf6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ScopedPostOrderNodeIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ScopedPostOrderNodeIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/SinglePassNodeIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/SinglePassNodeIterator.java index d2a4b0aac20..15936e82819 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/SinglePassNodeIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/SinglePassNodeIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/StatelessPostOrderNodeIterator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/StatelessPostOrderNodeIterator.java index f2fc6901982..0e63ebb8b4e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/StatelessPostOrderNodeIterator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/StatelessPostOrderNodeIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/package-info.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/package-info.java index d4008fdee77..c9877c033f3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/package-info.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/package-info.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/package-info.java index bf5a8255ba9..89fcf2688b5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/package-info.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/BlockClosure.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/BlockClosure.java index bc379aa14e5..a312bf432c1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/BlockClosure.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/BlockClosure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/MemoryScheduleVerification.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/MemoryScheduleVerification.java index f689425c466..301fc296034 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/MemoryScheduleVerification.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/MemoryScheduleVerification.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/SchedulePhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/SchedulePhase.java index b9caa30d29f..f23cb380e33 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/SchedulePhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/SchedulePhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/CompilerConfiguration.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/CompilerConfiguration.java index 57f26c455b7..5d832674aed 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/CompilerConfiguration.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/CompilerConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/HighTierContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/HighTierContext.java index 835634a5eed..f7b4ba7067d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/HighTierContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/HighTierContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/LowTierContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/LowTierContext.java index cb37d9ff307..b1a879cfe26 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/LowTierContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/LowTierContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/MidTierContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/MidTierContext.java index 2d0d9077259..85d13de09c2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/MidTierContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/MidTierContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/PhaseContext.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/PhaseContext.java index b100913a04e..1b42f2ec70c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/PhaseContext.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/PhaseContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/Suites.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/Suites.java index d8a51940ec3..1eebfcd9d1f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/Suites.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/Suites.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/SuitesCreator.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/SuitesCreator.java index 1700a990be5..e2d6c5760b3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/SuitesCreator.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/SuitesCreator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/SuitesProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/SuitesProvider.java index b2f31722abb..a2ecc7bd132 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/SuitesProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/SuitesProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/TargetProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/TargetProvider.java index c648b991b79..0c367d12f05 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/TargetProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/tiers/TargetProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/BlockWorkList.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/BlockWorkList.java index 7b71c832399..25426e6e0fb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/BlockWorkList.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/BlockWorkList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/GraphOrder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/GraphOrder.java index 3eb77cfeeb2..072eb932c1e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/GraphOrder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/GraphOrder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/MethodDebugValueName.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/MethodDebugValueName.java index 0623a8e98a6..36f9230a912 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/MethodDebugValueName.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/MethodDebugValueName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/Providers.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/Providers.java index 040ee38b211..039bb12a70e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/Providers.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/Providers.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/ValueMergeUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/ValueMergeUtil.java index fecd6ff7376..10cfface7a2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/ValueMergeUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/util/ValueMergeUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/BinaryGraphPrinter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/BinaryGraphPrinter.java index 92d0369db5b..3c017ed723d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/BinaryGraphPrinter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/BinaryGraphPrinter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CFGPrinter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CFGPrinter.java index be0b5d4533c..956104d0892 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CFGPrinter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CFGPrinter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,7 +50,6 @@ import org.graalvm.compiler.graph.Position; import org.graalvm.compiler.java.BciBlockMapping; import org.graalvm.compiler.lir.LIR; import org.graalvm.compiler.lir.LIRInstruction; -import org.graalvm.compiler.lir.alloc.trace.GlobalLivenessInfo; import org.graalvm.compiler.lir.debug.IntervalDumper; import org.graalvm.compiler.lir.debug.IntervalDumper.IntervalVisitor; import org.graalvm.compiler.lir.gen.LIRGenerationResult; @@ -87,7 +86,6 @@ class CFGPrinter extends CompilationPrinter { protected ControlFlowGraph cfg; protected ScheduleResult schedule; protected ResolvedJavaMethod method; - protected GlobalLivenessInfo livenessInfo; protected LIRGenerationResult res; /** @@ -487,55 +485,13 @@ class CFGPrinter extends CompilationPrinter { begin("IR"); out.println("LIR"); - if (livenessInfo != null) { - int opId = lirInstructions.get(0).id(); - printLiveVars(livenessInfo.getBlockIn(block), "in(var)", opId); - printLiveLoc(livenessInfo.getInLocation(block), "in(loc)", opId); - } for (int i = 0; i < lirInstructions.size(); i++) { LIRInstruction inst = lirInstructions.get(i); printLIRInstruction(inst); } - if (livenessInfo != null) { - int opId = lirInstructions.get(lirInstructions.size() - 1).id(); - printLiveVars(livenessInfo.getBlockOut(block), "out(var)", opId); - printLiveLoc(livenessInfo.getOutLocation(block), "out(loc)", opId); - } end("IR"); } - private void printLiveVars(int[] live, String lbl, int opId) { - out.printf("nr %4d ", opId).print(COLUMN_END).print(" instruction "); - out.print(lbl).print(" ["); - for (int i = 0; i < live.length; i++) { - if (i > 0) { - out.print(", "); - } - int varNum = live[i]; - Value value = varNum >= 0 ? livenessInfo.getVariable(varNum) : Value.ILLEGAL; - out.print(i).print(": ").print(value.toString()); - } - out.print(']'); - out.print(COLUMN_END); - out.println(COLUMN_END); - } - - private void printLiveLoc(Value[] values, String lbl, int opId) { - if (values != null) { - out.printf("nr %4d ", opId).print(COLUMN_END).print(" instruction "); - out.print(lbl).print(" ["); - for (int i = 0; i < values.length; i++) { - if (i > 0) { - out.print(", "); - } - out.print(i).print(": ").print(values[i].toString()); - } - out.print(']'); - out.print(COLUMN_END); - out.println(COLUMN_END); - } - } - private void printLIRInstruction(LIRInstruction inst) { if (inst == null) { out.print("nr -1 ").print(COLUMN_END).print(" instruction ").print("").print(COLUMN_END); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CFGPrinterObserver.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CFGPrinterObserver.java index 2bebfad354e..a165bba4aa4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CFGPrinterObserver.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CFGPrinterObserver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,6 @@ import org.graalvm.compiler.debug.TTY; import org.graalvm.compiler.graph.Graph; import org.graalvm.compiler.java.BciBlockMapping; import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.lir.alloc.trace.GlobalLivenessInfo; import org.graalvm.compiler.lir.debug.IntervalDumper; import org.graalvm.compiler.lir.gen.LIRGenerationResult; import org.graalvm.compiler.nodes.StructuredGraph; @@ -178,7 +177,6 @@ public class CFGPrinterObserver implements DebugDumpHandler { cfgPrinter.lir = debug.contextLookup(LIR.class); } cfgPrinter.nodeLirGenerator = debug.contextLookup(NodeLIRBuilder.class); - cfgPrinter.livenessInfo = debug.contextLookup(GlobalLivenessInfo.class); cfgPrinter.res = debug.contextLookup(LIRGenerationResult.class); if (cfgPrinter.nodeLirGenerator != null) { cfgPrinter.target = cfgPrinter.nodeLirGenerator.getLIRGeneratorTool().target(); @@ -247,7 +245,6 @@ public class CFGPrinterObserver implements DebugDumpHandler { cfgPrinter.lir = null; cfgPrinter.res = null; cfgPrinter.nodeLirGenerator = null; - cfgPrinter.livenessInfo = null; cfgPrinter.cfg = null; cfgPrinter.flush(); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CanonicalStringGraphPrinter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CanonicalStringGraphPrinter.java index 0c54823d4fd..60d42a1cdfe 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CanonicalStringGraphPrinter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CanonicalStringGraphPrinter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CompilationPrinter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CompilationPrinter.java index 00e884e4fa5..9b6a73e7281 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CompilationPrinter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/CompilationPrinter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraalDebugHandlersFactory.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraalDebugHandlersFactory.java index cd6aee73397..b8b7c246e31 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraalDebugHandlersFactory.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraalDebugHandlersFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraphPrinter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraphPrinter.java index 74f1d4453a2..23618d3307a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraphPrinter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraphPrinter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraphPrinterDumpHandler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraphPrinterDumpHandler.java index bb98ae5e917..38abf456ebb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraphPrinterDumpHandler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/GraphPrinterDumpHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/NoDeadCodeVerifyHandler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/NoDeadCodeVerifyHandler.java index 6e1ea0fb241..59fbc00ee26 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/NoDeadCodeVerifyHandler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.printer/src/org/graalvm/compiler/printer/NoDeadCodeVerifyHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.processor/src/org/graalvm/compiler/processor/AbstractProcessor.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.processor/src/org/graalvm/compiler/processor/AbstractProcessor.java index 8cdea40ba7c..05f7de432c1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.processor/src/org/graalvm/compiler/processor/AbstractProcessor.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.processor/src/org/graalvm/compiler/processor/AbstractProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.processor/src/org/graalvm/compiler/processor/SuppressFBWarnings.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.processor/src/org/graalvm/compiler/processor/SuppressFBWarnings.java index 0f5282b9a17..4d5a132757b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.processor/src/org/graalvm/compiler/processor/SuppressFBWarnings.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.processor/src/org/graalvm/compiler/processor/SuppressFBWarnings.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64CountLeadingZerosNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64CountLeadingZerosNode.java index c0ec287aeb0..ccf28017019 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64CountLeadingZerosNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64CountLeadingZerosNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64CountTrailingZerosNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64CountTrailingZerosNode.java index 1e42381eb60..4d7d3776545 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64CountTrailingZerosNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64CountTrailingZerosNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64FloatArithmeticSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64FloatArithmeticSnippets.java index bde9df43e71..43b1ab96982 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64FloatArithmeticSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64FloatArithmeticSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64GraphBuilderPlugins.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64GraphBuilderPlugins.java index 6b1460dfa22..e099ca49b36 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64GraphBuilderPlugins.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64GraphBuilderPlugins.java @@ -168,17 +168,20 @@ public class AArch64GraphBuilderPlugins { } private static void registerUnsafePlugins(InvocationPlugins plugins, BytecodeProvider replacementsBytecodeProvider) { - registerUnsafePlugins(new Registration(plugins, Unsafe.class), new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object}); + registerUnsafePlugins(new Registration(plugins, Unsafe.class), + new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object}, "Object"); if (!Java8OrEarlier) { - registerUnsafePlugins(new Registration(plugins, "jdk.internal.misc.Unsafe", replacementsBytecodeProvider), new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object}); + registerUnsafePlugins(new Registration(plugins, "jdk.internal.misc.Unsafe", replacementsBytecodeProvider), + new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object}, + Java11OrEarlier ? "Object" : "Reference"); } } - private static void registerUnsafePlugins(Registration r, JavaKind[] unsafeJavaKinds) { + private static void registerUnsafePlugins(Registration r, JavaKind[] unsafeJavaKinds, String objectKindName) { for (JavaKind kind : unsafeJavaKinds) { Class javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass(); - String kindName = (kind == JavaKind.Object && !Java11OrEarlier) ? "Reference" : kind.name(); + String kindName = kind == JavaKind.Object ? objectKindName : kind.name(); r.register4("getAndSet" + kindName, Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() { @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode value) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64IntegerArithmeticSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64IntegerArithmeticSnippets.java index 66959885d08..9aaf49d009c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64IntegerArithmeticSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64IntegerArithmeticSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64IntegerSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64IntegerSubstitutions.java index ee543f26e2d..f3669f2630a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64IntegerSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64IntegerSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64LongSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64LongSubstitutions.java index 695cbdafea0..5338df18fec 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64LongSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64LongSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64StringLatin1Substitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64StringLatin1Substitutions.java index eb6eea6ce70..188d09e42e4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64StringLatin1Substitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64StringLatin1Substitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64StringUTF16Substitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64StringUTF16Substitutions.java index 3fdad29bdfd..3d5dc4a3187 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64StringUTF16Substitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.aarch64/src/org/graalvm/compiler/replacements/aarch64/AArch64StringUTF16Substitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ArrayIndexOf.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ArrayIndexOf.java index 331bac64ca2..830abb8645c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ArrayIndexOf.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ArrayIndexOf.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ArrayIndexOfNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ArrayIndexOfNode.java index cbc935a395c..9f53f1febb9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ArrayIndexOfNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ArrayIndexOfNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ConvertSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ConvertSnippets.java index d98ce174ae7..7a0b0ce22a6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ConvertSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64ConvertSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64CountLeadingZerosNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64CountLeadingZerosNode.java index 29f6c0ed380..63de11bf8fa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64CountLeadingZerosNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64CountLeadingZerosNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64CountTrailingZerosNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64CountTrailingZerosNode.java index 4636c515890..549024e1850 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64CountTrailingZerosNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64CountTrailingZerosNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64FloatConvertNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64FloatConvertNode.java index 83dc57939aa..8f61d4961d7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64FloatConvertNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64FloatConvertNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64GraphBuilderPlugins.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64GraphBuilderPlugins.java index 89aac60478f..7ca8c43d321 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64GraphBuilderPlugins.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64GraphBuilderPlugins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,6 +40,7 @@ import java.util.Arrays; import org.graalvm.compiler.bytecode.BytecodeProvider; import org.graalvm.compiler.lir.amd64.AMD64ArithmeticLIRGeneratorTool.RoundingMode; +import org.graalvm.compiler.nodes.PauseNode; import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins; import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext; @@ -75,6 +76,7 @@ public class AMD64GraphBuilderPlugins { invocationPlugins.defer(new Runnable() { @Override public void run() { + registerThreadPlugins(invocationPlugins, arch); registerIntegerLongPlugins(invocationPlugins, IntegerSubstitutions.class, JavaKind.Int, arch, replacementsBytecodeProvider); registerIntegerLongPlugins(invocationPlugins, LongSubstitutions.class, JavaKind.Long, arch, replacementsBytecodeProvider); registerPlatformSpecificUnsafePlugins(invocationPlugins, replacementsBytecodeProvider, explicitUnsafeNullChecks, @@ -89,6 +91,22 @@ public class AMD64GraphBuilderPlugins { }); } + private static void registerThreadPlugins(InvocationPlugins plugins, AMD64 arch) { + if (!Java8OrEarlier) { + // Pause instruction introduced with SSE2 + if (arch.getFeatures().contains(AMD64.CPUFeature.SSE2)) { + Registration r = new Registration(plugins, Thread.class); + r.register0("onSpinWait", new InvocationPlugin() { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { + b.append(new PauseNode()); + return true; + } + }); + } + } + } + private static void registerIntegerLongPlugins(InvocationPlugins plugins, Class substituteDeclaringClass, JavaKind kind, AMD64 arch, BytecodeProvider bytecodeProvider) { Class declaringClass = kind.toBoxedJavaClass(); Class type = kind.toJavaClass(); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64MathSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64MathSubstitutions.java index a9c1c7ab31d..b3277792ce2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64MathSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64MathSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64RoundNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64RoundNode.java index cd000398885..f5d03916248 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64RoundNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64RoundNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64StringSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64StringSubstitutions.java index e91f8b8c64e..9d18765954e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64StringSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.amd64/src/org/graalvm/compiler/replacements/amd64/AMD64StringSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.jdk9_11.test/src/org/graalvm/compiler/replacements/jdk9_11/test/UnsafeObjectReplacementsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.jdk9_11.test/src/org/graalvm/compiler/replacements/jdk9_11/test/UnsafeObjectReplacementsTest.java deleted file mode 100644 index a7d3e39a8d4..00000000000 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.jdk9_11.test/src/org/graalvm/compiler/replacements/jdk9_11/test/UnsafeObjectReplacementsTest.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package org.graalvm.compiler.replacements.jdk9_11.test; - -import org.graalvm.compiler.api.test.Graal; -import org.graalvm.compiler.replacements.test.MethodSubstitutionTest; -import org.graalvm.compiler.runtime.RuntimeProvider; -import org.graalvm.compiler.test.AddExports; -import org.junit.Test; - -import jdk.vm.ci.aarch64.AArch64; -import jdk.vm.ci.amd64.AMD64; -import jdk.vm.ci.code.TargetDescription; - -@AddExports("java.base/jdk.internal.misc") -public class UnsafeObjectReplacementsTest extends MethodSubstitutionTest { - - static class Container { - public volatile Object objectField = dummyValue; - } - - static jdk.internal.misc.Unsafe unsafe = jdk.internal.misc.Unsafe.getUnsafe(); - static Container dummyValue = new Container(); - static Container newDummyValue = new Container(); - static long objectOffset; - - static { - try { - objectOffset = unsafe.objectFieldOffset(Container.class.getDeclaredField("objectField")); - } catch (NoSuchFieldException e) { - throw new RuntimeException(e); - } - } - - public static Object unsafeCompareAndExchangeObject() { - Container container = new Container(); - return unsafe.compareAndExchangeObject(container, objectOffset, dummyValue, newDummyValue); - } - - @Test - public void testCompareAndSet() { - TargetDescription target = Graal.getRequiredCapability(RuntimeProvider.class).getHostBackend().getTarget(); - if (target.arch instanceof AMD64) { - testGraph("unsafeCompareAndExchangeObject"); - } - test("unsafeCompareAndExchangeObject"); - } - - public static Object unsafeGetAndSetObject() { - Container container = new Container(); - container.objectField = null; - Container other = new Container(); - return unsafe.getAndSetObject(container, objectOffset, other); - } - - @Test - public void testGetAndSet() { - TargetDescription target = Graal.getRequiredCapability(RuntimeProvider.class).getHostBackend().getTarget(); - if (target.arch instanceof AMD64 || target.arch instanceof AArch64) { - testGraph("unsafeGetAndSetObject"); - } - test("unsafeGetAndSetObject"); - } - - public static Object unsafeGetPutObject() { - Container container = new Container(); - unsafe.putObject(container, objectOffset, "Hello there"); - return unsafe.getObject(container, objectOffset); - } - - public static Object unsafeGetPutObjectOpaque() { - Container container = new Container(); - unsafe.putObjectOpaque(container, objectOffset, "Hello there"); - return unsafe.getObjectOpaque(container, objectOffset); - } - - public static Object unsafeGetPutObjectRA() { - Container container = new Container(); - unsafe.putObjectRelease(container, objectOffset, "Hello there"); - return unsafe.getObjectAcquire(container, objectOffset); - } - - public static Object unsafeGetPutObjectVolatile() { - Container container = new Container(); - unsafe.putObjectVolatile(container, objectOffset, "Hello there"); - return unsafe.getObjectVolatile(container, objectOffset); - } - - @Test - public void testUnsafeGetPutPlain() { - testGraph("unsafeGetPutObject"); - test("unsafeGetPutObject"); - } - - @Test - public void testUnsafeGetPutOpaque() { - testGraph("unsafeGetPutObjectOpaque"); - test("unsafeGetPutObjectOpaque"); - } - - @Test - public void testUnsafeGetPutReleaseAcquire() { - testGraph("unsafeGetPutObjectRA"); - test("unsafeGetPutObjectRA"); - } - - @Test - public void testUnsafeGetPutVolatile() { - testGraph("unsafeGetPutObjectVolatile"); - test("unsafeGetPutObjectVolatile"); - } -} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.processor/src/org/graalvm/compiler/replacements/processor/NodeIntrinsicHandler.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.processor/src/org/graalvm/compiler/replacements/processor/NodeIntrinsicHandler.java index e3bec0d68cd..dae34011c1f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.processor/src/org/graalvm/compiler/replacements/processor/NodeIntrinsicHandler.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.processor/src/org/graalvm/compiler/replacements/processor/NodeIntrinsicHandler.java @@ -100,6 +100,8 @@ public final class NodeIntrinsicHandler extends AnnotationHandler { } if (enclosingElement != null) { nodeClass = (TypeElement) enclosingElement; + } else { + messager.printMessage(Kind.ERROR, String.format("Cannot find a class enclosing @%s method.", getSimpleName(NODE_INTRINSIC_CLASS_NAME)), element, annotation); } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.sparc/src/org/graalvm/compiler/replacements/sparc/SPARCGraphBuilderPlugins.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.sparc/src/org/graalvm/compiler/replacements/sparc/SPARCGraphBuilderPlugins.java index 79c275caf20..613a9bdb1ff 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.sparc/src/org/graalvm/compiler/replacements/sparc/SPARCGraphBuilderPlugins.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.sparc/src/org/graalvm/compiler/replacements/sparc/SPARCGraphBuilderPlugins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArrayEqualsConstantLengthTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArrayEqualsConstantLengthTest.java index 62818e579aa..6393332182c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArrayEqualsConstantLengthTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArrayEqualsConstantLengthTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArrayStoreBytecodeExceptionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArrayStoreBytecodeExceptionTest.java index 9030b5663e4..47a9b3b9346 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArrayStoreBytecodeExceptionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArrayStoreBytecodeExceptionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArraysSubstitutionsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArraysSubstitutionsTest.java index 8df34969d74..2c9b4b64914 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArraysSubstitutionsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArraysSubstitutionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,11 +24,14 @@ package org.graalvm.compiler.replacements.test; +import static org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; + +import java.util.Arrays; + import org.graalvm.compiler.nodes.ReturnNode; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.phases.OptimisticOptimizations; import org.graalvm.compiler.phases.common.CanonicalizerPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.phases.tiers.PhaseContext; import org.graalvm.compiler.replacements.nodes.ArrayEqualsNode; @@ -36,10 +39,6 @@ import org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase; import org.junit.Assert; import org.junit.Test; -import java.util.Arrays; - -import static org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; - public class ArraysSubstitutionsTest extends ArraysSubstitutionsTestBase { private static final int N = 10; @@ -133,7 +132,7 @@ public class ArraysSubstitutionsTest extends ArraysSubstitutionsTestBase { public void testCanonicalLength() { StructuredGraph graph = parseEager("testCanonicalLengthSnippet", AllowAssumptions.NO); HighTierContext context = new HighTierContext(getProviders(), getDefaultGraphBuilderSuite(), OptimisticOptimizations.ALL); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); new CanonicalizerPhase().apply(graph, new PhaseContext(getProviders())); Assert.assertTrue(graph.getNodes(ReturnNode.TYPE).first().result().asJavaConstant().asLong() == 0); @@ -149,7 +148,7 @@ public class ArraysSubstitutionsTest extends ArraysSubstitutionsTestBase { public void testCanonicalEqual() { StructuredGraph graph = parseEager("testCanonicalEqualSnippet", AllowAssumptions.NO); HighTierContext context = new HighTierContext(getProviders(), getDefaultGraphBuilderSuite(), OptimisticOptimizations.ALL); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); new CanonicalizerPhase().apply(graph, new PhaseContext(getProviders())); Assert.assertTrue(graph.getNodes(ReturnNode.TYPE).first().result().asJavaConstant().asLong() == 1); @@ -163,7 +162,7 @@ public class ArraysSubstitutionsTest extends ArraysSubstitutionsTestBase { public void testVirtualEqual() { StructuredGraph graph = parseEager("testVirtualEqualSnippet", AllowAssumptions.NO); HighTierContext context = new HighTierContext(getProviders(), getDefaultGraphBuilderSuite(), OptimisticOptimizations.ALL); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); new CanonicalizerPhase().apply(graph, new PhaseContext(getProviders())); new PartialEscapePhase(false, new CanonicalizerPhase(), graph.getOptions()).apply(graph, context); new CanonicalizerPhase().apply(graph, new PhaseContext(getProviders())); @@ -181,7 +180,7 @@ public class ArraysSubstitutionsTest extends ArraysSubstitutionsTestBase { public void testVirtualNotEqual() { StructuredGraph graph = parseEager("testVirtualNotEqualSnippet", AllowAssumptions.NO); HighTierContext context = getDefaultHighTierContext(); - new InliningPhase(new CanonicalizerPhase()).apply(graph, context); + createInliningPhase().apply(graph, context); new CanonicalizerPhase().apply(graph, new PhaseContext(getProviders())); new PartialEscapePhase(false, new CanonicalizerPhase(), graph.getOptions()).apply(graph, context); new CanonicalizerPhase().apply(graph, new PhaseContext(getProviders())); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArraysSubstitutionsTestBase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArraysSubstitutionsTestBase.java index 32dd9924cde..6d66eb2c641 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArraysSubstitutionsTestBase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ArraysSubstitutionsTestBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/BitOpNodesTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/BitOpNodesTest.java index 3701a7f96a6..1c050e405ef 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/BitOpNodesTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/BitOpNodesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,21 +24,19 @@ package org.graalvm.compiler.replacements.test; -import org.graalvm.compiler.nodes.NodeView; -import org.junit.Assert; -import org.junit.Assume; -import org.junit.Test; - import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.core.test.GraalCompilerTest; +import org.graalvm.compiler.nodes.NodeView; import org.graalvm.compiler.nodes.ReturnNode; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.phases.common.CanonicalizerPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.replacements.nodes.BitScanReverseNode; +import org.junit.Assert; +import org.junit.Assume; +import org.junit.Test; import jdk.vm.ci.aarch64.AArch64; import jdk.vm.ci.amd64.AMD64; @@ -307,7 +305,7 @@ public class BitOpNodesTest extends GraalCompilerTest { HighTierContext context = getDefaultHighTierContext(); CanonicalizerPhase canonicalizer = new CanonicalizerPhase(); canonicalizer.apply(graph, context); - new InliningPhase(canonicalizer).apply(graph, context); + createInliningPhase(canonicalizer).apply(graph, context); canonicalizer.apply(graph, context); Assert.assertEquals(1, graph.getNodes(ReturnNode.TYPE).count()); if (expectedClass != null) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/BytecodeExceptionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/BytecodeExceptionTest.java index ba8aed4a5cc..6f3070dca00 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/BytecodeExceptionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/BytecodeExceptionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ClassCastBytecodeExceptionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ClassCastBytecodeExceptionTest.java index fcb36d8d82f..e3a0712e4b8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ClassCastBytecodeExceptionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ClassCastBytecodeExceptionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/CompiledExceptionHandlerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/CompiledExceptionHandlerTest.java index 2210562cee5..82e3bbccf6e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/CompiledExceptionHandlerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/CompiledExceptionHandlerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/CompiledNullPointerExceptionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/CompiledNullPointerExceptionTest.java index 5048bf487d3..d78543a0d23 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/CompiledNullPointerExceptionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/CompiledNullPointerExceptionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DeoptimizeOnExceptionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DeoptimizeOnExceptionTest.java index 643084b2936..31cfc8d97c6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DeoptimizeOnExceptionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DeoptimizeOnExceptionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DeoptimizeOnVolatileReadTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DeoptimizeOnVolatileReadTest.java index 05c1a25332e..193b7d97e8e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DeoptimizeOnVolatileReadTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DeoptimizeOnVolatileReadTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DerivedOopTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DerivedOopTest.java index b419ca6206e..81ce29e816b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DerivedOopTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DerivedOopTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DynamicNewArrayTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DynamicNewArrayTest.java index 6f0962480b6..4cd38e4f28f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DynamicNewArrayTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/DynamicNewArrayTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/EdgesTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/EdgesTest.java index 2bf5a902809..08558a87883 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/EdgesTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/EdgesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/FloatArraysEqualsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/FloatArraysEqualsTest.java index deb7ec5292e..f7e1f6219b0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/FloatArraysEqualsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/FloatArraysEqualsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/FoldTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/FoldTest.java index 578e33f570b..b697b0b1020 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/FoldTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/FoldTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InstanceOfDynamicTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InstanceOfDynamicTest.java index 3c8c9bebc04..667db2f50f7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InstanceOfDynamicTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InstanceOfDynamicTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InstanceOfTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InstanceOfTest.java index 68fb3c8febe..87f856a4a1e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InstanceOfTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InstanceOfTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/IntegerExactFoldTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/IntegerExactFoldTest.java index 975875dbe9a..3af8816f8ee 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/IntegerExactFoldTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/IntegerExactFoldTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/IntegerSubOverflowsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/IntegerSubOverflowsTest.java index 979c0031f13..767fe650eb6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/IntegerSubOverflowsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/IntegerSubOverflowsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InvokeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InvokeTest.java index 0f37da89c8e..2064e795c8f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InvokeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InvokeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/MethodSubstitutionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/MethodSubstitutionTest.java index 2bcd7a4a46e..7e32dbcadbe 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/MethodSubstitutionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/MethodSubstitutionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,11 +35,9 @@ import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions; import org.graalvm.compiler.nodes.java.MethodCallTargetNode; import org.graalvm.compiler.nodes.spi.LoweringTool; -import org.graalvm.compiler.phases.BasePhase; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; import org.graalvm.compiler.phases.common.LoweringPhase; -import org.graalvm.compiler.phases.common.inlining.InliningPhase; import org.graalvm.compiler.phases.tiers.HighTierContext; import org.graalvm.compiler.replacements.nodes.MacroNode; @@ -58,11 +56,6 @@ public abstract class MethodSubstitutionTest extends GraalCompilerTest { return testGraph(snippet, null); } - @SuppressWarnings("unused") - public BasePhase createInliningPhase(StructuredGraph graph) { - return new InliningPhase(new CanonicalizerPhase()); - } - @SuppressWarnings("try") protected StructuredGraph testGraph(final String snippet, String name) { return testGraph(getResolvedJavaMethod(snippet), name); @@ -75,7 +68,7 @@ public abstract class MethodSubstitutionTest extends GraalCompilerTest { StructuredGraph graph = parseEager(method, AllowAssumptions.YES, debug); HighTierContext context = getDefaultHighTierContext(); debug.dump(DebugContext.BASIC_LEVEL, graph, "Graph"); - createInliningPhase(graph).apply(graph, context); + createInliningPhase().apply(graph, context); debug.dump(DebugContext.BASIC_LEVEL, graph, "Graph"); new CanonicalizerPhase().apply(graph, context); new DeadCodeEliminationPhase().apply(graph); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/MonitorTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/MonitorTest.java index 608ca1676c1..fefd6b330dd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/MonitorTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/MonitorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NestedExceptionHandlerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NestedExceptionHandlerTest.java index 0780455ea02..65bd523dc9e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NestedExceptionHandlerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NestedExceptionHandlerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewArrayTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewArrayTest.java index f86827d8592..4ddbc01f6e9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewArrayTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewArrayTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewInstanceTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewInstanceTest.java index 02c6e9df919..10118dbb8ac 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewInstanceTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewInstanceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewMultiArrayTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewMultiArrayTest.java index 85f2a33dc46..f81d73154e5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewMultiArrayTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NewMultiArrayTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NullBytecodeExceptionTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NullBytecodeExceptionTest.java index 97b3504b78d..a5da10e35cf 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NullBytecodeExceptionTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/NullBytecodeExceptionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ObjectAccessTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ObjectAccessTest.java index 96bcb52c5f4..7e1007c031f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ObjectAccessTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ObjectAccessTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PEGraphDecoderTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PEGraphDecoderTest.java index 965de19ea07..39dff72f0d9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PEGraphDecoderTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PEGraphDecoderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PointerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PointerTest.java index dd67e490342..5efd2dbaee3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PointerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PointerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PointerTrackingTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PointerTrackingTest.java index c6c7806717d..faa526d4065 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PointerTrackingTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/PointerTrackingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ReplacementsParseTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ReplacementsParseTest.java index 45087c43da8..57a78a1e878 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ReplacementsParseTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ReplacementsParseTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ReplacementsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ReplacementsTest.java index 0c8356b0848..32edfb11166 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ReplacementsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ReplacementsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SnippetsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SnippetsTest.java index b8a58545d50..0b62eba2aa4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SnippetsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SnippetsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StandardMethodSubstitutionsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StandardMethodSubstitutionsTest.java index 0c49379ef7d..2eb823bb08d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StandardMethodSubstitutionsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StandardMethodSubstitutionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringCompareToTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringCompareToTest.java index 75a3cf63c05..d161eed2ced 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringCompareToTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringCompareToTest.java @@ -24,14 +24,31 @@ package org.graalvm.compiler.replacements.test; +import jdk.vm.ci.aarch64.AArch64; +import jdk.vm.ci.amd64.AMD64; +import jdk.vm.ci.meta.ResolvedJavaMethod; +import org.graalvm.compiler.graph.Node; +import org.graalvm.compiler.nodes.StructuredGraph; +import org.graalvm.compiler.options.OptionValues; import org.graalvm.compiler.replacements.nodes.ArrayCompareToNode; +import org.graalvm.compiler.serviceprovider.GraalServices; +import org.junit.Assert; +import org.junit.Assume; import org.junit.Test; +import java.util.List; + +import static org.graalvm.compiler.core.common.GraalOptions.RemoveNeverExecutedCode; + /** * Tests compareTo method intrinsic. */ public class StringCompareToTest extends StringSubstitutionTestBase { + // The compareTo() implementation in java.lang.String has 4 calls to compareTo implementation. + private static final int EXPECT_NODE_COUNT = 4; + private static final String DISABLE_COMPACTSTRINGS_FLAG = "-XX:-CompactStrings"; + public StringCompareToTest() { initSubstitution( getResolvedJavaMethod(String.class, "compareTo", String.class), @@ -39,6 +56,62 @@ public class StringCompareToTest extends StringSubstitutionTestBase { ArrayCompareToNode.class); } + private int countNode(ResolvedJavaMethod method, Class expectedNode, OptionValues options) { + StructuredGraph graph = parseForCompile(method, options); + applyFrontEnd(graph); + + int c = 0; + for (Node node : graph.getNodes()) { + if (expectedNode.isInstance(node)) { + c += 1; + } + } + + return c; + } + + @Override + protected void initSubstitution(ResolvedJavaMethod theRealMethod, + ResolvedJavaMethod theTestMethod, Class expectedNode) { + Assume.assumeTrue((getTarget().arch instanceof AMD64) || (getTarget().arch instanceof AArch64)); + + realMethod = theRealMethod; + testMethod = theTestMethod; + + StructuredGraph graph = testGraph(testMethod.getName()); + + // Check to see if the resulting graph contains the expected node + StructuredGraph replacement = getReplacements().getSubstitution(realMethod, -1, false, null); + if (replacement == null) { + assertInGraph(graph, expectedNode); + } + + OptionValues options; + boolean needCheckNode = true; + + if (GraalServices.Java8OrEarlier) { + needCheckNode = false; + } else { + List vmArgs = GraalServices.getInputArguments(); + for (String vmArg : vmArgs) { + if (vmArg.equals(DISABLE_COMPACTSTRINGS_FLAG)) { + needCheckNode = false; + } + } + } + + if (needCheckNode) { + options = new OptionValues(getInitialOptions(), RemoveNeverExecutedCode, false); + Assert.assertEquals(EXPECT_NODE_COUNT, countNode(testMethod, expectedNode, options)); + } else { + options = getInitialOptions(); + } + + // Force compilation. + testCode = getCode(testMethod, options); + Assert.assertNotNull(testCode); + } + public static int stringCompareTo(String a, String b) { return a.compareTo(b); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringEqualsConstantTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringEqualsConstantTest.java index 556b7b15fb5..5fcf881ec99 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringEqualsConstantTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringEqualsConstantTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringHashConstantTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringHashConstantTest.java index 11bf4a3fccd..af8be119c96 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringHashConstantTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringHashConstantTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfCharTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfCharTest.java index 83774e40c0f..61e9c59e30c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfCharTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfCharTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfConstantTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfConstantTest.java index 20c09755d00..40863f82731 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfConstantTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfConstantTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfDeoptimizeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfDeoptimizeTest.java index 5c7a5733db3..a6ca4c9da13 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfDeoptimizeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfDeoptimizeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfTest.java index 2daea685634..dfb299982e2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfTestBase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfTestBase.java index a7ada18be4e..de4ed71b51b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfTestBase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringIndexOfTestBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringSubstitutionTestBase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringSubstitutionTestBase.java index 3e9e902df14..6346b7076e4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringSubstitutionTestBase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringSubstitutionTestBase.java @@ -38,9 +38,9 @@ import jdk.vm.ci.meta.ResolvedJavaMethod; */ public class StringSubstitutionTestBase extends MethodSubstitutionTest { - private ResolvedJavaMethod realMethod = null; - private ResolvedJavaMethod testMethod = null; - private InstalledCode testCode = null; + protected ResolvedJavaMethod realMethod = null; + protected ResolvedJavaMethod testMethod = null; + protected InstalledCode testCode = null; protected final String[] testData = new String[]{ "A", "\uFF21", "AB", "A", "a", "Ab", "AA", "\uFF21", diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringSubstitutionsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringSubstitutionsTest.java index 2b990075e5d..f489820b3ff 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringSubstitutionsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/StringSubstitutionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SubstitutionsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SubstitutionsTest.java index d9f6154513a..136e91f3270 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SubstitutionsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SubstitutionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SystemArrayCopyTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SystemArrayCopyTest.java index 40ccd42db28..f658e3499b0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SystemArrayCopyTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/SystemArrayCopyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/TypeCheckTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/TypeCheckTest.java index ac72a463320..62bc28e0bda 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/TypeCheckTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/TypeCheckTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsafeBooleanAccessTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsafeBooleanAccessTest.java index a45447fa00c..3af0c2af7aa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsafeBooleanAccessTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsafeBooleanAccessTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsafeSubstitutionsTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsafeSubstitutionsTest.java index a6ee1fe169e..74fe4dffb45 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsafeSubstitutionsTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsafeSubstitutionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsignedIntegerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsignedIntegerTest.java index c655dbcd306..3e9189c309f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsignedIntegerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsignedIntegerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsignedMathTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsignedMathTest.java index 4b21d876ab8..2f57b453ae5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsignedMathTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnsignedMathTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnwindExceptionToCallerTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnwindExceptionToCallerTest.java index f202e75a169..96b0b294042 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnwindExceptionToCallerTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/UnwindExceptionToCallerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/WordTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/WordTest.java index 0a2886c46fe..c2b93c98fb6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/WordTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/WordTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/classfile/ClassfileBytecodeProviderTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/classfile/ClassfileBytecodeProviderTest.java index 810a1278989..3a66eba3194 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/classfile/ClassfileBytecodeProviderTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/classfile/ClassfileBytecodeProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -168,6 +168,10 @@ public class ClassfileBytecodeProviderTest extends GraalCompilerTest { */ continue; } + if (isGSON(className)) { + /* uses old class format */ + continue; + } try { checkClass(metaAccess, getSnippetReflection(), className); } catch (ClassNotFoundException e) { @@ -186,6 +190,10 @@ public class ClassfileBytecodeProviderTest extends GraalCompilerTest { return className.startsWith("org.graalvm.nativeimage"); } + private static boolean isGSON(String className) { + return className.contains("com.google.gson"); + } + protected void checkClass(MetaAccessProvider metaAccess, SnippetReflectionProvider snippetReflection, String className) throws ClassNotFoundException { Class c = Class.forName(className, true, getClass().getClassLoader()); ClassfileBytecodeProvider cbp = new ClassfileBytecodeProvider(metaAccess, snippetReflection); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/classfile/RedefineIntrinsicTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/classfile/RedefineIntrinsicTest.java index cf602ef88f8..46f6ac83d4f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/classfile/RedefineIntrinsicTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/classfile/RedefineIntrinsicTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ArraySubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ArraySubstitutions.java index 3a788fb7ed4..2324162a6d2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ArraySubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ArraySubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ArraysSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ArraysSubstitutions.java index 5ee14a4bdbe..525f6e1a252 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ArraysSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ArraysSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/BoxingSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/BoxingSnippets.java index 499a036db01..748923da98b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/BoxingSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/BoxingSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/CachingPEGraphDecoder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/CachingPEGraphDecoder.java index 1c679deadc4..53fa18ab25d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/CachingPEGraphDecoder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/CachingPEGraphDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ConstantBindingParameterPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ConstantBindingParameterPlugin.java index 01a83a93f18..fa0013bad1c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ConstantBindingParameterPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ConstantBindingParameterPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ConstantStringIndexOfSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ConstantStringIndexOfSnippets.java index 2cf155cf830..809677f6c76 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ConstantStringIndexOfSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ConstantStringIndexOfSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/DefaultJavaLoweringProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/DefaultJavaLoweringProvider.java index be2097c4030..4477c342de7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/DefaultJavaLoweringProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/DefaultJavaLoweringProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/GraphKit.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/GraphKit.java index 0502e52b0dd..ecccc716003 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/GraphKit.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/GraphKit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -356,10 +356,7 @@ public class GraphKit implements GraphBuilderTool { Plugins plugins = new Plugins(graphBuilderPlugins); GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault(plugins); - StructuredGraph calleeGraph = new StructuredGraph.Builder(invoke.getOptions(), invoke.getDebug()).method(method).build(); - if (invoke.graph().trackNodeSourcePosition()) { - calleeGraph.setTrackNodeSourcePosition(); - } + StructuredGraph calleeGraph = new StructuredGraph.Builder(invoke.getOptions(), invoke.getDebug()).method(method).trackNodeSourcePosition(invoke.graph().trackNodeSourcePosition()).build(); IntrinsicContext initialReplacementContext = new IntrinsicContext(method, method, providers.getReplacements().getDefaultReplacementBytecodeProvider(), INLINE_AFTER_PARSING); GraphBuilderPhase.Instance instance = createGraphBuilderInstance(metaAccess, providers.getStampProvider(), providers.getConstantReflection(), providers.getConstantFieldProvider(), config, OptimisticOptimizations.NONE, diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/InlineDuringParsingPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/InlineDuringParsingPlugin.java index ede011b35f6..1f2bb8f62a3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/InlineDuringParsingPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/InlineDuringParsingPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/InstanceOfSnippetsTemplates.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/InstanceOfSnippetsTemplates.java index b5e1fddf0b7..a6d057e6427 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/InstanceOfSnippetsTemplates.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/InstanceOfSnippetsTemplates.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/IntegerSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/IntegerSubstitutions.java index f5153d303e5..23f522dae57 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/IntegerSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/IntegerSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/IntrinsicGraphBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/IntrinsicGraphBuilder.java index 89984b11fd0..efe58df122c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/IntrinsicGraphBuilder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/IntrinsicGraphBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,9 @@ import org.graalvm.compiler.core.common.type.Stamp; import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.core.common.type.StampPair; import org.graalvm.compiler.core.common.type.TypeReference; +import org.graalvm.compiler.debug.DebugCloseable; import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.debug.GraalError; -import org.graalvm.compiler.debug.DebugCloseable; import org.graalvm.compiler.graph.NodeSourcePosition; import org.graalvm.compiler.nodes.CallTargetNode; import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind; @@ -94,8 +94,7 @@ public class IntrinsicGraphBuilder implements GraphBuilderContext, Receiver { this.stampProvider = stampProvider; this.code = code; this.method = code.getMethod(); - this.graph = new StructuredGraph.Builder(options, debug, allowAssumptions).method(method).setIsSubstitution(true).build(); - this.graph.setTrackNodeSourcePosition(); + this.graph = new StructuredGraph.Builder(options, debug, allowAssumptions).method(method).setIsSubstitution(true).trackNodeSourcePosition(true).build(); this.invokeBci = invokeBci; this.lastInstr = graph.start(); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/JavacBug.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/JavacBug.java index 9e79e1dce9a..24050312554 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/JavacBug.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/JavacBug.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/Log.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/Log.java index 4f10ce73f44..9accdde3536 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/Log.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/Log.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/LongSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/LongSubstitutions.java index 6ccaea19abd..e38ca18a0b2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/LongSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/LongSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/MethodHandlePlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/MethodHandlePlugin.java index 033fe68f1e1..336ee966c3a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/MethodHandlePlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/MethodHandlePlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/NodeIntrinsificationProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/NodeIntrinsificationProvider.java index 8733a48ce74..7191508bda4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/NodeIntrinsificationProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/NodeIntrinsificationProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,7 @@ import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.core.common.type.TypeReference; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.nodes.graphbuilderconf.NodeIntrinsicPluginFactory.InjectionProvider; +import org.graalvm.compiler.replacements.arraycopy.ArrayCopyForeignCalls; import org.graalvm.compiler.word.WordTypes; import jdk.vm.ci.meta.JavaKind; @@ -71,7 +72,7 @@ public class NodeIntrinsificationProvider implements InjectionProvider { T injected = snippetReflection.getInjectedNodeIntrinsicParameter(type); if (injected != null) { return injected; - } else if (type.equals(ForeignCallsProvider.class)) { + } else if (type.equals(ForeignCallsProvider.class) || type.equals(ArrayCopyForeignCalls.class)) { return type.cast(foreignCalls); } else if (type.equals(SnippetReflectionProvider.class)) { return type.cast(snippetReflection); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/PEGraphDecoder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/PEGraphDecoder.java index fbbd38e7b59..bb2a517358a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/PEGraphDecoder.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/PEGraphDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ReplacementsImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ReplacementsImpl.java index 8106b3a1553..9023cece5fa 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ReplacementsImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ReplacementsImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ReplacementsUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ReplacementsUtil.java index 8cb5c73c74a..bc34de934d5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ReplacementsUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/ReplacementsUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,11 @@ package org.graalvm.compiler.replacements; +import jdk.vm.ci.meta.JavaKind; +import jdk.vm.ci.meta.MetaAccessProvider; + +import org.graalvm.compiler.api.replacements.Fold; +import org.graalvm.compiler.api.replacements.Fold.InjectedParameter; import org.graalvm.compiler.debug.Assertions; import org.graalvm.compiler.replacements.nodes.AssertionNode; @@ -55,4 +60,15 @@ public final class ReplacementsUtil { AssertionNode.assertion(false, condition, message); } } + + @Fold + public static int arrayIndexScale(@InjectedParameter MetaAccessProvider metaAccessProvider, JavaKind elementKind) { + return metaAccessProvider.getArrayIndexScale(elementKind); + } + + @Fold + public static int getArrayBaseOffset(@InjectedParameter MetaAccessProvider metaAccessProvider, JavaKind elementKind) { + return metaAccessProvider.getArrayBaseOffset(elementKind); + } + } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetCounter.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetCounter.java index 9331a96f585..513573476c8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetCounter.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetCounter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetCounterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetCounterNode.java index e385f4c778d..167b39f6200 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetCounterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetCounterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetIntegerHistogram.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetIntegerHistogram.java index fd33837ea29..2470e25a010 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetIntegerHistogram.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetIntegerHistogram.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetLowerableMemoryNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetLowerableMemoryNode.java index 8ca4ba5259f..6a83a5c46c0 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetLowerableMemoryNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetLowerableMemoryNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetTemplate.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetTemplate.java index 57f9ba7c1f4..bcb9bacd130 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetTemplate.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/SnippetTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -49,7 +49,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Predicate; -import jdk.vm.ci.meta.ConstantReflectionProvider; import jdk.internal.vm.compiler.collections.EconomicMap; import jdk.internal.vm.compiler.collections.EconomicSet; import jdk.internal.vm.compiler.collections.Equivalence; @@ -142,6 +141,7 @@ import jdk.internal.vm.compiler.word.WordBase; import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.meta.Constant; +import jdk.vm.ci.meta.ConstantReflectionProvider; import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.Local; @@ -172,24 +172,44 @@ public class SnippetTemplate { protected final ResolvedJavaMethod method; protected ResolvedJavaMethod original; protected final LocationIdentity[] privateLocations; + protected final Object receiver; + + public Object getReceiver() { + return receiver; + } + + boolean hasReceiver() { + assert hasReceiver(method) == (receiver != null) : "Snippet with the receiver must have it set as constant. Snippet: " + this; + return hasReceiver(method); + } + + static boolean hasReceiver(ResolvedJavaMethod method) { + return method.hasReceiver(); + } /** * Lazily constructed parts of {@link SnippetInfo}. */ static class Lazy { Lazy(ResolvedJavaMethod method) { - int count = method.getSignature().getParameterCount(false); + int count = method.getSignature().getParameterCount(hasReceiver(method)); constantParameters = new boolean[count]; varargsParameters = new boolean[count]; nonNullParameters = new boolean[count]; - for (int i = 0; i < count; i++) { - constantParameters[i] = method.getParameterAnnotation(ConstantParameter.class, i) != null; - varargsParameters[i] = method.getParameterAnnotation(VarargsParameter.class, i) != null; - nonNullParameters[i] = method.getParameterAnnotation(NonNullParameter.class, i) != null; + int offset = hasReceiver(method) ? 1 : 0; + for (int i = offset; i < count; i++) { + constantParameters[i] = method.getParameterAnnotation(ConstantParameter.class, i - offset) != null; + varargsParameters[i] = method.getParameterAnnotation(VarargsParameter.class, i - offset) != null; + nonNullParameters[i] = method.getParameterAnnotation(NonNullParameter.class, i - offset) != null; - assert !constantParameters[i] || !varargsParameters[i] : "Parameter cannot be annotated with both @" + ConstantParameter.class.getSimpleName() + " and @" + + assert !constantParameters[i - offset] || !varargsParameters[i - offset] : "Parameter cannot be annotated with both @" + ConstantParameter.class.getSimpleName() + " and @" + VarargsParameter.class.getSimpleName(); } + if (method.hasReceiver()) { + // Receiver must be constant. + assert !constantParameters[0]; + constantParameters[0] = true; + } // Retrieve the names only when assertions are turned on. assert initNames(method, count); @@ -207,11 +227,16 @@ public class SnippetTemplate { private boolean initNames(ResolvedJavaMethod method, int parameterCount) { names = new String[parameterCount]; + int offset = 0; + if (method.hasReceiver()) { + names[0] = "this"; + offset = 1; + } Parameter[] params = method.getParameters(); if (params != null) { - for (int i = 0; i < names.length; i++) { - if (params[i].isNamePresent()) { - names[i] = params[i].getName(); + for (int i = offset; i < names.length; i++) { + if (params[i - offset].isNamePresent()) { + names[i] = params[i - offset].getName(); } } } else { @@ -244,12 +269,12 @@ public class SnippetTemplate { protected abstract Lazy lazy(); - protected SnippetInfo(ResolvedJavaMethod method, LocationIdentity[] privateLocations) { + protected SnippetInfo(ResolvedJavaMethod method, LocationIdentity[] privateLocations, Object receiver) { this.method = method; this.privateLocations = privateLocations; instantiationCounter = DebugContext.counter("SnippetInstantiationCount[%s]", method.getName()); instantiationTimer = DebugContext.timer("SnippetInstantiationTime[%s]", method.getName()); - assert method.isStatic() : "snippet method must be static: " + method.format("%H.%n"); + this.receiver = receiver; } public ResolvedJavaMethod getMethod() { @@ -293,8 +318,8 @@ public class SnippetTemplate { protected static class LazySnippetInfo extends SnippetInfo { protected final AtomicReference lazy = new AtomicReference<>(null); - protected LazySnippetInfo(ResolvedJavaMethod method, LocationIdentity[] privateLocations) { - super(method, privateLocations); + protected LazySnippetInfo(ResolvedJavaMethod method, LocationIdentity[] privateLocations, Object receiver) { + super(method, privateLocations, receiver); } @Override @@ -309,8 +334,8 @@ public class SnippetTemplate { protected static class EagerSnippetInfo extends SnippetInfo { protected final Lazy lazy; - protected EagerSnippetInfo(ResolvedJavaMethod method, LocationIdentity[] privateLocations) { - super(method, privateLocations); + protected EagerSnippetInfo(ResolvedJavaMethod method, LocationIdentity[] privateLocations, Object receiver) { + super(method, privateLocations, receiver); lazy = new Lazy(method); } @@ -353,6 +378,9 @@ public class SnippetTemplate { this.values = new Object[info.getParameterCount()]; this.constStamps = new Stamp[info.getParameterCount()]; this.cacheable = true; + if (info.hasReceiver()) { + addConst("this", info.getReceiver()); + } } public Arguments add(String name, Object value) { @@ -392,7 +420,7 @@ public class SnippetTemplate { private boolean check(String name, boolean constParam, boolean varargsParam) { assert nextParamIdx < info.getParameterCount() : "too many parameters: " + name + " " + this; - assert info.getParameterName(nextParamIdx) == null || info.getParameterName(nextParamIdx).equals(name) : "wrong parameter name: " + name + " " + this; + assert info.getParameterName(nextParamIdx) == null || info.getParameterName(nextParamIdx).equals(name) : "wrong parameter name at " + nextParamIdx + " : " + name + " " + this; assert constParam == info.isConstantParameter(nextParamIdx) : "Parameter " + (constParam ? "not " : "") + "annotated with @" + ConstantParameter.class.getSimpleName() + ": " + name + " " + this; assert varargsParam == info.isVarargsParameter(nextParamIdx) : "Parameter " + (varargsParam ? "not " : "") + "annotated with @" + VarargsParameter.class.getSimpleName() + ": " + name + @@ -614,12 +642,16 @@ public class SnippetTemplate { return null; } + protected SnippetInfo snippet(Class declaringClass, String methodName, LocationIdentity... initialPrivateLocations) { + return snippet(declaringClass, methodName, null, initialPrivateLocations); + } + /** * Finds the unique method in {@code declaringClass} named {@code methodName} annotated by * {@link Snippet} and returns a {@link SnippetInfo} value describing it. There must be * exactly one snippet method in {@code declaringClass}. */ - protected SnippetInfo snippet(Class declaringClass, String methodName, LocationIdentity... initialPrivateLocations) { + protected SnippetInfo snippet(Class declaringClass, String methodName, Object receiver, LocationIdentity... initialPrivateLocations) { assert methodName != null; Method method = findMethod(declaringClass, methodName, null); assert method != null : "did not find @" + Snippet.class.getSimpleName() + " method in " + declaringClass + " named " + methodName; @@ -629,9 +661,9 @@ public class SnippetTemplate { providers.getReplacements().registerSnippet(javaMethod, GraalOptions.TrackNodeSourcePosition.getValue(options)); LocationIdentity[] privateLocations = GraalOptions.SnippetCounters.getValue(options) ? SnippetCounterNode.addSnippetCounters(initialPrivateLocations) : initialPrivateLocations; if (GraalOptions.EagerSnippets.getValue(options)) { - return new EagerSnippetInfo(javaMethod, privateLocations); + return new EagerSnippetInfo(javaMethod, privateLocations, receiver); } else { - return new LazySnippetInfo(javaMethod, privateLocations); + return new LazySnippetInfo(javaMethod, privateLocations, receiver); } } @@ -714,7 +746,8 @@ public class SnippetTemplate { this.info = args.info; Object[] constantArgs = getConstantArgs(args); - StructuredGraph snippetGraph = providers.getReplacements().getSnippet(args.info.method, args.info.original, constantArgs, trackNodeSourcePosition, replacee.getNodeSourcePosition()); + boolean shouldTrackNodeSourcePosition1 = trackNodeSourcePosition || (providers.getCodeCache() != null && providers.getCodeCache().shouldDebugNonSafepoints()); + StructuredGraph snippetGraph = providers.getReplacements().getSnippet(args.info.method, args.info.original, constantArgs, shouldTrackNodeSourcePosition1, replacee.getNodeSourcePosition()); ResolvedJavaMethod method = snippetGraph.method(); Signature signature = method.getSignature(); @@ -725,9 +758,6 @@ public class SnippetTemplate { final StructuredGraph snippetCopy = new StructuredGraph.Builder(options, debug).name(snippetGraph.name).method(snippetGraph.method()).trackNodeSourcePosition( snippetGraph.trackNodeSourcePosition()).setIsSubstitution(true).build(); assert !GraalOptions.TrackNodeSourcePosition.getValue(options) || snippetCopy.trackNodeSourcePosition(); - if (providers.getCodeCache() != null && providers.getCodeCache().shouldDebugNonSafepoints()) { - snippetCopy.setTrackNodeSourcePosition(); - } try (DebugContext.Scope scope = debug.scope("SpecializeSnippet", snippetCopy)) { if (!snippetGraph.isUnsafeAccessTrackingEnabled()) { snippetCopy.disableUnsafeAccessTracking(); @@ -1038,8 +1068,8 @@ public class SnippetTemplate { return true; } - private static boolean checkConstantArgument(MetaAccessProvider metaAccess, final ResolvedJavaMethod method, Signature signature, int i, String name, Object arg, JavaKind kind) { - ResolvedJavaType type = signature.getParameterType(i, method.getDeclaringClass()).resolve(method.getDeclaringClass()); + private static boolean checkConstantArgument(MetaAccessProvider metaAccess, final ResolvedJavaMethod method, Signature signature, int paramIndex, String name, Object arg, JavaKind kind) { + ResolvedJavaType type = signature.getParameterType(paramIndex, method.getDeclaringClass()).resolve(method.getDeclaringClass()); if (metaAccess.lookupJavaType(WordBase.class).isAssignableFrom(type)) { assert arg instanceof JavaConstant : method + ": word constant parameters must be passed boxed in a Constant value: " + arg; return true; @@ -1715,10 +1745,11 @@ public class SnippetTemplate { } private static boolean checkTemplate(MetaAccessProvider metaAccess, Arguments args, ResolvedJavaMethod method, Signature signature) { - for (int i = 0; i < args.info.getParameterCount(); i++) { + int offset = args.info.hasReceiver() ? 1 : 0; + for (int i = offset; i < args.info.getParameterCount(); i++) { if (args.info.isConstantParameter(i)) { - JavaKind kind = signature.getParameterKind(i); - assert checkConstantArgument(metaAccess, method, signature, i, args.info.getParameterName(i), args.values[i], kind); + JavaKind kind = signature.getParameterKind(i - offset); + assert checkConstantArgument(metaAccess, method, signature, i - offset, args.info.getParameterName(i), args.values[i], kind); } else if (args.info.isVarargsParameter(i)) { assert args.values[i] instanceof Varargs; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/Snippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/Snippets.java index 78244343399..9ec587ff515 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/Snippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/Snippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java index 19602ec1cb0..dc01b76706b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java @@ -88,13 +88,13 @@ import org.graalvm.compiler.nodes.calc.ZeroExtendNode; import org.graalvm.compiler.nodes.debug.BindToRegisterNode; import org.graalvm.compiler.nodes.debug.BlackholeNode; import org.graalvm.compiler.nodes.debug.ControlFlowAnchorNode; -import org.graalvm.compiler.nodes.extended.OpaqueNode; import org.graalvm.compiler.nodes.debug.SpillRegistersNode; import org.graalvm.compiler.nodes.extended.BoxNode; import org.graalvm.compiler.nodes.extended.BranchProbabilityNode; import org.graalvm.compiler.nodes.extended.BytecodeExceptionNode.BytecodeExceptionKind; import org.graalvm.compiler.nodes.extended.GetClassNode; import org.graalvm.compiler.nodes.extended.MembarNode; +import org.graalvm.compiler.nodes.extended.OpaqueNode; import org.graalvm.compiler.nodes.extended.RawLoadNode; import org.graalvm.compiler.nodes.extended.RawStoreNode; import org.graalvm.compiler.nodes.extended.UnboxNode; @@ -116,6 +116,7 @@ import org.graalvm.compiler.nodes.java.UnsafeCompareAndSwapNode; import org.graalvm.compiler.nodes.type.StampTool; import org.graalvm.compiler.nodes.util.GraphUtil; import org.graalvm.compiler.nodes.virtual.EnsureVirtualizedNode; +import org.graalvm.compiler.replacements.nodes.ProfileBooleanNode; import org.graalvm.compiler.replacements.nodes.ReverseBytesNode; import org.graalvm.compiler.replacements.nodes.VirtualizableInvokeMacroNode; import org.graalvm.compiler.replacements.nodes.arithmetic.IntegerAddExactNode; @@ -152,6 +153,7 @@ public class StandardGraphBuilderPlugins { registerObjectPlugins(plugins); registerClassPlugins(plugins); registerMathPlugins(plugins, allowDeoptimization); + registerStrictMathPlugins(plugins); registerUnsignedMathPlugins(plugins); registerStringPlugins(plugins, bytecodeProvider, snippetReflection); registerCharacterPlugins(plugins); @@ -270,6 +272,19 @@ public class StandardGraphBuilderPlugins { r.registerMethodSubstitution(ArraySubstitutions.class, "getLength", Object.class); } + /** + * The intrinsic for {@link Math#sqrt(double)} is shared with {@link StrictMath#sqrt(double)}. + * + * @see "http://hg.openjdk.java.net/jdk/jdk/file/621efe32eb0b/src/hotspot/share/oops/method.cpp#l1504" + */ + static final class MathSqrtPlugin implements InvocationPlugin { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) { + b.push(JavaKind.Double, b.append(SqrtNode.create(value, NodeView.DEFAULT))); + return true; + } + } + private abstract static class UnsafeCompareAndUpdatePluginsRegistrar { public void register(Registration r, String casPrefix, boolean explicitUnsafeNullChecks, JavaKind[] compareAndSwapTypes, boolean java11OrEarlier) { for (JavaKind kind : compareAndSwapTypes) { @@ -631,13 +646,12 @@ public class StandardGraphBuilderPlugins { return true; } }); - r.register1("sqrt", Double.TYPE, new InvocationPlugin() { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) { - b.push(JavaKind.Double, b.append(SqrtNode.create(value, NodeView.DEFAULT))); - return true; - } - }); + r.register1("sqrt", Double.TYPE, new MathSqrtPlugin()); + } + + private static void registerStrictMathPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, StrictMath.class); + r.register1("sqrt", Double.TYPE, new MathSqrtPlugin()); } public static final class StringIndexOfConstantPlugin implements InvocationPlugin { @@ -793,6 +807,19 @@ public class StandardGraphBuilderPlugins { return true; } }); + + r.register2("cast", Receiver.class, Object.class, new InvocationPlugin() { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) { + b.genCheckcastDynamic(object, receiver.get()); + return true; + } + + @Override + public boolean inlineOnly() { + return true; + } + }); } /** @@ -974,7 +1001,18 @@ public class StandardGraphBuilderPlugins { EndNode endNode = graph.add(new EndNode()); node.setNext(endNode); if (node instanceof StateSplit) { + if (isLoad(node)) { + /* + * Temporarily push the access node so that the frame state has the node + * on the expression stack. + */ + b.push(unsafeAccessKind, node); + } b.setStateAfter((StateSplit) node); + if (isLoad(node)) { + ValueNode popped = b.pop(unsafeAccessKind); + assert popped == node; + } } merge.addForwardEnd(endNode); } @@ -1265,7 +1303,26 @@ public class StandardGraphBuilderPlugins { private static void registerMethodHandleImplPlugins(InvocationPlugins plugins, SnippetReflectionProvider snippetReflection, BytecodeProvider bytecodeProvider) { Registration r = new Registration(plugins, "java.lang.invoke.MethodHandleImpl", bytecodeProvider); + // In later JDKs this no longer exists and the usage is replace by Class.cast which is + // already an intrinsic + r.registerOptional2("castReference", Class.class, Object.class, new InvocationPlugin() { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode javaClass, ValueNode object) { + b.genCheckcastDynamic(object, javaClass); + return true; + } + + @Override + public boolean inlineOnly() { + return true; + } + }); r.register2("profileBoolean", boolean.class, int[].class, new InvocationPlugin() { + @Override + public boolean inlineOnly() { + return true; + } + @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode result, ValueNode counters) { if (result.isConstant()) { @@ -1298,7 +1355,9 @@ public class StandardGraphBuilderPlugins { b.addPush(JavaKind.Boolean, newResult); return true; } - return false; + b.addPush(JavaKind.Boolean, + new ProfileBooleanNode(snippetReflection, b.getInvokeKind(), targetMethod, b.bci(), b.getInvokeReturnStamp(b.getAssumptions()), result, counters)); + return true; } }); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StringIndexOfNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StringIndexOfNode.java index 4d9e46d00af..b3c978b024e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StringIndexOfNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StringIndexOfNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StringSubstitutions.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StringSubstitutions.java index 157780ab7c0..6a6527da4b7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StringSubstitutions.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StringSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/UnsafeAccess.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/UnsafeAccess.java index 124521425dd..1038355cc85 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/UnsafeAccess.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/UnsafeAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopyCallNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyCallNode.java similarity index 79% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopyCallNode.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyCallNode.java index 32f4409611e..bbb1497a837 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopyCallNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyCallNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ //JaCoCo Exclude -package org.graalvm.compiler.hotspot.replacements.arraycopy; +package org.graalvm.compiler.replacements.arraycopy; import static org.graalvm.compiler.nodeinfo.InputType.Memory; import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_UNKNOWN; @@ -36,13 +36,11 @@ import org.graalvm.compiler.graph.Node; import org.graalvm.compiler.graph.NodeClass; import org.graalvm.compiler.graph.spi.Canonicalizable; import org.graalvm.compiler.graph.spi.CanonicalizerTool; -import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; -import org.graalvm.compiler.hotspot.meta.HotSpotHostForeignCallsProvider; -import org.graalvm.compiler.hotspot.nodes.GetObjectAddressNode; import org.graalvm.compiler.nodeinfo.InputType; import org.graalvm.compiler.nodeinfo.NodeInfo; import org.graalvm.compiler.nodes.ConstantNode; import org.graalvm.compiler.nodes.FixedWithNextNode; +import org.graalvm.compiler.nodes.GetObjectAddressNode; import org.graalvm.compiler.nodes.NamedLocationIdentity; import org.graalvm.compiler.nodes.NodeView; import org.graalvm.compiler.nodes.StructuredGraph; @@ -58,6 +56,7 @@ import org.graalvm.compiler.nodes.memory.MemoryNode; import org.graalvm.compiler.nodes.memory.address.OffsetAddressNode; import org.graalvm.compiler.nodes.spi.Lowerable; import org.graalvm.compiler.nodes.spi.LoweringTool; +import org.graalvm.compiler.word.WordTypes; import jdk.internal.vm.compiler.word.LocationIdentity; import jdk.vm.ci.code.CodeUtil; @@ -78,30 +77,29 @@ public final class ArrayCopyCallNode extends AbstractMemoryCheckpoint implements @OptionalInput(Memory) MemoryNode lastLocationAccess; - protected final JavaKind elementKind; - protected final LocationIdentity locationIdentity; + private final JavaKind elementKind; + private final LocationIdentity locationIdentity; + private final ArrayCopyForeignCalls foreignCalls; + private final JavaKind wordJavaKind; + private final int heapWordSize; /** * Aligned means that the offset of the copy is heap word aligned. */ - protected boolean aligned; - protected boolean disjoint; - protected boolean uninitialized; + private boolean aligned; + private boolean disjoint; + private boolean uninitialized; - protected final HotSpotGraalRuntimeProvider runtime; - - public ArrayCopyCallNode(@InjectedNodeParameter HotSpotGraalRuntimeProvider runtime, ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length, JavaKind elementKind, - boolean aligned, boolean disjoint, boolean uninitialized) { - this(runtime, src, srcPos, dest, destPos, length, elementKind, null, aligned, disjoint, uninitialized); + public ArrayCopyCallNode(@InjectedNodeParameter ArrayCopyForeignCalls foreignCalls, @InjectedNodeParameter WordTypes wordTypes, + ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, + ValueNode length, JavaKind elementKind, boolean aligned, boolean disjoint, boolean uninitialized, int heapWordSize) { + this(foreignCalls, wordTypes, src, srcPos, dest, destPos, length, elementKind, null, aligned, disjoint, uninitialized, heapWordSize); } - public ArrayCopyCallNode(@InjectedNodeParameter HotSpotGraalRuntimeProvider runtime, ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length, JavaKind elementKind, - boolean disjoint) { - this(runtime, src, srcPos, dest, destPos, length, elementKind, null, false, disjoint, false); - } - - protected ArrayCopyCallNode(@InjectedNodeParameter HotSpotGraalRuntimeProvider runtime, ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length, JavaKind elementKind, - LocationIdentity locationIdentity, boolean aligned, boolean disjoint, boolean uninitialized) { + protected ArrayCopyCallNode(@InjectedNodeParameter ArrayCopyForeignCalls foreignCalls, @InjectedNodeParameter WordTypes wordTypes, + ValueNode src, ValueNode srcPos, ValueNode dest, + ValueNode destPos, ValueNode length, JavaKind elementKind, + LocationIdentity locationIdentity, boolean aligned, boolean disjoint, boolean uninitialized, int heapWordSize) { super(TYPE, StampFactory.forVoid()); assert elementKind != null; this.src = src; @@ -114,7 +112,10 @@ public final class ArrayCopyCallNode extends AbstractMemoryCheckpoint implements this.aligned = aligned; this.disjoint = disjoint; this.uninitialized = uninitialized; - this.runtime = runtime; + this.foreignCalls = foreignCalls; + this.wordJavaKind = wordTypes.getWordKind(); + this.heapWordSize = heapWordSize; + } public ValueNode getSource() { @@ -144,7 +145,7 @@ public final class ArrayCopyCallNode extends AbstractMemoryCheckpoint implements private ValueNode computeBase(LoweringTool tool, ValueNode base, ValueNode pos) { FixedWithNextNode basePtr = graph().add(new GetObjectAddressNode(base)); graph().addBeforeFixed(this, basePtr); - Stamp wordStamp = StampFactory.forKind(runtime.getTarget().wordJavaKind); + Stamp wordStamp = StampFactory.forKind(wordJavaKind); ValueNode wordPos = IntegerConvertNode.convert(pos, wordStamp, graph(), NodeView.DEFAULT); int shift = CodeUtil.log2(tool.getMetaAccess().getArrayIndexScale(elementKind)); ValueNode scaledIndex = graph().unique(new LeftShiftNode(wordPos, ConstantNode.forInt(shift, graph()))); @@ -156,7 +157,7 @@ public final class ArrayCopyCallNode extends AbstractMemoryCheckpoint implements public void lower(LoweringTool tool) { if (graph().getGuardsStage().areFrameStatesAtDeopts()) { updateAlignedDisjoint(tool.getMetaAccess()); - ForeignCallDescriptor desc = HotSpotHostForeignCallsProvider.lookupArraycopyDescriptor(elementKind, isAligned(), isDisjoint(), isUninitialized(), + ForeignCallDescriptor desc = foreignCalls.lookupArraycopyDescriptor(elementKind, isAligned(), isDisjoint(), isUninitialized(), locationIdentity.equals(LocationIdentity.any())); StructuredGraph graph = graph(); ValueNode srcAddr = computeBase(tool, getSource(), getSourcePosition()); @@ -165,7 +166,7 @@ public final class ArrayCopyCallNode extends AbstractMemoryCheckpoint implements if (len.stamp(NodeView.DEFAULT).getStackKind() != JavaKind.Long) { len = IntegerConvertNode.convert(len, StampFactory.forKind(JavaKind.Long), graph(), NodeView.DEFAULT); } - ForeignCallNode call = graph.add(new ForeignCallNode(runtime.getHostBackend().getForeignCalls(), desc, srcAddr, destAddr, len)); + ForeignCallNode call = graph.add(new ForeignCallNode(foreignCalls, desc, srcAddr, destAddr, len)); call.setStateAfter(stateAfter()); graph.replaceFixedWithFixed(this, call); } @@ -189,27 +190,28 @@ public final class ArrayCopyCallNode extends AbstractMemoryCheckpoint implements @NodeIntrinsic private static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter JavaKind elementKind, @ConstantNodeParameter boolean aligned, - @ConstantNodeParameter boolean disjoint, @ConstantNodeParameter boolean uninitialized); + @ConstantNodeParameter boolean disjoint, @ConstantNodeParameter boolean uninitialized, @ConstantNodeParameter int heapWordSize); @NodeIntrinsic private static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter JavaKind elementKind, @ConstantNodeParameter LocationIdentity locationIdentity, @ConstantNodeParameter boolean aligned, @ConstantNodeParameter boolean disjoint, - @ConstantNodeParameter boolean uninitialized); + @ConstantNodeParameter boolean uninitialized, @ConstantNodeParameter int heapWordSize); - public static void arraycopyObjectKillsAny(Object src, int srcPos, Object dest, int destPos, int length) { - arraycopy(src, srcPos, dest, destPos, length, JavaKind.Object, LocationIdentity.any(), false, false, false); + public static void arraycopyObjectKillsAny(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter int heapWordSize) { + arraycopy(src, srcPos, dest, destPos, length, JavaKind.Object, LocationIdentity.any(), false, false, false, heapWordSize); } - public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter JavaKind elementKind) { - arraycopy(src, srcPos, dest, destPos, length, elementKind, false, false, false); + public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter JavaKind elementKind, @ConstantNodeParameter int heapWordSize) { + arraycopy(src, srcPos, dest, destPos, length, elementKind, false, false, false, heapWordSize); } - public static void disjointArraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter JavaKind elementKind) { - arraycopy(src, srcPos, dest, destPos, length, elementKind, false, true, false); + public static void disjointArraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter JavaKind elementKind, @ConstantNodeParameter int heapWordSize) { + arraycopy(src, srcPos, dest, destPos, length, elementKind, false, true, false, heapWordSize); } - public static void disjointUninitializedArraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter JavaKind elementKind) { - arraycopy(src, srcPos, dest, destPos, length, elementKind, false, true, true); + public static void disjointUninitializedArraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter JavaKind elementKind, + @ConstantNodeParameter int heapWordSize) { + arraycopy(src, srcPos, dest, destPos, length, elementKind, false, true, true, heapWordSize); } public boolean isAligned() { @@ -225,7 +227,7 @@ public final class ArrayCopyCallNode extends AbstractMemoryCheckpoint implements } boolean isHeapWordAligned(MetaAccessProvider metaAccess, JavaConstant value, JavaKind kind) { - return (metaAccess.getArrayBaseOffset(kind) + (long) value.asInt() * metaAccess.getArrayIndexScale(kind)) % runtime.getVMConfig().heapWordSize == 0; + return (metaAccess.getArrayBaseOffset(kind) + (long) value.asInt() * metaAccess.getArrayIndexScale(kind)) % heapWordSize == 0; } public void updateAlignedDisjoint(MetaAccessProvider metaAccess) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyForeignCalls.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyForeignCalls.java new file mode 100644 index 00000000000..60352b2e1bc --- /dev/null +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyForeignCalls.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +package org.graalvm.compiler.replacements.arraycopy; + +import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor; +import org.graalvm.compiler.core.common.spi.ForeignCallsProvider; +import org.graalvm.compiler.word.Word; + +import jdk.vm.ci.meta.JavaKind; + +public interface ArrayCopyForeignCalls extends ForeignCallsProvider { + + ForeignCallDescriptor UNSAFE_ARRAYCOPY = new ForeignCallDescriptor("unsafe_arraycopy", void.class, Word.class, Word.class, Word.class); + ForeignCallDescriptor GENERIC_ARRAYCOPY = new ForeignCallDescriptor("generic_arraycopy", int.class, Word.class, int.class, Word.class, int.class, int.class); + + ForeignCallDescriptor lookupCheckcastArraycopyDescriptor(boolean uninit); + + ForeignCallDescriptor lookupArraycopyDescriptor(JavaKind kind, boolean aligned, boolean disjoint, boolean uninit, boolean killAny); +} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopyNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyNode.java similarity index 95% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopyNode.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyNode.java index 2acc02198de..9cc988304b4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopyNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.hotspot.replacements.arraycopy; +package org.graalvm.compiler.replacements.arraycopy; import static jdk.internal.vm.compiler.word.LocationIdentity.any; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopySnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopySnippets.java similarity index 84% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopySnippets.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopySnippets.java index dfdf70c412c..b0e73517ae7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopySnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopySnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,17 +22,8 @@ */ -package org.graalvm.compiler.hotspot.replacements.arraycopy; +package org.graalvm.compiler.replacements.arraycopy; -import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfig.INJECTED_VMCONFIG; -import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfigBase.INJECTED_METAACCESS; -import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_SUPER_CHECK_OFFSET_LOCATION; -import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION; -import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.arrayClassElementOffset; -import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.getArrayBaseOffset; -import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.loadHub; -import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readLayoutHelper; -import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.superCheckOffsetOffset; import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.FREQUENT_PROBABILITY; import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.LIKELY_PROBABILITY; import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.NOT_FREQUENT_PROBABILITY; @@ -45,18 +36,17 @@ import java.util.EnumMap; import jdk.internal.vm.compiler.collections.UnmodifiableEconomicMap; import org.graalvm.compiler.api.directives.GraalDirectives; import org.graalvm.compiler.api.replacements.Fold; +import org.graalvm.compiler.api.replacements.Fold.InjectedParameter; import org.graalvm.compiler.api.replacements.Snippet; import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter; +import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; import org.graalvm.compiler.debug.DebugHandlersFactory; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.graph.Node; -import org.graalvm.compiler.hotspot.meta.HotSpotProviders; -import org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil; -import org.graalvm.compiler.hotspot.word.KlassPointer; import org.graalvm.compiler.nodes.CallTargetNode; import org.graalvm.compiler.nodes.DeoptimizeNode; -import org.graalvm.compiler.nodes.Invoke; import org.graalvm.compiler.nodes.InvokeNode; +import org.graalvm.compiler.nodes.InvokeWithExceptionNode; import org.graalvm.compiler.nodes.NamedLocationIdentity; import org.graalvm.compiler.nodes.NodeView; import org.graalvm.compiler.nodes.PiNode; @@ -69,9 +59,11 @@ import org.graalvm.compiler.nodes.spi.LoweringTool; import org.graalvm.compiler.nodes.type.StampTool; import org.graalvm.compiler.nodes.util.GraphUtil; import org.graalvm.compiler.options.OptionValues; +import org.graalvm.compiler.phases.util.Providers; import org.graalvm.compiler.replacements.ReplacementsUtil; import org.graalvm.compiler.replacements.SnippetCounter; import org.graalvm.compiler.replacements.SnippetCounter.Group; +import org.graalvm.compiler.replacements.SnippetCounter.Group.Factory; import org.graalvm.compiler.replacements.SnippetIntegerHistogram; import org.graalvm.compiler.replacements.SnippetTemplate; import org.graalvm.compiler.replacements.SnippetTemplate.Arguments; @@ -81,16 +73,17 @@ import org.graalvm.compiler.replacements.nodes.BasicArrayCopyNode; import org.graalvm.compiler.replacements.nodes.ExplodeLoopNode; import org.graalvm.compiler.word.Word; import jdk.internal.vm.compiler.word.LocationIdentity; -import jdk.internal.vm.compiler.word.WordFactory; +import jdk.internal.vm.compiler.word.Pointer; import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.meta.DeoptimizationAction; import jdk.vm.ci.meta.DeoptimizationReason; import jdk.vm.ci.meta.JavaKind; +import jdk.vm.ci.meta.MetaAccessProvider; import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaType; -public class ArrayCopySnippets implements Snippets { +public abstract class ArrayCopySnippets implements Snippets { private enum ArrayCopyTypeCheck { UNDEFINED_ARRAY_TYPE_CHECK, @@ -103,18 +96,31 @@ public class ArrayCopySnippets implements Snippets { LAYOUT_HELPER_BASED_ARRAY_TYPE_CHECK } + /** Marker value for the {@link InjectedParameter} injected parameter. */ + static final MetaAccessProvider INJECTED_META_ACCESS = null; + + public abstract Pointer loadHub(Object nonNullSrc); + + public abstract Pointer getDestElemClass(Pointer destKlass); + + public abstract Word getSuperCheckOffset(Pointer destElemKlass); + + public abstract int getReadLayoutHelper(Pointer srcHub); + + protected abstract int heapWordSize(); + @Snippet - public static void arraycopyZeroLengthSnippet(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter ArrayCopyTypeCheck arrayTypeCheck, + public void arraycopyZeroLengthSnippet(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter ArrayCopyTypeCheck arrayTypeCheck, @ConstantParameter Counters counters) { Object nonNullSrc = GraalDirectives.guardingNonNull(src); Object nonNullDest = GraalDirectives.guardingNonNull(dest); - checkArrayTypes(nonNullSrc, nonNullDest, arrayTypeCheck); + this.checkArrayTypes(nonNullSrc, nonNullDest, arrayTypeCheck); checkLimits(nonNullSrc, srcPos, nonNullDest, destPos, length, counters); counters.zeroLengthStaticCounter.inc(); } @Snippet - public static void arraycopyExactSnippet(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter ArrayCopyTypeCheck arrayTypeCheck, + public void arraycopyExactSnippet(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter ArrayCopyTypeCheck arrayTypeCheck, @ConstantParameter JavaKind elementKind, @ConstantParameter SnippetCounter elementKindCounter, @ConstantParameter SnippetCounter elementKindCopiedCounter, @ConstantParameter Counters counters) { Object nonNullSrc = GraalDirectives.guardingNonNull(src); @@ -125,11 +131,11 @@ public class ArrayCopySnippets implements Snippets { elementKindCounter.inc(); elementKindCopiedCounter.add(length); - ArrayCopyCallNode.arraycopy(nonNullSrc, srcPos, nonNullDest, destPos, length, elementKind); + ArrayCopyCallNode.arraycopy(nonNullSrc, srcPos, nonNullDest, destPos, length, elementKind, heapWordSize()); } @Snippet - public static void arraycopyUnrolledSnippet(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter ArrayCopyTypeCheck arrayTypeCheck, + public void arraycopyUnrolledSnippet(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter ArrayCopyTypeCheck arrayTypeCheck, @ConstantParameter JavaKind elementKind, @ConstantParameter int unrolledLength, @ConstantParameter Counters counters) { Object nonNullSrc = GraalDirectives.guardingNonNull(src); Object nonNullDest = GraalDirectives.guardingNonNull(dest); @@ -141,7 +147,7 @@ public class ArrayCopySnippets implements Snippets { } @Snippet - public static void arraycopyCheckcastSnippet(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter ArrayCopyTypeCheck arrayTypeCheck, + public void arraycopyCheckcastSnippet(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter ArrayCopyTypeCheck arrayTypeCheck, @ConstantParameter Counters counters, @ConstantParameter SnippetInfo workSnippet, @ConstantParameter JavaKind elementKind) { Object nonNullSrc = GraalDirectives.guardingNonNull(src); Object nonNullDest = GraalDirectives.guardingNonNull(dest); @@ -153,7 +159,7 @@ public class ArrayCopySnippets implements Snippets { } @Snippet - public static void arraycopyGenericSnippet(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter ArrayCopyTypeCheck arrayTypeCheck, @ConstantParameter Counters counters, + public void arraycopyGenericSnippet(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter ArrayCopyTypeCheck arrayTypeCheck, @ConstantParameter Counters counters, @ConstantParameter SnippetInfo workSnippet, @ConstantParameter JavaKind elementKind) { Object nonNullSrc = GraalDirectives.guardingNonNull(src); Object nonNullDest = GraalDirectives.guardingNonNull(dest); @@ -180,8 +186,8 @@ public class ArrayCopySnippets implements Snippets { } private static void unrolledArraycopyWork(Object nonNullSrc, int srcPos, Object nonNullDest, int destPos, int length, JavaKind elementKind) { - int scale = HotSpotReplacementsUtil.arrayIndexScale(INJECTED_METAACCESS, elementKind); - int arrayBaseOffset = getArrayBaseOffset(INJECTED_METAACCESS, elementKind); + int scale = ReplacementsUtil.arrayIndexScale(INJECTED_META_ACCESS, elementKind); + int arrayBaseOffset = ReplacementsUtil.getArrayBaseOffset(INJECTED_META_ACCESS, elementKind); LocationIdentity arrayLocation = getArrayLocation(elementKind); long sourceOffset = arrayBaseOffset + (long) srcPos * scale; @@ -204,20 +210,20 @@ public class ArrayCopySnippets implements Snippets { } @Snippet(allowPartialIntrinsicArgumentMismatch = true) - public static void checkcastArraycopyWithSlowPathWork(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter Counters counters) { + public void checkcastArraycopyWithSlowPathWork(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter Counters counters) { if (probability(FREQUENT_PROBABILITY, length > 0)) { Object nonNullSrc = PiNode.asNonNullObject(src); Object nonNullDest = PiNode.asNonNullObject(dest); - KlassPointer srcKlass = loadHub(nonNullSrc); - KlassPointer destKlass = loadHub(nonNullDest); + Pointer srcKlass = loadHub(nonNullSrc); + Pointer destKlass = loadHub(nonNullDest); if (probability(LIKELY_PROBABILITY, srcKlass == destKlass)) { // no storecheck required. counters.objectCheckcastSameTypeCounter.inc(); counters.objectCheckcastSameTypeCopiedCounter.add(length); - ArrayCopyCallNode.arraycopyObjectKillsAny(nonNullSrc, srcPos, nonNullDest, destPos, length); + ArrayCopyCallNode.arraycopyObjectKillsAny(nonNullSrc, srcPos, nonNullDest, destPos, length, heapWordSize()); } else { - KlassPointer destElemKlass = destKlass.readKlassPointer(arrayClassElementOffset(INJECTED_VMCONFIG), OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION); - Word superCheckOffset = WordFactory.signed(destElemKlass.readInt(superCheckOffsetOffset(INJECTED_VMCONFIG), KLASS_SUPER_CHECK_OFFSET_LOCATION)); + Pointer destElemKlass = getDestElemClass(destKlass); + Word superCheckOffset = getSuperCheckOffset(destElemKlass); counters.objectCheckcastDifferentTypeCounter.inc(); counters.objectCheckcastDifferentTypeCopiedCounter.add(length); @@ -236,7 +242,7 @@ public class ArrayCopySnippets implements Snippets { } @Snippet(allowPartialIntrinsicArgumentMismatch = true) - public static void genericArraycopyWithSlowPathWork(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter Counters counters) { + public void genericArraycopyWithSlowPathWork(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter Counters counters) { // The length > 0 check should not be placed here because generic array copy stub should // enforce type check. This is fine performance-wise because this snippet is rarely used. counters.genericArraycopyDifferentTypeCounter.inc(); @@ -268,19 +274,19 @@ public class ArrayCopySnippets implements Snippets { counters.checkSuccessCounter.inc(); } - private static void checkArrayTypes(Object nonNullSrc, Object nonNullDest, ArrayCopyTypeCheck arrayTypeCheck) { + private void checkArrayTypes(Object nonNullSrc, Object nonNullDest, ArrayCopyTypeCheck arrayTypeCheck) { if (arrayTypeCheck == ArrayCopyTypeCheck.NO_ARRAY_TYPE_CHECK) { // nothing to do } else if (arrayTypeCheck == ArrayCopyTypeCheck.HUB_BASED_ARRAY_TYPE_CHECK) { - KlassPointer srcHub = loadHub(nonNullSrc); - KlassPointer destHub = loadHub(nonNullDest); + Pointer srcHub = loadHub(nonNullSrc); + Pointer destHub = loadHub(nonNullDest); if (probability(SLOW_PATH_PROBABILITY, srcHub != destHub)) { DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } } else if (arrayTypeCheck == ArrayCopyTypeCheck.LAYOUT_HELPER_BASED_ARRAY_TYPE_CHECK) { - KlassPointer srcHub = loadHub(nonNullSrc); - KlassPointer destHub = loadHub(nonNullDest); - if (probability(SLOW_PATH_PROBABILITY, readLayoutHelper(srcHub) != readLayoutHelper(destHub))) { + Pointer srcHub = loadHub(nonNullSrc); + Pointer destHub = loadHub(nonNullDest); + if (probability(SLOW_PATH_PROBABILITY, getReadLayoutHelper(srcHub) != getReadLayoutHelper(destHub))) { DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } } else { @@ -350,26 +356,35 @@ public class ArrayCopySnippets implements Snippets { } public static class Templates extends SnippetTemplate.AbstractTemplates { - private final SnippetInfo arraycopyGenericSnippet = snippet("arraycopyGenericSnippet"); - private final SnippetInfo arraycopyUnrolledSnippet = snippet("arraycopyUnrolledSnippet"); - private final SnippetInfo arraycopyExactSnippet = snippet("arraycopyExactSnippet"); - private final SnippetInfo arraycopyZeroLengthSnippet = snippet("arraycopyZeroLengthSnippet"); - private final SnippetInfo arraycopyCheckcastSnippet = snippet("arraycopyCheckcastSnippet"); - private final SnippetInfo arraycopyNativeSnippet = snippet("arraycopyNativeSnippet"); - - private final SnippetInfo checkcastArraycopyWithSlowPathWork = snippet("checkcastArraycopyWithSlowPathWork"); - private final SnippetInfo genericArraycopyWithSlowPathWork = snippet("genericArraycopyWithSlowPathWork"); + private final SnippetInfo arraycopyGenericSnippet; + private final SnippetInfo arraycopyUnrolledSnippet; + private final SnippetInfo arraycopyExactSnippet; + private final SnippetInfo arraycopyZeroLengthSnippet; + private final SnippetInfo arraycopyCheckcastSnippet; + private final SnippetInfo arraycopyNativeSnippet; + private final SnippetInfo checkcastArraycopyWithSlowPathWork; + private final SnippetInfo genericArraycopyWithSlowPathWork; private ResolvedJavaMethod originalArraycopy; private final Counters counters; - public Templates(OptionValues options, Iterable factories, SnippetCounter.Group.Factory factory, HotSpotProviders providers, TargetDescription target) { - super(options, factories, providers, providers.getSnippetReflection(), target); + public Templates(ArrayCopySnippets receiver, OptionValues options, Iterable factories, Factory factory, Providers providers, + SnippetReflectionProvider snippetReflection, TargetDescription target) { + super(options, factories, providers, snippetReflection, target); this.counters = new Counters(factory); + + arraycopyGenericSnippet = snippet(receiver, "arraycopyGenericSnippet"); + arraycopyUnrolledSnippet = snippet(receiver, "arraycopyUnrolledSnippet"); + arraycopyExactSnippet = snippet(receiver, "arraycopyExactSnippet"); + arraycopyZeroLengthSnippet = snippet(receiver, "arraycopyZeroLengthSnippet"); + arraycopyCheckcastSnippet = snippet(receiver, "arraycopyCheckcastSnippet"); + arraycopyNativeSnippet = snippet(null, "arraycopyNativeSnippet"); + checkcastArraycopyWithSlowPathWork = snippet(receiver, "checkcastArraycopyWithSlowPathWork"); + genericArraycopyWithSlowPathWork = snippet(receiver, "genericArraycopyWithSlowPathWork"); } - protected SnippetInfo snippet(String methodName) { - SnippetInfo info = snippet(ArrayCopySnippets.class, methodName, LocationIdentity.any()); + protected SnippetInfo snippet(ArrayCopySnippets receiver, String methodName) { + SnippetInfo info = snippet(ArrayCopySnippets.class, methodName, receiver, LocationIdentity.any()); info.setOriginalMethod(originalArraycopy()); return info; } @@ -530,8 +545,8 @@ public class ArrayCopySnippets implements Snippets { SnippetTemplate template = template(arraycopy, args); UnmodifiableEconomicMap replacements = template.instantiate(providers.getMetaAccess(), arraycopy, SnippetTemplate.DEFAULT_REPLACER, args, false); for (Node originalNode : replacements.getKeys()) { - if (originalNode instanceof Invoke) { - Invoke invoke = (Invoke) replacements.get(originalNode); + if (originalNode instanceof InvokeNode) { + InvokeNode invoke = (InvokeNode) replacements.get(originalNode); assert invoke.asNode().graph() == graph; CallTargetNode call = invoke.callTarget(); @@ -539,14 +554,17 @@ public class ArrayCopySnippets implements Snippets { throw new GraalError("unexpected invoke %s in snippet", call.targetMethod()); } // Here we need to fix the bci of the invoke - InvokeNode newInvoke = graph.add(new InvokeNode(invoke.callTarget(), arraycopy.getBci())); + InvokeNode newInvoke = invoke.replaceWithNewBci(arraycopy.getBci()); + newInvoke.setStateDuring(null); + newInvoke.setStateAfter(null); if (arraycopy.stateDuring() != null) { newInvoke.setStateDuring(arraycopy.stateDuring()); } else { assert arraycopy.stateAfter() != null : arraycopy; newInvoke.setStateAfter(arraycopy.stateAfter()); } - graph.replaceFixedWithFixed((InvokeNode) invoke.asNode(), newInvoke); + } else if (originalNode instanceof InvokeWithExceptionNode) { + throw new GraalError("unexpected invoke with exception %s in snippet", originalNode); } else if (originalNode instanceof ArrayCopyWithSlowPathNode) { ArrayCopyWithSlowPathNode slowPath = (ArrayCopyWithSlowPathNode) replacements.get(originalNode); assert arraycopy.stateAfter() != null : arraycopy; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopyWithSlowPathNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyWithSlowPathNode.java similarity index 95% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopyWithSlowPathNode.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyWithSlowPathNode.java index b11978d0eba..481e452f46c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/ArrayCopyWithSlowPathNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/ArrayCopyWithSlowPathNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ -package org.graalvm.compiler.hotspot.replacements.arraycopy; +package org.graalvm.compiler.replacements.arraycopy; import org.graalvm.compiler.graph.NodeClass; import org.graalvm.compiler.nodeinfo.InputType; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/CheckcastArrayCopyCallNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/CheckcastArrayCopyCallNode.java similarity index 85% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/CheckcastArrayCopyCallNode.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/CheckcastArrayCopyCallNode.java index 4e99a876d47..83d9d04d822 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/CheckcastArrayCopyCallNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/CheckcastArrayCopyCallNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ //JaCoCo Exclude -package org.graalvm.compiler.hotspot.replacements.arraycopy; +package org.graalvm.compiler.replacements.arraycopy; import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_UNKNOWN; import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_UNKNOWN; @@ -32,13 +32,11 @@ import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor; import org.graalvm.compiler.core.common.type.PrimitiveStamp; import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.graph.NodeClass; -import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; -import org.graalvm.compiler.hotspot.meta.HotSpotHostForeignCallsProvider; -import org.graalvm.compiler.hotspot.nodes.GetObjectAddressNode; import org.graalvm.compiler.nodeinfo.InputType; import org.graalvm.compiler.nodeinfo.NodeInfo; import org.graalvm.compiler.nodes.ConstantNode; import org.graalvm.compiler.nodes.FixedWithNextNode; +import org.graalvm.compiler.nodes.GetObjectAddressNode; import org.graalvm.compiler.nodes.NodeView; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.ValueNode; @@ -52,6 +50,7 @@ import org.graalvm.compiler.nodes.memory.address.OffsetAddressNode; import org.graalvm.compiler.nodes.spi.Lowerable; import org.graalvm.compiler.nodes.spi.LoweringTool; import org.graalvm.compiler.word.Word; +import org.graalvm.compiler.word.WordTypes; import jdk.internal.vm.compiler.word.LocationIdentity; import jdk.vm.ci.code.CodeUtil; @@ -61,6 +60,10 @@ import jdk.vm.ci.meta.JavaKind; public final class CheckcastArrayCopyCallNode extends AbstractMemoryCheckpoint implements Lowerable, MemoryCheckpoint.Single { public static final NodeClass TYPE = NodeClass.create(CheckcastArrayCopyCallNode.class); + + private final ArrayCopyForeignCalls foreignCalls; + private final JavaKind wordKind; + @Input ValueNode src; @Input ValueNode srcPos; @Input ValueNode dest; @@ -71,11 +74,13 @@ public final class CheckcastArrayCopyCallNode extends AbstractMemoryCheckpoint i protected final boolean uninit; - protected final HotSpotGraalRuntimeProvider runtime; - - protected CheckcastArrayCopyCallNode(@InjectedNodeParameter HotSpotGraalRuntimeProvider runtime, ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length, + protected CheckcastArrayCopyCallNode(@InjectedNodeParameter ArrayCopyForeignCalls foreignCalls, @InjectedNodeParameter WordTypes wordTypes, + ValueNode src, ValueNode srcPos, ValueNode dest, + ValueNode destPos, ValueNode length, ValueNode superCheckOffset, ValueNode destElemKlass, boolean uninit) { super(TYPE, StampFactory.forKind(JavaKind.Int)); + this.foreignCalls = foreignCalls; + this.wordKind = wordTypes.getWordKind(); this.src = src; this.srcPos = srcPos; this.dest = dest; @@ -84,7 +89,6 @@ public final class CheckcastArrayCopyCallNode extends AbstractMemoryCheckpoint i this.superCheckOffset = superCheckOffset; this.destElemKlass = destElemKlass; this.uninit = uninit; - this.runtime = runtime; } public ValueNode getSource() { @@ -116,7 +120,7 @@ public final class CheckcastArrayCopyCallNode extends AbstractMemoryCheckpoint i graph().addBeforeFixed(this, basePtr); int shift = CodeUtil.log2(tool.getMetaAccess().getArrayIndexScale(JavaKind.Object)); - ValueNode extendedPos = IntegerConvertNode.convert(pos, StampFactory.forKind(runtime.getTarget().wordJavaKind), graph(), NodeView.DEFAULT); + ValueNode extendedPos = IntegerConvertNode.convert(pos, StampFactory.forKind(wordKind), graph(), NodeView.DEFAULT); ValueNode scaledIndex = graph().unique(new LeftShiftNode(extendedPos, ConstantNode.forInt(shift, graph()))); ValueNode offset = graph().unique( new AddNode(scaledIndex, @@ -127,15 +131,15 @@ public final class CheckcastArrayCopyCallNode extends AbstractMemoryCheckpoint i @Override public void lower(LoweringTool tool) { if (graph().getGuardsStage().areFrameStatesAtDeopts()) { - ForeignCallDescriptor desc = HotSpotHostForeignCallsProvider.lookupCheckcastArraycopyDescriptor(isUninit()); + ForeignCallDescriptor desc = foreignCalls.lookupCheckcastArraycopyDescriptor(isUninit()); StructuredGraph graph = graph(); ValueNode srcAddr = computeBase(tool, getSource(), getSourcePosition()); ValueNode destAddr = computeBase(tool, getDestination(), getDestinationPosition()); ValueNode len = getLength(); - if (len.stamp(NodeView.DEFAULT).getStackKind() != runtime.getTarget().wordJavaKind) { - len = IntegerConvertNode.convert(len, StampFactory.forKind(runtime.getTarget().wordJavaKind), graph(), NodeView.DEFAULT); + if (len.stamp(NodeView.DEFAULT).getStackKind() != wordKind) { + len = IntegerConvertNode.convert(len, StampFactory.forKind(wordKind), graph(), NodeView.DEFAULT); } - ForeignCallNode call = graph.add(new ForeignCallNode(runtime.getHostBackend().getForeignCalls(), desc, srcAddr, destAddr, len, superCheckOffset, destElemKlass)); + ForeignCallNode call = graph.add(new ForeignCallNode(foreignCalls, desc, srcAddr, destAddr, len, superCheckOffset, destElemKlass)); call.setStateAfter(stateAfter()); graph.replaceFixedWithFixed(this, call); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/GenericArrayCopyCallNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/GenericArrayCopyCallNode.java similarity index 74% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/GenericArrayCopyCallNode.java rename to src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/GenericArrayCopyCallNode.java index 724110c0b7d..d16e7aa16e3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/arraycopy/GenericArrayCopyCallNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/arraycopy/GenericArrayCopyCallNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,22 +23,20 @@ //JaCoCo Exclude -package org.graalvm.compiler.hotspot.replacements.arraycopy; +package org.graalvm.compiler.replacements.arraycopy; import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_UNKNOWN; import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_UNKNOWN; +import static org.graalvm.compiler.replacements.arraycopy.ArrayCopyForeignCalls.GENERIC_ARRAYCOPY; +import org.graalvm.compiler.core.common.spi.ForeignCallsProvider; import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.graph.NodeClass; -import org.graalvm.compiler.hotspot.HotSpotBackend; -import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; -import org.graalvm.compiler.hotspot.nodes.GetObjectAddressNode; import org.graalvm.compiler.nodeinfo.InputType; import org.graalvm.compiler.nodeinfo.NodeInfo; -import org.graalvm.compiler.nodes.NodeView; +import org.graalvm.compiler.nodes.GetObjectAddressNode; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.nodes.ValueNode; -import org.graalvm.compiler.nodes.calc.IntegerConvertNode; import org.graalvm.compiler.nodes.extended.ForeignCallNode; import org.graalvm.compiler.nodes.memory.AbstractMemoryCheckpoint; import org.graalvm.compiler.nodes.memory.MemoryCheckpoint; @@ -52,40 +50,35 @@ import jdk.vm.ci.meta.JavaKind; public final class GenericArrayCopyCallNode extends AbstractMemoryCheckpoint implements Lowerable, MemoryCheckpoint.Single { public static final NodeClass TYPE = NodeClass.create(GenericArrayCopyCallNode.class); + private final ForeignCallsProvider foreignCalls; @Input ValueNode src; @Input ValueNode srcPos; @Input ValueNode dest; @Input ValueNode destPos; @Input ValueNode length; - protected final HotSpotGraalRuntimeProvider runtime; + private ForeignCallsProvider getForeignCalls() { + return foreignCalls; + } - protected GenericArrayCopyCallNode(@InjectedNodeParameter HotSpotGraalRuntimeProvider runtime, ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length) { + protected GenericArrayCopyCallNode(@InjectedNodeParameter ForeignCallsProvider foreignCalls, ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length) { super(TYPE, StampFactory.forKind(JavaKind.Int)); + this.foreignCalls = foreignCalls; this.src = src; this.srcPos = srcPos; this.dest = dest; this.destPos = destPos; this.length = length; - this.runtime = runtime; } public ValueNode getSource() { return src; } - public ValueNode getSourcePosition() { - return srcPos; - } - public ValueNode getDestination() { return dest; } - public ValueNode getDestinationPosition() { - return destPos; - } - public ValueNode getLength() { return length; } @@ -96,7 +89,7 @@ public final class GenericArrayCopyCallNode extends AbstractMemoryCheckpoint imp StructuredGraph graph = graph(); ValueNode srcAddr = objectAddress(getSource()); ValueNode destAddr = objectAddress(getDestination()); - ForeignCallNode call = graph.add(new ForeignCallNode(runtime.getHostBackend().getForeignCalls(), HotSpotBackend.GENERIC_ARRAYCOPY, srcAddr, srcPos, destAddr, destPos, length)); + ForeignCallNode call = graph.add(new ForeignCallNode(getForeignCalls(), GENERIC_ARRAYCOPY, srcAddr, srcPos, destAddr, destPos, length)); call.setStateAfter(stateAfter()); graph.replaceFixedWithFixed(this, call); } @@ -108,13 +101,6 @@ public final class GenericArrayCopyCallNode extends AbstractMemoryCheckpoint imp return result; } - private ValueNode wordValue(ValueNode value) { - if (value.stamp(NodeView.DEFAULT).getStackKind() != runtime.getTarget().wordJavaKind) { - return IntegerConvertNode.convert(value, StampFactory.forKind(runtime.getTarget().wordJavaKind), graph(), NodeView.DEFAULT); - } - return value; - } - @Override public LocationIdentity getLocationIdentity() { return LocationIdentity.any(); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/Classfile.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/Classfile.java index d59b90c4028..cfafa7de5c9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/Classfile.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/Classfile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecode.java index 6339cfba666..433fa31b5ef 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java index 7851af3066e..7eaf06d0c9f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java index 67c6d611081..ece2f8ebb21 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java index c6a6ee8dbe4..a59f9a15f09 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayCompareToNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayCompareToNode.java index 66e34c387f4..7e65965544e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayCompareToNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayCompareToNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayEqualsNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayEqualsNode.java index 6cf3f2c5608..993a29728d5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayEqualsNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayEqualsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayRegionEqualsNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayRegionEqualsNode.java index 5610e07d7ad..d15dc7e597f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayRegionEqualsNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayRegionEqualsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/AssertionNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/AssertionNode.java index 7076b954b55..bab8a155d10 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/AssertionNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/AssertionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BasicArrayCopyNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BasicArrayCopyNode.java index 3d121210e16..50e83b61e49 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BasicArrayCopyNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BasicArrayCopyNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BasicObjectCloneNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BasicObjectCloneNode.java index 23ac8ee0550..2ec5b4abad1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BasicObjectCloneNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BasicObjectCloneNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BinaryMathIntrinsicNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BinaryMathIntrinsicNode.java index 47362114d3c..1432aa02394 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BinaryMathIntrinsicNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BinaryMathIntrinsicNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitCountNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitCountNode.java index b33b9ce9f87..1f76d629df5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitCountNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitCountNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitScanForwardNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitScanForwardNode.java index 0c2d044b653..93c933d4d01 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitScanForwardNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitScanForwardNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitScanReverseNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitScanReverseNode.java index e16d3e948e8..827fa44fe32 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitScanReverseNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/BitScanReverseNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/CStringConstant.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/CStringConstant.java index ce9c359d0ef..4497e1a61ab 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/CStringConstant.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/CStringConstant.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/DirectStoreNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/DirectStoreNode.java index 66d1b19f1b7..52e5009b44f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/DirectStoreNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/DirectStoreNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ExplodeLoopNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ExplodeLoopNode.java index 4fc927a6efe..2c58ed4be08 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ExplodeLoopNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ExplodeLoopNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/LoadSnippetVarargParameterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/LoadSnippetVarargParameterNode.java index e2d4619e53f..ad75e0f987d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/LoadSnippetVarargParameterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/LoadSnippetVarargParameterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MacroNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MacroNode.java index 7a56cf8c058..1f5f9dabdd6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MacroNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MacroNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,6 +60,7 @@ import org.graalvm.compiler.phases.tiers.PhaseContext; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.ResolvedJavaMethod; +import jdk.internal.vm.compiler.word.LocationIdentity; /** * Macro nodes can be used to temporarily replace an invoke. They can, for example, be used to @@ -88,12 +89,12 @@ public abstract class MacroNode extends FixedWithNextNode implements Lowerable, protected final int bci; protected final ResolvedJavaMethod targetMethod; - protected final StampPair returnStamp; protected final InvokeKind invokeKind; + protected final StampPair returnStamp; protected MacroNode(NodeClass c, InvokeKind invokeKind, ResolvedJavaMethod targetMethod, int bci, StampPair returnStamp, ValueNode... arguments) { - super(c, returnStamp.getTrustedStamp()); - assert targetMethod.getSignature().getParameterCount(!targetMethod.isStatic()) == arguments.length; + super(c, returnStamp != null ? returnStamp.getTrustedStamp() : null); + assertArgumentCount(targetMethod, arguments); this.arguments = new NodeInputList<>(this, arguments); this.bci = bci; this.targetMethod = targetMethod; @@ -102,6 +103,10 @@ public abstract class MacroNode extends FixedWithNextNode implements Lowerable, assert !isPlaceholderBci(bci); } + protected void assertArgumentCount(ResolvedJavaMethod method, ValueNode... args) { + assert method.getSignature().getParameterCount(!method.isStatic()) == args.length; + } + public ValueNode getArgument(int i) { return arguments.get(i); } @@ -223,9 +228,13 @@ public abstract class MacroNode extends FixedWithNextNode implements Lowerable, } } + public LocationIdentity getLocationIdentity() { + return LocationIdentity.any(); + } + protected InvokeNode createInvoke() { MethodCallTargetNode callTarget = graph().add(new MethodCallTargetNode(invokeKind, targetMethod, arguments.toArray(new ValueNode[arguments.size()]), returnStamp, null)); - InvokeNode invoke = graph().add(new InvokeNode(callTarget, bci)); + InvokeNode invoke = graph().add(new InvokeNode(callTarget, bci, getLocationIdentity())); if (stateAfter() != null) { invoke.setStateAfter(stateAfter().duplicate()); if (getStackKind() != JavaKind.Void) { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MacroStateSplitNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MacroStateSplitNode.java index fd72e2b904b..f996b2c10ec 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MacroStateSplitNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MacroStateSplitNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -87,7 +87,7 @@ public abstract class MacroStateSplitNode extends MacroNode implements StateSpli } assert invoke.stateAfter().bci == BytecodeFrame.AFTER_BCI; // Here we need to fix the bci of the invoke - InvokeNode newInvoke = snippetGraph.add(new InvokeNode(invoke.callTarget(), bci())); + InvokeNode newInvoke = snippetGraph.add(new InvokeNode(invoke.callTarget(), bci(), invoke.getLocationIdentity())); newInvoke.setStateAfter(invoke.stateAfter()); snippetGraph.replaceFixedWithFixed((InvokeNode) invoke.asNode(), newInvoke); } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MethodHandleNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MethodHandleNode.java index 5de18bd729f..1b3122d169b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MethodHandleNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MethodHandleNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ProfileBooleanNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ProfileBooleanNode.java new file mode 100644 index 00000000000..f7bbeff4495 --- /dev/null +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ProfileBooleanNode.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +package org.graalvm.compiler.replacements.nodes; + +import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_UNKNOWN; +import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_UNKNOWN; + +import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; +import org.graalvm.compiler.core.common.type.StampPair; +import org.graalvm.compiler.graph.NodeClass; +import org.graalvm.compiler.graph.spi.Simplifiable; +import org.graalvm.compiler.graph.spi.SimplifierTool; +import org.graalvm.compiler.nodeinfo.NodeInfo; +import org.graalvm.compiler.nodes.CallTargetNode; +import org.graalvm.compiler.nodes.ConstantNode; +import org.graalvm.compiler.nodes.FixedGuardNode; +import org.graalvm.compiler.nodes.LogicConstantNode; +import org.graalvm.compiler.nodes.LogicNode; +import org.graalvm.compiler.nodes.NodeView; +import org.graalvm.compiler.nodes.ValueNode; +import org.graalvm.compiler.nodes.calc.IntegerEqualsNode; + +import jdk.vm.ci.meta.DeoptimizationAction; +import jdk.vm.ci.meta.DeoptimizationReason; +import jdk.vm.ci.meta.JavaConstant; +import jdk.vm.ci.meta.ResolvedJavaMethod; + +@NodeInfo(cycles = CYCLES_UNKNOWN, size = SIZE_UNKNOWN) +public class ProfileBooleanNode extends MacroStateSplitNode implements Simplifiable { + public static final NodeClass TYPE = NodeClass.create(ProfileBooleanNode.class); + private final SnippetReflectionProvider snippetReflection; + + public ProfileBooleanNode(SnippetReflectionProvider snippetReflection, CallTargetNode.InvokeKind invokeKind, ResolvedJavaMethod targetMethod, int bci, StampPair returnStamp, + ValueNode... arguments) { + super(TYPE, invokeKind, targetMethod, bci, returnStamp, arguments); + this.snippetReflection = snippetReflection; + } + + ValueNode getResult() { + return getArgument(0); + } + + ValueNode getCounters() { + return getArgument(1); + } + + @Override + public void simplify(SimplifierTool b) { + ValueNode result = getResult(); + if (result.isConstant()) { + replaceAtUsages(result); + graph().removeFixed(this); + return; + } + ValueNode counters = getCounters(); + if (counters.isConstant()) { + ValueNode newResult = result; + int[] counts = snippetReflection.asObject(int[].class, (JavaConstant) counters.asConstant()); + if (counts != null && counts.length == 2) { + int falseCount = counts[0]; + int trueCount = counts[1]; + int totalCount = trueCount + falseCount; + + if (totalCount == 0) { + graph().addBeforeFixed(this, + graph().addOrUniqueWithInputs( + new FixedGuardNode(LogicConstantNode.contradiction(), DeoptimizationReason.TransferToInterpreter, DeoptimizationAction.InvalidateReprofile, + false))); + } else if (falseCount == 0 || trueCount == 0) { + boolean expected = falseCount == 0; + LogicNode condition = graph().addOrUniqueWithInputs( + IntegerEqualsNode.create(b.getConstantReflection(), b.getMetaAccess(), b.getOptions(), null, result, + ConstantNode.forBoolean(!expected), + NodeView.DEFAULT)); + + graph().addBeforeFixed(this, graph().add(new FixedGuardNode(condition, DeoptimizationReason.UnreachedCode, DeoptimizationAction.InvalidateReprofile, true))); + newResult = graph().unique(ConstantNode.forBoolean(expected)); + } else { + // We cannot use BranchProbabilityNode here since there's no guarantee + // the result of MethodHandleImpl.profileBoolean() is used as the + // test in an `if` statement (as required by BranchProbabilityNode). + } + } + replaceAtUsages(newResult); + graph().removeFixed(this); + } + } +} diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/PureFunctionMacroNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/PureFunctionMacroNode.java index 3d592bb4df5..8f96760bf5b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/PureFunctionMacroNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/PureFunctionMacroNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ReadRegisterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ReadRegisterNode.java index 9bdc78cedec..dc34a0f3783 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ReadRegisterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ReadRegisterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ResolvedMethodHandleCallTargetNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ResolvedMethodHandleCallTargetNode.java index 97c59dc9876..79857691be2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ResolvedMethodHandleCallTargetNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ResolvedMethodHandleCallTargetNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ReverseBytesNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ReverseBytesNode.java index ce3030b0f89..8856983f288 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ReverseBytesNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ReverseBytesNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/UnaryMathIntrinsicNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/UnaryMathIntrinsicNode.java index 571330abec1..223222c158b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/UnaryMathIntrinsicNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/UnaryMathIntrinsicNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/VirtualizableInvokeMacroNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/VirtualizableInvokeMacroNode.java index f591c0b6dd4..f2acc44f321 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/VirtualizableInvokeMacroNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/VirtualizableInvokeMacroNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/WriteRegisterNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/WriteRegisterNode.java index b06c7ae66c1..18a842911cb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/WriteRegisterNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/WriteRegisterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerAddExactNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerAddExactNode.java index 5b56c24fbac..7dc3ff315bc 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerAddExactNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerAddExactNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerAddExactSplitNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerAddExactSplitNode.java index f3646d1d4f8..02ec672640d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerAddExactSplitNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerAddExactSplitNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerExactArithmeticNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerExactArithmeticNode.java index 7e08feaa9ae..73624b86ca4 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerExactArithmeticNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerExactArithmeticNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulExactNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulExactNode.java index 5f86e13e088..fc7d6a6ab3f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulExactNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulExactNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulExactSplitNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulExactSplitNode.java index 01acf153546..b5b28105be5 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulExactSplitNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulExactSplitNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulHighNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulHighNode.java index 2c985b4a989..b34c4f01320 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulHighNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerMulHighNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerSubExactNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerSubExactNode.java index ab9cb4298eb..31e3a2af770 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerSubExactNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerSubExactNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerSubExactSplitNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerSubExactSplitNode.java index 5d3bd4da8c0..5be5dd0c0e6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerSubExactSplitNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/IntegerSubExactSplitNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/UnsignedMulHighNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/UnsignedMulHighNode.java index 5a963ae4b59..cdcef7f3945 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/UnsignedMulHighNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/arithmetic/UnsignedMulHighNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.runtime/src/org/graalvm/compiler/runtime/RuntimeProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.runtime/src/org/graalvm/compiler/runtime/RuntimeProvider.java index 27b0b347bea..f5f0f8539f2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.runtime/src/org/graalvm/compiler/runtime/RuntimeProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.runtime/src/org/graalvm/compiler/runtime/RuntimeProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/GraalServices.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/GraalServices.java index 51d66e2150d..d9eedbe380b 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/GraalServices.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/GraalServices.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/JMXService.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/JMXService.java index b7772c5275d..a4b5d2c26f1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/JMXService.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/JMXService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/ServiceProvider.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/ServiceProvider.java index ec8bade1eea..c32e2effb71 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/ServiceProvider.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.serviceprovider/src/org/graalvm/compiler/serviceprovider/ServiceProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/AddExports.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/AddExports.java index 7673f7f533a..b886c2efc73 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/AddExports.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/AddExports.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/ExportingClassLoader.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/ExportingClassLoader.java index 5f3bbfd2267..c9330031f4a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/ExportingClassLoader.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/ExportingClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/GraalTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/GraalTest.java index 70c2f29449a..ce4157f3f07 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/GraalTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/GraalTest.java @@ -240,8 +240,10 @@ public class GraalTest { assertDeepEquals(message, expected, actual, equalFloatsOrDoublesDelta()); } - /** @see JDK-8076557 */ - protected static void assumeManagementLibraryIsLoadable() { + /** + * @see "https://bugs.openjdk.java.net/browse/JDK-8076557" + */ + public static void assumeManagementLibraryIsLoadable() { try { /* Trigger loading of the management library using the bootstrap class loader. */ GraalServices.getCurrentThreadAllocatedBytes(); diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/JLModule.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/JLModule.java index 1b83ff2e983..64d28c8eaae 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/JLModule.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/JLModule.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/SubprocessUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/SubprocessUtil.java index 50578c963e7..9d0a4d18696 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/SubprocessUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.test/src/org/graalvm/compiler/test/SubprocessUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,6 +39,7 @@ import java.util.regex.Pattern; import org.graalvm.compiler.serviceprovider.GraalServices; import org.graalvm.util.CollectionsUtil; +import org.junit.Assume; /** * Utility methods for spawning a VM in a subprocess during unit tests. @@ -61,6 +62,8 @@ public final class SubprocessUtil { return Files.readAllLines(new File(processArgsFile).toPath()); } catch (IOException e) { } + } else { + Assume.assumeTrue("Process command line unavailable", false); } return null; } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual.bench/src/org/graalvm/compiler/virtual/bench/PartialEscapeBench.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual.bench/src/org/graalvm/compiler/virtual/bench/PartialEscapeBench.java index 2a05b12c887..f4cc7054c1f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual.bench/src/org/graalvm/compiler/virtual/bench/PartialEscapeBench.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual.bench/src/org/graalvm/compiler/virtual/bench/PartialEscapeBench.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/nodes/MaterializedObjectState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/nodes/MaterializedObjectState.java index 9422899eda1..219e9adaefb 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/nodes/MaterializedObjectState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/nodes/MaterializedObjectState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/nodes/VirtualObjectState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/nodes/VirtualObjectState.java index 44e36c18a74..4f159e0af69 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/nodes/VirtualObjectState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/nodes/VirtualObjectState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EarlyReadEliminationPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EarlyReadEliminationPhase.java index 1eee1b64e5c..ec01237aaa6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EarlyReadEliminationPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EarlyReadEliminationPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectList.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectList.java index ecaffd08cae..6e785e3e57c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectList.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsBlockState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsBlockState.java index 37e1c472be9..7fd516bccc1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsBlockState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsBlockState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsClosure.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsClosure.java index 4164677d201..49bbf8631e3 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsClosure.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsClosure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsPhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsPhase.java index 13e11a62003..79696afcd81 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsPhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/EffectsPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/GraphEffectList.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/GraphEffectList.java index 7c15a5259c2..6d4f2f8af48 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/GraphEffectList.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/GraphEffectList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ObjectState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ObjectState.java index 38fe33a7eee..59609aa5a81 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ObjectState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ObjectState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PEReadEliminationBlockState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PEReadEliminationBlockState.java index 951fc1b5144..65c052c98a1 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PEReadEliminationBlockState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PEReadEliminationBlockState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PEReadEliminationClosure.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PEReadEliminationClosure.java index cb8bcc2f95f..d6da7da4b9d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PEReadEliminationClosure.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PEReadEliminationClosure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapeBlockState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapeBlockState.java index de9368c1468..5bbb90e8c30 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapeBlockState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapeBlockState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapeClosure.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapeClosure.java index cc78ce6a6da..aff2d19936e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapeClosure.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapeClosure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapePhase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapePhase.java index 3ba41504b68..5d0d31a97e6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapePhase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PartialEscapePhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ReadEliminationBlockState.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ReadEliminationBlockState.java index 4becf8a4b2e..33c9846ad31 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ReadEliminationBlockState.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ReadEliminationBlockState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ReadEliminationClosure.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ReadEliminationClosure.java index 517a6b00dbe..2ee7759055a 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ReadEliminationClosure.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/ReadEliminationClosure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/VirtualUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/VirtualUtil.java index 2d2156a160f..60fb407b19e 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/VirtualUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/VirtualUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/VirtualizerToolImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/VirtualizerToolImpl.java index c92b46f43a8..f313a935348 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/VirtualizerToolImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/VirtualizerToolImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/BarrieredAccess.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/BarrieredAccess.java index 029bd0319cd..7f34ada9f53 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/BarrieredAccess.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/BarrieredAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/ObjectAccess.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/ObjectAccess.java index 8bb1c0ad222..fb51490c126 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/ObjectAccess.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/ObjectAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/UnsafeAccess.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/UnsafeAccess.java index a45ca45ec5a..7324d19c49c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/UnsafeAccess.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/UnsafeAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/Word.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/Word.java index 3b3392c10ab..8dcd192dbcd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/Word.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/Word.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordCastNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordCastNode.java index 6b33aab07c8..3902b1e19dd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordCastNode.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordCastNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordOperationPlugin.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordOperationPlugin.java index ce9a69b574d..c3083a4c947 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordOperationPlugin.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordOperationPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordTypes.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordTypes.java index d8e6ff93a01..e86d6adcbc7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordTypes.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.word/src/org/graalvm/compiler/word/WordTypes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/DefaultGraphBlocks.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/DefaultGraphBlocks.java index 80740740b19..7b3a16cb3d7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/DefaultGraphBlocks.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/DefaultGraphBlocks.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/DefaultGraphTypes.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/DefaultGraphTypes.java index b1cdf54ea73..62e664774c6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/DefaultGraphTypes.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/DefaultGraphTypes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphBlocks.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphBlocks.java index 40175ce7af1..51e17255a2d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphBlocks.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphBlocks.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphElements.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphElements.java index 7b49958104c..460cd765292 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphElements.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphElements.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphJavadocSnippets.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphJavadocSnippets.java index 4fb6039ff32..3030ea8f7db 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphJavadocSnippets.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphJavadocSnippets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphLocations.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphLocations.java index 0af428d93fa..c90a24e7a80 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphLocations.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphLocations.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphOutput.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphOutput.java index 13945a1e520..69e0f3cefc8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphOutput.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphOutput.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphProtocol.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphProtocol.java index e1cdec73b06..41625633b7f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphProtocol.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphProtocol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphStructure.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphStructure.java index bd90515d96a..dafe4ee3639 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphStructure.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphStructure.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphTypes.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphTypes.java index a107ad87ddf..2dcece16861 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphTypes.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/GraphTypes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/ProtocolImpl.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/ProtocolImpl.java index b9a7d12aa4b..237aae026b6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/ProtocolImpl.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/ProtocolImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/package-info.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/package-info.java index 805dee0e8fe..216b840414d 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/package-info.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.graphio/src/org/graalvm/graphio/package-info.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ArrayDuplicationBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ArrayDuplicationBenchmark.java index 4e0871b0c3c..15b47ca89e8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ArrayDuplicationBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ArrayDuplicationBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,13 +42,17 @@ public class ArrayDuplicationBenchmark extends BenchmarkBase { private Object[][] testObjectArray; + private Object[][] testStringArray; + private Object[] dummy; @Setup public void setup() { testObjectArray = new Object[TESTSIZE][]; + testStringArray = new Object[TESTSIZE][]; for (int i = 0; i < TESTSIZE; i++) { testObjectArray[i] = new Object[20]; + testStringArray[i] = new String[200]; } } @@ -92,6 +96,20 @@ public class ArrayDuplicationBenchmark extends BenchmarkBase { return Arrays.copyOf(cache, cache.length); } + @Benchmark + @OperationsPerInvocation(TESTSIZE) + public Object[] arraysCopyOfToString() { + int j = 0; + for (int i = 0; i < TESTSIZE; i++) { + dummy[j++] = arraysCopyOfToString(testStringArray[i]); + } + return dummy; + } + + public Object[] arraysCopyOfToString(Object[] cache) { + return Arrays.copyOf(cache, cache.length, String[].class); + } + @Benchmark @OperationsPerInvocation(TESTSIZE) public Object[] cloneObjectArray() { diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ArrayListBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ArrayListBenchmark.java index 23b86905493..6a479b20077 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ArrayListBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ArrayListBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/BenchmarkBase.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/BenchmarkBase.java index f15ea05c59f..1a89594fdbd 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/BenchmarkBase.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/BenchmarkBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/BoxingBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/BoxingBenchmark.java index 1cf05fedc09..5fdba963007 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/BoxingBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/BoxingBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ConcurrentSkipListBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ConcurrentSkipListBenchmark.java index 014673b95e0..f7b38dd7fe6 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ConcurrentSkipListBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/ConcurrentSkipListBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/GuardedIntrinsicBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/GuardedIntrinsicBenchmark.java index 6f0278db250..1ba5a7f98ea 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/GuardedIntrinsicBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/GuardedIntrinsicBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/HashBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/HashBenchmark.java index a30daf37a1f..4ef1617fee9 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/HashBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/HashBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/MathFunctionBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/MathFunctionBenchmark.java index c88d9724eaa..fec13af0eff 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/MathFunctionBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/MathFunctionBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,7 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; /** * Benchmarks cost of Math intrinsics. @@ -40,6 +41,7 @@ public class MathFunctionBenchmark extends BenchmarkBase { public static class ThreadState { double[] data = randomDoubles(100); double[] result = new double[100]; + double k = data[0]; static double[] randomDoubles(int len) { double[] data = new double[len]; @@ -100,4 +102,16 @@ public class MathFunctionBenchmark extends BenchmarkBase { result[i] = Math.tan(data[i]); } } + + @Benchmark + @Warmup(iterations = 1) + public void mathSqrt(ThreadState state, Blackhole blackhole) { + blackhole.consume(Math.sqrt(state.k)); + } + + @Benchmark + @Warmup(iterations = 1) + public void strictMathSqrt(ThreadState state, Blackhole blackhole) { + blackhole.consume(StrictMath.sqrt(state.k)); + } } diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/SimpleSyncBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/SimpleSyncBenchmark.java index 48dd76b1127..64838497a16 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/SimpleSyncBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/SimpleSyncBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/StringBenchmark.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/StringBenchmark.java index 1d3256a4194..70d74e42a9f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/StringBenchmark.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/StringBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/TestJMHBlackbox.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/TestJMHBlackbox.java index dd3cdaacd6c..71ca7363903 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/TestJMHBlackbox.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/TestJMHBlackbox.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/package-info.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/package-info.java index da226f5a5ce..188dc48380c 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/package-info.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.micro.benchmarks/src/micro/benchmarks/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,4 +26,4 @@ */ -package micro.benchmarks; \ No newline at end of file +package micro.benchmarks; diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util.test/src/org/graalvm/util/test/CollectionSizeTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util.test/src/org/graalvm/util/test/CollectionSizeTest.java index cd5bb3883c3..37efaaac46f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util.test/src/org/graalvm/util/test/CollectionSizeTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util.test/src/org/graalvm/util/test/CollectionSizeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util.test/src/org/graalvm/util/test/CollectionUtilTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util.test/src/org/graalvm/util/test/CollectionUtilTest.java index eaa6fc53d27..7accd8f0cd7 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util.test/src/org/graalvm/util/test/CollectionUtilTest.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util.test/src/org/graalvm/util/test/CollectionUtilTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util/src/org/graalvm/util/CollectionsUtil.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util/src/org/graalvm/util/CollectionsUtil.java index b74b0e2a1e9..f080dae693f 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util/src/org/graalvm/util/CollectionsUtil.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util/src/org/graalvm/util/CollectionsUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util/src/org/graalvm/util/ObjectSizeEstimate.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util/src/org/graalvm/util/ObjectSizeEstimate.java index 9f10ee961b2..22b0971bec8 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util/src/org/graalvm/util/ObjectSizeEstimate.java +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.util/src/org/graalvm/util/ObjectSizeEstimate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/jdk.jartool/share/classes/sun/tools/jar/Main.java b/src/jdk.jartool/share/classes/sun/tools/jar/Main.java index 47be39de434..4b9d565a4d2 100644 --- a/src/jdk.jartool/share/classes/sun/tools/jar/Main.java +++ b/src/jdk.jartool/share/classes/sun/tools/jar/Main.java @@ -1180,7 +1180,7 @@ public class Main { String name = entry.name; boolean isDir = entry.isDir; - if (name.equals("") || name.equals(".") || name.equals(zname)) { + if (name.isEmpty() || name.equals(".") || name.equals(zname)) { return; } else if ((name.equals(MANIFEST_DIR) || name.equals(MANIFEST_NAME)) && !Mflag) { @@ -1886,7 +1886,7 @@ public class Main { .map(ModuleInfoEntry::name) .map(Main::versionFromEntryName) .collect(joining(" ")); - if (!releases.equals("")) + if (!releases.isEmpty()) output("releases: " + releases + "\n"); // Describe the operative descriptor for the specified --release, if any @@ -1955,7 +1955,7 @@ public class Main { sb.append(md.toNameAndVersion()); - if (!uriString.equals("")) + if (!uriString.isEmpty()) sb.append(" ").append(uriString); if (md.isOpen()) sb.append(" open"); diff --git a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ClassDocImpl.java b/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ClassDocImpl.java index f81bf4dd89f..6a9cc6ea1e9 100644 --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ClassDocImpl.java +++ b/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ClassDocImpl.java @@ -420,7 +420,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { } else { String n = ""; for ( ; c != null; c = c.owner.enclClass()) { - n = c.name + (n.equals("") ? "" : ".") + n; + n = c.name + (n.isEmpty() ? "" : ".") + n; } return n; } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java index a8614f9eee6..0a706bc7069 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java @@ -71,6 +71,16 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants; */ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWriter { + private static final Set suppressSubtypesSet + = Set.of("java.lang.Object", + "org.omg.CORBA.Object"); + + private static final Set suppressImplementingSet + = Set.of( "java.lang.Cloneable", + "java.lang.constant.Constable", + "java.lang.constant.ConstantDesc", + "java.io.Serializable"); + protected final TypeElement typeElement; protected final ClassTree classtree; @@ -370,9 +380,10 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite @Override public void addSubClassInfo(Content classInfoTree) { if (utils.isClass(typeElement)) { - if (typeElement.getQualifiedName().contentEquals("java.lang.Object") || - typeElement.getQualifiedName().contentEquals("org.omg.CORBA.Object")) { - return; // Don't generate the list, too huge + for (String s : suppressSubtypesSet) { + if (typeElement.getQualifiedName().contentEquals(s)) { + return; // Don't generate the list, too huge + } } Set subclasses = classtree.directSubClasses(typeElement, false); if (!subclasses.isEmpty()) { @@ -412,9 +423,10 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite if (!utils.isInterface(typeElement)) { return; } - if (typeElement.getQualifiedName().contentEquals("java.lang.Cloneable") || - typeElement.getQualifiedName().contentEquals("java.io.Serializable")) { - return; // Don't generate the list, too big + for (String s : suppressImplementingSet) { + if (typeElement.getQualifiedName().contentEquals(s)) { + return; // Don't generate the list, too huge + } } Set implcl = classtree.implementingClasses(typeElement); if (!implcl.isEmpty()) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchIndexItem.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchIndexItem.java index cafbc015b24..c7440677dc6 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchIndexItem.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchIndexItem.java @@ -114,18 +114,18 @@ public class SearchIndexItem { item.append("\"m\":\"").append(containingModule).append("\","); } item.append("\"l\":\"").append(label).append("\""); - if (!url.equals("")) { + if (!url.isEmpty()) { item.append(",\"url\":\"").append(url).append("\""); } item.append("}"); break; case TYPES: item.append("{"); - if (!containingPackage.equals("")) { + if (!containingPackage.isEmpty()) { item.append("\"p\":\"").append(containingPackage).append("\","); } item.append("\"l\":\"").append(label).append("\""); - if (!url.equals("")) { + if (!url.isEmpty()) { item.append(",\"url\":\"").append(url).append("\""); } item.append("}"); @@ -135,7 +135,7 @@ public class SearchIndexItem { .append("\"p\":\"").append(containingPackage).append("\",") .append("\"c\":\"").append(containingClass).append("\",") .append("\"l\":\"").append(label).append("\""); - if (!url.equals("")) { + if (!url.isEmpty()) { item.append(",\"url\":\"").append(url).append("\""); } item.append("}"); @@ -144,7 +144,7 @@ public class SearchIndexItem { item.append("{") .append("\"l\":\"").append(label).append("\",") .append("\"h\":\"").append(holder).append("\","); - if (!description.equals("")) { + if (!description.isEmpty()) { item.append("\"d\":\"").append(description).append("\","); } item.append("\"u\":\"").append(url).append("\"") diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/script.js b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/script.js index ba4374772da..57133ad5ebf 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/script.js +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/script.js @@ -36,45 +36,55 @@ function loadScripts(doc, tag) { createElem(doc, tag, 'jquery/jszip-utils/dist/jszip-utils-ie.js'); } createElem(doc, tag, 'search.js'); - + $.get(pathtoroot + "module-search-index.zip") .done(function() { JSZipUtils.getBinaryContent(pathtoroot + "module-search-index.zip", function(e, data) { - var zip = new JSZip(data); - zip.load(data); - moduleSearchIndex = JSON.parse(zip.file("module-search-index.json").asText()); + JSZip.loadAsync(data).then(function(zip){ + zip.file("module-search-index.json").async("text").then(function(content){ + moduleSearchIndex = JSON.parse(content); + }); + }); }); }); $.get(pathtoroot + "package-search-index.zip") .done(function() { JSZipUtils.getBinaryContent(pathtoroot + "package-search-index.zip", function(e, data) { - var zip = new JSZip(data); - zip.load(data); - packageSearchIndex = JSON.parse(zip.file("package-search-index.json").asText()); + JSZip.loadAsync(data).then(function(zip){ + zip.file("package-search-index.json").async("text").then(function(content){ + packageSearchIndex = JSON.parse(content); + }); + }); }); }); $.get(pathtoroot + "type-search-index.zip") .done(function() { JSZipUtils.getBinaryContent(pathtoroot + "type-search-index.zip", function(e, data) { - var zip = new JSZip(data); - zip.load(data); - typeSearchIndex = JSON.parse(zip.file("type-search-index.json").asText()); + JSZip.loadAsync(data).then(function(zip){ + zip.file("type-search-index.json").async("text").then(function(content){ + typeSearchIndex = JSON.parse(content); + }); + }); }); }); $.get(pathtoroot + "member-search-index.zip") .done(function() { JSZipUtils.getBinaryContent(pathtoroot + "member-search-index.zip", function(e, data) { - var zip = new JSZip(data); - zip.load(data); - memberSearchIndex = JSON.parse(zip.file("member-search-index.json").asText()); + JSZip.loadAsync(data).then(function(zip){ + zip.file("member-search-index.json").async("text").then(function(content){ + memberSearchIndex = JSON.parse(content); + }); + }); }); }); $.get(pathtoroot + "tag-search-index.zip") .done(function() { JSZipUtils.getBinaryContent(pathtoroot + "tag-search-index.zip", function(e, data) { - var zip = new JSZip(data); - zip.load(data); - tagSearchIndex = JSON.parse(zip.file("tag-search-index.json").asText()); + JSZip.loadAsync(data).then(function(zip){ + zip.file("tag-search-index.json").async("text").then(function(content){ + tagSearchIndex = JSON.parse(content); + }); + }); }); }); if (!moduleSearchIndex) { diff --git a/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java b/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java index f2db61ab777..393834c2414 100644 --- a/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java +++ b/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java @@ -149,7 +149,7 @@ public class JMap { throws AttachNotSupportedException, IOException, UnsupportedEncodingException { String liveopt = "-all"; - if (options.equals("") || options.equals("all")) { + if (options.isEmpty() || options.equals("all")) { // pass } else if (options.equals("live")) { diff --git a/src/jdk.jconsole/share/classes/sun/tools/jconsole/ConnectDialog.java b/src/jdk.jconsole/share/classes/sun/tools/jconsole/ConnectDialog.java index 70125a07b2d..b81cd05a23c 100644 --- a/src/jdk.jconsole/share/classes/sun/tools/jconsole/ConnectDialog.java +++ b/src/jdk.jconsole/share/classes/sun/tools/jconsole/ConnectDialog.java @@ -313,9 +313,9 @@ public class ConnectDialog extends InternalDialog if (remoteRadioButton.isSelected()) { String txt = remoteTF.getText().trim(); String userName = userNameTF.getText().trim(); - userName = userName.equals("") ? null : userName; + userName = userName.isEmpty() ? null : userName; String password = passwordTF.getText(); - password = password.equals("") ? null : password; + password = password.isEmpty() ? null : password; try { if (txt.startsWith(JConsole.ROOT_URL)) { String url = txt; diff --git a/src/jdk.jconsole/share/classes/sun/tools/jconsole/ThreadTab.java b/src/jdk.jconsole/share/classes/sun/tools/jconsole/ThreadTab.java index 7f8236d9b2a..116d21b9aef 100644 --- a/src/jdk.jconsole/share/classes/sun/tools/jconsole/ThreadTab.java +++ b/src/jdk.jconsole/share/classes/sun/tools/jconsole/ThreadTab.java @@ -665,7 +665,7 @@ class ThreadTab extends Tab implements ActionListener, DocumentListener, ListSel } public void focusLost(FocusEvent e) { - if (promptRemoved && getText().equals("")) { + if (promptRemoved && getText().isEmpty()) { setText(prompt); setForeground(Color.gray); promptRemoved = false; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/ValueDescriptor.java b/src/jdk.jfr/share/classes/jdk/jfr/ValueDescriptor.java index ca4b24839c4..d5ecca9464c 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/ValueDescriptor.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/ValueDescriptor.java @@ -291,7 +291,7 @@ public final class ValueDescriptor { if (type.isSimpleType()) { return Collections.emptyList(); } - return Collections.unmodifiableList(type.getFields()); + return type.getFields(); } // package private diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/ChunkParser.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/ChunkParser.java index 96319e2f4b4..ee6e00d6ecd 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/ChunkParser.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/ChunkParser.java @@ -53,7 +53,7 @@ final class ChunkParser { private final TimeConverter timeConverter; public ChunkParser(RecordingInput input) throws IOException { - this(new ChunkHeader(input)); + this(new ChunkHeader(input)); } private ChunkParser(ChunkHeader header) throws IOException { @@ -61,7 +61,7 @@ final class ChunkParser { this.chunkHeader = header; this.metadata = header.readMetadata(); this.absoluteChunkEnd = header.getEnd(); - this.timeConverter = new TimeConverter(chunkHeader); + this.timeConverter = new TimeConverter(chunkHeader, metadata.getGMTOffset()); ParserFactory factory = new ParserFactory(metadata, timeConverter); LongMap constantPools = factory.getConstantPools(); @@ -114,9 +114,7 @@ final class ChunkParser { boolean flush = input.readBoolean(); int poolCount = input.readInt(); Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE, () -> { - return "New constant pool: startPosition=" + position + - ", size=" + size + ", deltaToNext=" + delta + - ", flush=" + flush + ", poolCount=" + poolCount; + return "New constant pool: startPosition=" + position + ", size=" + size + ", deltaToNext=" + delta + ", flush=" + flush + ", poolCount=" + poolCount; }); for (int i = 0; i < poolCount; i++) { @@ -155,7 +153,7 @@ final class ChunkParser { private String getName(long id) { Type type = typeMap.get(id); - return type == null ? ("unknown(" + id +")") : type.getName(); + return type == null ? ("unknown(" + id + ")") : type.getName(); } public Collection getTypes() { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedEvent.java index bbcda7afc93..19691302b8c 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedEvent.java @@ -41,7 +41,8 @@ import jdk.jfr.internal.EventInstrumentation; public final class RecordedEvent extends RecordedObject { private final EventType eventType; private final long startTime; - private final long endTime; + // package private needed for efficient sorting + final long endTime; // package private RecordedEvent(EventType type, List vds, Object[] values, long startTime, long endTime, TimeConverter timeConverter) { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java index 90d19d2fd96..2d9ed1be696 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java @@ -25,11 +25,11 @@ package jdk.jfr.consumer; -import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.time.Duration; import java.time.Instant; +import java.time.OffsetDateTime; import java.util.List; import java.util.Objects; @@ -37,7 +37,7 @@ import jdk.jfr.Timespan; import jdk.jfr.Timestamp; import jdk.jfr.ValueDescriptor; import jdk.jfr.internal.PrivateAccess; -import jdk.jfr.internal.cmd.PrettyWriter; +import jdk.jfr.internal.tool.PrettyWriter; /** * A complex data type that consists of one or more fields. @@ -872,20 +872,21 @@ public class RecordedObject { final public String toString() { StringWriter s = new StringWriter(); PrettyWriter p = new PrettyWriter(new PrintWriter(s)); - try { - if (this instanceof RecordedEvent) { - p.print((RecordedEvent) this); - } else { - p.print(this, ""); - } - - } catch (IOException e) { - // Ignore, should not happen with StringWriter + p.setStackDepth(5); + if (this instanceof RecordedEvent) { + p.print((RecordedEvent) this); + } else { + p.print(this, ""); } - p.flush(); + p.flush(true); return s.toString(); } + // package private for now. Used by EventWriter + OffsetDateTime getOffsetDateTime(String name) { + return OffsetDateTime.ofInstant(getInstant(name), timeConverter.getZoneOffset()); + } + private static IllegalArgumentException newIllegalArgumentException(String name, String typeName) { return new IllegalArgumentException("Attempt to get field \"" + name + "\" with illegal data type conversion " + typeName); } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordingFile.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordingFile.java index dde93ed81d8..901f2534a13 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordingFile.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordingFile.java @@ -32,13 +32,16 @@ import java.io.IOException; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import jdk.jfr.EventType; import jdk.jfr.internal.MetadataDescriptor; +import jdk.jfr.internal.Type; import jdk.jfr.internal.consumer.ChunkHeader; import jdk.jfr.internal.consumer.RecordingInput; +import jdk.jfr.internal.consumer.RecordingInternals; /** * A recording file. @@ -59,7 +62,29 @@ import jdk.jfr.internal.consumer.RecordingInput; * @since 9 */ public final class RecordingFile implements Closeable { + static{ + RecordingInternals.INSTANCE = new RecordingInternals() { + public List readTypes(RecordingFile file) throws IOException { + return file.readTypes(); + } + public boolean isLastEventInChunk(RecordingFile file) { + return file.isLastEventInChunk; + } + + @Override + public Object getOffsetDataTime(RecordedObject event, String name) { + return event.getOffsetDateTime(name); + } + + @Override + public void sort(List events) { + Collections.sort(events, (e1, e2) -> Long.compare(e1.endTime, e2.endTime)); + } + }; + } + + private boolean isLastEventInChunk; private final File file; private RecordingInput input; private ChunkParser chunkParser; @@ -98,9 +123,11 @@ public final class RecordingFile implements Closeable { ensureOpen(); throw new EOFException(); } + isLastEventInChunk = false; RecordedEvent event = nextEvent; nextEvent = chunkParser.readEvent(); if (nextEvent == null) { + isLastEventInChunk = true; findNext(); } return event; @@ -129,6 +156,21 @@ public final class RecordingFile implements Closeable { ensureOpen(); List types = new ArrayList<>(); HashSet foundIds = new HashSet<>(); + try (RecordingInput ri = new RecordingInput(file)) { + ChunkHeader ch = new ChunkHeader(ri); + aggregateEventTypeForChunk(ch, types, foundIds); + while (!ch.isLastChunk()) { + ch = ch.nextHeader(); + aggregateEventTypeForChunk(ch, types, foundIds); + } + } + return types; + } + + List readTypes() throws IOException { + ensureOpen(); + List types = new ArrayList<>(); + HashSet foundIds = new HashSet<>(); try (RecordingInput ri = new RecordingInput(file)) { ChunkHeader ch = new ChunkHeader(ri); aggregateTypeForChunk(ch, types, foundIds); @@ -140,7 +182,17 @@ public final class RecordingFile implements Closeable { return types; } - private static void aggregateTypeForChunk(ChunkHeader ch, List types, HashSet foundIds) throws IOException { + private void aggregateTypeForChunk(ChunkHeader ch, List types, HashSet foundIds) throws IOException { + MetadataDescriptor m = ch.readMetadata(); + for (Type t : m.getTypes()) { + if (!foundIds.contains(t.getId())) { + types.add(t); + foundIds.add(t.getId()); + } + } + } + + private static void aggregateEventTypeForChunk(ChunkHeader ch, List types, HashSet foundIds) throws IOException { MetadataDescriptor m = ch.readMetadata(); for (EventType t : m.getEventTypes()) { if (!foundIds.contains(t.getId())) { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/TimeConverter.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/TimeConverter.java index b3b625eb1b4..0397f8a6858 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/TimeConverter.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/TimeConverter.java @@ -25,6 +25,12 @@ package jdk.jfr.consumer; +import java.time.DateTimeException; +import java.time.ZoneOffset; + +import jdk.jfr.internal.LogLevel; +import jdk.jfr.internal.LogTag; +import jdk.jfr.internal.Logger; import jdk.jfr.internal.consumer.ChunkHeader; /** @@ -34,11 +40,22 @@ final class TimeConverter { private final long startTicks; private final long startNanos; private final double divisor; + private final ZoneOffset zoneOffet; - TimeConverter(ChunkHeader chunkHeader) { + TimeConverter(ChunkHeader chunkHeader, int rawOffset) { this.startTicks = chunkHeader.getStartTicks(); this.startNanos = chunkHeader.getStartNanos(); this.divisor = chunkHeader.getTicksPerSecond() / 1000_000_000L; + this.zoneOffet = zoneOfSet(rawOffset); + } + + private ZoneOffset zoneOfSet(int rawOffset) { + try { + return ZoneOffset.ofTotalSeconds(rawOffset / 1000); + } catch (DateTimeException dte) { + Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Could not create ZoneOffset from raw offset " + rawOffset); + } + return ZoneOffset.UTC; } public long convertTimestamp(long ticks) { @@ -48,4 +65,8 @@ final class TimeConverter { public long convertTimespan(long ticks) { return (long) (ticks / divisor); } + + public ZoneOffset getZoneOffset() { + return zoneOffet; + } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java index 0d41ce40226..75bfb9b6681 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java @@ -49,7 +49,7 @@ public final class OldObjectSample { private static final String OLD_OBJECT_CUTOFF = EVENT_NAME + "#" + Cutoff.NAME; private static final String OLD_OBJECT_ENABLED = EVENT_NAME + "#" + Enabled.NAME; - // Emit if old object is enabled in recoding with cutoff for that recording + // Emit if old object is enabled in recording with cutoff for that recording public static void emit(PlatformRecording recording) { if (isEnabled(recording)) { long nanos = CutoffSetting.parseValueSafe(recording.getSettings().get(OLD_OBJECT_CUTOFF)); @@ -59,7 +59,7 @@ public final class OldObjectSample { } // Emit if old object is enabled for at least one recording, and use the largest - // cutoff for an enabled recoding + // cutoff for an enabled recording public static void emit(List recordings, Boolean pathToGcRoots) { boolean enabled = false; long cutoffNanos = Boolean.TRUE.equals(pathToGcRoots) ? Long.MAX_VALUE : 0L; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/RequestEngine.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/RequestEngine.java index 4dd5b4c584e..3455f1f99cd 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/RequestEngine.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/RequestEngine.java @@ -34,6 +34,8 @@ import java.util.List; import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Predicate; +import jdk.jfr.Event; +import jdk.jfr.EventType; public final class RequestEngine { @@ -60,7 +62,11 @@ public final class RequestEngine { private void execute() { try { if (accessControllerContext == null) { // native - jvm.emitEvent(type.getId(), JVM.counterTime(), 0); + if (type.isJDK()) { + hook.run(); + } else { + jvm.emitEvent(type.getId(), JVM.counterTime(), 0); + } Logger.log(LogTag.JFR_SYSTEM_EVENT, LogLevel.DEBUG, ()-> "Executed periodic hook for " + type.getLogName()); } else { executeSecure(); @@ -91,11 +97,12 @@ public final class RequestEngine { private final static List entries = new CopyOnWriteArrayList<>(); private static long lastTimeMillis; - // Insertion takes O(2*n), could be O(1) with HashMap, but - // thinking is that CopyOnWriteArrayList is faster - // to iterate over, which will happen more over time. public static void addHook(AccessControlContext acc, PlatformEventType type, Runnable hook) { Objects.requireNonNull(acc); + addHookInternal(acc, type, hook); + } + + private static void addHookInternal(AccessControlContext acc, PlatformEventType type, Runnable hook) { RequestHook he = new RequestHook(acc, type, hook); for (RequestHook e : entries) { if (e.hook == hook) { @@ -103,10 +110,24 @@ public final class RequestEngine { } } he.type.setEventHook(true); + // Insertion takes O(2*n), could be O(1) with HashMap, but + // thinking is that CopyOnWriteArrayList is faster + // to iterate over, which will happen more over time. entries.add(he); logHook("Added", type); } + public static void addTrustedJDKHook(Class eventClass, Runnable runnable) { + if (eventClass.getClassLoader() != null) { + throw new SecurityException("Hook can only be registered for event classes that are loaded by the bootstrap class loader"); + } + if (runnable.getClass().getClassLoader() != null) { + throw new SecurityException("Runnable hook class must be loaded by the bootstrap class loader"); + } + EventType eType = MetadataRepository.getInstance().getEventType(eventClass); + PlatformEventType pType = PrivateAccess.getInstance().getPlatformEventType(eType); + addHookInternal(null, pType, runnable); + } private static void logHook(String action, PlatformEventType type) { if (type.isJDK() || type.isJVM()) { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/Type.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/Type.java index 967e7e28274..fafd4e7ce09 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/Type.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/Type.java @@ -27,6 +27,7 @@ package jdk.jfr.internal; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -71,7 +72,7 @@ public class Type implements Comparable { private final String name; private final String superType; private final boolean constantPool; - private final ArrayList fields = new ArrayList<>(); + private List fields = new ArrayList<>(); private Boolean simpleType; // calculated lazy private boolean remove = true; private long id; @@ -183,6 +184,10 @@ public class Type implements Comparable { } public List getFields() { + if (fields instanceof ArrayList) { + ((ArrayList) fields).trimToSize(); + fields = Collections.unmodifiableList(fields); + } return fields; } @@ -216,7 +221,7 @@ public class Type implements Comparable { } void trimFields() { - fields.trimToSize(); + getFields(); } void setAnnotations(List annotations) { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/Utils.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/Utils.java index 9bc8e8d2333..ff148497d42 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/Utils.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/Utils.java @@ -65,6 +65,8 @@ import jdk.jfr.internal.settings.ThresholdSetting; public final class Utils { + private static final String INFINITY = "infinity"; + private static Boolean SAVE_GENERATED; public static final String EVENTS_PACKAGE_NAME = "jdk.jfr.events"; @@ -102,6 +104,9 @@ public final class Utils { } public static String formatBytes(long bytes, String separation) { + if (bytes == 1) { + return "1 byte"; + } if (bytes < 1024) { return bytes + " bytes"; } @@ -114,7 +119,6 @@ public final class Utils { if (dValue == null) { return "0"; } - long value = dValue.toNanos(); TimespanUnit result = TimespanUnit.NANOSECONDS; for (TimespanUnit unit : TimespanUnit.values()) { @@ -128,6 +132,13 @@ public final class Utils { return String.format("%d%s%s", value, separation, result.text); } + public static long parseTimespanWithInfinity(String s) { + if (INFINITY.equals(s)) { + return Long.MAX_VALUE; + } + return parseTimespan(s); + } + public static long parseTimespan(String s) { if (s.endsWith("ns")) { return Long.parseLong(s.substring(0, s.length() - 2).trim()); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/Command.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/Command.java deleted file mode 100644 index e9baa02b833..00000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/Command.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.cmd; - -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Deque; -import java.util.List; - -abstract class Command { - - private final static Command HELP = new HelpCommand(); - private final static List COMMANDS = createCommands(); - - static void displayHelp() { - System.out.println("Usage: java " + Execute.class.getName() + " []"); - System.out.println(); - displayAvailableCommands(); - } - - static void displayAvailableCommands() { - System.out.println("Available commands are:"); - System.out.println(); - boolean first = true; - for (Command c : Command.COMMANDS) { - if (!first) { - System.out.println(); - } - System.out.println(" " + c.getName() + " " + c.getOptionSyntax()); - System.out.println(" " + c.getDescription()); - first = false; - } - } - - public static List getCommands() { - return COMMANDS; - } - - public static Command valueOf(String commandName) { - for (Command command : COMMANDS) { - if (command.getName().equals(commandName)) { - return command; - } - } - return null; - } - - abstract public String getOptionSyntax(); - - abstract public String getName(); - - abstract public String getDescription(); - - abstract public void displayOptionUsage(); - - abstract public void execute(Deque options); - - final protected void userFailed(String message) { - println(); - println(message); - displayUsage(); - throw new IllegalArgumentException(message); - } - - final protected void ensureMaxArgumentCount(Deque options, int maxCount) { - if (options.size() > maxCount) { - userFailed("Too many arguments"); - } - } - - final protected void ensureMinArgumentCount(Deque options, int minCount) { - if (options.size() < minCount) { - userFailed("Too few arguments"); - } - } - - final protected void ensureFileExist(Path file) { - if (!Files.exists(file)) { - userFailed("Could not find file " + file); - } - } - - final protected Path ensureFileDoesNotExist(Path file) { - if (Files.exists(file)) { - userFailed("File " + file + " already exists"); - } - return file; - } - - final protected void ensureJFRFile(Path path) { - if (!path.toString().endsWith(".jfr")) { - userFailed("Filename must end with .jfr"); - } - } - - final protected void displayUsage() { - String javaText = "java " + Execute.class.getName(); - println(); - println("Usage: " + javaText + " " + getName() + " " + getOptionSyntax()); - println(); - displayOptionUsage(); - } - - final protected void println() { - System.out.println(); - } - - final protected void print(String text) { - System.out.print(text); - } - - final protected void println(String text) { - System.out.println(text); - } - - private static List createCommands() { - List commands = new ArrayList<>(); - commands.add(new PrintCommand()); - commands.add(new SummaryCommand()); - commands.add(new ReconstructCommand()); - commands.add(new SplitCommand()); - commands.add(HELP); - return Collections.unmodifiableList(commands); - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/Execute.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/Execute.java deleted file mode 100644 index 800c589f2c1..00000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/Execute.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.cmd; - -import java.util.Arrays; -import java.util.Deque; -import java.util.LinkedList; - -/** - * Launcher class for JFR tools - * - */ -public final class Execute { - - public static void main(String... args) { - Deque argList = new LinkedList<>(Arrays.asList(args)); - if (argList.isEmpty()) { - System.out.println(); - Command.displayHelp(); - return; - } - String command = argList.remove(); - for (Command c : Command.getCommands()) { - if (c.getName().equals(command)) { - try { - c.execute(argList); - } catch (IllegalArgumentException iae) { - return; // already handled by command - } catch (Throwable e) { - System.out.println(); - System.out.println(e.getMessage()); - System.out.println(); - } - return; - } - } - System.out.println(); - System.out.println("Unknown command " + command + "."); - System.out.println(); - Command.displayHelp(); - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/PrettyWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/PrettyWriter.java deleted file mode 100644 index 0cdfbf58fbb..00000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/PrettyWriter.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.cmd; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.StringJoiner; - -import jdk.jfr.AnnotationElement; -import jdk.jfr.ValueDescriptor; -import jdk.jfr.consumer.RecordedEvent; -import jdk.jfr.consumer.RecordedObject; -import jdk.jfr.consumer.RecordingFile; -import jdk.jfr.internal.PrivateAccess; -import jdk.jfr.internal.Type; -import jdk.jfr.internal.consumer.ChunkHeader; -import jdk.jfr.internal.consumer.RecordingInput; - -public final class PrettyWriter extends StructuredWriter { - - public PrettyWriter(PrintWriter destination) { - super(destination); - } - - void print(Path source) throws FileNotFoundException, IOException { - try (RecordingInput input = new RecordingInput(source.toFile())) { - HashSet typeSet = new HashSet<>(); - for (ChunkHeader ch = new ChunkHeader(input); !ch.isLastChunk(); ch = ch.nextHeader()) { - typeSet.addAll(ch.readMetadata().getTypes()); - } - List types = new ArrayList<>(typeSet); - Collections.sort(types, (c1, c2) -> Long.compare(c1.getId(), c2.getId())); - for (Type t : types) { - printType(t); - } - flush(); - } - - try (RecordingFile es = new RecordingFile(source)) { - while (es.hasMoreEvents()) { - print(es.readEvent()); - flush(); - } - } - flush(); - } - - public void printType(Type t) throws IOException { - print("// id: "); - println(String.valueOf(t.getId())); - int commentIndex = t.getName().length() + 10; - String typeName = t.getName(); - int index = typeName.lastIndexOf("."); - if (index != -1) { - println("package " + typeName.substring(0, index) + ";"); - } - printAnnotations(commentIndex, t.getAnnotationElements()); - print("class " + typeName.substring(index + 1)); - String superType = t.getSuperType(); - if (superType != null) { - print(" extends " + superType); - } - println(" {"); - indent(); - for (ValueDescriptor v : t.getFields()) { - printField(commentIndex, v); - } - retract(); - println("}"); - println(); - } - - private void printField(int commentIndex, ValueDescriptor v) throws IOException { - println(); - printAnnotations(commentIndex, v.getAnnotationElements()); - printIndent(); - Type vType = PrivateAccess.getInstance().getType(v); - if (Type.SUPER_TYPE_SETTING.equals(vType.getSuperType())) { - print("static "); - } - print(makeSimpleType(v.getTypeName())); - if (v.isArray()) { - print("[]"); - } - print(" "); - print(v.getName()); - print(";"); - printCommentRef(commentIndex, v.getTypeId()); - } - - private void printCommentRef(int commentIndex, long typeId) throws IOException { - int column = getColumn(); - if (column > commentIndex) { - print(" "); - } else { - while (column < commentIndex) { - print(" "); - column++; - } - } - println(" // id=" + typeId); - } - - private void printAnnotations(int commentIndex, List annotations) throws IOException { - for (AnnotationElement a : annotations) { - printIndent(); - print("@"); - print(makeSimpleType(a.getTypeName())); - List vs = a.getValueDescriptors(); - if (!vs.isEmpty()) { - printAnnotation(a); - printCommentRef(commentIndex, a.getTypeId()); - } else { - println(); - } - } - } - - private void printAnnotation(AnnotationElement a) throws IOException { - StringJoiner sj = new StringJoiner(", ", "(", ")"); - List vs = a.getValueDescriptors(); - for (ValueDescriptor v : vs) { - Object o = a.getValue(v.getName()); - if (vs.size() == 1 && v.getName().equals("value")) { - sj.add(textify(o)); - } else { - sj.add(v.getName() + "=" + textify(o)); - } - } - print(sj.toString()); - } - - private String textify(Object o) { - if (o.getClass().isArray()) { - Object[] array = (Object[]) o; - if (array.length == 1) { - return quoteIfNeeded(array[0]); - } - StringJoiner s = new StringJoiner(", ", "{", "}") ; - for (Object ob : array) { - s.add(quoteIfNeeded(ob)); - } - return s.toString(); - } else { - return quoteIfNeeded(o); - } - } - - private String quoteIfNeeded(Object o) { - if (o instanceof String) { - return "\"" + o + "\""; - } else { - return String.valueOf(o); - } - } - - private String makeSimpleType(String typeName) { - int index = typeName.lastIndexOf("."); - return typeName.substring(index + 1); - } - - public void print(RecordedEvent event) throws IOException { - print(makeSimpleType(event.getEventType().getName()), " "); - print((RecordedObject) event, ""); - } - - public void print(RecordedObject struct, String postFix) throws IOException { - println("{"); - indent(); - for (ValueDescriptor v : struct.getFields()) { - printIndent(); - print(v.getName(), " = "); - printValue(struct.getValue(v.getName()), ""); - } - retract(); - printIndent(); - println("}" + postFix); - } - - private void printArray(Object[] array) throws IOException { - println("["); - indent(); - for (int i = 0; i < array.length; i++) { - printIndent(); - printValue(array[i], i + 1 < array.length ? ", " : ""); - } - retract(); - printIndent(); - println("]"); - } - - private void printValue(Object value, String postFix) throws IOException { - if (value == null) { - println("null" + postFix); - } else if (value instanceof RecordedObject) { - print((RecordedObject) value, postFix); - } else if (value.getClass().isArray()) { - printArray((Object[]) value); - } else { - String text = String.valueOf(value); - if (value instanceof String) { - text = "\"" + text + "\""; - } - println(text); - } - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/PrintCommand.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/PrintCommand.java deleted file mode 100644 index 5bea4667ddb..00000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/PrintCommand.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.cmd; - -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Deque; - -final class PrintCommand extends Command { - @Override - public String getName() { - return "print"; - } - - @Override - public String getOptionSyntax() { - return "[--xml|--json] "; - } - - @Override - public String getDescription() { - return "Print contents of a recording file (.jfr)"; - } - - @Override - public void displayOptionUsage() { - println(" --xml Print a recording in XML format"); - println(); - println(" --json Print a recording in JSON format"); - println(); - println(" Location of the recording file (.jfr) to print"); - } - - @Override - public void execute(Deque options) { - if (options.isEmpty()) { - userFailed("Missing file"); - } - ensureMaxArgumentCount(options, 2); - - Path file = Paths.get(options.removeLast()); - - ensureFileExist(file); - ensureJFRFile(file); - ensureMaxArgumentCount(options, 1); - - String format = "--pretty"; - if (!options.isEmpty()) { - format = options.remove(); - } - try (PrintWriter pw = new PrintWriter(System.out)) { - try { - switch (format) { - case "--pretty": - PrettyWriter prettyWriter = new PrettyWriter(pw); - prettyWriter.print(file); - break; - case "--xml": - XMLWriter xmlPrinter = new XMLWriter(pw); - xmlPrinter.print(file); - break; - case "--json": - JSONWriter jsonWriter = new JSONWriter(pw); - jsonWriter.print(file); - break; - default: - userFailed("Unknown option " + format); - break; - } - } catch (IOException ioe) { - userFailed("Could not read recording at " + file.toAbsolutePath() + ". " + ioe.getMessage()); - } - } - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/SplitCommand.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/SplitCommand.java deleted file mode 100644 index fa13a947baf..00000000000 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/SplitCommand.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.jfr.internal.cmd; - -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Deque; -import java.util.List; - -import jdk.jfr.internal.consumer.ChunkHeader; -import jdk.jfr.internal.consumer.RecordingInput; - -final class SplitCommand extends Command { - - @Override - public String getOptionSyntax() { - return "[--maxchunks ] "; - } - - @Override - public void displayOptionUsage() { - println(" --maxchunks Maximum number of chunks per splitted file (default 5)."); - println(" The chunk size varies, but is typically around 15 MB."); - println(); - println(" Location of recording file (.jfr) to split"); - } - - @Override - public String getName() { - return "split"; - } - - @Override - public String getDescription() { - return "Splits a recording file into smaller files"; - } - - @Override - public void execute(Deque options) { - if (options.isEmpty()) { - userFailed("Missing file"); - } - ensureMaxArgumentCount(options, 3); - Path file = Paths.get(options.removeLast()); - ensureFileExist(file); - ensureJFRFile(file); - int maxchunks = 5; - if (!options.isEmpty()) { - String option = options.pop(); - if (!"--maxchunks".equals(option)) { - userFailed("Unknown option " + option); - } - if (options.isEmpty()) { - userFailed("Missing value for --maxChunks"); - } - String value = options.pop(); - try { - maxchunks = Integer.parseInt(value); - if (maxchunks < 1) { - userFailed("Must be at least one chunk per file."); - } - } catch (NumberFormatException nfe) { - userFailed("Not a valid value for --maxchunks."); - } - } - ensureMaxArgumentCount(options, 0); - println(); - println("Examining recording " + file + " ..."); - List sizes; - - try { - sizes = findChunkSizes(file); - } catch (IOException e) { - throw new IllegalStateException("Unexpected error. " + e.getMessage()); - } - if (sizes.size() <= maxchunks) { - throw new IllegalStateException("Number of chunks in recording (" + sizes.size() + ") doesn't exceed max chunks (" + maxchunks + ")"); - } - println(); - - println(); - if (sizes.size() > 0) { - print("File consists of " + sizes.size() + " chunks. The recording will be split into "); - sizes = combineChunkSizes(sizes, maxchunks); - println(sizes.size() + " files with at most " + maxchunks + " chunks per file."); - println(); - - try { - splitFile(file, sizes); - } catch (IOException e) { - throw new IllegalStateException("Unexpected error. " + e.getMessage()); - } - } else { - println("No JFR chunks found in file. "); - } - } - - private List findChunkSizes(Path p) throws IOException { - try (RecordingInput input = new RecordingInput(p.toFile())) { - List sizes = new ArrayList<>(); - ChunkHeader ch = new ChunkHeader(input); - sizes.add(ch.getSize()); - while (!ch.isLastChunk()) { - ch = ch.nextHeader(); - sizes.add(ch.getSize()); - } - return sizes; - } - } - - private List combineChunkSizes(List sizes, int chunksPerFile) { - List reduced = new ArrayList(); - long size = sizes.get(0); - for (int n = 1; n < sizes.size(); n++) { - if (n % chunksPerFile == 0) { - reduced.add(size); - size = 0; - } - size += sizes.get(n); - } - reduced.add(size); - return reduced; - } - - private void splitFile(Path file, List splitPositions) throws IOException { - - int padAmountZeros = String.valueOf(splitPositions.size() - 1).length(); - String fileName = file.toString(); - String fileFormatter = fileName.subSequence(0, fileName.length() - 4) + "_%0" + padAmountZeros + "d.jfr"; - for (int i = 0; i < splitPositions.size(); i++) { - Path p = Paths.get(String.format(fileFormatter, i)); - if (Files.exists(p)) { - throw new IllegalStateException("Can't create split file " + p + ", a file with that name already exist"); - } - } - DataInputStream stream = new DataInputStream(new BufferedInputStream(new FileInputStream(file.toFile()))); - - for (int i = 0; i < splitPositions.size(); i++) { - Long l = splitPositions.get(i); - byte[] bytes = readBytes(stream, l.intValue()); - Path p = Paths.get(String.format(fileFormatter, i)); - File splittedFile = p.toFile(); - println("Writing " + splittedFile + " ..."); - FileOutputStream fos = new FileOutputStream(splittedFile); - fos.write(bytes); - fos.close(); - } - stream.close(); - } - - private byte[] readBytes(InputStream stream, int count) throws IOException { - byte[] data = new byte[count]; - int totalRead = 0; - while (totalRead < data.length) { - int read = stream.read(data, totalRead, data.length - totalRead); - if (read == -1) { - throw new IOException("Unexpected end of data."); - } - totalRead += read; - } - return data; - } -} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java index 9ab1e02297c..fcdf14adf01 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java @@ -161,7 +161,7 @@ public final class ChunkHeader { return chunkSize; } - public long getDuration() { + public long getDurationNanos() { return durationNanos; } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RecordingInternals.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RecordingInternals.java new file mode 100644 index 00000000000..34be20f8a09 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RecordingInternals.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.jfr.internal.consumer; + +import java.io.IOException; +import java.util.List; + +import jdk.jfr.consumer.RecordedEvent; +import jdk.jfr.consumer.RecordedObject; +import jdk.jfr.consumer.RecordingFile; +import jdk.jfr.internal.Type; + +public abstract class RecordingInternals { + + public static RecordingInternals INSTANCE; + + public abstract boolean isLastEventInChunk(RecordingFile file); + + public abstract Object getOffsetDataTime(RecordedObject event, String name); + + public abstract List readTypes(RecordingFile file) throws IOException; + + public abstract void sort(List events); + +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java index 593b164e346..fe30df63c3c 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/instrument/JDKEvents.java @@ -29,7 +29,6 @@ import java.util.ArrayList; import java.util.List; import jdk.jfr.Event; -import jdk.jfr.FlightRecorder; import jdk.jfr.events.ActiveRecordingEvent; import jdk.jfr.events.ActiveSettingEvent; import jdk.jfr.events.ErrorThrownEvent; @@ -50,7 +49,6 @@ import jdk.jfr.internal.LogTag; import jdk.jfr.internal.Logger; import jdk.jfr.internal.RequestEngine; import jdk.jfr.internal.SecuritySupport; -import jdk.jfr.internal.Utils; public final class JDKEvents { @@ -105,7 +103,7 @@ public final class JDKEvents { SecuritySupport.registerEvent((Class) eventClass); } initializationTriggered = true; - FlightRecorder.addPeriodicEvent(ExceptionStatisticsEvent.class, emitExceptionStatistics); + RequestEngine.addTrustedJDKHook(ExceptionStatisticsEvent.class, emitExceptionStatistics); } } catch (Exception e) { Logger.log(LogTag.JFR_SYSTEM, LogLevel.WARN, "Could not initialize JDK events. " + e.getMessage()); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/CutoffSetting.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/CutoffSetting.java index f297017ff5b..7be4a6ce2ea 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/CutoffSetting.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/CutoffSetting.java @@ -28,11 +28,11 @@ package jdk.jfr.internal.settings; import java.util.Objects; import java.util.Set; -import jdk.jfr.BooleanFlag; import jdk.jfr.Description; import jdk.jfr.Label; import jdk.jfr.MetadataDefinition; import jdk.jfr.Name; +import jdk.jfr.Timespan; import jdk.jfr.internal.Control; import jdk.jfr.internal.PlatformEventType; import jdk.jfr.internal.Type; @@ -42,7 +42,7 @@ import jdk.jfr.internal.Utils; @Label("Cutoff") @Description("Limit running time of event") @Name(Type.SETTINGS_PREFIX + "Cutoff") -@BooleanFlag +@Timespan public final class CutoffSetting extends Control { private final static long typeId = Type.getTypeId(CutoffSetting.class); @@ -59,7 +59,7 @@ public final class CutoffSetting extends Control { long max = 0; String text = "0 ns"; for (String value : values) { - long l = parseValue(value); + long l = Utils.parseTimespanWithInfinity(value); if (l > max) { text = value; max = l; @@ -70,15 +70,11 @@ public final class CutoffSetting extends Control { @Override public void setValue(String value) { - long l = parseValue(value); + long l = Utils.parseTimespanWithInfinity(value); this.value = value; eventType.setCutoff(l); } - private long parseValue(String value) { - return isInfinity(value) ? Long.MAX_VALUE : Utils.parseTimespan(value); - } - @Override public String getValue() { return value; @@ -88,16 +84,12 @@ public final class CutoffSetting extends Control { return CutoffSetting.typeId == typeId; } - private static boolean isInfinity(String s) { - return s.equals("infinity"); - } - public static long parseValueSafe(String value) { if (value == null) { return 0L; } try { - return isInfinity(value) ? Long.MAX_VALUE : Utils.parseTimespan(value); + return Utils.parseTimespanWithInfinity(value); } catch (NumberFormatException nfe) { return 0L; } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/PeriodSetting.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/PeriodSetting.java index 1fd319e6f09..f33a0f9c616 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/PeriodSetting.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/PeriodSetting.java @@ -58,10 +58,11 @@ public final class PeriodSetting extends Control { @Override public String combine(Set values) { - long min = Long.MAX_VALUE; + boolean beginChunk = false; boolean endChunk = false; - String text = EVERY_CHUNK; + Long min = null; + String text = null; for (String value : values) { switch (value) { case EVERY_CHUNK: @@ -75,14 +76,21 @@ public final class PeriodSetting extends Control { endChunk = true; break; default: - long l = Utils.parseTimespan(value); - if (l < min) { + long l = Utils.parseTimespanWithInfinity(value); + // Always accept first specified value + if (min == null) { text = value; min = l; + } else { + if (l < min) { + text = value; + min = l; + } } } } - if (min != Long.MAX_VALUE) { + // A specified interval trumps *_CHUNK + if (min != null) { return text; } if (beginChunk && !endChunk) { @@ -91,7 +99,7 @@ public final class PeriodSetting extends Control { if (!beginChunk && endChunk) { return END_CHUNK; } - return text; + return EVERY_CHUNK; // also default } @Override @@ -107,7 +115,12 @@ public final class PeriodSetting extends Control { eventType.setPeriod(0, false, true); break; default: - eventType.setPeriod(Utils.parseTimespan(value) / 1_000_000, false, false); + long nanos = Utils.parseTimespanWithInfinity(value); + if (nanos != Long.MAX_VALUE) { + eventType.setPeriod(nanos / 1_000_000, false, false); + } else { + eventType.setPeriod(Long.MAX_VALUE, false, false); + } } this.value = value; } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/ThresholdSetting.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/ThresholdSetting.java index 651a9e1e628..84479b55781 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/ThresholdSetting.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/ThresholdSetting.java @@ -54,21 +54,27 @@ public final class ThresholdSetting extends Control { @Override public String combine(Set values) { - long min = Long.MAX_VALUE; - String text = "0 ns"; + Long min = null; + String text = null; for (String value : values) { - long l = Utils.parseTimespan(value); - if (l < min) { - text = value; + long l = Utils.parseTimespanWithInfinity(value); + // always accept first value + if (min == null) { min = l; + text = value; + } else { + if (l < min) { + text = value; + min = l; + } } } - return text; + return text == null ? "0 ns" : text; } @Override public void setValue(String value) { - long l = Utils.parseTimespan(value); + long l = Utils.parseTimespanWithInfinity(value); this.value = value; eventType.setThreshold(l); } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/ReconstructCommand.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Assemble.java similarity index 64% rename from src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/ReconstructCommand.java rename to src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Assemble.java index cac6d057578..44a834d9f86 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/ReconstructCommand.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Assemble.java @@ -23,76 +23,72 @@ * questions. */ -package jdk.jfr.internal.cmd; +package jdk.jfr.internal.tool; import java.io.FileOutputStream; import java.io.IOException; +import java.io.PrintStream; import java.nio.channels.FileChannel; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Collections; import java.util.Deque; import java.util.List; -final class ReconstructCommand extends Command { - - @Override - public String getOptionSyntax() { - return " "; - } +final class Assemble extends Command { @Override public String getName() { - return "reconstruct"; + return "assemble"; + } + + @Override + public List getOptionSyntax() { + return Collections.singletonList(" "); } @Override public String getDescription() { - return "Assemble leftover chunks, from a disk repository, into a recording file (.jfr)"; + return "Assemble leftover chunks from a disk repository into a recording file"; } @Override - public void displayOptionUsage() { - println(" Directory where the repository is located"); - println(); - println(" Name of the recording file (.jfr) to create"); + public void displayOptionUsage(PrintStream stream) { + stream.println(" Directory where the repository is located"); + stream.println(); + stream.println(" Name of the recording file (.jfr) to create"); } @Override - public void execute(Deque options) { + public void execute(Deque options) throws UserSyntaxException, UserDataException { ensureMinArgumentCount(options, 2); ensureMaxArgumentCount(options, 2); + Path repository = getDirectory(options.pop()); - Path repository = Paths.get(options.pop()).toAbsolutePath(); - if (!Files.exists(repository)) { - userFailed("Could not find disk repository at " + repository); - } - if (!Files.isDirectory(repository)) { - userFailed("Must specify a directory as disk repository"); - } - Path output = Paths.get(options.pop()); - ensureFileDoesNotExist(output); - ensureJFRFile(output); + Path file = Paths.get(options.pop()); + ensureFileDoesNotExist(file); + ensureJFRFile(file); - try (FileOutputStream fos = new FileOutputStream(output.toFile())) { + try (FileOutputStream fos = new FileOutputStream(file.toFile())) { List files = listJFRFiles(repository); if (files.isEmpty()) { - throw new IllegalStateException("No *.jfr files found at " + repository); + throw new UserDataException("no *.jfr files found at " + repository); } println(); - println("Combining files... "); + println("Assembling files... "); println(); - transferTo(files, output, fos.getChannel()); + transferTo(files, file, fos.getChannel()); println(); - println("Reconstruction complete."); + println("Finished."); } catch (IOException e) { - userFailed("Could not open destination file " + output + ". " + e.getMessage()); + throw new UserDataException("could not open destination file " + file + ". " + e.getMessage()); } } - private List listJFRFiles(Path path) throws IOException { + private List listJFRFiles(Path path) throws UserDataException { try { List files = new ArrayList<>(); if (Files.isDirectory(path)) { @@ -107,11 +103,11 @@ final class ReconstructCommand extends Command { files.sort((u, v) -> u.getFileName().compareTo(v.getFileName())); return files; } catch (IOException ioe) { - throw new IllegalStateException("Could not list *.jfr for directory " + path + ". " + ioe.getMessage()); + throw new UserDataException("could not list *.jfr for directory " + path + ". " + ioe.getMessage()); } } - private void transferTo(List sourceFiles, Path output, FileChannel out) { + private void transferTo(List sourceFiles, Path output, FileChannel out) throws UserDataException { long pos = 0; for (Path p : sourceFiles) { println(" " + p.toString()); @@ -124,7 +120,7 @@ final class ReconstructCommand extends Command { rem -= w; } } catch (IOException ioe) { - throw new IllegalStateException("Could not copy recording chunk " + p + " to new file. " + ioe.getMessage()); + throw new UserDataException("could not copy recording chunk " + p + " to new file. " + ioe.getMessage()); } } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Command.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Command.java new file mode 100644 index 00000000000..95ac85be6bc --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Command.java @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.tool; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOError; +import java.io.IOException; +import java.io.PrintStream; +import java.io.RandomAccessFile; +import java.nio.file.Files; +import java.nio.file.InvalidPathException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Deque; +import java.util.List; + +abstract class Command { + public final static String title = "Tool for working with Flight Recorder files (.jfr)"; + private final static Command HELP = new Help(); + private final static List COMMANDS = createCommands(); + + private static List createCommands() { + List commands = new ArrayList<>(); + commands.add(new Print()); + commands.add(new Metadata()); + commands.add(new Summary()); + commands.add(new Assemble()); + commands.add(new Disassemble()); + commands.add(new Version()); + commands.add(HELP); + return Collections.unmodifiableList(commands); + } + + static void displayHelp() { + System.out.println(title); + System.out.println(); + displayAvailableCommands(System.out); + } + + abstract public String getName(); + + abstract public String getDescription(); + + abstract public void execute(Deque argList) throws UserSyntaxException, UserDataException; + + protected String getTitle() { + return getDescription(); + } + + static void displayAvailableCommands(PrintStream stream) { + boolean first = true; + for (Command c : Command.COMMANDS) { + if (!first) { + System.out.println(); + } + displayCommand(stream, c); + stream.println(" " + c.getDescription()); + first = false; + } + } + + protected static void displayCommand(PrintStream stream, Command c) { + boolean firstSyntax = true; + String alias = buildAlias(c); + String initial = " jfr " + c.getName(); + for (String syntaxLine : c.getOptionSyntax()) { + if (firstSyntax) { + if (syntaxLine.length() != 0) { + stream.println(initial + " " + syntaxLine + alias); + } else { + stream.println(initial + alias); + } + } else { + for (int i = 0; i < initial.length(); i++) { + stream.print(" "); + } + stream.println(" " + syntaxLine); + } + firstSyntax = false; + } + } + + private static String buildAlias(Command c) { + List aliases = c.getAliases(); + if (aliases.isEmpty()) { + return ""; + } + StringBuilder sb = new StringBuilder(); + if (aliases.size() == 1) { + sb.append(" (alias "); + sb.append(aliases.get(0)); + sb.append(")"); + return sb.toString(); + } + sb.append(" (aliases "); + for (int i = 0; i< aliases.size(); i ++ ) { + sb.append(aliases.get(i)); + if (i < aliases.size() -1) { + sb.append(", "); + } + } + sb.append(")"); + return sb.toString(); + } + + public static List getCommands() { + return COMMANDS; + } + + public static Command valueOf(String commandName) { + for (Command command : COMMANDS) { + if (command.getName().equals(commandName)) { + return command; + } + } + return null; + } + + public List getOptionSyntax() { + return Collections.singletonList(""); + } + + public void displayOptionUsage(PrintStream stream) { + } + + protected boolean acceptOption(Deque options, String expected) throws UserSyntaxException { + if (expected.equals(options.peek())) { + if (options.size() < 2) { + throw new UserSyntaxException("missing value for " + options.peek()); + } + options.remove(); + return true; + } + return false; + } + + protected void warnForWildcardExpansion(String option, String filter) throws UserDataException { + // Users should quote their wildcards to avoid expansion by the shell + try { + if (!filter.contains(File.pathSeparator)) { + Path p = Path.of(".", filter); + if (!Files.exists(p)) { + return; + } + } + throw new UserDataException("wildcards should be quoted, for example " + option + " \"Foo*\""); + } catch (InvalidPathException ipe) { + // ignore + } + } + + protected boolean acceptFilterOption(Deque options, String expected) throws UserSyntaxException { + if (!acceptOption(options, expected)) { + return false; + } + if (options.isEmpty()) { + throw new UserSyntaxException("missing filter after " + expected); + } + String filter = options.peek(); + if (filter.startsWith("--")) { + throw new UserSyntaxException("missing filter after " + expected); + } + return true; + } + + final protected void ensureMaxArgumentCount(Deque options, int maxCount) throws UserSyntaxException { + if (options.size() > maxCount) { + throw new UserSyntaxException("too many arguments"); + } + } + + final protected void ensureMinArgumentCount(Deque options, int minCount) throws UserSyntaxException { + if (options.size() < minCount) { + throw new UserSyntaxException("too few arguments"); + } + } + + final protected Path getDirectory(String pathText) throws UserDataException { + try { + Path path = Paths.get(pathText).toAbsolutePath(); + if (!Files.exists((path))) { + throw new UserDataException("directory does not exist, " + pathText); + } + if (!Files.isDirectory(path)) { + throw new UserDataException("path must be directory, " + pathText); + } + return path; + } catch (InvalidPathException ipe) { + throw new UserDataException("invalid path '" + pathText + "'"); + } + } + + final protected Path getJFRInputFile(Deque options) throws UserSyntaxException, UserDataException { + if (options.isEmpty()) { + throw new UserSyntaxException("missing file"); + } + String file = options.removeLast(); + if (file.startsWith("--")) { + throw new UserSyntaxException("missing file"); + } + try { + Path path = Paths.get(file).toAbsolutePath(); + ensureAccess(path); + ensureJFRFile(path); + return path; + } catch (IOError ioe) { + throw new UserDataException("i/o error reading file '" + file + "', " + ioe.getMessage()); + } catch (InvalidPathException ipe) { + throw new UserDataException("invalid path '" + file + "'"); + } + } + + private void ensureAccess(Path path) throws UserDataException { + try (RandomAccessFile rad = new RandomAccessFile(path.toFile(), "r")) { + if (rad.length() == 0) { + throw new UserDataException("file is empty '" + path + "'"); + } + rad.read(); // try to read 1 byte + } catch (FileNotFoundException e) { + throw new UserDataException("could not find file '" + path + "'"); + } catch (IOException e) { + throw new UserDataException("i/o error reading file '" + path + "', " + e.getMessage()); + } + } + + final protected void couldNotReadError(Path p, IOException e) throws UserDataException { + throw new UserDataException("could not read recording at " + p.toAbsolutePath() + ". " + e.getMessage()); + } + + final protected Path ensureFileDoesNotExist(Path file) throws UserDataException { + if (Files.exists(file)) { + throw new UserDataException("file '" + file + "' already exists"); + } + return file; + } + + final protected void ensureJFRFile(Path path) throws UserDataException { + if (!path.toString().endsWith(".jfr")) { + throw new UserDataException("filename must end with '.jfr'"); + } + } + + protected void displayUsage(PrintStream stream) { + displayCommand(stream, this); + stream.println(); + displayOptionUsage(stream); + } + + final protected void println() { + System.out.println(); + } + + final protected void print(String text) { + System.out.print(text); + } + + final protected void println(String text) { + System.out.println(text); + } + + final protected boolean matches(String command) { + for (String s : getNames()) { + if (s.equals(command)) { + return true; + } + } + return false; + } + + protected List getAliases() { + return Collections.emptyList(); + } + + public List getNames() { + List names = new ArrayList<>(); + names.add(getName()); + names.addAll(getAliases()); + return names; + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Disassemble.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Disassemble.java new file mode 100644 index 00000000000..17ad5d176f1 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Disassemble.java @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.tool; + +import java.io.BufferedInputStream; +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.nio.file.Files; +import java.nio.file.InvalidPathException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; + +import jdk.jfr.internal.consumer.ChunkHeader; +import jdk.jfr.internal.consumer.RecordingInput; + +final class Disassemble extends Command { + + @Override + public String getName() { + return "disassemble"; + } + + @Override + public List getOptionSyntax() { + List list = new ArrayList<>(); + list.add("[--output ]"); + list.add("[--max-chunks ]"); + list.add("[--max-size ]"); + list.add(""); + return list; + } + + @Override + public void displayOptionUsage(PrintStream stream) { + stream.println(" --output The location to write the disassembled file,"); + stream.println(" by default the current directory"); + stream.println(""); + stream.println(" --max-chunks Maximum number of chunks per disassembled file,"); + stream.println(" by default 5. The chunk size varies, but is "); + stream.println(" typically around 15 MB."); + stream.println(""); + stream.println(" --max-size Maximum number of bytes per file."); + stream.println(""); + stream.println(" Location of the recording file (.jfr)"); + } + + @Override + public String getDescription() { + return "Disassamble a recording file into smaller files/chunks"; + } + + @Override + public void execute(Deque options) throws UserSyntaxException, UserDataException { + if (options.isEmpty()) { + throw new UserSyntaxException("missing file"); + } + Path file = getJFRInputFile(options); + int maxChunks = Integer.MAX_VALUE; + int maxsize = Integer.MAX_VALUE; + String output = System.getProperty("user.dir"); + int optionCount = options.size(); + while (optionCount > 0) { + if (acceptOption(options, "--output")) { + output = options.pop(); + } + if (acceptOption(options, "--max-size")) { + String value = options.pop(); + try { + maxsize = Integer.parseInt(value); + if (maxsize < 1) { + throw new UserDataException("max size must be at least 1"); + } + } catch (NumberFormatException nfe) { + throw new UserDataException("not a valid value for --max-size."); + } + } + if (acceptOption(options, "--max-chunks")) { + String value = options.pop(); + try { + maxChunks = Integer.parseInt(value); + if (maxChunks < 1) { + throw new UserDataException("max chunks must be at least 1."); + } + } catch (NumberFormatException nfe) { + throw new UserDataException("not a valid value for --max-size."); + } + } + if (optionCount == options.size()) { + // No progress made + throw new UserSyntaxException("unknown option " + options.peek()); + } + optionCount = options.size(); + } + Path outputPath = getDirectory(output); + + println(); + println("Examining recording " + file + " ..."); + List sizes; + if (maxsize != Integer.MAX_VALUE && maxChunks == Integer.MAX_VALUE) { + try { + long fileSize = Files.size(file); + if (maxsize >=fileSize) { + println(); + println("File size (" + fileSize +") does not exceed max size (" + maxsize + ")"); + return; + } + } catch (IOException e) { + throw new UserDataException("unexpected i/o error when determining file size" + e.getMessage()); + } + } + if (maxsize == Integer.MAX_VALUE && maxChunks == Integer.MAX_VALUE) { + maxChunks = 5; + } + + try { + sizes = findChunkSizes(file); + } catch (IOException e) { + throw new UserDataException("unexpected i/o error. " + e.getMessage()); + } + if (maxsize == Integer.MAX_VALUE == sizes.size() <= maxChunks) { + throw new UserDataException("number of chunks in recording (" + sizes.size() + ") doesn't exceed max chunks (" + maxChunks + ")"); + } + println(); + if (sizes.size() > 0) { + List combinedSizes = combineChunkSizes(sizes, maxChunks, maxsize); + print("File consists of " + sizes.size() + " chunks. The recording will be split into "); + println(combinedSizes.size() + " files"); + println(); + splitFile(outputPath, file, combinedSizes); + } else { + throw new UserDataException("no JFR chunks found in file."); + } + } + + private List findChunkSizes(Path p) throws IOException { + try (RecordingInput input = new RecordingInput(p.toFile())) { + List sizes = new ArrayList<>(); + ChunkHeader ch = new ChunkHeader(input); + sizes.add(ch.getSize()); + while (!ch.isLastChunk()) { + ch = ch.nextHeader(); + sizes.add(ch.getSize()); + } + return sizes; + } + } + + private List combineChunkSizes(List sizes, int maxChunks, long maxSize) { + List reduced = new ArrayList(); + int chunks = 1; + long fileSize = sizes.get(0); + for (int i = 1; i < sizes.size(); i++) { + long size = sizes.get(i); + if (fileSize + size > maxSize) { + reduced.add(fileSize); + chunks = 1; + fileSize = size; + continue; + } + fileSize += size; + if (chunks == maxChunks) { + reduced.add(fileSize); + fileSize = 0; + chunks = 1; + continue; + } + chunks++; + } + if (fileSize != 0) { + reduced.add(fileSize); + } + return reduced; + } + + private void splitFile(Path directory, Path file, List splitPositions) throws UserDataException { + int padAmountZeros = String.valueOf(splitPositions.size() - 1).length(); + String fileName = file.getFileName().toString(); + String fileFormatter = fileName.subSequence(0, fileName.length() - 4) + "_%0" + padAmountZeros + "d.jfr"; + for (int i = 0; i < splitPositions.size(); i++) { + String formattedFilename = String.format(fileFormatter, i); + try { + Path p = directory.resolve(formattedFilename); + if (Files.exists(p)) { + throw new UserDataException("can't create disassembled file " + p + ", a file with that name already exist"); + } + } catch (InvalidPathException ipe) { + throw new UserDataException("can't construct path with filename" + formattedFilename); + } + } + + try (DataInputStream stream = new DataInputStream(new BufferedInputStream(new FileInputStream(file.toFile())))) { + for (int i = 0; i < splitPositions.size(); i++) { + Long l = splitPositions.get(i); + byte[] bytes = readBytes(stream, l.intValue()); + String formattedFilename = String.format(fileFormatter, i); + Path p = directory.resolve(formattedFilename); + File splittedFile = p.toFile(); + println("Writing " + splittedFile + " ... " + bytes.length); + FileOutputStream fos = new FileOutputStream(splittedFile); + fos.write(bytes); + fos.close(); + } + } catch (IOException ioe) { + throw new UserDataException("i/o error writing file " + file); + } + } + + private byte[] readBytes(InputStream stream, int count) throws UserDataException, IOException { + byte[] data = new byte[count]; + int totalRead = 0; + while (totalRead < data.length) { + int read = stream.read(data, totalRead, data.length - totalRead); + if (read == -1) { + throw new UserDataException("unexpected end of data"); + } + totalRead += read; + } + return data; + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/EventPrintWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/EventPrintWriter.java new file mode 100644 index 00000000000..546f48117d7 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/EventPrintWriter.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.tool; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; + +import jdk.jfr.EventType; +import jdk.jfr.Timespan; +import jdk.jfr.Timestamp; +import jdk.jfr.ValueDescriptor; +import jdk.jfr.consumer.RecordedEvent; +import jdk.jfr.consumer.RecordedObject; +import jdk.jfr.consumer.RecordingFile; +import jdk.jfr.internal.consumer.RecordingInternals; + +abstract class EventPrintWriter extends StructuredWriter { + + enum ValueType { + TIMESPAN, TIMESTAMP, OTHER + } + + protected static final String STACK_TRACE_FIELD = "stackTrace"; + protected static final String EVENT_THREAD_FIELD = "eventThread"; + + private Predicate eventFilter = x -> true; + private int stackDepth; + + // cach that will speed up annotation lookup + private Map typeOfValues = new HashMap<>(); + + EventPrintWriter(PrintWriter p) { + super(p); + } + + abstract protected void print(List events); + + void print(Path source) throws FileNotFoundException, IOException { + List events = new ArrayList<>(500_000); + printBegin(); + try (RecordingFile file = new RecordingFile(source)) { + while (file.hasMoreEvents()) { + RecordedEvent event = file.readEvent(); + if (acceptEvent(event)) { + events.add(event); + } + if (RecordingInternals.INSTANCE.isLastEventInChunk(file)) { + RecordingInternals.INSTANCE.sort(events); + print(events); + events.clear(); + } + } + } + printEnd(); + flush(true); + } + + protected void printEnd() { + } + + protected void printBegin() { + } + + public final void setEventFilter(Predicate eventFilter) { + this.eventFilter = eventFilter; + } + + protected final boolean acceptEvent(RecordedEvent event) { + return eventFilter.test(event.getEventType()); + } + + protected final int getStackDepth() { + return stackDepth; + } + + protected final boolean isLateField(String name) { + return name.equals(EVENT_THREAD_FIELD) || name.equals(STACK_TRACE_FIELD); + } + + public void setStackDepth(int stackDepth) { + this.stackDepth = stackDepth; + } + + protected Object getValue(RecordedObject object, ValueDescriptor v) { + ValueType valueType = typeOfValues.get(v); + if (valueType == null) { + valueType = determineValueType(v); + typeOfValues.put(v, valueType); + } + switch (valueType) { + case TIMESPAN: + return object.getDuration(v.getName()); + case TIMESTAMP: + return RecordingInternals.INSTANCE.getOffsetDataTime(object, v.getName()); + default: + return object.getValue(v.getName()); + } + } + // It's expensive t check + private ValueType determineValueType(ValueDescriptor v) { + if (v.getAnnotation(Timespan.class) != null) { + return ValueType.TIMESPAN; + } + if (v.getAnnotation(Timestamp.class) != null) { + return ValueType.TIMESTAMP; + } + return ValueType.OTHER; + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/HelpCommand.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Help.java similarity index 62% rename from src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/HelpCommand.java rename to src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Help.java index 44abd5b8801..42e840e8b8a 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/HelpCommand.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Help.java @@ -23,23 +23,14 @@ * questions. */ -package jdk.jfr.internal.cmd; +package jdk.jfr.internal.tool; +import java.io.PrintStream; +import java.util.Collections; import java.util.Deque; +import java.util.List; -final class HelpCommand extends Command { - - @Override - public String getOptionSyntax() { - return "[]"; - } - - @Override - public void displayOptionUsage() { - println(" The name of the command to get help for"); - println(); - Command.displayAvailableCommands(); - } +final class Help extends Command { @Override public String getName() { @@ -47,22 +38,38 @@ final class HelpCommand extends Command { } @Override - public String getDescription() { - return "Display help about a command"; + public List getOptionSyntax() { + return Collections.singletonList("[]"); + } + + protected List getAliases() { + return List.of("--help", "-h", "-?"); } @Override - public void execute(Deque options) { + public void displayOptionUsage(PrintStream stream) { + println(" The name of the command to get help for"); + } + + @Override + public String getDescription() { + return "Display all available commands, or help about a specific command"; + } + + @Override + public void execute(Deque options) throws UserSyntaxException, UserDataException { if (options.isEmpty()) { - displayUsage(); - } else { - ensureMaxArgumentCount(options, 1); - String commandName = options.remove(); - Command c = Command.valueOf(commandName); - if (c == null) { - userFailed("Unknown command " + commandName); - } - c.displayUsage(); + Command.displayHelp(); + return; } + ensureMaxArgumentCount(options, 1); + String commandName = options.remove(); + Command c = Command.valueOf(commandName); + if (c == null) { + throw new UserDataException("unknown command '" + commandName + "'"); + } + println(c.getTitle()); + println(); + c.displayUsage(System.out); } } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/JSONWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/JSONWriter.java similarity index 83% rename from src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/JSONWriter.java rename to src/jdk.jfr/share/classes/jdk/jfr/internal/tool/JSONWriter.java index 8f441a38543..0e008c87325 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/JSONWriter.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/JSONWriter.java @@ -23,63 +23,63 @@ * questions. */ -package jdk.jfr.internal.cmd; +package jdk.jfr.internal.tool; -import java.io.IOException; import java.io.PrintWriter; -import java.nio.file.Path; +import java.util.List; import jdk.jfr.EventType; import jdk.jfr.ValueDescriptor; import jdk.jfr.consumer.RecordedEvent; +import jdk.jfr.consumer.RecordedFrame; import jdk.jfr.consumer.RecordedObject; -import jdk.jfr.consumer.RecordingFile; -final class JSONWriter extends StructuredWriter { +final class JSONWriter extends EventPrintWriter { + + private boolean first = true; public JSONWriter(PrintWriter writer) { super(writer); } - public void print(Path source) throws IOException { - try (RecordingFile es = new RecordingFile(source)) { - printObjectBegin(); - printRecording(es); - printObjectEnd(); - flush(); + @Override + protected void printBegin() { + printObjectBegin(); + printDataStructureName("recording"); + printObjectBegin(); + printDataStructureName("events"); + printArrayBegin(); + } + + @Override + protected void print(List events) { + for (RecordedEvent event : events) { + printNewDataStructure(first, true, null); + printEvent(event); + flush(false); + first = false; } } - private void printRecording(RecordingFile es) throws IOException { - printDataStructureName("recording"); - printObjectBegin(); - printEvents(es); + @Override + protected void printEnd() { + printArrayEnd();; + printObjectEnd(); printObjectEnd(); } - private void printEvents(RecordingFile es) throws IOException { - printDataStructureName("events"); - printArrayBegin(); + private void printEvent(RecordedEvent event) { + printObjectBegin(); + EventType type = event.getEventType(); + printValue(true, false, "type", type.getName()); + printNewDataStructure(false, false, "values"); + printObjectBegin(); boolean first = true; - while (es.hasMoreEvents()) { - RecordedEvent e = es.readEvent(); - printNewDataStructure(first, true, null); - printEvent(e); - flush(); + for (ValueDescriptor v : event.getFields()) { + printValueDescriptor(first, false, v, getValue(event, v)); first = false; } - printArrayEnd(); - } - - private void printEvent(RecordedEvent e) { - printObjectBegin(); - EventType type = e.getEventType(); - printValue(true, false, "name", type.getName()); - printValue(false, false, "typeId", type.getId()); - printValue(false, false, "startTime", e.getStartTime()); - printValue(false, false, "duration", e.getDuration()); - printNewDataStructure(false, false, "values"); - printObject(e); + printObjectEnd(); printObjectEnd(); } @@ -122,7 +122,7 @@ final class JSONWriter extends StructuredWriter { printObjectBegin(); boolean first = true; for (ValueDescriptor v : object.getFields()) { - printValueDescriptor(first, false, v, object.getValue(v.getName())); + printValueDescriptor(first, false, v, getValue(object, v)); first = false; } printObjectEnd(); @@ -131,8 +131,12 @@ final class JSONWriter extends StructuredWriter { private void printArray(ValueDescriptor v, Object[] array) { printArrayBegin(); boolean first = true; + int depth = 0; for (Object arrayElement : array) { - printValueDescriptor(first, true, v, arrayElement); + if (!(arrayElement instanceof RecordedFrame) || depth < getStackDepth()) { + printValueDescriptor(first, true, v, arrayElement); + } + depth++; first = false; } printArrayEnd(); @@ -254,5 +258,4 @@ final class JSONWriter extends StructuredWriter { } print(c); } - } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Main.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Main.java new file mode 100644 index 00000000000..785ffda9133 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Main.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.tool; + +import java.util.Arrays; +import java.util.Deque; +import java.util.LinkedList; + +/** + * Launcher class for the JDK_HOME\bin\jfr tool + * + */ +public final class Main { + + private static final int EXIT_OK = 0; + private static final int EXIT_FAILED = 1; + private static final int EXIT_WRONG_ARGUMENTS = 2; + + public static void main(String... args) { + Deque argList = new LinkedList<>(Arrays.asList(args)); + if (argList.isEmpty()) { + System.out.println(Command.title); + System.out.println(); + System.out.println("Before using this tool, you must have a recording file."); + System.out.println("A file can be created by starting a recording from command line:"); + System.out.println(); + System.out.println(" java -XX:StartFlightRecording:filename=recording.jfr,duration=30s ... "); + System.out.println(); + System.out.println("A recording can also be started on already running Java Virtual Machine:"); + System.out.println(); + System.out.println(" jcmd (to list available pids)"); + System.out.println(" jcmd JFR.start"); + System.out.println(); + System.out.println("Recording data can be dumped to file using the JFR.dump command:"); + System.out.println(); + System.out.println(" jcmd JFR.dump filename=recording.jfr"); + System.out.println(); + System.out.println("The contents of the recording can then be printed, for example:"); + System.out.println(); + System.out.println(" jfr print recording.jfr"); + System.out.println(); + System.out.println(" jfr print --events CPULoad,GarbageCollection recording.jfr"); + System.out.println(); + System.out.println(" jfr print --json --events CPULoad recording.jfr"); + System.out.println(); + System.out.println(" jfr print --categories \"GC,JVM,Java*\" recording.jfr"); + System.out.println(); + System.out.println(" jfr print --events \"jdk.*\" --stack-depth 64 recording.jfr"); + System.out.println(); + System.out.println(" jfr summary recording.jfr"); + System.out.println(); + System.out.println(" jfr metadata recording.jfr"); + System.out.println(); + System.out.println("For more information about available commands, use 'jfr help'"); + System.exit(EXIT_OK); + } + String command = argList.remove(); + for (Command c : Command.getCommands()) { + if (c.matches(command)) { + try { + c.execute(argList); + System.exit(EXIT_OK); + } catch (UserDataException ude) { + System.err.println("jfr " + c.getName() + ": " + ude.getMessage()); + System.exit(EXIT_FAILED); + } catch (UserSyntaxException use) { + System.err.println("jfr " + c.getName() + ": " + use.getMessage()); + System.err.println(); + System.err.println("Usage:"); + System.err.println(); + c.displayUsage(System.err); + System.exit(EXIT_WRONG_ARGUMENTS); + } catch (Throwable e) { + System.err.println("jfr " + c.getName() + ": unexpected internal error, " + e.getMessage()); + e.printStackTrace(); + System.exit(EXIT_FAILED); + } + } + } + System.err.println("jfr: unknown command '" + command + "'"); + System.err.println(); + System.err.println("List of available commands:"); + System.err.println(); + Command.displayAvailableCommands(System.err); + System.exit(EXIT_WRONG_ARGUMENTS); + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Metadata.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Metadata.java new file mode 100644 index 00000000000..44c989c6ee0 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Metadata.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.tool; + +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Path; +import java.util.Collections; +import java.util.Comparator; +import java.util.Deque; +import java.util.List; + +import jdk.jfr.consumer.RecordingFile; +import jdk.jfr.internal.Type; +import jdk.jfr.internal.consumer.RecordingInternals; + +final class Metadata extends Command { + + private static class TypeComparator implements Comparator { + + @Override + public int compare(Type t1, Type t2) { + int g1 = groupValue(t1); + int g2 = groupValue(t2); + if (g1 == g2) { + String n1 = t1.getName(); + String n2 = t2.getName(); + String package1 = n1.substring(0, n1.lastIndexOf('.') + 1); + String package2 = n2.substring(0, n2.lastIndexOf('.') + 1); + + if (package1.equals(package2)) { + return n1.compareTo(n2); + } else { + // Ensure that jdk.* are printed first + // This makes it easier to find user defined events at the end. + if (Type.SUPER_TYPE_EVENT.equals(t1.getSuperType()) && !package1.equals(package2)) { + if (package1.equals("jdk.jfr")) { + return -1; + } + if (package2.equals("jdk.jfr")) { + return 1; + } + } + return package1.compareTo(package2); + } + } else { + return Integer.compare(groupValue(t1), groupValue(t2)); + } + } + + int groupValue(Type t) { + String superType = t.getSuperType(); + if (superType == null) { + return 1; + } + if (Type.SUPER_TYPE_ANNOTATION.equals(superType)) { + return 3; + } + if (Type.SUPER_TYPE_SETTING.equals(superType)) { + return 4; + } + if (Type.SUPER_TYPE_EVENT.equals(superType)) { + return 5; + } + return 2; // reserved for enums in the future + } + } + + @Override + public String getName() { + return "metadata"; + } + + @Override + public List getOptionSyntax() { + return Collections.singletonList(""); + } + + @Override + public String getDescription() { + return "Display event metadata, such as labels, descriptions and field layout"; + } + + @Override + public void execute(Deque options) throws UserSyntaxException, UserDataException { + Path file = getJFRInputFile(options); + + boolean showIds = false; + int optionCount = options.size(); + while (optionCount > 0) { + if (acceptOption(options, "--ids")) { + showIds = true; + } + if (optionCount == options.size()) { + // No progress made + throw new UserSyntaxException("unknown option " + options.peek()); + } + optionCount = options.size(); + } + + try (PrintWriter pw = new PrintWriter(System.out)) { + PrettyWriter prettyWriter = new PrettyWriter(pw); + prettyWriter.setShowIds(showIds); + try (RecordingFile rf = new RecordingFile(file)) { + List types = RecordingInternals.INSTANCE.readTypes(rf); + Collections.sort(types, new TypeComparator()); + for (Type type : types) { + prettyWriter.printType(type); + } + prettyWriter.flush(true); + } catch (IOException ioe) { + couldNotReadError(file, ioe); + } + } + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/PrettyWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/PrettyWriter.java new file mode 100644 index 00000000000..152b282b29f --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/PrettyWriter.java @@ -0,0 +1,501 @@ +/* + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.tool; + +import java.io.PrintWriter; +import java.time.Duration; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.StringJoiner; + +import jdk.jfr.AnnotationElement; +import jdk.jfr.DataAmount; +import jdk.jfr.Frequency; +import jdk.jfr.MemoryAddress; +import jdk.jfr.Percentage; +import jdk.jfr.ValueDescriptor; +import jdk.jfr.consumer.RecordedClass; +import jdk.jfr.consumer.RecordedClassLoader; +import jdk.jfr.consumer.RecordedEvent; +import jdk.jfr.consumer.RecordedFrame; +import jdk.jfr.consumer.RecordedMethod; +import jdk.jfr.consumer.RecordedObject; +import jdk.jfr.consumer.RecordedStackTrace; +import jdk.jfr.consumer.RecordedThread; +import jdk.jfr.internal.PrivateAccess; +import jdk.jfr.internal.Type; +import jdk.jfr.internal.Utils; + +/** + * Print events in a human-readable format. + * + * This class is also used by {@link RecordedObject#toString()} + */ +public final class PrettyWriter extends EventPrintWriter { + private final static DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("HH:mm:ss.SSS"); + private final static Long ZERO = 0L; + private boolean showIds; + + public PrettyWriter(PrintWriter destination) { + super(destination); + } + + @Override + protected void print(List events) { + for (RecordedEvent e : events) { + print(e); + flush(false); + } + } + + public void printType(Type t) { + if (showIds) { + print("// id: "); + println(String.valueOf(t.getId())); + } + int commentIndex = t.getName().length() + 10; + String typeName = t.getName(); + int index = typeName.lastIndexOf("."); + if (index != -1) { + println("@Name(\"" + typeName + "\")"); + } + printAnnotations(commentIndex, t.getAnnotationElements()); + print("class " + typeName.substring(index + 1)); + String superType = t.getSuperType(); + if (superType != null) { + print(" extends " + superType); + } + println(" {"); + indent(); + boolean first = true; + for (ValueDescriptor v : t.getFields()) { + printField(commentIndex, v, first); + first = false; + } + retract(); + println("}"); + println(); + } + + private void printField(int commentIndex, ValueDescriptor v, boolean first) { + if (!first) { + println(); + } + printAnnotations(commentIndex, v.getAnnotationElements()); + printIndent(); + Type vType = PrivateAccess.getInstance().getType(v); + if (Type.SUPER_TYPE_SETTING.equals(vType.getSuperType())) { + print("static "); + } + print(makeSimpleType(v.getTypeName())); + if (v.isArray()) { + print("[]"); + } + print(" "); + print(v.getName()); + print(";"); + printCommentRef(commentIndex, v.getTypeId()); + } + + private void printCommentRef(int commentIndex, long typeId) { + if (showIds) { + int column = getColumn(); + if (column > commentIndex) { + print(" "); + } else { + while (column < commentIndex) { + print(" "); + column++; + } + } + println(" // id=" + typeId); + } else { + println(); + } + } + + private void printAnnotations(int commentIndex, List annotations) { + for (AnnotationElement a : annotations) { + printIndent(); + print("@"); + print(makeSimpleType(a.getTypeName())); + List vs = a.getValueDescriptors(); + if (!vs.isEmpty()) { + printAnnotation(a); + printCommentRef(commentIndex, a.getTypeId()); + } else { + println(); + } + } + } + + private void printAnnotation(AnnotationElement a) { + StringJoiner sj = new StringJoiner(", ", "(", ")"); + List vs = a.getValueDescriptors(); + for (ValueDescriptor v : vs) { + Object o = a.getValue(v.getName()); + if (vs.size() == 1 && v.getName().equals("value")) { + sj.add(textify(o)); + } else { + sj.add(v.getName() + "=" + textify(o)); + } + } + print(sj.toString()); + } + + private String textify(Object o) { + if (o.getClass().isArray()) { + Object[] array = (Object[]) o; + if (array.length == 1) { + return quoteIfNeeded(array[0]); + } + StringJoiner s = new StringJoiner(", ", "{", "}"); + for (Object ob : array) { + s.add(quoteIfNeeded(ob)); + } + return s.toString(); + } else { + return quoteIfNeeded(o); + } + } + + private String quoteIfNeeded(Object o) { + if (o instanceof String) { + return "\"" + o + "\""; + } else { + return String.valueOf(o); + } + } + + private String makeSimpleType(String typeName) { + int index = typeName.lastIndexOf("."); + return typeName.substring(index + 1); + } + + public void print(RecordedEvent event) { + print(event.getEventType().getName(), " "); + println("{"); + indent(); + for (ValueDescriptor v : event.getFields()) { + String name = v.getName(); + if (!isZeroDuration(event, name) && !isLateField(name)) { + printFieldValue(event, v); + } + } + if (event.getThread() != null) { + printIndent(); + print(EVENT_THREAD_FIELD + " = "); + printThread(event.getThread(), ""); + } + if (event.getStackTrace() != null) { + printIndent(); + print(STACK_TRACE_FIELD + " = "); + printStackTrace(event.getStackTrace()); + } + retract(); + printIndent(); + println("}"); + println(); + } + + private boolean isZeroDuration(RecordedEvent event, String name) { + return name.equals("duration") && ZERO.equals(event.getValue("duration")); + } + + private void printStackTrace(RecordedStackTrace stackTrace) { + println("["); + List frames = stackTrace.getFrames(); + indent(); + int i = 0; + while (i < frames.size() && i < getStackDepth()) { + RecordedFrame frame = frames.get(i); + if (frame.isJavaFrame()) { + printIndent(); + printValue(frame, null, ""); + println(); + i++; + } + } + if (stackTrace.isTruncated() || i == getStackDepth()) { + printIndent(); + println("..."); + } + retract(); + printIndent(); + println("]"); + } + + public void print(RecordedObject struct, String postFix) { + println("{"); + indent(); + for (ValueDescriptor v : struct.getFields()) { + printFieldValue(struct, v); + } + retract(); + printIndent(); + println("}" + postFix); + } + + private void printFieldValue(RecordedObject struct, ValueDescriptor v) { + printIndent(); + print(v.getName(), " = "); + printValue(getValue(struct, v), v, ""); + } + + private void printArray(Object[] array) { + println("["); + indent(); + for (int i = 0; i < array.length; i++) { + printIndent(); + printValue(array[i], null, i + 1 < array.length ? ", " : ""); + } + retract(); + printIndent(); + println("]"); + } + + private void printValue(Object value, ValueDescriptor field, String postFix) { + if (value == null) { + println("null" + postFix); + return; + } + if (value instanceof RecordedObject) { + if (value instanceof RecordedThread) { + printThread((RecordedThread) value, postFix); + return; + } + if (value instanceof RecordedClass) { + printClass((RecordedClass) value, postFix); + return; + } + if (value instanceof RecordedClassLoader) { + printClassLoader((RecordedClassLoader) value, postFix); + return; + } + if (value instanceof RecordedFrame) { + RecordedFrame frame = (RecordedFrame) value; + if (frame.isJavaFrame()) { + printJavaFrame((RecordedFrame) value, postFix); + return; + } + } + if (value instanceof RecordedMethod) { + println(formatMethod((RecordedMethod) value)); + return; + } + print((RecordedObject) value, postFix); + return; + } + if (value.getClass().isArray()) { + printArray((Object[]) value); + return; + } + if (field.getContentType() != null) { + if (printFormatted(field, value)) { + return; + } + } + String text = String.valueOf(value); + if (value instanceof String) { + text = "\"" + text + "\""; + } + println(text); + } + + private void printClassLoader(RecordedClassLoader cl, String postFix) { + // Purposely not printing class loader name to avoid cluttered output + RecordedClass clazz = cl.getType(); + print(clazz == null ? "null" : clazz.getName()); + if (clazz != null) { + print(" ("); + print("id = "); + print(String.valueOf(cl.getId())); + println(")"); + } + } + + private void printJavaFrame(RecordedFrame f, String postFix) { + print(formatMethod(f.getMethod())); + int line = f.getLineNumber(); + if (line >= 0) { + print(" line: " + line); + } + print(postFix); + } + + private String formatMethod(RecordedMethod m) { + StringBuilder sb = new StringBuilder(); + sb.append(m.getType().getName()); + sb.append("."); + sb.append(m.getName()); + sb.append("("); + StringJoiner sj = new StringJoiner(", "); + String md = m.getDescriptor().replace("/", "."); + String parameter = md.substring(1, md.lastIndexOf(")")); + for (String qualifiedName : decodeDescriptors(parameter)) { + String typeName = qualifiedName.substring(qualifiedName.lastIndexOf('.') + 1); + sj.add(typeName); + } + sb.append(sj); + sb.append(")"); + return sb.toString(); + } + + private void printClass(RecordedClass clazz, String postFix) { + RecordedClassLoader classLoader = clazz.getClassLoader(); + String classLoaderName = "null"; + if (classLoader != null) { + if (classLoader.getName() != null) { + classLoaderName = classLoader.getName(); + } else { + classLoaderName = classLoader.getType().getName(); + } + } + String className = clazz.getName(); + if (className.startsWith("[")) { + className = decodeDescriptors(className).get(0); + } + println(className + " (classLoader = " + classLoaderName + ")" + postFix); + } + + List decodeDescriptors(String descriptor) { + List descriptors = new ArrayList<>(); + for (int index = 0; index < descriptor.length(); index++) { + String arrayBrackets = ""; + while (descriptor.charAt(index) == '[') { + arrayBrackets += "[]"; + index++; + } + char c = descriptor.charAt(index); + String type; + switch (c) { + case 'L': + int endIndex = descriptor.indexOf(';', index); + type = descriptor.substring(index + 1, endIndex); + index = endIndex; + break; + case 'I': + type = "int"; + break; + case 'J': + type = "long"; + break; + case 'Z': + type = "boolean"; + break; + case 'D': + type = "double"; + break; + case 'F': + type = "float"; + break; + case 'S': + type = "short"; + break; + case 'C': + type = "char"; + break; + case 'B': + type = "byte"; + break; + default: + type = ""; + } + descriptors.add(type + arrayBrackets); + } + return descriptors; + } + + private void printThread(RecordedThread thread, String postFix) { + long javaThreadId = thread.getJavaThreadId(); + if (javaThreadId > 0) { + println("\"" + thread.getJavaName() + "\" (javaThreadId = " + thread.getJavaThreadId() + ")" + postFix); + } else { + println("\"" + thread.getOSName() + "\" (osThreadId = " + thread.getOSThreadId() + ")" + postFix); + } + } + + private boolean printFormatted(ValueDescriptor field, Object value) { + if (value instanceof Duration) { + Duration d = (Duration) value; + double s = d.toNanosPart() / 1000_000_000.0 + d.toSecondsPart(); + if (s < 1.0) { + if (s < 0.001) { + println(String.format("%.3f", s * 1_000_000) + " us"); + } else { + println(String.format("%.3f", s * 1_000) + " ms"); + } + } else { + if (s < 1000.0) { + println(String.format("%.3f", s) + " s"); + } else { + println(String.format("%.0f", s) + " s"); + } + } + return true; + } + if (value instanceof OffsetDateTime) { + OffsetDateTime zdt = (OffsetDateTime) value; + println(TIME_FORMAT.format(zdt)); + return true; + } + Percentage percentage = field.getAnnotation(Percentage.class); + if (percentage != null) { + if (value instanceof Number) { + double d = ((Number) value).doubleValue(); + println(String.format("%.2f", d * 100) + "%"); + return true; + } + } + DataAmount dataAmount = field.getAnnotation(DataAmount.class); + if (dataAmount != null) { + if (value instanceof Number) { + Number n = (Number) value; + String bytes = Utils.formatBytes(n.longValue(), " "); + if (field.getAnnotation(Frequency.class) != null) { + bytes += "/s"; + } + println(bytes); + return true; + } + } + MemoryAddress memoryAddress = field.getAnnotation(MemoryAddress.class); + if (memoryAddress != null) { + if (value instanceof Number) { + long d = ((Number) value).longValue(); + println(String.format("0x%08X", d)); + return true; + } + } + return false; + } + + public void setShowIds(boolean showIds) { + this.showIds = showIds; + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Print.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Print.java new file mode 100644 index 00000000000..1f9294c7dc6 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Print.java @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.tool; + +import java.io.IOException; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.nio.charset.Charset; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Deque; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Predicate; + +import jdk.jfr.EventType; + +final class Print extends Command { + @Override + public String getName() { + return "print"; + } + + @Override + public List getOptionSyntax() { + List list = new ArrayList<>(); + list.add("[--xml|--json]"); + list.add("[--categories ]"); + list.add("[--events ]"); + list.add("[--stack-depth ]"); + list.add(""); + return list; + } + + @Override + protected String getTitle() { + return "Print contents of a recording file"; + } + + @Override + public String getDescription() { + return getTitle() + ". See 'jfr help print' for details."; + } + + @Override + public void displayOptionUsage(PrintStream stream) { + stream.println(" --xml Print recording in XML format"); + stream.println(); + stream.println(" --json Print recording in JSON format"); + stream.println(); + stream.println(" --categories Select events matching a category name."); + stream.println(" The filter is a comma-separated list of names,"); + stream.println(" simple and/or qualified, and/or quoted glob patterns"); + stream.println(); + stream.println(" --events Select events matching an event name."); + stream.println(" The filter is a comma-separated list of names,"); + stream.println(" simple and/or qualified, and/or quoted glob patterns"); + stream.println(); + stream.println(" --stack-depth Number of frames in stack traces, by default 5"); + stream.println(); + stream.println(" Location of the recording file (.jfr)"); + stream.println(); + stream.println(); + stream.println("Example usage:"); + stream.println(); + stream.println(" jfr print --events OldObjectSample recording.jfr"); + stream.println(); + stream.println(" jfr print --events CPULoad,GarbageCollection recording.jfr"); + stream.println(); + stream.println(" jfr print --categories \"GC,JVM,Java*\" recording.jfr"); + stream.println(); + stream.println(" jfr print --events \"jdk.*\" --stack-depth 64 recording.jfr"); + stream.println(); + stream.println(" jfr print --json --events CPULoad recording.jfr"); + } + + @Override + public void execute(Deque options) throws UserSyntaxException, UserDataException { + Path file = getJFRInputFile(options); + PrintWriter pw = new PrintWriter(System.out, false, Charset.forName("UTF-8")); + Predicate eventFilter = null; + int stackDepth = 5; + EventPrintWriter eventWriter = null; + int optionCount = options.size(); + while (optionCount > 0) { + if (acceptFilterOption(options, "--events")) { + String filter = options.remove(); + warnForWildcardExpansion("--events", filter); + eventFilter = addEventFilter(filter, eventFilter); + } + if (acceptFilterOption(options, "--categories")) { + String filter = options.remove(); + warnForWildcardExpansion("--categories", filter); + eventFilter = addCategoryFilter(filter, eventFilter); + } + if (acceptOption(options, "--stack-depth")) { + String value = options.pop(); + try { + stackDepth = Integer.parseInt(value); + if (stackDepth < 0) { + throw new UserSyntaxException("stack depth must be zero or a positive integer."); + } + } catch (NumberFormatException nfe) { + throw new UserSyntaxException("not a valid value for --stack-depth"); + } + } + if (acceptFormatterOption(options, eventWriter, "--json")) { + eventWriter = new JSONWriter(pw); + } + if (acceptFormatterOption(options, eventWriter, "--xml")) { + eventWriter = new XMLWriter(pw); + } + if (optionCount == options.size()) { + // No progress made + throw new UserSyntaxException("unknown option " + options.peek()); + } + optionCount = options.size(); + } + if (eventWriter == null) { + eventWriter = new PrettyWriter(pw); // default to pretty printer + } + eventWriter.setStackDepth(stackDepth); + if (eventFilter != null) { + eventFilter = addCache(eventFilter, eventType -> eventType.getId()); + eventWriter.setEventFilter(eventFilter); + } + try { + eventWriter.print(file); + } catch (IOException ioe) { + couldNotReadError(file, ioe); + } + pw.flush(); + } + + private static boolean acceptFormatterOption(Deque options, EventPrintWriter eventWriter, String expected) throws UserSyntaxException { + if (expected.equals(options.peek())) { + if (eventWriter != null) { + throw new UserSyntaxException("only one format can be specified at a time"); + } + options.remove(); + return true; + } + return false; + } + + private static Predicate addCache(final Predicate filter, Function cacheFunction) { + Map cache = new HashMap<>(); + return t -> cache.computeIfAbsent(cacheFunction.apply(t), x -> filter.test(t)); + } + + private static Predicate recurseIfPossible(Predicate filter) { + return x -> filter != null && filter.test(x); + } + + private static Predicate addCategoryFilter(String filterText, Predicate eventFilter) throws UserSyntaxException { + List filters = explodeFilter(filterText); + return recurseIfPossible(eventType -> { + for (String category : eventType.getCategoryNames()) { + for (String filter : filters) { + if (match(category, filter)) { + return true; + } + if (category.contains(" ") && acronomify(category).equals(filter)) { + return true; + } + } + } + return false; + }); + } + + private static String acronomify(String multipleWords) { + boolean newWord = true; + String acronym = ""; + for (char c : multipleWords.toCharArray()) { + if (newWord) { + if (Character.isAlphabetic(c) && Character.isUpperCase(c)) { + acronym += c; + } + } + newWord = Character.isWhitespace(c); + } + return acronym; + } + + private static Predicate addEventFilter(String filterText, final Predicate eventFilter) throws UserSyntaxException { + List filters = explodeFilter(filterText); + return recurseIfPossible(eventType -> { + for (String filter : filters) { + String fullEventName = eventType.getName(); + if (match(fullEventName, filter)) { + return true; + } + String eventName = fullEventName.substring(fullEventName.lastIndexOf(".") + 1); + if (match(eventName, filter)) { + return true; + } + } + return false; + }); + } + + private static boolean match(String text, String filter) { + if (filter.length() == 0) { + // empty filter string matches if string is empty + return text.length() == 0; + } + if (filter.charAt(0) == '*') { // recursive check + filter = filter.substring(1); + for (int n = 0; n <= text.length(); n++) { + if (match(text.substring(n), filter)) + return true; + } + } else if (text.length() == 0) { + // empty string and non-empty filter does not match + return false; + } else if (filter.charAt(0) == '?') { + // eat any char and move on + return match(text.substring(1), filter.substring(1)); + } else if (filter.charAt(0) == text.charAt(0)) { + // eat chars and move on + return match(text.substring(1), filter.substring(1)); + } + return false; + } + + private static List explodeFilter(String filter) throws UserSyntaxException { + List list = new ArrayList<>(); + for (String s : filter.split(",")) { + s = s.trim(); + if (!s.isEmpty()) { + list.add(s); + } + } + return list; + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/StructuredWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/StructuredWriter.java similarity index 86% rename from src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/StructuredWriter.java rename to src/jdk.jfr/share/classes/jdk/jfr/internal/tool/StructuredWriter.java index eef11859e30..f6b5ae2d068 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/StructuredWriter.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/StructuredWriter.java @@ -23,7 +23,7 @@ * questions. */ -package jdk.jfr.internal.cmd; +package jdk.jfr.internal.tool; import java.io.PrintWriter; @@ -36,6 +36,8 @@ abstract class StructuredWriter { private char[] indentionArray = new char[0]; private int indent = 0; private int column; + // print first event immediately so tool feels responsive + private boolean first = true; StructuredWriter(PrintWriter p) { out = p; @@ -46,9 +48,17 @@ abstract class StructuredWriter { } // Flush to print writer - public final void flush() { - out.print(builder.toString()); - builder.setLength(0); + public final void flush(boolean hard) { + if (hard) { + out.print(builder.toString()); + builder.setLength(0); + return; + } + if (first || builder.length() > 100_000) { + out.print(builder.toString()); + builder.setLength(0); + first = false; + } } final public void printIndent() { diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/SummaryCommand.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Summary.java similarity index 81% rename from src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/SummaryCommand.java rename to src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Summary.java index 106409d53bd..e282d6b7e33 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/SummaryCommand.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Summary.java @@ -23,18 +23,20 @@ * questions. */ -package jdk.jfr.internal.cmd; +package jdk.jfr.internal.tool; import java.io.IOException; +import java.io.PrintStream; import java.nio.file.Path; -import java.nio.file.Paths; -import java.time.Duration; import java.time.Instant; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.Deque; import java.util.HashMap; import java.util.List; +import java.util.Locale; import jdk.jfr.EventType; import jdk.jfr.internal.MetadataDescriptor; @@ -42,31 +44,31 @@ import jdk.jfr.internal.Type; import jdk.jfr.internal.consumer.ChunkHeader; import jdk.jfr.internal.consumer.RecordingInput; -final class SummaryCommand extends Command { +final class Summary extends Command { + private final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withLocale(Locale.UK).withZone(ZoneOffset.UTC); + + @Override + public String getName() { + return "summary"; + } private static class Statistics { Statistics(String name) { this.name = name; } - String name; long count; long size; } @Override - public String getOptionSyntax() { - return ""; + public List getOptionSyntax() { + return Collections.singletonList(""); } @Override - public void displayOptionUsage() { - println(" Location of the recording file (.jfr) to display information about"); - } - - @Override - public String getName() { - return "summary"; + public void displayOptionUsage(PrintStream stream) { + stream.println(" Location of the recording file (.jfr) to display information about"); } @Override @@ -75,23 +77,17 @@ final class SummaryCommand extends Command { } @Override - public void execute(Deque options) { - if (options.isEmpty()) { - userFailed("Missing file"); - } + public void execute(Deque options) throws UserSyntaxException, UserDataException { ensureMaxArgumentCount(options, 1); - Path p = Paths.get(options.remove()); - ensureFileExist(p); - ensureJFRFile(p); + Path p = getJFRInputFile(options); try { printInformation(p); } catch (IOException e) { - throw new IllegalStateException("Unexpected error. " + e.getMessage()); + couldNotReadError(p, e); } } private void printInformation(Path p) throws IOException { - long totalSize = 0; long totalDuration = 0; long chunks = 0; @@ -115,17 +111,14 @@ final class SummaryCommand extends Command { minWidth = Math.max(minWidth, eventType.getName().length()); } - totalSize += ch.getSize(); - totalDuration += ch.getDuration(); + totalDuration += ch.getDurationNanos(); chunks++; input.position(ch.getEventStart()); while (input.position() < chunkEnd) { - long pos = input.position(); int size = input.readInt(); long eventTypeId = input.readLong(); Statistics s = stats.get(eventTypeId); - if (s != null) { s.count++; s.size += size; @@ -142,12 +135,8 @@ final class SummaryCommand extends Command { long adjustNanos = first.getStartNanos() - epochSeconds * 1_000_000_000L; println(" Version: " + first.getMajor() + "." + first.getMinor()); println(" Chunks: " + chunks); - println(" Size: " + totalSize + " bytes"); - println(" Start: " + Instant.ofEpochSecond(epochSeconds, adjustNanos)); - println(" Duration: " + Duration.ofNanos(totalDuration)); - println(); - println(" Start Ticks: " + first.getStartTicks()); - println(" Ticks / Second: " + first.getTicksPerSecond()); + println(" Start: " + DATE_FORMAT.format(Instant.ofEpochSecond(epochSeconds, adjustNanos)) + " (UTC)"); + println(" Duration: " + (totalDuration + 500_000_000) / 1_000_000_000 + " s"); List statsList = new ArrayList<>(stats.values()); Collections.sort(statsList, (u, v) -> Long.compare(v.count, u.count)); diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/UserDataException.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/UserDataException.java new file mode 100644 index 00000000000..a21ae95f671 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/UserDataException.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.tool; + +/** + * Exception that is thrown if there is something wrong with the input, for instance + * a file that can't be read or a numerical value that is out of range. + *

    + * When this exception is thrown, a user will typically not want to see the + * command line syntax, but instead information about what was wrong with the + * input. + */ +final class UserDataException extends Exception { + private static final long serialVersionUID = 6656457380115167810L; + /** + * The error message. + * + * The first letter should not be capitalized, so a context can be printed prior + * to the error message. + * + * @param errorMessage + */ + public UserDataException(String errorMessage) { + super(errorMessage); + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/UserSyntaxException.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/UserSyntaxException.java new file mode 100644 index 00000000000..db6224ccee3 --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/UserSyntaxException.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.tool; + +/** + * Exception that is thrown if options don't follow the syntax of the command. + */ +final class UserSyntaxException extends Exception { + private static final long serialVersionUID = 3437009454344160933L; + + /** + * The error message. + * + * The first letter should not be capitalized, so a context can be printed prior + * to the error message. + * + * @param errorMessage + */ + public UserSyntaxException(String message) { + super(message); + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Version.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Version.java new file mode 100644 index 00000000000..2f3eea9902d --- /dev/null +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Version.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.internal.tool; + +import java.util.Deque; +import java.util.List; + +final class Version extends Command { + @Override + public String getName() { + return "version"; + } + + @Override + public String getDescription() { + return "Display version of the jfr tool"; + } + + @Override + public void execute(Deque options) { + System.out.println("1.0"); + } + + protected List getAliases() { + return List.of("--version"); + } +} diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/XMLWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/XMLWriter.java similarity index 75% rename from src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/XMLWriter.java rename to src/jdk.jfr/share/classes/jdk/jfr/internal/tool/XMLWriter.java index f765c0dd0c2..2db1688239b 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/cmd/XMLWriter.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/XMLWriter.java @@ -23,55 +23,60 @@ * questions. */ -package jdk.jfr.internal.cmd; +package jdk.jfr.internal.tool; -import java.io.IOException; import java.io.PrintWriter; -import java.nio.file.Path; +import java.util.List; import jdk.jfr.EventType; import jdk.jfr.ValueDescriptor; import jdk.jfr.consumer.RecordedEvent; +import jdk.jfr.consumer.RecordedFrame; import jdk.jfr.consumer.RecordedObject; -import jdk.jfr.consumer.RecordingFile; - -final class XMLWriter extends StructuredWriter { +final class XMLWriter extends EventPrintWriter { public XMLWriter(PrintWriter destination) { super(destination); } - public void print(Path source) throws IOException { - try (RecordingFile es = new RecordingFile(source)) { - println(""); - println(""); - indent(); - printIndent(); - println(""); - indent(); - while (es.hasMoreEvents()) { - printEvent(es.readEvent()); - flush(); - } - retract(); - printIndent(); - println(""); - retract(); - println(""); - flush(); + @Override + protected void printBegin() { + println(""); + println(""); + indent(); + printIndent(); + println(""); + indent(); + } + + @Override + protected void printEnd() { + retract(); + printIndent(); + println(""); + retract(); + println(""); + } + + @Override + protected void print(List events) { + for (RecordedEvent event : events) { + printEvent(event); } } - private void printEvent(RecordedEvent e) throws IOException { - EventType type = e.getEventType(); + private void printEvent(RecordedEvent event) { + EventType type = event.getEventType(); printIndent(); print(""); - printObject(e); + println(); + indent(); + for (ValueDescriptor v : event.getFields()) { + printValueDescriptor(v, getValue(event, v), -1); + } + retract(); printIndent(); println(""); println(); @@ -85,7 +90,7 @@ final class XMLWriter extends StructuredWriter { println(); indent(); for (ValueDescriptor v : struct.getFields()) { - printValueDescriptor(v, struct.getValue(v.getName()), -1); + printValueDescriptor(v, getValue(struct, v), -1); } retract(); } @@ -93,8 +98,13 @@ final class XMLWriter extends StructuredWriter { private void printArray(ValueDescriptor v, Object[] array) { println(); indent(); + int depth = 0; for (int index = 0; index < array.length; index++) { - printValueDescriptor(v, array[index], index); + Object arrayElement = array[index]; + if (!(arrayElement instanceof RecordedFrame) || depth < getStackDepth()) { + printValueDescriptor(v, array[index], index); + } + depth++; } retract(); } @@ -134,9 +144,8 @@ final class XMLWriter extends StructuredWriter { printAttribute("index", Integer.toString(index)); } if (value == null) { - print(">"); + printAttribute("xsi:nil", "true"); + println("/>"); return false; } if (value.getClass().isArray()) { diff --git a/src/jdk.jfr/share/classes/module-info.java b/src/jdk.jfr/share/classes/module-info.java index 2355126c080..dc65de9eb3b 100644 --- a/src/jdk.jfr/share/classes/module-info.java +++ b/src/jdk.jfr/share/classes/module-info.java @@ -25,6 +25,12 @@ /** * Defines the API for JDK Flight Recorder. + *

    + * + *

    + *
    Tool Guides: + *
    {@extLink jfr_tool_reference jfr} + *
    * * @moduleGraph * @since 9 diff --git a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java index 3a1dcf93af4..b0be07116fc 100644 --- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java +++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java @@ -108,7 +108,11 @@ public final class ReleaseInfoPlugin implements Plugin { case "del": { // --release-info del:keys=openjdk,java_version - Utils.parseList(config.get(KEYS)).stream().forEach((k) -> { + String keys = config.get(KEYS); + if (keys == null || keys.isEmpty()) { + throw new IllegalArgumentException("No key specified for delete"); + } + Utils.parseList(keys).stream().forEach((k) -> { release.remove(k); }); } diff --git a/src/jdk.management.agent/share/classes/jdk/internal/agent/Agent.java b/src/jdk.management.agent/share/classes/jdk/internal/agent/Agent.java index b44b3395700..8cff6f6dbd0 100644 --- a/src/jdk.management.agent/share/classes/jdk/internal/agent/Agent.java +++ b/src/jdk.management.agent/share/classes/jdk/internal/agent/Agent.java @@ -265,7 +265,7 @@ public class Agent { // return empty property set private static Properties parseString(String args) { Properties argProps = new Properties(); - if (args != null && !args.trim().equals("")) { + if (args != null && !args.trim().isEmpty()) { for (String option : args.split(",")) { String s[] = option.split("=", 2); String name = s[0].trim(); diff --git a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsContext.java b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsContext.java index 3038f6fc49e..aad05496429 100644 --- a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsContext.java +++ b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsContext.java @@ -537,8 +537,8 @@ public class DnsContext extends ComponentDirContext { int prefixLast = prefixC.size() - 1; // Let toolkit do the work at namespace boundaries. - if (nameC.isEmpty() || nameC.get(0).equals("") || - prefixC.isEmpty() || prefixC.get(prefixLast).equals("")) { + if (nameC.isEmpty() || nameC.get(0).isEmpty() || + prefixC.isEmpty() || prefixC.get(prefixLast).isEmpty()) { return super.composeName(nameC, prefixC); } @@ -687,7 +687,7 @@ public class DnsContext extends ComponentDirContext { private static CT fromAttrId(String attrId) throws InvalidAttributeIdentifierException { - if (attrId.equals("")) { + if (attrId.isEmpty()) { throw new InvalidAttributeIdentifierException( "Attribute ID cannot be empty"); } diff --git a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsName.java b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsName.java index 4bd2b06d877..6b678a6b1e5 100644 --- a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsName.java +++ b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsName.java @@ -368,7 +368,7 @@ public final class DnsName implements Name { boolean hasRootLabel() { return (!isEmpty() && - get(0).equals("")); + get(0).isEmpty()); } /* @@ -442,7 +442,7 @@ public final class DnsName implements Name { // label of the name. Those two are special cases in that for // all other domain names, the number of labels is one greater // than the number of dot separators. - if (!name.equals("") && !name.equals(".")) { + if (!name.isEmpty() && !name.equals(".")) { add(0, label.toString()); } diff --git a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsUrl.java b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsUrl.java index ef17259695c..f77e3d4f57b 100644 --- a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsUrl.java +++ b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsUrl.java @@ -89,7 +89,7 @@ public class DnsUrl extends Uri { domain = path.startsWith("/") ? path.substring(1) : path; - domain = domain.equals("") + domain = domain.isEmpty() ? "." : UrlUtil.decode(domain); diff --git a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/ResourceRecord.java b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/ResourceRecord.java index 2d219073f3c..e0b8dce556e 100644 --- a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/ResourceRecord.java +++ b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/ResourceRecord.java @@ -200,7 +200,7 @@ public class ResourceRecord { } private static int nameToValue(String name, String[] names) { - if (name.equals("")) { + if (name.isEmpty()) { return -1; // invalid name } else if (name.equals("*")) { return QTYPE_STAR; // QTYPE_STAR == QCLASS_STAR diff --git a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/ZoneNode.java b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/ZoneNode.java index 352f15df916..dde4277d8e8 100644 --- a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/ZoneNode.java +++ b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/ZoneNode.java @@ -124,7 +124,7 @@ class ZoneNode extends NameNode { * name and its resource records. Returns the zone's new contents. */ NameNode populate(DnsName zone, ResourceRecords rrs) { - // assert zone.get(0).equals(""); // zone has root label + // assert zone.get(0).isEmpty(); // zone has root label // assert (zone.size() == (depth() + 1)); // +1 due to root label NameNode newContents = new NameNode(null); diff --git a/src/jdk.rmic/share/classes/sun/tools/java/ClassPath.java b/src/jdk.rmic/share/classes/sun/tools/java/ClassPath.java index 4d5ecf29220..48e37ab0eaa 100644 --- a/src/jdk.rmic/share/classes/sun/tools/java/ClassPath.java +++ b/src/jdk.rmic/share/classes/sun/tools/java/ClassPath.java @@ -230,7 +230,7 @@ class ClassPath { int i = name.lastIndexOf(File.separatorChar); subdir = name.substring(0, i + 1); basename = name.substring(i + 1); - } else if (!subdir.equals("") + } else if (!subdir.isEmpty() && !subdir.endsWith(fileSeparatorChar)) { // zip files are picky about "foo" vs. "foo/". // also, the getFiles caches are keyed with a trailing / diff --git a/src/jdk.rmic/share/classes/sun/tools/java/Package.java b/src/jdk.rmic/share/classes/sun/tools/java/Package.java index 9d45d1c44d4..1a7c077f7bd 100644 --- a/src/jdk.rmic/share/classes/sun/tools/java/Package.java +++ b/src/jdk.rmic/share/classes/sun/tools/java/Package.java @@ -115,7 +115,7 @@ class Package { } private String makeName(String fileName) { - return pkg.equals("") ? fileName : pkg + File.separator + fileName; + return pkg.isEmpty() ? fileName : pkg + File.separator + fileName; } /** @@ -153,7 +153,7 @@ class Package { } public String toString() { - if (pkg.equals("")) { + if (pkg.isEmpty()) { return "unnamed package"; } return "package " + pkg; diff --git a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/Compilation.java b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/Compilation.java index 379067f3071..64301dcd0c0 100644 --- a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/Compilation.java +++ b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/Compilation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -216,6 +216,10 @@ public class Compilation implements LogEvent { } else { if (printID) { stream.print(getId()); + // Print the comp level next to the id as with +PrintCompilation + if (nmethod != null && nmethod.getLevel() != 0) { + stream.print(" " + nmethod.getLevel()); + } } int bc = isOsr() ? getBCI() : -1; stream.print(getMethod().decodeFlags(bc) + " " + compiler + " " + getMethod().format(bc)); diff --git a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/LogParser.java b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/LogParser.java index d3aed82ae2d..125164f9c34 100644 --- a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/LogParser.java +++ b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/LogParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1096,6 +1096,10 @@ public class LogParser extends DefaultHandler implements ErrorHandler { id, parseLong(atts.getValue("address")), parseLong(atts.getValue("size"))); + String level = atts.getValue("level"); + if (level != null) { + nm.setLevel(parseLong(level)); + } nmethods.put(id, nm); events.add(nm); } else if (qname.equals("parse")) { diff --git a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/NMethod.java b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/NMethod.java index 9d07a771bf6..4aa60b285b6 100644 --- a/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/NMethod.java +++ b/src/utils/LogCompilation/src/main/java/com/sun/hotspot/tools/compiler/NMethod.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,6 +42,11 @@ public class NMethod extends BasicLogEvent { */ private long size; + /** + * The nmethod's compilation level. + */ + private long level; + NMethod(double s, String i, long a, long sz) { super(s, i); address = a; @@ -68,4 +73,18 @@ public class NMethod extends BasicLogEvent { public void setSize(long size) { this.size = size; } + + /** + * @return the level + */ + public long getLevel() { + return level; + } + + /** + * @param level the level to set + */ + public void setLevel(long level) { + this.level = level; + } } diff --git a/src/utils/LogCompilation/src/test/java/com/sun/hotspot/tools/compiler/TestLogCompilation.java b/src/utils/LogCompilation/src/test/java/com/sun/hotspot/tools/compiler/TestLogCompilation.java index c912dcf53e3..7371cd97159 100644 --- a/src/utils/LogCompilation/src/test/java/com/sun/hotspot/tools/compiler/TestLogCompilation.java +++ b/src/utils/LogCompilation/src/test/java/com/sun/hotspot/tools/compiler/TestLogCompilation.java @@ -53,7 +53,9 @@ public class TestLogCompilation { // no file (just prints the help) {"./src/test/resources/hotspot_pid23756.log"}, // LogCompilation output of running on above file - {"./src/test/resources/hotspot_pid25109.log"} + {"./src/test/resources/hotspot_pid25109.log"}, + {"./src/test/resources/no_tiered_short.log"}, + {"./src/test/resources/tiered_short.log"} }; return Arrays.asList(data); diff --git a/src/utils/LogCompilation/src/test/resources/no_tiered_short.log b/src/utils/LogCompilation/src/test/resources/no_tiered_short.log new file mode 100644 index 00000000000..918eb38b96f --- /dev/null +++ b/src/utils/LogCompilation/src/test/resources/no_tiered_short.log @@ -0,0 +1,140 @@ + + + + +Java HotSpot(TM) 64-Bit Server VM + + +11+28 + + +Java HotSpot(TM) 64-Bit Server VM (11+28) for linux-amd64 JRE (11+28), built on Aug 22 2018 18:51:59 by "mach5one" with gcc 7.3.0 + + + + +-XX:-TieredCompilation -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation + +target/LogCompilation-1.0-SNAPSHOT.jar + + +SUN_STANDARD + + +java.vm.specification.name=Java Virtual Machine Specification +java.vm.version=11+28 +java.vm.name=Java HotSpot(TM) 64-Bit Server VM +jdk.debug=release +sun.boot.library.path=/opt/jdk-11/lib +java.library.path=/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib +java.home=/opt/jdk-11 +java.class.path=target/LogCompilation-1.0-SNAPSHOT.jar +jdk.boot.class.path.append= +java.vm.info=mixed mode, aot, sharing +java.vm.specification.vendor=Oracle Corporation +java.vm.specification.version=11 +java.vm.vendor=Oracle Corporation +sun.java.command=target/LogCompilation-1.0-SNAPSHOT.jar +sun.java.launcher=SUN_STANDARD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/utils/LogCompilation/src/test/resources/tiered_short.log b/src/utils/LogCompilation/src/test/resources/tiered_short.log new file mode 100644 index 00000000000..4ead4ec2ba4 --- /dev/null +++ b/src/utils/LogCompilation/src/test/resources/tiered_short.log @@ -0,0 +1,4999 @@ + + + + +Java HotSpot(TM) 64-Bit Server VM + + +11+28 + + +Java HotSpot(TM) 64-Bit Server VM (11+28) for linux-amd64 JRE (11+28), built on Aug 22 2018 18:51:59 by "mach5one" with gcc 7.3.0 + + + + +-XX:+TieredCompilation -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation + +target/LogCompilation-1.0-SNAPSHOT.jar + + +SUN_STANDARD + + +java.vm.specification.name=Java Virtual Machine Specification +java.vm.version=11+28 +java.vm.name=Java HotSpot(TM) 64-Bit Server VM +jdk.debug=release +sun.boot.library.path=/opt/jdk-11/lib +java.library.path=/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib +java.home=/opt/jdk-11 +java.class.path=target/LogCompilation-1.0-SNAPSHOT.jar +jdk.boot.class.path.append= +java.vm.info=mixed mode, aot, sharing +java.vm.specification.vendor=Oracle Corporation +java.vm.specification.version=11 +java.vm.vendor=Oracle Corporation +sun.java.command=target/LogCompilation-1.0-SNAPSHOT.jar +sun.java.launcher=SUN_STANDARD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/hotspot/gtest/gc/g1/test_heapRegion.cpp b/test/hotspot/gtest/gc/g1/test_heapRegion.cpp index 00649f97c37..ce636f05b00 100644 --- a/test/hotspot/gtest/gc/g1/test_heapRegion.cpp +++ b/test/hotspot/gtest/gc/g1/test_heapRegion.cpp @@ -28,7 +28,7 @@ #include "gc/g1/heapRegion.inline.hpp" #include "gc/shared/referenceProcessor.hpp" #include "runtime/interfaceSupport.inline.hpp" -#include "runtime/vm_operations.hpp" +#include "runtime/vmOperations.hpp" #include "runtime/vmThread.hpp" #include "unittest.hpp" diff --git a/test/hotspot/gtest/gc/shared/test_oopStorage.cpp b/test/hotspot/gtest/gc/shared/test_oopStorage.cpp index 1bd22abb0a1..7cf6d6cbb7e 100644 --- a/test/hotspot/gtest/gc/shared/test_oopStorage.cpp +++ b/test/hotspot/gtest/gc/shared/test_oopStorage.cpp @@ -34,7 +34,7 @@ #include "runtime/mutex.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/thread.hpp" -#include "runtime/vm_operations.hpp" +#include "runtime/vmOperations.hpp" #include "runtime/vmThread.hpp" #include "utilities/align.hpp" #include "utilities/ostream.hpp" diff --git a/test/hotspot/gtest/gc/shared/test_oopStorage_parperf.cpp b/test/hotspot/gtest/gc/shared/test_oopStorage_parperf.cpp index 76557316913..d4e24ac415c 100644 --- a/test/hotspot/gtest/gc/shared/test_oopStorage_parperf.cpp +++ b/test/hotspot/gtest/gc/shared/test_oopStorage_parperf.cpp @@ -32,7 +32,7 @@ #include "runtime/interfaceSupport.inline.hpp" #include "runtime/os.hpp" #include "runtime/thread.hpp" -#include "runtime/vm_operations.hpp" +#include "runtime/vmOperations.hpp" #include "runtime/vmThread.hpp" #include "utilities/debug.hpp" #include "utilities/ostream.hpp" diff --git a/test/hotspot/gtest/threadHelper.inline.hpp b/test/hotspot/gtest/threadHelper.inline.hpp index 93543c9bc89..b166d8c3f69 100644 --- a/test/hotspot/gtest/threadHelper.inline.hpp +++ b/test/hotspot/gtest/threadHelper.inline.hpp @@ -28,7 +28,7 @@ #include "runtime/semaphore.hpp" #include "runtime/thread.hpp" #include "runtime/vmThread.hpp" -#include "runtime/vm_operations.hpp" +#include "runtime/vmOperations.hpp" #include "unittest.hpp" class VM_StopSafepoint : public VM_Operation { diff --git a/test/hotspot/gtest/utilities/test_concurrentHashtable.cpp b/test/hotspot/gtest/utilities/test_concurrentHashtable.cpp index 06fd03dbf53..ad67deccbda 100644 --- a/test/hotspot/gtest/utilities/test_concurrentHashtable.cpp +++ b/test/hotspot/gtest/utilities/test_concurrentHashtable.cpp @@ -26,7 +26,7 @@ #include "runtime/semaphore.hpp" #include "runtime/thread.hpp" #include "runtime/vmThread.hpp" -#include "runtime/vm_operations.hpp" +#include "runtime/vmOperations.hpp" #include "utilities/concurrentHashTable.inline.hpp" #include "utilities/concurrentHashTableTasks.inline.hpp" #include "threadHelper.inline.hpp" diff --git a/test/hotspot/jtreg/ProblemList-graal.txt b/test/hotspot/jtreg/ProblemList-graal.txt index b8c310892d8..1b7f143323d 100644 --- a/test/hotspot/jtreg/ProblemList-graal.txt +++ b/test/hotspot/jtreg/ProblemList-graal.txt @@ -165,8 +165,6 @@ org.graalvm.compiler.debug.test.DebugContextTest 8203504 org.graalvm.compiler.hotspot.test.GraalOSRTest 8206947 org.graalvm.compiler.hotspot.test.ReservedStackAccessTest 8213567 windows-all -org.graalvm.compiler.hotspot.test.BigIntegerIntrinsicsTest 8213556 org.graalvm.compiler.replacements.test.StringCompressInflateTest 8213556 -org.graalvm.compiler.replacements.test.SubstitutionNodeSourcePositionTest 8213556 org.graalvm.compiler.debug.test.TimerKeyTest 8213598 diff --git a/test/hotspot/jtreg/TEST.ROOT b/test/hotspot/jtreg/TEST.ROOT index fc2e655d1bc..daf22c86825 100644 --- a/test/hotspot/jtreg/TEST.ROOT +++ b/test/hotspot/jtreg/TEST.ROOT @@ -46,6 +46,7 @@ requires.properties= \ vm.gc.Serial \ vm.gc.Parallel \ vm.gc.ConcMarkSweep \ + vm.gc.Shenandoah \ vm.gc.Epsilon \ vm.gc.Z \ vm.jvmci \ diff --git a/test/hotspot/jtreg/TEST.groups b/test/hotspot/jtreg/TEST.groups index 60cce5aa5f2..c9c7db8fdd2 100644 --- a/test/hotspot/jtreg/TEST.groups +++ b/test/hotspot/jtreg/TEST.groups @@ -168,26 +168,34 @@ tier1_gc = \ :tier1_gc_1 \ :tier1_gc_2 \ :tier1_gc_gcold \ - :tier1_gc_gcbasher + :tier1_gc_gcbasher \ + :tier1_gc_shenandoah hotspot_not_fast_gc = \ :hotspot_gc \ -:tier1_gc tier1_gc_1 = \ - gc/epsilon/ \ + :gc_epsilon \ gc/g1/ \ -gc/g1/ihop/TestIHOPErgo.java + -gc/g1/TestTimelyCompaction.java tier1_gc_2 = \ gc/ \ - -gc/epsilon/ \ + -:gc_epsilon \ -gc/g1/ \ -gc/logging/TestUnifiedLoggingSwitchStress.java \ -gc/stress \ -gc/survivorAlignment/TestPromotionFromSurvivorToTenuredAfterMinorGC.java \ -gc/cms/TestMBeanCMS.java \ - -gc/metaspace/CompressedClassSpaceSizeInJmapHeap.java + -gc/metaspace/CompressedClassSpaceSizeInJmapHeap.java \ + -gc/shenandoah + +gc_epsilon = \ + gc/epsilon/ \ + gc/CriticalNativeArgs.java \ + gc/stress/CriticalNativeStress.java tier1_gc_gcold = \ gc/stress/gcold/TestGCOldWithG1.java \ @@ -200,6 +208,52 @@ tier1_gc_gcbasher = \ gc/stress/gcbasher/TestGCBasherWithCMS.java \ gc/stress/gcbasher/TestGCBasherWithSerial.java \ gc/stress/gcbasher/TestGCBasherWithParallel.java + +tier1_gc_shenandoah = \ + gc/shenandoah/options/ \ + gc/shenandoah/compiler/ \ + gc/shenandoah/mxbeans/ \ + gc/shenandoah/TestSmallHeap.java \ + gc/shenandoah/oom/ \ + gc/CriticalNativeArgs.java + +tier2_gc_shenandoah = \ + runtime/MemberName/MemberNameLeak.java \ + runtime/CompressedOops/UseCompressedOops.java \ + gc/TestHumongousReferenceObject.java \ + gc/TestSystemGC.java \ + gc/arguments/TestDisableDefaultGC.java \ + gc/arguments/TestUseCompressedOopsErgo.java \ + gc/arguments/TestAlignmentToUseLargePages.java \ + gc/class_unloading/TestClassUnloadingDisabled.java \ + gc/ergonomics/TestInitialGCThreadLogging.java \ + gc/ergonomics/TestDynamicNumberOfGCThreads.java \ + gc/logging/TestGCId.java \ + gc/metaspace/TestMetaspacePerfCounters.java \ + gc/metaspace/TestMetaspacePerfCounters.java \ + gc/startup_warnings/TestShenandoah.java \ + gc/TestFullGCALot.java \ + gc/logging/TestUnifiedLoggingSwitchStress.java \ + runtime/Metaspace/DefineClass.java \ + gc/shenandoah/ \ + serviceability/sa/TestHeapDumpForInvokeDynamic.java \ + -gc/shenandoah/TestStringDedupStress.java \ + -gc/stress/CriticalNativeStress.java \ + -:tier1_gc_shenandoah + +tier3_gc_shenandoah = \ + gc/stress/gcold/TestGCOldWithShenandoah.java \ + gc/stress/gcbasher/TestGCBasherWithShenandoah.java \ + gc/stress/gclocker/TestGCLockerWithShenandoah.java \ + gc/stress/systemgc/TestSystemGCWithShenandoah.java \ + gc/shenandoah/TestStringDedupStress.java \ + gc/stress/CriticalNativeStress.java \ + -:tier2_gc_shenandoah + +hotspot_gc_shenandoah = \ + :tier1_gc_shenandoah \ + :tier2_gc_shenandoah \ + :tier3_gc_shenandoah tier1_runtime = \ runtime/ \ diff --git a/test/hotspot/jtreg/applications/ctw/modules/jdk_jfr.java b/test/hotspot/jtreg/applications/ctw/modules/jdk_jfr.java new file mode 100644 index 00000000000..615d51dc3cd --- /dev/null +++ b/test/hotspot/jtreg/applications/ctw/modules/jdk_jfr.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary run CTW for all classes from jdk.jfr module + * + * @library /test/lib / /testlibrary/ctw/src + * @modules java.base/jdk.internal.access + * java.base/jdk.internal.jimage + * java.base/jdk.internal.misc + * java.base/jdk.internal.reflect + * @modules jdk.jfr + * + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:jdk.jfr + */ diff --git a/test/hotspot/jtreg/applications/ctw/modules/jdk_management_jfr.java b/test/hotspot/jtreg/applications/ctw/modules/jdk_management_jfr.java new file mode 100644 index 00000000000..0f0dff9649e --- /dev/null +++ b/test/hotspot/jtreg/applications/ctw/modules/jdk_management_jfr.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary run CTW for all classes from jdk.management.jfr module + * + * @library /test/lib / /testlibrary/ctw/src + * @modules java.base/jdk.internal.access + * java.base/jdk.internal.jimage + * java.base/jdk.internal.misc + * java.base/jdk.internal.reflect + * @modules jdk.management.jfr + * + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:jdk.management.jfr + */ diff --git a/test/hotspot/jtreg/compiler/c2/aarch64/TestVolatiles.java b/test/hotspot/jtreg/compiler/c2/aarch64/TestVolatiles.java index 72e0312518e..f34fe50ef88 100644 --- a/test/hotspot/jtreg/compiler/c2/aarch64/TestVolatiles.java +++ b/test/hotspot/jtreg/compiler/c2/aarch64/TestVolatiles.java @@ -39,7 +39,9 @@ * CMS, * CMSCondMark, * Serial, - * Parallel} + * Parallel, + * Shenandoah, + * ShenandoahTraversal} */ @@ -100,6 +102,19 @@ public class TestVolatiles { procArgs[argcount - 3] = "-XX:+UseConcMarkSweepGC"; procArgs[argcount - 2] = "-XX:+UseCondCardMark"; break; + case "Shenandoah": + argcount = 10; + procArgs = new String[argcount]; + procArgs[argcount - 3] = "-XX:+UnlockExperimentalVMOptions"; + procArgs[argcount - 2] = "-XX:+UseShenandoahGC"; + break; + case "ShenandoahTraversal": + argcount = 11; + procArgs = new String[argcount]; + procArgs[argcount - 4] = "-XX:+UnlockExperimentalVMOptions"; + procArgs[argcount - 3] = "-XX:+UseShenandoahGC"; + procArgs[argcount - 2] = "-XX:ShenandoahGCHeuristics=traversal"; + break; default: throw new RuntimeException("unexpected test type " + testType); } @@ -355,6 +370,17 @@ public class TestVolatiles { "ret" }; break; + case "Shenandoah": + case "ShenandoahTraversal": + // Shenandoah generates normal object graphs for + // volatile stores + matches = new String[] { + "membar_release \\(elided\\)", + useCompressedOops ? "stlrw?" : "stlr", + "membar_volatile \\(elided\\)", + "ret" + }; + break; } } else { switch (testType) { @@ -418,6 +444,20 @@ public class TestVolatiles { "ret" }; break; + + case "Shenandoah": + case "ShenandoahTraversal": + // Shenandoah generates normal object graphs for + // volatile stores + matches = new String[] { + "membar_release", + "dmb ish", + useCompressedOops ? "strw?" : "str", + "membar_volatile", + "dmb ish", + "ret" + }; + break; } } @@ -520,6 +560,17 @@ public class TestVolatiles { "ret" }; break; + case "Shenandoah": + case "ShenandoahTraversal": + // For volatile CAS, Shenanodoah generates normal + // graphs with a shenandoah-specific cmpxchg + matches = new String[] { + "membar_release \\(elided\\)", + useCompressedOops ? "cmpxchgw?_acq_shenandoah" : "cmpxchg_acq_shenandoah", + "membar_acquire \\(elided\\)", + "ret" + }; + break; } } else { switch (testType) { @@ -583,6 +634,19 @@ public class TestVolatiles { "ret" }; break; + case "Shenandoah": + case "ShenandoahTraversal": + // For volatile CAS, Shenanodoah generates normal + // graphs with a shenandoah-specific cmpxchg + matches = new String[] { + "membar_release", + "dmb ish", + useCompressedOops ? "cmpxchgw?_shenandoah" : "cmpxchg_shenandoah", + "membar_acquire", + "dmb ish", + "ret" + }; + break; } } @@ -701,6 +765,17 @@ public class TestVolatiles { "ret" }; break; + case "Shenandoah": + case "ShenandoahTraversal": + // For volatile CAS, Shenanodoah generates normal + // graphs with a shenandoah-specific cmpxchg + matches = new String[] { + "membar_release \\(elided\\)", + useCompressedOops ? "cmpxchgw?_acq_shenandoah" : "cmpxchg_acq_shenandoah", + "membar_acquire \\(elided\\)", + "ret" + }; + break; } } else { switch (testType) { @@ -764,6 +839,19 @@ public class TestVolatiles { "ret" }; break; + case "Shenandoah": + case "ShenandoahTraversal": + // For volatile CAS, Shenanodoah generates normal + // graphs with a shenandoah-specific cmpxchg + matches = new String[] { + "membar_release", + "dmb ish", + useCompressedOops ? "cmpxchgw?_shenandoah" : "cmpxchg_shenandoah", + "membar_acquire", + "dmb ish", + "ret" + }; + break; } } @@ -862,6 +950,15 @@ public class TestVolatiles { "ret" }; break; + case "Shenandoah": + case "ShenandoahTraversal": + matches = new String[] { + "membar_release \\(elided\\)", + useCompressedOops ? "atomic_xchgw?_acq" : "atomic_xchg_acq", + "membar_acquire \\(elided\\)", + "ret" + }; + break; } } else { switch (testType) { @@ -925,6 +1022,17 @@ public class TestVolatiles { "ret" }; break; + case "Shenandoah": + case "ShenandoahTraversal": + matches = new String[] { + "membar_release", + "dmb ish", + useCompressedOops ? "atomic_xchgw? " : "atomic_xchg ", + "membar_acquire", + "dmb ish", + "ret" + }; + break; } } diff --git a/test/hotspot/jtreg/compiler/c2/aarch64/TestVolatilesShenandoah.java b/test/hotspot/jtreg/compiler/c2/aarch64/TestVolatilesShenandoah.java new file mode 100644 index 00000000000..7af8ad11a19 --- /dev/null +++ b/test/hotspot/jtreg/compiler/c2/aarch64/TestVolatilesShenandoah.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary C2 should use ldar, stlr and ldaxr+stlxr insns for volatile operations + * @library /test/lib / + * + * @modules java.base/jdk.internal.misc + * + * @requires os.arch=="aarch64" & vm.debug == true & + * vm.flavor == "server" & !vm.graal.enabled & + * vm.gc.Shenandoah + * + * @build compiler.c2.aarch64.TestVolatiles + * compiler.c2.aarch64.TestVolatileLoad + * compiler.c2.aarch64.TestUnsafeVolatileLoad + * compiler.c2.aarch64.TestVolatileStore + * compiler.c2.aarch64.TestUnsafeVolatileStore + * compiler.c2.aarch64.TestUnsafeVolatileCAS + * compiler.c2.aarch64.TestUnsafeVolatileWeakCAS + * compiler.c2.aarch64.TestUnsafeVolatileCAE + * compiler.c2.aarch64.TestUnsafeVolatileGAS + * compiler.c2.aarch64.TestUnsafeVolatileGAA + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestVolatileLoad Shenandoah + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestVolatileStore Shenandoah + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileLoad Shenandoah + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileStore Shenandoah + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileCAS Shenandoah + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileWeakCAS Shenandoah + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileCAE Shenandoah + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileGAS Shenandoah + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileGAA Shenandoah + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestVolatileLoad ShenandoahTraversal + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestVolatileStore ShenandoahTraversal + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileLoad ShenandoahTraversal + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileStore ShenandoahTraversal + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileCAS ShenandoahTraversal + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileWeakCAS ShenandoahTraversal + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileCAE ShenandoahTraversal + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileGAS ShenandoahTraversal + * + * @run driver compiler.c2.aarch64.TestVolatilesShenandoah + * TestUnsafeVolatileGAA ShenandoahTraversal + * + */ + +package compiler.c2.aarch64; + +public class TestVolatilesShenandoah { + public static void main(String args[]) throws Throwable + { + // delegate work to shared code + new TestVolatiles().runtest(args[0], args[1]); + } +} diff --git a/test/hotspot/jtreg/compiler/graalunit/TestPackages.txt b/test/hotspot/jtreg/compiler/graalunit/TestPackages.txt index a0894f18c35..d4e99587faa 100644 --- a/test/hotspot/jtreg/compiler/graalunit/TestPackages.txt +++ b/test/hotspot/jtreg/compiler/graalunit/TestPackages.txt @@ -20,7 +20,6 @@ Options org.graalvm.compiler.options.test PhasesCommon org.graalvm.compiler.phases.common.test Replacements org.graalvm.compiler.replacements.test Replacements9 org.graalvm.compiler.replacements.jdk9.test -Replacements9_11 org.graalvm.compiler.replacements.jdk9_11.test Replacements12 org.graalvm.compiler.replacements.jdk12.test Util org.graalvm.util.test JttBackend org.graalvm.compiler.jtt.backend diff --git a/test/hotspot/jtreg/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java b/test/hotspot/jtreg/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java index 43bb5612a0c..f257c3e3ac7 100644 --- a/test/hotspot/jtreg/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java +++ b/test/hotspot/jtreg/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java @@ -49,6 +49,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.lang.annotation.Annotation; +import java.lang.invoke.MethodHandles.Lookup; import java.lang.reflect.AccessibleObject; import java.lang.reflect.Constructor; import java.lang.reflect.Field; @@ -764,6 +765,9 @@ public class TestResolvedJavaType extends TypeUniverse { if (f.getDeclaringClass().equals(metaAccess.lookupJavaType(Class.class)) && f.getName().equals("classLoader")) { return true; } + if (f.getDeclaringClass().equals(metaAccess.lookupJavaType(Lookup.class))) { + return f.getName().equals("allowedModes") || f.getName().equals("lookupClass"); + } if (f.getDeclaringClass().equals(metaAccess.lookupJavaType(ClassLoader.class)) || f.getDeclaringClass().equals(metaAccess.lookupJavaType(AccessibleObject.class)) || f.getDeclaringClass().equals(metaAccess.lookupJavaType(Constructor.class)) || diff --git a/test/hotspot/jtreg/gc/CriticalNativeArgs.java b/test/hotspot/jtreg/gc/CriticalNativeArgs.java new file mode 100644 index 00000000000..1889501167c --- /dev/null +++ b/test/hotspot/jtreg/gc/CriticalNativeArgs.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. and/or its affiliates. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + + +/* + * @test CriticalNativeStressEpsilon + * @key gc + * @bug 8199868 + * @requires (os.arch =="x86_64" | os.arch == "amd64") & vm.gc.Epsilon & !vm.graal.enabled + * @summary test argument unpacking nmethod wrapper of critical native method + * @run main/othervm/native -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xcomp -Xmx256M -XX:+CriticalJNINatives CriticalNativeArgs + */ + +/* + * @test CriticalNativeStressShenandoah + * @key gc + * @bug 8199868 + * @requires (os.arch =="x86_64" | os.arch == "amd64") & vm.gc.Shenandoah & !vm.graal.enabled + * @summary test argument unpacking nmethod wrapper of critical native method + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -Xcomp -Xmx512M -XX:+CriticalJNINatives CriticalNativeArgs + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -Xcomp -Xmx512M -XX:+CriticalJNINatives CriticalNativeArgs + * + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive -Xcomp -Xmx512M -XX:+CriticalJNINatives CriticalNativeArgs + * + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xcomp -Xmx256M -XX:+CriticalJNINatives CriticalNativeArgs + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCHeuristics=traversal -Xcomp -Xmx512M -XX:+CriticalJNINatives CriticalNativeArgs + */ +public class CriticalNativeArgs { + static { + System.loadLibrary("CriticalNative"); + } + + static native boolean isNull(int[] a); + + public static void main(String[] args) { + int[] arr = new int[2]; + + if (isNull(arr)) { + throw new RuntimeException("Should not be null"); + } + + if (!isNull(null)) { + throw new RuntimeException("Should be null"); + } + } +} diff --git a/test/hotspot/jtreg/gc/TestFullGCCount.java b/test/hotspot/jtreg/gc/TestFullGCCount.java index 416b18a189d..decde82bd88 100644 --- a/test/hotspot/jtreg/gc/TestFullGCCount.java +++ b/test/hotspot/jtreg/gc/TestFullGCCount.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,9 @@ * @test TestFullGCCount.java * @bug 7072527 * @summary CMS: JMM GC counters overcount in some cases - * @requires !(vm.gc.ConcMarkSweep & vm.opt.ExplicitGCInvokesConcurrent == true) + * @requires !(vm.gc == "ConcMarkSweep" & vm.opt.ExplicitGCInvokesConcurrent == true) + * @comment Shenandoah has "ExplicitGCInvokesConcurrent" on by default + * @requires !(vm.gc == "Shenandoah" & vm.opt.ExplicitGCInvokesConcurrent != false) * @modules java.management * @run main/othervm -Xlog:gc TestFullGCCount */ diff --git a/test/hotspot/jtreg/gc/TestHumongousReferenceObject.java b/test/hotspot/jtreg/gc/TestHumongousReferenceObject.java index 3ef0181c4b9..2b0a0361020 100644 --- a/test/hotspot/jtreg/gc/TestHumongousReferenceObject.java +++ b/test/hotspot/jtreg/gc/TestHumongousReferenceObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,16 @@ import jdk.internal.vm.annotation.Contended; * @run main/othervm -XX:+EnableContended -XX:-RestrictContended -Xmx128m -XX:+UseG1GC -XX:G1HeapRegionSize=4M -XX:ContendedPaddingWidth=8192 TestHumongousReferenceObject * @run main/othervm -XX:+EnableContended -XX:-RestrictContended -Xmx128m -XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:ContendedPaddingWidth=8192 TestHumongousReferenceObject */ + +/* + * @test TestHumongousReferenceObjectShenandoah + * @summary Test that verifies that iteration over large, plain Java objects, that potentially cross region boundaries, with references in them works. + * @requires vm.gc.Shenandoah + * @bug 8151499 8153734 + * @modules java.base/jdk.internal.vm.annotation + * @run main/othervm -XX:+EnableContended -XX:-RestrictContended -Xmx128m -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahHeapRegionSize=8M -XX:ContendedPaddingWidth=8192 TestHumongousReferenceObject + * @run main/othervm -XX:+EnableContended -XX:-RestrictContended -Xmx128m -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahHeapRegionSize=8M -XX:ContendedPaddingWidth=8192 -XX:+UnlockDiagnosticVMOptions -XX:+ShenandoahVerify TestHumongousReferenceObject + */ public class TestHumongousReferenceObject { /* diff --git a/test/hotspot/jtreg/gc/TestSystemGC.java b/test/hotspot/jtreg/gc/TestSystemGC.java index 93a81a5dc22..f3b530edd64 100644 --- a/test/hotspot/jtreg/gc/TestSystemGC.java +++ b/test/hotspot/jtreg/gc/TestSystemGC.java @@ -45,6 +45,14 @@ * @run main/othervm -XX:+UseConcMarkSweepGC -XX:+ExplicitGCInvokesConcurrent TestSystemGC */ +/* + * @test TestSystemGCShenandoah + * @key gc + * @requires vm.gc.Shenandoah & !vm.graal.enabled + * @summary Runs System.gc() with different flags. + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC TestSystemGC + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ExplicitGCInvokesConcurrent TestSystemGC + */ public class TestSystemGC { public static void main(String args[]) throws Exception { System.gc(); diff --git a/test/hotspot/jtreg/gc/arguments/TestAlignmentToUseLargePages.java b/test/hotspot/jtreg/gc/arguments/TestAlignmentToUseLargePages.java index 742619bb8d3..042cd578aac 100644 --- a/test/hotspot/jtreg/gc/arguments/TestAlignmentToUseLargePages.java +++ b/test/hotspot/jtreg/gc/arguments/TestAlignmentToUseLargePages.java @@ -48,6 +48,16 @@ * @run main/othervm -Xms71M -Xmx91M -XX:+UseConcMarkSweepGC -XX:-UseLargePages TestAlignmentToUseLargePages */ +/** + * @test TestAlignmentToUseLargePagesShenandoah + * @key gc + * @bug 8024396 + * @comment Graal does not support Shenandoah + * @requires vm.gc.Shenandoah & !vm.graal.enabled + * @run main/othervm -Xms71M -Xmx91M -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseLargePages TestAlignmentToUseLargePages + * @run main/othervm -Xms71M -Xmx91M -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:-UseLargePages TestAlignmentToUseLargePages + */ + public class TestAlignmentToUseLargePages { public static void main(String args[]) throws Exception { // nothing to do diff --git a/test/hotspot/jtreg/gc/arguments/TestDisableDefaultGC.java b/test/hotspot/jtreg/gc/arguments/TestDisableDefaultGC.java index 6eef55b825f..ed856e2da92 100644 --- a/test/hotspot/jtreg/gc/arguments/TestDisableDefaultGC.java +++ b/test/hotspot/jtreg/gc/arguments/TestDisableDefaultGC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,6 +44,7 @@ public class TestDisableDefaultGC { "-XX:-UseG1GC", "-XX:-UseConcMarkSweepGC", "-XX:+UnlockExperimentalVMOptions", + "-XX:-UseShenandoahGC", "-XX:-UseZGC", "-version"); OutputAnalyzer output = new OutputAnalyzer(pb.start()); diff --git a/test/hotspot/jtreg/gc/arguments/TestMaxMinHeapFreeRatioFlags.java b/test/hotspot/jtreg/gc/arguments/TestMaxMinHeapFreeRatioFlags.java index ffab16ca723..0e6bfa86976 100644 --- a/test/hotspot/jtreg/gc/arguments/TestMaxMinHeapFreeRatioFlags.java +++ b/test/hotspot/jtreg/gc/arguments/TestMaxMinHeapFreeRatioFlags.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ * @test TestMaxMinHeapFreeRatioFlags * @key gc * @summary Verify that heap size changes according to max and min heap free ratios. - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/gc/arguments/TestNewRatioFlag.java b/test/hotspot/jtreg/gc/arguments/TestNewRatioFlag.java index aa128408346..ced3b50c900 100644 --- a/test/hotspot/jtreg/gc/arguments/TestNewRatioFlag.java +++ b/test/hotspot/jtreg/gc/arguments/TestNewRatioFlag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ * @key gc * @bug 8025166 * @summary Verify that heap devided among generations according to NewRatio - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/gc/arguments/TestNewSizeFlags.java b/test/hotspot/jtreg/gc/arguments/TestNewSizeFlags.java index 1c7af6a2aae..fd399310b4a 100644 --- a/test/hotspot/jtreg/gc/arguments/TestNewSizeFlags.java +++ b/test/hotspot/jtreg/gc/arguments/TestNewSizeFlags.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ * @key gc * @bug 8025166 * @summary Verify that young gen size conforms values specified by NewSize, MaxNewSize and Xmn options - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/gc/arguments/TestShrinkHeapInSteps.java b/test/hotspot/jtreg/gc/arguments/TestShrinkHeapInSteps.java index 494fab9f4e4..53d083b5e36 100644 --- a/test/hotspot/jtreg/gc/arguments/TestShrinkHeapInSteps.java +++ b/test/hotspot/jtreg/gc/arguments/TestShrinkHeapInSteps.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ * @test TestShrinkHeapInSteps * @key gc * @summary Verify that -XX:-ShrinkHeapInSteps works properly. - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/gc/arguments/TestSurvivorRatioFlag.java b/test/hotspot/jtreg/gc/arguments/TestSurvivorRatioFlag.java index e98f8fe740e..b45620003b9 100644 --- a/test/hotspot/jtreg/gc/arguments/TestSurvivorRatioFlag.java +++ b/test/hotspot/jtreg/gc/arguments/TestSurvivorRatioFlag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ * @test TestSurvivorRatioFlag * @key gc * @summary Verify that actual survivor ratio is equal to specified SurvivorRatio value - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/gc/arguments/TestTargetSurvivorRatioFlag.java b/test/hotspot/jtreg/gc/arguments/TestTargetSurvivorRatioFlag.java index 9a240d4f8cb..b3a248a7280 100644 --- a/test/hotspot/jtreg/gc/arguments/TestTargetSurvivorRatioFlag.java +++ b/test/hotspot/jtreg/gc/arguments/TestTargetSurvivorRatioFlag.java @@ -27,7 +27,7 @@ * @summary Verify that option TargetSurvivorRatio affects survivor space occupancy after minor GC. * @requires vm.opt.ExplicitGCInvokesConcurrent != true * @requires vm.opt.UseJVMCICompiler != true - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/gc/arguments/TestUseCompressedOopsErgo.java b/test/hotspot/jtreg/gc/arguments/TestUseCompressedOopsErgo.java index 2c4fd806b1a..106acb5c041 100644 --- a/test/hotspot/jtreg/gc/arguments/TestUseCompressedOopsErgo.java +++ b/test/hotspot/jtreg/gc/arguments/TestUseCompressedOopsErgo.java @@ -54,6 +54,21 @@ * @run main/othervm TestUseCompressedOopsErgo -XX:+UseConcMarkSweepGC */ +/* + * @test TestUseCompressedOopsErgoShenandoah + * @key gc + * @bug 8010722 + * @comment Graal does not support Shenandoah + * @requires vm.gc.Shenandoah & !vm.graal.enabled + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management/sun.management + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm TestUseCompressedOopsErgo -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC + */ + public class TestUseCompressedOopsErgo { public static void main(String args[]) throws Exception { diff --git a/test/hotspot/jtreg/gc/arguments/TestVerifyBeforeAndAfterGCFlags.java b/test/hotspot/jtreg/gc/arguments/TestVerifyBeforeAndAfterGCFlags.java index 21c32afbb0a..628b5faba84 100644 --- a/test/hotspot/jtreg/gc/arguments/TestVerifyBeforeAndAfterGCFlags.java +++ b/test/hotspot/jtreg/gc/arguments/TestVerifyBeforeAndAfterGCFlags.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,7 @@ * @summary Runs an simple application (GarbageProducer) with various combinations of -XX:{+|-}Verify{After|Before}GC flags and checks that output contain or doesn't contain expected patterns - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @modules java.base/jdk.internal.misc * @modules java.management * @library /test/lib diff --git a/test/hotspot/jtreg/gc/class_unloading/TestClassUnloadingDisabled.java b/test/hotspot/jtreg/gc/class_unloading/TestClassUnloadingDisabled.java index 4c1c0a302bd..cb99e5d6945 100644 --- a/test/hotspot/jtreg/gc/class_unloading/TestClassUnloadingDisabled.java +++ b/test/hotspot/jtreg/gc/class_unloading/TestClassUnloadingDisabled.java @@ -64,6 +64,24 @@ * -XX:-ClassUnloading -XX:+UseConcMarkSweepGC TestClassUnloadingDisabled */ +/* + * @test TestClassUnloadingDisabledShenandoah + * @key gc + * @bug 8114823 + * @comment Graal does not support Shenandoah + * @requires vm.gc.Shenandoah & !vm.graal.enabled + * @requires vm.opt.ExplicitGCInvokesConcurrent != true + * @requires vm.opt.ClassUnloading != true + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * -XX:-ClassUnloading -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC TestClassUnloadingDisabled + */ + import java.io.File; import java.io.IOException; import java.nio.file.Files; diff --git a/test/hotspot/jtreg/gc/epsilon/CriticalNativeStress.java b/test/hotspot/jtreg/gc/epsilon/CriticalNativeStress.java deleted file mode 100644 index d7d8dc5d002..00000000000 --- a/test/hotspot/jtreg/gc/epsilon/CriticalNativeStress.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (c) 2018, Red Hat, Inc. and/or its affiliates. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -import java.util.Random; - -/* - * @test CriticalNativeStress - * @key gc - * @bug 8199868 - * @requires (os.arch =="x86_64" | os.arch == "amd64") & (vm.bits == "64") & vm.gc.Epsilon & !vm.graal.enabled - * @summary test argument pinning by nmethod wrapper of critical native method - * @run main/othervm/native -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xcomp -Xmx1G -XX:+CriticalJNINatives CriticalNativeStress - */ -public class CriticalNativeStress { - private static Random rand = new Random(); - static { - System.loadLibrary("CriticalNative"); - } - - // CYCLES and THREAD_PER_CASE are used to tune the tests for different GC settings, - // so that they can execrise enough GC cycles and not OOM - private static int CYCLES = Integer.getInteger("cycles", 3); - private static int THREAD_PER_CASE = Integer.getInteger("threadPerCase", 1); - - static native long sum1(long[] a); - - // More than 6 parameters - static native long sum2(long a1, int[] a2, int[] a3, long[] a4, int[] a5); - - static long sum(long[] a) { - long sum = 0; - for (int index = 0; index < a.length; index ++) { - sum += a[index]; - } - return sum; - } - - static long sum(int[] a) { - long sum = 0; - for (int index = 0; index < a.length; index ++) { - sum += a[index]; - } - return sum; - } - - private static volatile String garbage_array[]; - - // GC potentially moves arrays passed to critical native methods - // if they are not pinned correctly. - // Create enough garbages to exercise GC cycles, verify - // the arrays are pinned correctly. - static void create_garbage(int len) { - len = Math.max(len, 1024); - String array[] = new String[len]; - for (int index = 0; index < len; index ++) { - array[index] = "String " + index; - } - garbage_array = array; - } - - // Two test cases with different method signatures: - // Tests generate arbitrary length of arrays with - // arbitrary values, then calcuate sum of the array - // elements with critical native JNI methods and java - // methods, and compare the results for correctness. - static void run_test_case1() { - // Create testing arary with arbitrary length and - // values - int length = rand.nextInt(50) + 1; - long[] arr = new long[length]; - for (int index = 0; index < length; index ++) { - arr[index] = rand.nextLong() % 1002; - } - - // Generate garbages to trigger GCs - for (int index = 0; index < length; index ++) { - create_garbage(index); - } - - // Compare results for correctness. - long native_sum = sum1(arr); - long java_sum = sum(arr); - if (native_sum != java_sum) { - StringBuffer sb = new StringBuffer("Sums do not match: native = ") - .append(native_sum).append(" java = ").append(java_sum); - - throw new RuntimeException(sb.toString()); - } - } - - static void run_test_case2() { - // Create testing arary with arbitrary length and - // values - int index; - long a1 = rand.nextLong() % 1025; - - int a2_length = rand.nextInt(50) + 1; - int[] a2 = new int[a2_length]; - for (index = 0; index < a2_length; index ++) { - a2[index] = rand.nextInt(106); - } - - int a3_length = rand.nextInt(150) + 1; - int[] a3 = new int[a3_length]; - for (index = 0; index < a3_length; index ++) { - a3[index] = rand.nextInt(3333); - } - - int a4_length = rand.nextInt(200) + 1; - long[] a4 = new long[a4_length]; - for (index = 0; index < a4_length; index ++) { - a4[index] = rand.nextLong() % 122; - } - - int a5_length = rand.nextInt(350) + 1; - int[] a5 = new int[a5_length]; - for (index = 0; index < a5_length; index ++) { - a5[index] = rand.nextInt(333); - } - - // Generate garbages to trigger GCs - for (index = 0; index < a1; index ++) { - create_garbage(index); - } - - // Compare results for correctness. - long native_sum = sum2(a1, a2, a3, a4, a5); - long java_sum = a1 + sum(a2) + sum(a3) + sum(a4) + sum(a5); - if (native_sum != java_sum) { - StringBuffer sb = new StringBuffer("Sums do not match: native = ") - .append(native_sum).append(" java = ").append(java_sum); - - throw new RuntimeException(sb.toString()); - } - } - - static class Case1Runner extends Thread { - public Case1Runner() { - start(); - } - - public void run() { - for (int index = 0; index < CYCLES; index ++) { - run_test_case1(); - } - } - } - - static class Case2Runner extends Thread { - public Case2Runner() { - start(); - } - - public void run() { - for (int index = 0; index < CYCLES; index ++) { - run_test_case2(); - } - } - } - - public static void main(String[] args) { - Thread[] thrs = new Thread[THREAD_PER_CASE * 2]; - for (int index = 0; index < thrs.length; index = index + 2) { - thrs[index] = new Case1Runner(); - thrs[index + 1] = new Case2Runner(); - } - - for (int index = 0; index < thrs.length; index ++) { - try { - thrs[index].join(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } -} - diff --git a/test/hotspot/jtreg/gc/ergonomics/TestDynamicNumberOfGCThreads.java b/test/hotspot/jtreg/gc/ergonomics/TestDynamicNumberOfGCThreads.java index 5040a9370a8..4fb320020af 100644 --- a/test/hotspot/jtreg/gc/ergonomics/TestDynamicNumberOfGCThreads.java +++ b/test/hotspot/jtreg/gc/ergonomics/TestDynamicNumberOfGCThreads.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,10 +29,14 @@ * @key gc * @modules java.base/jdk.internal.misc * @library /test/lib + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI TestDynamicNumberOfGCThreads */ import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.process.ProcessTools; +import sun.hotspot.gc.GC; public class TestDynamicNumberOfGCThreads { public static void main(String[] args) throws Exception { @@ -42,6 +46,10 @@ public class TestDynamicNumberOfGCThreads { testDynamicNumberOfGCThreads("UseG1GC"); testDynamicNumberOfGCThreads("UseParallelGC"); + + if (GC.Shenandoah.isSupported()) { + testDynamicNumberOfGCThreads("UseShenandoahGC"); + } } private static void verifyDynamicNumberOfGCThreads(OutputAnalyzer output) { @@ -51,7 +59,7 @@ public class TestDynamicNumberOfGCThreads { private static void testDynamicNumberOfGCThreads(String gcFlag) throws Exception { // UseDynamicNumberOfGCThreads and TraceDynamicGCThreads enabled - String[] baseArgs = {"-XX:+" + gcFlag, "-Xmx10M", "-XX:+UseDynamicNumberOfGCThreads", "-Xlog:gc+task=trace", GCTest.class.getName()}; + String[] baseArgs = {"-XX:+UnlockExperimentalVMOptions", "-XX:+" + gcFlag, "-Xmx10M", "-XX:+UseDynamicNumberOfGCThreads", "-Xlog:gc+task=trace", GCTest.class.getName()}; // Base test with gc and +UseDynamicNumberOfGCThreads: ProcessBuilder pb_enabled = ProcessTools.createJavaProcessBuilder(baseArgs); diff --git a/test/hotspot/jtreg/gc/ergonomics/TestInitialGCThreadLogging.java b/test/hotspot/jtreg/gc/ergonomics/TestInitialGCThreadLogging.java index f68e8fa842b..7f2c12e383b 100644 --- a/test/hotspot/jtreg/gc/ergonomics/TestInitialGCThreadLogging.java +++ b/test/hotspot/jtreg/gc/ergonomics/TestInitialGCThreadLogging.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,10 +29,14 @@ * @key gc * @modules java.base/jdk.internal.misc * @library /test/lib + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI TestInitialGCThreadLogging */ import jdk.test.lib.process.ProcessTools; import jdk.test.lib.process.OutputAnalyzer; +import sun.hotspot.gc.GC; public class TestInitialGCThreadLogging { public static void main(String[] args) throws Exception { @@ -42,6 +46,10 @@ public class TestInitialGCThreadLogging { testInitialGCThreadLogging("UseG1GC", "GC Thread"); testInitialGCThreadLogging("UseParallelGC", "ParGC Thread"); + + if (GC.Shenandoah.isSupported()) { + testInitialGCThreadLogging("UseShenandoahGC", "Shenandoah GC Thread"); + } } private static void verifyDynamicNumberOfGCThreads(OutputAnalyzer output, String threadName) { @@ -51,7 +59,7 @@ public class TestInitialGCThreadLogging { private static void testInitialGCThreadLogging(String gcFlag, String threadName) throws Exception { // UseDynamicNumberOfGCThreads and TraceDynamicGCThreads enabled - String[] baseArgs = {"-XX:+" + gcFlag, "-Xmx10M", "-XX:+UseDynamicNumberOfGCThreads", "-Xlog:gc+task=trace", "-version"}; + String[] baseArgs = {"-XX:+UnlockExperimentalVMOptions", "-XX:+" + gcFlag, "-Xmx10M", "-XX:+UseDynamicNumberOfGCThreads", "-Xlog:gc+task=trace", "-version"}; // Base test with gc and +UseDynamicNumberOfGCThreads: ProcessBuilder pb_enabled = ProcessTools.createJavaProcessBuilder(baseArgs); diff --git a/test/hotspot/jtreg/gc/g1/TestPeriodicCollection.java b/test/hotspot/jtreg/gc/g1/TestPeriodicCollection.java new file mode 100644 index 00000000000..0147c126db2 --- /dev/null +++ b/test/hotspot/jtreg/gc/g1/TestPeriodicCollection.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test TestPeriodicCollection + * @requires vm.gc.G1 + * @requires vm.compMode != "Xcomp" + * @summary Verify that heap shrinks when the application is idle. + * @library /test/lib / + * @modules java.base/jdk.internal.misc + * @modules java.management/sun.management + * @run main/othervm -XX:MaxNewSize=32M -XX:InitialHeapSize=48M -Xmx128M -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=25 -XX:+UseG1GC -XX:G1PeriodicGCInterval=3000 -XX:+G1PeriodicGCInvokesConcurrent -Xlog:gc,gc+periodic=debug,gc+ergo+heap=debug TestPeriodicCollection + * @run main/othervm -XX:MaxNewSize=32M -XX:InitialHeapSize=48M -Xmx128M -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=25 -XX:+UseG1GC -XX:G1PeriodicGCInterval=3000 -XX:-G1PeriodicGCInvokesConcurrent -Xlog:gc,gc+periodic=debug,gc+ergo+heap=debug TestPeriodicCollection + */ + +import com.sun.management.HotSpotDiagnosticMXBean; + +import gc.testlibrary.Helpers; + +import java.lang.management.GarbageCollectorMXBean; +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryUsage; +import java.text.NumberFormat; +import static jdk.test.lib.Asserts.*; + +public class TestPeriodicCollection { + + public static final String MIN_FREE_RATIO_FLAG_NAME = "MinHeapFreeRatio"; + public static final String MAX_FREE_RATIO_FLAG_NAME = "MaxHeapFreeRatio"; + + private static final int IDLE_TIME = 7 * 1000; + + private static boolean gcOccurred() { + for (GarbageCollectorMXBean b : ManagementFactory.getGarbageCollectorMXBeans()) { + if (b.getCollectionCount() != 0) { + return true; + } + } + return false; + } + + public static void main(String[] args) { + MemoryUsage muInitial = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); + MemoryUsagePrinter.printMemoryUsage("initial", muInitial); + + if (gcOccurred()) { + System.out.println("At least one garbage collection occurred. Exiting as this may have already shrunk the heap."); + return; + } + + try { + Thread.sleep(IDLE_TIME); + } catch (InterruptedException ie) { + System.err.println("Skipped. Failed to wait for idle collection"); + } + + MemoryUsage muAfter = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); + MemoryUsagePrinter.printMemoryUsage("after", muAfter); + + assertLessThan(muAfter.getCommitted(), muInitial.getCommitted(), String.format( + "committed free heap size is not less than committed full heap size, heap hasn't been shrunk?%n" + + "%s = %s%n%s = %s", + MIN_FREE_RATIO_FLAG_NAME, + ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class) + .getVMOption(MIN_FREE_RATIO_FLAG_NAME).getValue(), + MAX_FREE_RATIO_FLAG_NAME, + ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class) + .getVMOption(MAX_FREE_RATIO_FLAG_NAME).getValue() + )); + } +} + +/** + * Prints memory usage to standard output + */ +class MemoryUsagePrinter { + + public static final NumberFormat NF = Helpers.numberFormatter(); + + public static void printMemoryUsage(String label, MemoryUsage memusage) { + float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted(); + System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n", + label, + NF.format(memusage.getInit()), + NF.format(memusage.getUsed()), + NF.format(memusage.getCommitted()), + freeratio * 100 + ); + } +} diff --git a/test/hotspot/jtreg/gc/epsilon/libCriticalNative.c b/test/hotspot/jtreg/gc/libCriticalNative.c similarity index 100% rename from test/hotspot/jtreg/gc/epsilon/libCriticalNative.c rename to test/hotspot/jtreg/gc/libCriticalNative.c diff --git a/test/hotspot/jtreg/gc/logging/TestGCId.java b/test/hotspot/jtreg/gc/logging/TestGCId.java index c2b134e1a3d..7f691c8b4c9 100644 --- a/test/hotspot/jtreg/gc/logging/TestGCId.java +++ b/test/hotspot/jtreg/gc/logging/TestGCId.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,10 +30,14 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * java.management + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI TestGCId */ import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.process.ProcessTools; +import sun.hotspot.gc.GC; public class TestGCId { public static void main(String[] args) throws Exception { @@ -41,6 +45,9 @@ public class TestGCId { testGCId("UseG1GC"); testGCId("UseConcMarkSweepGC"); testGCId("UseSerialGC"); + if (GC.Shenandoah.isSupported()) { + testGCId("UseShenandoahGC"); + } } private static void verifyContainsGCIDs(OutputAnalyzer output) { @@ -51,7 +58,7 @@ public class TestGCId { private static void testGCId(String gcFlag) throws Exception { ProcessBuilder pb_default = - ProcessTools.createJavaProcessBuilder("-XX:+" + gcFlag, "-Xlog:gc", "-Xmx10M", GCTest.class.getName()); + ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", "-XX:+" + gcFlag, "-Xlog:gc", "-Xmx10M", GCTest.class.getName()); verifyContainsGCIDs(new OutputAnalyzer(pb_default.start())); } diff --git a/test/hotspot/jtreg/gc/metaspace/TestMetaspacePerfCounters.java b/test/hotspot/jtreg/gc/metaspace/TestMetaspacePerfCounters.java index 24c3bb0e8c8..8fe4db3eeb5 100644 --- a/test/hotspot/jtreg/gc/metaspace/TestMetaspacePerfCounters.java +++ b/test/hotspot/jtreg/gc/metaspace/TestMetaspacePerfCounters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,6 +53,20 @@ import gc.testlibrary.PerfCounters; * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+UsePerfData -XX:+UseParallelGC -XX:+UseParallelOldGC TestMetaspacePerfCounters * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+UsePerfData -XX:+UseG1GC TestMetaspacePerfCounters */ + +/* @test TestMetaspacePerfCountersShenandoah + * @bug 8014659 + * @requires vm.gc.Shenandoah + * @library /test/lib / + * @summary Tests that performance counters for metaspace and compressed class + * space exists and works. + * @modules java.base/jdk.internal.misc + * java.compiler + * java.management/sun.management + * jdk.internal.jvmstat/sun.jvmstat.monitor + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedClassPointers -XX:+UsePerfData -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC TestMetaspacePerfCounters + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+UsePerfData -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC TestMetaspacePerfCounters + */ public class TestMetaspacePerfCounters { public static Class fooClass = null; private static final String[] counterNames = {"minCapacity", "maxCapacity", "capacity", "used"}; diff --git a/test/hotspot/jtreg/gc/shenandoah/TestAllocHumongousFragment.java b/test/hotspot/jtreg/gc/shenandoah/TestAllocHumongousFragment.java new file mode 100644 index 00000000000..8850af8d07b --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestAllocHumongousFragment.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestAllocHumongousFragment + * @summary Make sure Shenandoah can recover from humongous allocation fragmentation + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestAllocHumongousFragment + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestAllocHumongousFragment + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC TestAllocHumongousFragment + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC TestAllocHumongousFragment + * + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot -XX:+ShenandoahVerify TestAllocHumongousFragment + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot -XX:+ShenandoahVerify TestAllocHumongousFragment + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot TestAllocHumongousFragment + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot TestAllocHumongousFragment + * + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahVerify TestAllocHumongousFragment + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahVerify TestAllocHumongousFragment + * + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=adaptive TestAllocHumongousFragment + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=static TestAllocHumongousFragment + * @run main/othervm -Xlog:gc -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahTargetNumRegions=2048 -XX:ShenandoahGCHeuristics=traversal TestAllocHumongousFragment + */ + +import java.util.*; +import java.util.concurrent.*; + +public class TestAllocHumongousFragment { + + static final long TARGET_MB = Long.getLong("target", 30_000); // 30 Gb allocations + static final long LIVE_MB = Long.getLong("occupancy", 700); // 700 Mb alive + + static volatile Object sink; + + static List objects; + + public static void main(String[] args) throws Exception { + final int min = 128 * 1024; + final int max = 16 * 1024 * 1024; + final long count = TARGET_MB * 1024 * 1024 / (16 + 4 * (min + (max - min) / 2)); + + objects = new ArrayList<>(); + long current = 0; + + Random r = new Random(); + for (long c = 0; c < count; c++) { + while (current > LIVE_MB * 1024 * 1024) { + int idx = ThreadLocalRandom.current().nextInt(objects.size()); + int[] remove = objects.remove(idx); + current -= remove.length * 4 + 16; + } + + int[] newObj = new int[min + r.nextInt(max - min)]; + current += newObj.length * 4 + 16; + objects.add(newObj); + sink = new Object(); + + System.out.println("Allocated: " + (current / 1024 / 1024) + " Mb"); + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestAllocIntArrays.java b/test/hotspot/jtreg/gc/shenandoah/TestAllocIntArrays.java new file mode 100644 index 00000000000..21fe25daff4 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestAllocIntArrays.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestAllocIntArrays + * @summary Acceptance tests: collector can withstand allocation + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestAllocIntArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestAllocIntArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC TestAllocIntArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC TestAllocIntArrays + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot -XX:+ShenandoahVerify TestAllocIntArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot -XX:+ShenandoahVerify TestAllocIntArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot TestAllocIntArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot TestAllocIntArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive TestAllocIntArrays + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahVerify TestAllocIntArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahVerify TestAllocIntArrays + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive TestAllocIntArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal TestAllocIntArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=static TestAllocIntArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=compact TestAllocIntArrays + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:-UseTLAB -XX:+ShenandoahVerify TestAllocIntArrays + */ + +import java.util.Random; + +public class TestAllocIntArrays { + + static final long TARGET_MB = Long.getLong("target", 10_000); // 10 Gb allocation + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + final int min = 0; + final int max = 384 * 1024; + long count = TARGET_MB * 1024 * 1024 / (16 + 4 * (min + (max - min) / 2)); + + Random r = new Random(); + for (long c = 0; c < count; c++) { + sink = new int[min + r.nextInt(max - min)]; + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestAllocObjectArrays.java b/test/hotspot/jtreg/gc/shenandoah/TestAllocObjectArrays.java new file mode 100644 index 00000000000..83d04e6522b --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestAllocObjectArrays.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestAllocObjectArrays + * @summary Acceptance tests: collector can withstand allocation + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestAllocObjectArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestAllocObjectArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC TestAllocObjectArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC TestAllocObjectArrays + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot -XX:+ShenandoahVerify TestAllocObjectArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot -XX:+ShenandoahVerify TestAllocObjectArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot TestAllocObjectArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot TestAllocObjectArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive TestAllocObjectArrays + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahVerify TestAllocObjectArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahVerify TestAllocObjectArrays + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive TestAllocObjectArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=static TestAllocObjectArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=compact TestAllocObjectArrays + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal TestAllocObjectArrays + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:-UseTLAB -XX:+ShenandoahVerify TestAllocObjectArrays + */ + +import java.util.Random; + +public class TestAllocObjectArrays { + + static final long TARGET_MB = Long.getLong("target", 10_000); // 10 Gb allocation + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + final int min = 0; + final int max = 384 * 1024; + long count = TARGET_MB * 1024 * 1024 / (16 + 4 * (min + (max - min) / 2)); + + Random r = new Random(); + for (long c = 0; c < count; c++) { + sink = new Object[min + r.nextInt(max - min)]; + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestAllocObjects.java b/test/hotspot/jtreg/gc/shenandoah/TestAllocObjects.java new file mode 100644 index 00000000000..ab37f8d34d1 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestAllocObjects.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestAllocObjects + * @summary Acceptance tests: collector can withstand allocation + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC TestAllocObjects + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot -XX:+ShenandoahVerify TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot -XX:+ShenandoahVerify TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive TestAllocObjects + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahVerify TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahVerify TestAllocObjects + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=static TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=compact TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal TestAllocObjects + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahSuspendibleWorkers TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=static -XX:+ShenandoahSuspendibleWorkers TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=compact -XX:+ShenandoahSuspendibleWorkers TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahSuspendibleWorkers TestAllocObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahSuspendibleWorkers TestAllocObjects + */ + +import java.util.Random; + +public class TestAllocObjects { + + static final long TARGET_MB = Long.getLong("target", 10_000); // 10 Gb allocation + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + long count = TARGET_MB * 1024 * 1024 / 16; + for (long c = 0; c < count; c++) { + sink = new Object(); + } + } + +} diff --git a/test/hotspot/jtreg/gc/epsilon/CriticalNativeArgs.java b/test/hotspot/jtreg/gc/shenandoah/TestArrayCopyCheckCast.java similarity index 54% rename from test/hotspot/jtreg/gc/epsilon/CriticalNativeArgs.java rename to test/hotspot/jtreg/gc/shenandoah/TestArrayCopyCheckCast.java index aaebe227a74..759cffa528e 100644 --- a/test/hotspot/jtreg/gc/epsilon/CriticalNativeArgs.java +++ b/test/hotspot/jtreg/gc/shenandoah/TestArrayCopyCheckCast.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Red Hat, Inc. and/or its affiliates. + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as @@ -21,32 +21,28 @@ * */ - /* - * @test CriticalNativeStress + * @test TestArrayCopyCheckCast * @key gc - * @bug 8199868 - * @requires (os.arch =="x86_64" | os.arch == "amd64") & (vm.bits == "64") & vm.gc.Epsilon & !vm.graal.enabled - * @summary test argument unpacking nmethod wrapper of critical native method - * @run main/othervm/native -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xcomp -Xmx256M -XX:+CriticalJNINatives CriticalNativeArgs + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:TieredStopAtLevel=0 -Xmx16m TestArrayCopyCheckCast */ -public class CriticalNativeArgs { - static { - System.loadLibrary("CriticalNative"); - } +public class TestArrayCopyCheckCast { - static native boolean isNull(int[] a); + static class Foo {} + static class Bar {} - public static void main(String[] args) { - int[] arr = new int[2]; - - if (isNull(arr)) { - throw new RuntimeException("Should not be null"); + public static void main(String[] args) throws Exception { + try { + Object[] array1 = new Object[1]; + array1[0] = new Bar(); + Foo[] array2 = new Foo[1]; + System.arraycopy(array1, 0, array2, 0, 1); + throw new RuntimeException(); + } catch (ArrayStoreException ex) { + // expected + } } - if (!isNull(null)) { - throw new RuntimeException("Should be null"); - } - } } - diff --git a/test/hotspot/jtreg/gc/shenandoah/TestArrayCopyStress.java b/test/hotspot/jtreg/gc/shenandoah/TestArrayCopyStress.java new file mode 100644 index 00000000000..dea9d8f76bc --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestArrayCopyStress.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +import java.util.concurrent.*; + +/* + * @test TestArrayCopyStress + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:TieredStopAtLevel=0 -Xmx16m TestArrayCopyStress + */ +public class TestArrayCopyStress { + + private static final int ARRAY_SIZE = 1000; + private static final int ITERATIONS = 10000; + + static class Foo { + int num; + + Foo(int num) { + this.num = num; + } + } + + static class Bar {} + + public static void main(String[] args) throws Exception { + for (int i = 0; i < ITERATIONS; i++) { + testConjoint(); + } + } + + private static void testConjoint() { + Foo[] array = new Foo[ARRAY_SIZE]; + for (int i = 0; i < ARRAY_SIZE; i++) { + array[i] = new Foo(i); + } + + int src_idx = ThreadLocalRandom.current().nextInt(0, ARRAY_SIZE); + int dst_idx = ThreadLocalRandom.current().nextInt(0, ARRAY_SIZE); + int len = ThreadLocalRandom.current().nextInt(0, Math.min(ARRAY_SIZE - src_idx, ARRAY_SIZE - dst_idx)); + System.arraycopy(array, src_idx, array, dst_idx, len); + + for (int i = 0; i < ARRAY_SIZE; i++) { + if (i >= dst_idx && i < dst_idx + len) { + assertEquals(array[i].num, i - (dst_idx - src_idx)); + } else { + assertEquals(array[i].num, i); + } + } + } + + private static void assertEquals(int a, int b) { + if (a != b) throw new RuntimeException("assert failed"); + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestElasticTLAB.java b/test/hotspot/jtreg/gc/shenandoah/TestElasticTLAB.java new file mode 100644 index 00000000000..dd432b4df08 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestElasticTLAB.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestElasticTLAB + * @summary Test that Shenandoah is able to work with elastic TLABs + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:-UseTLAB -XX:-ShenandoahElasticTLAB -XX:+ShenandoahVerify TestElasticTLAB + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:-UseTLAB -XX:-ShenandoahElasticTLAB TestElasticTLAB + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:-UseTLAB -XX:+ShenandoahElasticTLAB -XX:+ShenandoahVerify TestElasticTLAB + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:-UseTLAB -XX:+ShenandoahElasticTLAB TestElasticTLAB + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+UseTLAB -XX:-ShenandoahElasticTLAB -XX:+ShenandoahVerify TestElasticTLAB + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+UseTLAB -XX:-ShenandoahElasticTLAB TestElasticTLAB + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+UseTLAB -XX:+ShenandoahElasticTLAB -XX:+ShenandoahVerify TestElasticTLAB + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+UseTLAB -XX:+ShenandoahElasticTLAB TestElasticTLAB + */ + +import java.util.Random; + +public class TestElasticTLAB { + + static final long TARGET_MB = Long.getLong("target", 10_000); // 10 Gb allocation + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + final int min = 0; + final int max = 384 * 1024; + long count = TARGET_MB * 1024 * 1024 / (16 + 4 * (min + (max - min) / 2)); + + Random r = new Random(); + for (long c = 0; c < count; c++) { + sink = new int[min + r.nextInt(max - min)]; + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestEvilSyncBug.java b/test/hotspot/jtreg/gc/shenandoah/TestEvilSyncBug.java new file mode 100644 index 00000000000..35aed6e12e9 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestEvilSyncBug.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestEvilSyncBug + * @summary Tests for crash/assert when attaching init thread during shutdown + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver/timeout=480 TestEvilSyncBug + */ + +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.locks.*; + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestEvilSyncBug { + + private static final int NUM_RUNS = 100; + + static Thread[] hooks = new MyHook[10000]; + + public static void main(String[] args) throws Exception { + if (args.length > 0) { + test(); + } else { + ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + + Future[] fs = new Future[NUM_RUNS]; + + for (int c = 0; c < NUM_RUNS; c++) { + Callable task = () -> { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xms128m", + "-Xmx128m", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=aggressive", + "-XX:+ShenandoahStoreCheck", + "TestEvilSyncBug", "test"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + return null; + }; + fs[c] = pool.submit(task); + } + + for (Future f : fs) { + f.get(); + } + + pool.shutdown(); + pool.awaitTermination(1, TimeUnit.HOURS); + } + } + + private static void test() throws Exception { + + for (int t = 0; t < hooks.length; t++) { + hooks[t] = new MyHook(); + } + + ExecutorService service = Executors.newFixedThreadPool( + 2, + r -> { + Thread t = new Thread(r); + t.setDaemon(true); + return t; + } + ); + + List> futures = new ArrayList<>(); + for (int c = 0; c < 100; c++) { + Runtime.getRuntime().addShutdownHook(hooks[c]); + final Test[] tests = new Test[1000]; + for (int t = 0; t < tests.length; t++) { + tests[t] = new Test(); + } + + Future f1 = service.submit(() -> { + Runtime.getRuntime().addShutdownHook(new MyHook()); + IntResult2 r = new IntResult2(); + for (Test test : tests) { + test.RL_Us(r); + } + }); + Future f2 = service.submit(() -> { + Runtime.getRuntime().addShutdownHook(new MyHook()); + for (Test test : tests) { + test.WLI_Us(); + } + }); + + futures.add(f1); + futures.add(f2); + } + + for (Future f : futures) { + f.get(); + } + } + + public static class IntResult2 { + int r1, r2; + } + + public static class Test { + final StampedLock lock = new StampedLock(); + + int x, y; + + public void RL_Us(IntResult2 r) { + StampedLock lock = this.lock; + long stamp = lock.readLock(); + r.r1 = x; + r.r2 = y; + lock.unlock(stamp); + } + + public void WLI_Us() { + try { + StampedLock lock = this.lock; + long stamp = lock.writeLockInterruptibly(); + x = 1; + y = 2; + lock.unlock(stamp); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + + private static class MyHook extends Thread { + @Override + public void run() { + try { + Thread.sleep(10); + } catch (Exception e) {} + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestGCThreadGroups.java b/test/hotspot/jtreg/gc/shenandoah/TestGCThreadGroups.java new file mode 100644 index 00000000000..fb2a2b42bfb --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestGCThreadGroups.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test TestGCThreadGroups + * @summary Test Shenandoah GC uses concurrent/parallel threads correctly + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=2 -XX:ParallelGCThreads=4 -Xmx16m -Dtarget=1000 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:-UseDynamicNumberOfGCThreads -Xmx16m -Dtarget=1000 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+ForceDynamicNumberOfGCThreads -Xmx16m -Dtarget=1000 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=2 -XX:ParallelGCThreads=4 -Xmx16m -XX:ShenandoahGCHeuristics=passive -Dtarget=1000 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=2 -XX:ParallelGCThreads=4 -Xmx16m -XX:ShenandoahGCHeuristics=adaptive -Dtarget=1000 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=2 -XX:ParallelGCThreads=4 -Xmx16m -XX:ShenandoahGCHeuristics=static -Dtarget=1000 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=2 -XX:ParallelGCThreads=4 -Xmx16m -XX:ShenandoahGCHeuristics=compact -Dtarget=100 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=2 -XX:ParallelGCThreads=4 -Xmx16m -XX:ShenandoahGCHeuristics=aggressive -Dtarget=100 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=2 -XX:ParallelGCThreads=4 -Xmx16m -XX:ShenandoahGCHeuristics=traversal -Dtarget=1000 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=4 -XX:ParallelGCThreads=2 -Xmx16m -XX:ShenandoahGCHeuristics=passive -Dtarget=1000 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=4 -XX:ParallelGCThreads=2 -Xmx16m -XX:ShenandoahGCHeuristics=adaptive -Dtarget=1000 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=4 -XX:ParallelGCThreads=2 -Xmx16m -XX:ShenandoahGCHeuristics=static -Dtarget=1000 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=4 -XX:ParallelGCThreads=2 -Xmx16m -XX:ShenandoahGCHeuristics=compact -Dtarget=100 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=4 -XX:ParallelGCThreads=2 -Xmx16m -XX:ShenandoahGCHeuristics=aggressive -Dtarget=100 TestGCThreadGroups + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ConcGCThreads=4 -XX:ParallelGCThreads=2 -Xmx16m -XX:ShenandoahGCHeuristics=traversal -Dtarget=1000 TestGCThreadGroups +*/ + +public class TestGCThreadGroups { + + static final long TARGET_MB = Long.getLong("target", 10_000); // 10 Gb allocation, around 1K cycles to handle + static final long STRIDE = 100_000; + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + long count = TARGET_MB * 1024 * 1024 / 16; + for (long c = 0; c < count; c += STRIDE) { + for (long s = 0; s < STRIDE; s++) { + sink = new Object(); + } + Thread.sleep(1); + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestHeapUncommit.java b/test/hotspot/jtreg/gc/shenandoah/TestHeapUncommit.java new file mode 100644 index 00000000000..4ac357dc989 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestHeapUncommit.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestHeapUncommit + * @summary Acceptance tests: collector can withstand allocation + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC TestHeapUncommit + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:+ShenandoahVerify TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:+UseLargePages -XX:+ShenandoahVerify TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahVerify TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=static -XX:+ShenandoahVerify TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahVerify TestHeapUncommit + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:-UseTLAB -XX:+ShenandoahVerify TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:-UseTLAB -XX:+UseLargePages -XX:+ShenandoahVerify TestHeapUncommit + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:+UseLargePages TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=adaptive TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=static TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=compact TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=aggressive TestHeapUncommit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay=0 -XX:ShenandoahGCHeuristics=traversal TestHeapUncommit + */ + +import java.util.Random; + +public class TestHeapUncommit { + + static final long TARGET_MB = Long.getLong("target", 10_000); // 10 Gb allocation + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + final int min = 0; + final int max = 384 * 1024; + long count = TARGET_MB * 1024 * 1024 / (16 + 4 * (min + (max - min) / 2)); + + Random r = new Random(); + for (long c = 0; c < count; c++) { + sink = new int[min + r.nextInt(max - min)]; + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestHumongousThreshold.java b/test/hotspot/jtreg/gc/shenandoah/TestHumongousThreshold.java new file mode 100644 index 00000000000..6e1fa5333dc --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestHumongousThreshold.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestHumongousThreshold + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:+ShenandoahVerify TestHumongousThreshold + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:ShenandoahHumongousThreshold=50 -XX:+ShenandoahVerify TestHumongousThreshold + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:ShenandoahHumongousThreshold=90 -XX:+ShenandoahVerify TestHumongousThreshold + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:ShenandoahHumongousThreshold=99 -XX:+ShenandoahVerify TestHumongousThreshold + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:ShenandoahHumongousThreshold=100 -XX:+ShenandoahVerify TestHumongousThreshold + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -XX:ShenandoahHumongousThreshold=90 -XX:ShenandoahGCHeuristics=aggressive TestHumongousThreshold + */ + +import java.util.Random; + +public class TestHumongousThreshold { + + static final long TARGET_MB = Long.getLong("target", 20_000); // 20 Gb allocation + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + final int min = 0; + final int max = 384 * 1024; + long count = TARGET_MB * 1024 * 1024 / (16 + 4 * (min + (max - min) / 2)); + + Random r = new Random(); + for (long c = 0; c < count; c++) { + sink = new int[min + r.nextInt(max - min)]; + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestLargeObjectAlignment.java b/test/hotspot/jtreg/gc/shenandoah/TestLargeObjectAlignment.java new file mode 100644 index 00000000000..1fe1a566483 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestLargeObjectAlignment.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestLargeObjectAlignment + * @summary Shenandoah crashes with -XX:ObjectAlignmentInBytes=16 + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 -Xint TestLargeObjectAlignment + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 -XX:-TieredCompilation TestLargeObjectAlignment + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 -XX:TieredStopAtLevel=1 TestLargeObjectAlignment + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 -XX:TieredStopAtLevel=4 TestLargeObjectAlignment + */ + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class TestLargeObjectAlignment { + + static final int SLABS_COUNT = Integer.getInteger("slabs", 10000); + static final int NODE_COUNT = Integer.getInteger("nodes", 10000); + static final long TIME_NS = 1000L * 1000L * Integer.getInteger("timeMs", 5000); + + static Object[] objects; + + public static void main(String[] args) throws Exception { + objects = new Object[SLABS_COUNT]; + + long start = System.nanoTime(); + while (System.nanoTime() - start < TIME_NS) { + objects[ThreadLocalRandom.current().nextInt(SLABS_COUNT)] = createSome(); + } + } + + public static Object createSome() { + List result = new ArrayList(); + for (int c = 0; c < NODE_COUNT; c++) { + result.add(new Integer(c)); + } + return result; + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestLotsOfCycles.java b/test/hotspot/jtreg/gc/shenandoah/TestLotsOfCycles.java new file mode 100644 index 00000000000..84de38a3435 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestLotsOfCycles.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestLotsOfCycles + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx16m -XX:ShenandoahGCHeuristics=passive -Dtarget=10000 -XX:+ShenandoahDegeneratedGC TestLotsOfCycles + * @run main/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx16m -XX:ShenandoahGCHeuristics=passive -Dtarget=10000 -XX:-ShenandoahDegeneratedGC TestLotsOfCycles + * + * @run main/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx16m -XX:ShenandoahGCHeuristics=aggressive -Dtarget=1000 -XX:+ShenandoahOOMDuringEvacALot TestLotsOfCycles + * @run main/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx16m -XX:ShenandoahGCHeuristics=aggressive -Dtarget=1000 -XX:+ShenandoahAllocFailureALot TestLotsOfCycles + * @run main/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx16m -XX:ShenandoahGCHeuristics=aggressive -Dtarget=1000 TestLotsOfCycles + * + * @run main/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx16m -XX:ShenandoahGCHeuristics=adaptive -Dtarget=10000 TestLotsOfCycles + * @run main/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx16m -XX:ShenandoahGCHeuristics=traversal -Dtarget=10000 TestLotsOfCycles + * + * @run main/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx16m -XX:ShenandoahGCHeuristics=static -Dtarget=10000 TestLotsOfCycles + * @run main/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx16m -XX:ShenandoahGCHeuristics=compact -Dtarget=1000 TestLotsOfCycles + */ + +public class TestLotsOfCycles { + + static final long TARGET_MB = Long.getLong("target", 10_000); // 10 Gb allocation, around 1K cycles to handle + static final long STRIDE = 100_000; + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + long count = TARGET_MB * 1024 * 1024 / 16; + for (long c = 0; c < count; c += STRIDE) { + for (long s = 0; s < STRIDE; s++) { + sink = new Object(); + } + Thread.sleep(1); + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestParallelRefprocSanity.java b/test/hotspot/jtreg/gc/shenandoah/TestParallelRefprocSanity.java new file mode 100644 index 00000000000..05d74e0ba36 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestParallelRefprocSanity.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestParallelRefprocSanity + * @summary Test that reference processing works with both parallel and non-parallel variants. + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g TestParallelRefprocSanity + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:-ParallelRefProcEnabled TestParallelRefprocSanity + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:+ParallelRefProcEnabled TestParallelRefprocSanity + */ + +import java.lang.ref.*; + +public class TestParallelRefprocSanity { + + static final long TARGET_MB = Long.getLong("target", 10_000); // 10 Gb allocation + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + long count = TARGET_MB * 1024 * 1024 / 32; + for (long c = 0; c < count; c++) { + sink = new WeakReference(new Object()); + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestPeriodicGC.java b/test/hotspot/jtreg/gc/shenandoah/TestPeriodicGC.java new file mode 100644 index 00000000000..5f225b1b332 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestPeriodicGC.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestPeriodicGC + * @summary Test that periodic GC is working + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @run driver TestPeriodicGC + */ + +import java.util.*; + +import jdk.test.lib.Asserts; +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestPeriodicGC { + + public static void testWith(String msg, boolean periodic, String... args) throws Exception { + String[] cmds = Arrays.copyOf(args, args.length + 2); + cmds[args.length] = TestPeriodicGC.class.getName(); + cmds[args.length + 1] = "test"; + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(cmds); + + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + if (periodic && !output.getOutput().contains("Trigger: Time since last GC")) { + throw new AssertionError(msg + ": Should have periodic GC in logs"); + } + if (!periodic && output.getOutput().contains("Trigger: Time since last GC")) { + throw new AssertionError(msg + ": Should not have periodic GC in logs"); + } + } + + public static void main(String[] args) throws Exception { + if (args.length > 0 && args[0].equals("test")) { + Thread.sleep(5000); // stay idle + return; + } + + String[] enabled = new String[] { + "adaptive", + "compact", + "static", + "traversal", + }; + + String[] disabled = new String[] { + "aggressive", + "passive", + }; + + for (String h : enabled) { + testWith("Short period with " + h, + true, + "-Xlog:gc", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=" + h, + "-XX:ShenandoahGuaranteedGCInterval=1000" + ); + + testWith("Long period with " + h, + false, + "-Xlog:gc", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=" + h, + "-XX:ShenandoahGuaranteedGCInterval=100000" // deliberately too long + ); + } + + for (String h : disabled) { + testWith("Short period with " + h, + false, + "-Xlog:gc", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=" + h, + "-XX:ShenandoahGuaranteedGCInterval=1000" + ); + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestRefprocSanity.java b/test/hotspot/jtreg/gc/shenandoah/TestRefprocSanity.java new file mode 100644 index 00000000000..dde04a5cff9 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestRefprocSanity.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestRefprocSanity + * @summary Test that null references/referents work fine + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g TestRefprocSanity + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:+ShenandoahVerify TestRefprocSanity + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive TestRefprocSanity + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:+ShenandoahVerify -XX:ShenandoahGCHeuristics=traversal TestRefprocSanity + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal TestRefprocSanity + */ + +import java.lang.ref.*; + +public class TestRefprocSanity { + + static final long TARGET_MB = Long.getLong("target", 10_000); // 10 Gb allocation + static final int WINDOW = 10_000; + + static final Reference[] refs = new Reference[WINDOW]; + + public static void main(String[] args) throws Exception { + long count = TARGET_MB * 1024 * 1024 / 32; + int rIdx = 0; + + ReferenceQueue rq = new ReferenceQueue(); + + for (int c = 0; c < WINDOW; c++) { + refs[c] = select(c, new MyObject(c), rq); + } + + for (int c = 0; c < count; c++) { + verifyRefAt(rIdx); + refs[rIdx] = select(c, new MyObject(rIdx), rq); + + rIdx++; + if (rIdx >= WINDOW) { + rIdx = 0; + } + while (rq.poll() != null); // drain + } + } + + static Reference select(int v, MyObject ext, ReferenceQueue rq) { + switch (v % 10) { + case 0: return new SoftReference(null); + case 1: return new SoftReference(null, rq); + case 2: return new SoftReference(ext); + case 3: return new SoftReference(ext, rq); + case 4: return new WeakReference(null); + case 5: return new WeakReference(null, rq); + case 6: return new WeakReference(ext); + case 7: return new WeakReference(ext, rq); + case 8: return new PhantomReference(null, rq); + case 9: return new PhantomReference(ext, rq); + default: throw new IllegalStateException(); + } + } + + static void verifyRefAt(int idx) { + Reference ref = refs[idx]; + MyObject mo = ref.get(); + if (mo != null && mo.x != idx) { + throw new IllegalStateException("Referent tag is incorrect: " + mo.x + ", should be " + idx); + } + } + + static class MyObject { + final int x; + + public MyObject(int x) { + this.x = x; + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestRegionSampling.java b/test/hotspot/jtreg/gc/shenandoah/TestRegionSampling.java new file mode 100644 index 00000000000..642d84e7b22 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestRegionSampling.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestRegionSampling + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:+ShenandoahRegionSampling TestRegionSampling + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahRegionSampling TestRegionSampling + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahRegionSampling TestRegionSampling + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=static -XX:+ShenandoahRegionSampling TestRegionSampling + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=compact -XX:+ShenandoahRegionSampling TestRegionSampling + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahRegionSampling TestRegionSampling + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahRegionSampling TestRegionSampling + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -XX:+ShenandoahRegionSampling TestRegionSampling + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -XX:+ShenandoahRegionSampling TestRegionSampling + */ + +public class TestRegionSampling { + + static final long TARGET_MB = Long.getLong("target", 2_000); // 2 Gb allocation + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + long count = TARGET_MB * 1024 * 1024 / 16; + for (long c = 0; c < count; c++) { + sink = new Object(); + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestRetainObjects.java b/test/hotspot/jtreg/gc/shenandoah/TestRetainObjects.java new file mode 100644 index 00000000000..88b86204010 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestRetainObjects.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestRetainObjects + * @summary Acceptance tests: collector can deal with retained objects + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestRetainObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestRetainObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC TestRetainObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC TestRetainObjects + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot TestRetainObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot TestRetainObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive TestRetainObjects + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahVerify TestRetainObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahVerify TestRetainObjects + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive TestRetainObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=static TestRetainObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=compact TestRetainObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal TestRetainObjects + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:-UseTLAB -XX:+ShenandoahVerify TestRetainObjects + */ + +public class TestRetainObjects { + + static final int COUNT = 10_000_000; + static final int WINDOW = 10_000; + + static final String[] reachable = new String[WINDOW]; + + public static void main(String[] args) throws Exception { + int rIdx = 0; + for (int c = 0; c < COUNT; c++) { + reachable[rIdx] = ("LargeString" + c); + rIdx++; + if (rIdx >= WINDOW) { + rIdx = 0; + } + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestSieveObjects.java b/test/hotspot/jtreg/gc/shenandoah/TestSieveObjects.java new file mode 100644 index 00000000000..41d8f9c5a3d --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestSieveObjects.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestSieveObjects + * @summary Acceptance tests: collector can deal with retained objects + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestSieveObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestSieveObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC TestSieveObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC TestSieveObjects + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot TestSieveObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot TestSieveObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=aggressive TestSieveObjects + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahVerify TestSieveObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahVerify TestSieveObjects + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=adaptive TestSieveObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=static TestSieveObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=compact TestSieveObjects + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:ShenandoahGCHeuristics=traversal TestSieveObjects + * + * @run main/othervm/timeout=240 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g -XX:-UseTLAB -XX:+ShenandoahVerify TestSieveObjects + */ + +import java.util.concurrent.ThreadLocalRandom; + +public class TestSieveObjects { + + static final int COUNT = 100_000_000; + static final int WINDOW = 1_000_000; + static final int PAYLOAD = 100; + + static final MyObject[] arr = new MyObject[WINDOW]; + + public static void main(String[] args) throws Exception { + int rIdx = 0; + for (int c = 0; c < COUNT; c++) { + MyObject v = arr[rIdx]; + if (v != null) { + if (v.x != rIdx) { + throw new IllegalStateException("Illegal value at index " + rIdx + ": " + v.x); + } + if (ThreadLocalRandom.current().nextInt(1000) > 100) { + arr[rIdx] = null; + } + } else { + if (ThreadLocalRandom.current().nextInt(1000) > 500) { + arr[rIdx] = new MyObject(rIdx); + } + } + rIdx++; + if (rIdx >= WINDOW) { + rIdx = 0; + } + } + } + + public static class MyObject { + public int x; + public byte[] payload; + + public MyObject(int x) { + this.x = x; + this.payload = new byte[PAYLOAD]; + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestSmallHeap.java b/test/hotspot/jtreg/gc/shenandoah/TestSmallHeap.java new file mode 100644 index 00000000000..152c0b63621 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestSmallHeap.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestSmallHeap + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC TestSmallHeap + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx64m TestSmallHeap + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx32m TestSmallHeap + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx16m TestSmallHeap + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx8m TestSmallHeap + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx4m TestSmallHeap + */ + +public class TestSmallHeap { + + public static void main(String[] args) throws Exception { + System.out.println("Hello World!"); + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestStringDedup.java b/test/hotspot/jtreg/gc/shenandoah/TestStringDedup.java new file mode 100644 index 00000000000..653a5517619 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestStringDedup.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + + /* + * @test TestStringDedup + * @summary Test Shenandoah string deduplication implementation + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open + * java.management + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -XX:+UseStringDeduplication -Xmx256M -Xlog:gc+stats TestStringDedup + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -XX:+UseStringDeduplication -Xmx256M -Xlog:gc+stats TestStringDedup + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive -XX:+UseStringDeduplication -Xmx256M -Xlog:gc+stats TestStringDedup + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx256M -Xlog:gc+stats TestStringDedup + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=traversal -XX:+UseStringDeduplication -Xmx256M -Xlog:gc+stats TestStringDedup + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=compact -XX:+UseStringDeduplication -Xmx256M -Xlog:gc+stats TestStringDedup + */ + +import java.lang.reflect.*; +import java.util.*; + +import sun.misc.*; + +public class TestStringDedup { + private static Field valueField; + private static Unsafe unsafe; + + private static final int UniqueStrings = 20; + + static { + try { + Field field = Unsafe.class.getDeclaredField("theUnsafe"); + field.setAccessible(true); + unsafe = (Unsafe) field.get(null); + + valueField = String.class.getDeclaredField("value"); + valueField.setAccessible(true); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static Object getValue(String string) { + try { + return valueField.get(string); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + static class StringAndId { + private String str; + private int id; + + public StringAndId(String str, int id) { + this.str = str; + this.id = id; + } + + public String str() { + return str; + } + + public int id() { + return id; + } + } + + private static void generateStrings(ArrayList strs, int unique_strs) { + Random rn = new Random(); + for (int u = 0; u < unique_strs; u++) { + int n = rn.nextInt() % 10; + n = Math.max(n, 2); + for (int index = 0; index < n; index++) { + strs.add(new StringAndId("Unique String " + u, u)); + } + } + } + + private static int verifyDedepString(ArrayList strs) { + HashMap seen = new HashMap<>(); + int total = 0; + int dedup = 0; + + for (StringAndId item : strs) { + total++; + StringAndId existing_item = seen.get(getValue(item.str())); + if (existing_item == null) { + seen.put(getValue(item.str()), item); + } else { + if (item.id() != existing_item.id() || + !item.str().equals(existing_item.str())) { + System.out.println("StringDedup error:"); + System.out.println("String: " + item.str() + " != " + existing_item.str()); + throw new RuntimeException("StringDedup Test failed"); + } else { + dedup++; + } + } + } + System.out.println("Dedup: " + dedup + "/" + total + " unique: " + (total - dedup)); + return (total - dedup); + } + + public static void main(String[] args) { + ArrayList astrs = new ArrayList<>(); + generateStrings(astrs, UniqueStrings); + System.gc(); + System.gc(); + System.gc(); + System.gc(); + System.gc(); + + if (verifyDedepString(astrs) != UniqueStrings) { + // Can not guarantee all strings are deduplicated, there can + // still have pending items in queues. + System.out.println("Not all strings are deduplicated"); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestStringDedupStress.java b/test/hotspot/jtreg/gc/shenandoah/TestStringDedupStress.java new file mode 100644 index 00000000000..820921ac824 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestStringDedupStress.java @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + + /* + * @test TestStringDedupStress + * @summary Test Shenandoah string deduplication implementation + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open + * java.management + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -DtargetStrings=3000000 + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=aggressive -DtargetStrings=2000000 + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot -DtargetStrings=2000000 + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=static -DtargetStrings=4000000 + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=compact + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -DtargetOverwrites=40000000 + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -DtargetOverwrites=40000000 + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=traversal + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahUpdateRefsEarly=off -DtargetStrings=3000000 + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=compact -XX:ShenandoahUpdateRefsEarly=off -DtargetStrings=2000000 + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=aggressive -XX:ShenandoahUpdateRefsEarly=off -DtargetStrings=2000000 + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=static -XX:ShenandoahUpdateRefsEarly=off -DtargetOverwrites=4000000 + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=aggressive -XX:ShenandoahUpdateRefsEarly=off -XX:+ShenandoahOOMDuringEvacALot -DtargetStrings=2000000 + * TestStringDedupStress + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M -Xlog:gc+stats + * -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahOOMDuringEvacALot -DtargetStrings=2000000 + * TestStringDedupStress + */ + +import java.lang.management.*; +import java.lang.reflect.*; +import java.util.*; + +import sun.misc.*; + +public class TestStringDedupStress { + private static Field valueField; + private static Unsafe unsafe; + + private static long TARGET_STRINGS = Long.getLong("targetStrings", 2_500_000); + private static long TARGET_OVERWRITES = Long.getLong("targetOverwrites", 600_000); + private static final long MAX_REWRITE_GC_CYCLES = 6; + + private static final int UNIQUE_STRINGS = 20; + + static { + try { + Field field = Unsafe.class.getDeclaredField("theUnsafe"); + field.setAccessible(true); + unsafe = (Unsafe) field.get(null); + + valueField = String.class.getDeclaredField("value"); + valueField.setAccessible(true); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static Object getValue(String string) { + try { + return valueField.get(string); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + static class StringAndId { + private String str; + private int id; + + public StringAndId(String str, int id) { + this.str = str; + this.id = id; + } + + public String str() { + return str; + } + + public int id() { + return id; + } + } + + // Generate uniqueStrings number of strings + private static void generateStrings(ArrayList strs, int uniqueStrings) { + Random rn = new Random(); + for (int u = 0; u < uniqueStrings; u++) { + int n = rn.nextInt(uniqueStrings); + strs.add(new StringAndId("Unique String " + n, n)); + } + } + + private static int verifyDedepString(ArrayList strs) { + HashMap seen = new HashMap<>(); + int total = 0; + int dedup = 0; + + for (StringAndId item : strs) { + total++; + StringAndId existingItem = seen.get(getValue(item.str())); + if (existingItem == null) { + seen.put(getValue(item.str()), item); + } else { + if (item.id() != existingItem.id() || + !item.str().equals(existingItem.str())) { + System.out.println("StringDedup error:"); + System.out.println("id: " + item.id() + " != " + existingItem.id()); + System.out.println("or String: " + item.str() + " != " + existingItem.str()); + throw new RuntimeException("StringDedup Test failed"); + } else { + dedup++; + } + } + } + System.out.println("Dedup: " + dedup + "/" + total + " unique: " + (total - dedup)); + return (total - dedup); + } + + static volatile ArrayList astrs = new ArrayList<>(); + static GarbageCollectorMXBean gcCycleMBean; + + public static void main(String[] args) { + Random rn = new Random(); + + for (GarbageCollectorMXBean bean : ManagementFactory.getGarbageCollectorMXBeans()) { + if ("Shenandoah Cycles".equals(bean.getName())) { + gcCycleMBean = bean; + break; + } + } + + if (gcCycleMBean == null) { + throw new RuntimeException("Can not find Shenandoah GC cycle mbean"); + } + + // Generate roughly TARGET_STRINGS strings, only UNIQUE_STRINGS are unique + long genIters = TARGET_STRINGS / UNIQUE_STRINGS; + for (long index = 0; index < genIters; index++) { + generateStrings(astrs, UNIQUE_STRINGS); + } + + long cycleBeforeRewrite = gcCycleMBean.getCollectionCount(); + + for (long loop = 1; loop < TARGET_OVERWRITES; loop++) { + int arrSize = astrs.size(); + int index = rn.nextInt(arrSize); + StringAndId item = astrs.get(index); + int n = rn.nextInt(UNIQUE_STRINGS); + item.str = "Unique String " + n; + item.id = n; + + if (loop % 1000 == 0) { + // enough GC cycles for rewritten strings to be deduplicated + if (gcCycleMBean.getCollectionCount() - cycleBeforeRewrite >= MAX_REWRITE_GC_CYCLES) { + break; + } + } + } + verifyDedepString(astrs); + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestStringInternCleanup.java b/test/hotspot/jtreg/gc/shenandoah/TestStringInternCleanup.java new file mode 100644 index 00000000000..d3f4c39b8e2 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestStringInternCleanup.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestStringInternCleanup + * @summary Check that Shenandoah cleans up interned strings + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ClassUnloadingWithConcurrentMark -Xmx64m -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestStringInternCleanup + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ClassUnloadingWithConcurrentMark -Xmx64m -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestStringInternCleanup + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ClassUnloadingWithConcurrentMark -Xmx64m -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC TestStringInternCleanup + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ClassUnloadingWithConcurrentMark -Xmx64m -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC TestStringInternCleanup + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ClassUnloadingWithConcurrentMark -Xmx64m -XX:ShenandoahGCHeuristics=aggressive TestStringInternCleanup + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ClassUnloadingWithConcurrentMark -Xmx64m -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahVerify TestStringInternCleanup + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ClassUnloadingWithConcurrentMark -Xmx64m -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahVerify TestStringInternCleanup + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ClassUnloadingWithConcurrentMark -Xmx64m -XX:ShenandoahGCHeuristics=adaptive TestStringInternCleanup + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ClassUnloadingWithConcurrentMark -Xmx64m -XX:ShenandoahGCHeuristics=static TestStringInternCleanup + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ClassUnloadingWithConcurrentMark -Xmx64m -XX:ShenandoahGCHeuristics=compact TestStringInternCleanup + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ClassUnloadingWithConcurrentMark -Xmx64m -XX:ShenandoahGCHeuristics=traversal TestStringInternCleanup + * + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:-ClassUnloadingWithConcurrentMark -Xmx64m TestStringInternCleanup + */ + +public class TestStringInternCleanup { + + static final int COUNT = 1_000_000; + static final int WINDOW = 1_000; + + static final String[] reachable = new String[WINDOW]; + + public static void main(String[] args) throws Exception { + int rIdx = 0; + for (int c = 0; c < COUNT; c++) { + reachable[rIdx] = ("LargeInternedString" + c).intern(); + rIdx++; + if (rIdx >= WINDOW) { + rIdx = 0; + } + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestVerifyJCStress.java b/test/hotspot/jtreg/gc/shenandoah/TestVerifyJCStress.java new file mode 100644 index 00000000000..1d393621d7b --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestVerifyJCStress.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestVerifyJCStress + * @summary Tests that we pass at least one jcstress-like test with all verification turned on + * @key gc + * @requires vm.gc.Shenandoah + * @modules java.base/jdk.internal.misc + * java.management + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions + * -XX:+UseShenandoahGC -Xmx1g -Xms1g + * -XX:+ShenandoahStoreCheck -XX:+ShenandoahVerify -XX:+VerifyObjectEquals + * -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC + * TestVerifyJCStress + * + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions + * -XX:+UseShenandoahGC -Xmx1g -Xms1g + * -XX:+ShenandoahStoreCheck -XX:+ShenandoahVerify -XX:+VerifyObjectEquals + * -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC + * TestVerifyJCStress + * + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions + * -XX:+UseShenandoahGC -Xmx1g -Xms1g + * -XX:+ShenandoahStoreCheck -XX:+ShenandoahVerify -XX:+VerifyObjectEquals -XX:+ShenandoahVerifyOptoBarriers + * -XX:ShenandoahGCHeuristics=adaptive + * TestVerifyJCStress + * + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions + * -XX:+UseShenandoahGC -Xmx1g -Xms1g + * -XX:+ShenandoahStoreCheck -XX:+ShenandoahVerify -XX:+VerifyObjectEquals -XX:+ShenandoahVerifyOptoBarriers + * -XX:ShenandoahGCHeuristics=static + * TestVerifyJCStress + * + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions + * -XX:+UseShenandoahGC -Xmx1g -Xms1g + * -XX:+ShenandoahStoreCheck -XX:+ShenandoahVerify -XX:+VerifyObjectEquals -XX:+ShenandoahVerifyOptoBarriers + * -XX:ShenandoahGCHeuristics=traversal + * TestVerifyJCStress + */ + +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.locks.*; + +public class TestVerifyJCStress { + + public static void main(String[] args) throws Exception { + ExecutorService service = Executors.newFixedThreadPool( + 2, + r -> { + Thread t = new Thread(r); + t.setDaemon(true); + return t; + } + ); + + for (int c = 0; c < 10000; c++) { + final Test[] tests = new Test[10000]; + for (int t = 0; t < tests.length; t++) { + tests[t] = new Test(); + } + + Future f1 = service.submit(() -> { + IntResult2 r = new IntResult2(); + for (Test test : tests) { + test.RL_Us(r); + } + }); + Future f2 = service.submit(() -> { + for (Test test : tests) { + test.WLI_Us(); + } + }); + + f1.get(); + f2.get(); + } + } + + public static class IntResult2 { + int r1, r2; + } + + public static class Test { + final StampedLock lock = new StampedLock(); + + int x, y; + + public void RL_Us(IntResult2 r) { + StampedLock lock = this.lock; + long stamp = lock.readLock(); + r.r1 = x; + r.r2 = y; + lock.unlock(stamp); + } + + public void WLI_Us() { + try { + StampedLock lock = this.lock; + long stamp = lock.writeLockInterruptibly(); + x = 1; + y = 2; + lock.unlock(stamp); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestVerifyLevels.java b/test/hotspot/jtreg/gc/shenandoah/TestVerifyLevels.java new file mode 100644 index 00000000000..5d863dbe192 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestVerifyLevels.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestVerifyLevels + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -Xmx128m -XX:+ShenandoahVerify -XX:ShenandoahVerifyLevel=0 TestVerifyLevels + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -Xmx128m -XX:+ShenandoahVerify -XX:ShenandoahVerifyLevel=1 TestVerifyLevels + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -Xmx128m -XX:+ShenandoahVerify -XX:ShenandoahVerifyLevel=2 TestVerifyLevels + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -Xmx128m -XX:+ShenandoahVerify -XX:ShenandoahVerifyLevel=3 TestVerifyLevels + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -Xmx128m -XX:+ShenandoahVerify -XX:ShenandoahVerifyLevel=4 TestVerifyLevels + */ + +public class TestVerifyLevels { + + static final long TARGET_MB = Long.getLong("target", 1_000); // 1 Gb allocation + + static Object sink; + + public static void main(String[] args) throws Exception { + long count = TARGET_MB * 1024 * 1024 / 16; + for (long c = 0; c < count; c++) { + sink = new Object(); + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestWithLogLevel.java b/test/hotspot/jtreg/gc/shenandoah/TestWithLogLevel.java new file mode 100644 index 00000000000..3229f3ddcad --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestWithLogLevel.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + + /* + * @test TestWithLogLevel + * @summary Test Shenandoah with different log levels + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xms256M -Xmx1G -Xlog:gc*=error TestWithLogLevel + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xms256M -Xmx1G -Xlog:gc*=warning TestWithLogLevel + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xms256M -Xmx1G -Xlog:gc*=info TestWithLogLevel + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xms256M -Xmx1G -Xlog:gc*=debug TestWithLogLevel + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xms256M -Xmx1G -Xlog:gc*=trace TestWithLogLevel + */ + +import java.util.*; + +public class TestWithLogLevel { + public static void main(String[] args) { + ArrayList list = new ArrayList<>(); + long count = 300 * 1024 * 1024 / 16; // 300MB allocation + for (long index = 0; index < count; index++) { + Object sink = new Object(); + list.add(sink); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/TestWrongArrayMember.java b/test/hotspot/jtreg/gc/shenandoah/TestWrongArrayMember.java new file mode 100644 index 00000000000..edc636ad083 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/TestWrongArrayMember.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestWrongArrayMember + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -Xmx128m -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC TestWrongArrayMember + * @run main/othervm -Xmx128m -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=traversal TestWrongArrayMember + */ + +public class TestWrongArrayMember { + public static void main(String... args) throws Exception { + Object[] src = new Object[3]; + src[0] = new Integer(0); + src[1] = new Object(); + src[2] = new Object(); + Object[] dst = new Integer[3]; + dst[0] = new Integer(1); + dst[1] = new Integer(2); + dst[2] = new Integer(3); + try { + System.arraycopy(src, 0, dst, 0, 3); + throw new RuntimeException("Expected ArrayStoreException"); + } catch (ArrayStoreException e) { + if (src[0] != dst[0]) { + throw new RuntimeException("First element not copied"); + } else if (src[1] == dst[1] || src[2] == dst[2]) { + throw new RuntimeException("Second and third elements are affected"); + } else { + return; // Passed! + } + } + } +} + diff --git a/test/hotspot/jtreg/gc/shenandoah/compiler/TestC1ArrayCopyNPE.java b/test/hotspot/jtreg/gc/shenandoah/compiler/TestC1ArrayCopyNPE.java new file mode 100644 index 00000000000..a77cfecdfe7 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/compiler/TestC1ArrayCopyNPE.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* @test TestC1ArrayCopyNPE + * @summary test C1 arraycopy intrinsic + * @key gc + * @requires vm.gc.Shenandoah + * @run main/othervm -XX:TieredStopAtLevel=1 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive TestC1ArrayCopyNPE + */ + +public class TestC1ArrayCopyNPE { + + private static final int NUM_RUNS = 10000; + private static final int ARRAY_SIZE = 10000; + private static int[] a; + private static int[] b; + + public static void main(String[] args) { + a = null; + b = new int[ARRAY_SIZE]; + for (int i = 0; i < NUM_RUNS; i++) { + test(); + } + a = new int[ARRAY_SIZE]; + b = null; + for (int i = 0; i < NUM_RUNS; i++) { + test(); + } + } + + private static void test() { + try { + System.arraycopy(a, 0, b, 0, ARRAY_SIZE); + throw new RuntimeException("test failed"); + } catch (NullPointerException ex) { + // Ok + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/compiler/TestC1VectorizedMismatch.java b/test/hotspot/jtreg/gc/shenandoah/compiler/TestC1VectorizedMismatch.java new file mode 100644 index 00000000000..97c759ec2b1 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/compiler/TestC1VectorizedMismatch.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* @test TestC1VectorizedMismatch + * @summary test C1 vectorized mismatch intrinsic + * @key gc + * @requires vm.gc.Shenandoah + * @run main/othervm -XX:TieredStopAtLevel=1 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive TestC1VectorizedMismatch + */ + +import java.util.Arrays; + +public class TestC1VectorizedMismatch { + + private static final int NUM_RUNS = 10000; + private static final int ARRAY_SIZE = 10000; + private static int[] a; + private static int[] b; + + public static void main(String[] args) { + a = new int[ARRAY_SIZE]; + b = new int[ARRAY_SIZE]; + for (int i = 0; i < NUM_RUNS; i++) { + test(); + } + } + + private static void test() { + int[] a1 = new int[ARRAY_SIZE]; + int[] b1 = new int[ARRAY_SIZE]; + fillArray(a); + System.arraycopy(a, 0, b, 0, ARRAY_SIZE); + if (!Arrays.equals(a, b)) { + throw new RuntimeException("arrays not equal"); + } + } + + private static void fillArray(int[] array) { + for (int i = 0; i < ARRAY_SIZE; i++) { + int val = (int) (Math.random() * Integer.MAX_VALUE); + array[i] = val; + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/compiler/TestCommonGCLoads.java b/test/hotspot/jtreg/gc/shenandoah/compiler/TestCommonGCLoads.java new file mode 100644 index 00000000000..c104d463eb0 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/compiler/TestCommonGCLoads.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test TestCommonGCLoads + * @summary Test GC state load commoning works + * @key gc + * @requires vm.flavor == "server" + * @requires vm.gc.Shenandoah + * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:-TieredCompilation + * -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC + * -XX:-ShenandoahCommonGCStateLoads + * TestCommonGCLoads + * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:-TieredCompilation + * -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC + * -XX:+ShenandoahCommonGCStateLoads + * TestCommonGCLoads + */ + +public class TestCommonGCLoads { + + static Object d = new Object(); + + static Target t1 = new Target(); + static Target t2 = new Target(); + static Target t3 = new Target(); + static Target t4 = new Target(); + static Target t5 = new Target(); + + static void test() { + t1.field = d; + t2.field = d; + t3.field = d; + t4.field = d; + t5.field = d; + } + + static public void main(String[] args) { + for (int i = 0; i < 100_000; i++) { + test(); + } + } + + static class Target { + Object field; + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/compiler/TestExpandedWBLostNullCheckDep.java b/test/hotspot/jtreg/gc/shenandoah/compiler/TestExpandedWBLostNullCheckDep.java new file mode 100644 index 00000000000..ede284e5341 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/compiler/TestExpandedWBLostNullCheckDep.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test TestExpandedWBLostNullCheckDep + * @summary Logic that moves a null check in the expanded barrier may cause a memory access that doesn't depend on the barrier to bypass the null check + * @key gc + * @requires vm.gc.Shenandoah + * @requires vm.flavor == "server" + * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:-TieredCompilation + * -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC + * -XX:+StressGCM -XX:+StressLCM TestExpandedWBLostNullCheckDep + */ + +public class TestExpandedWBLostNullCheckDep { + + static void test(int i, int[] arr) { + // arr.length depends on a null check for arr + if (i < 0 || i >= arr.length) { + } + // The write barrier here also depends on the null check. The + // null check is moved in the barrier to enable implicit null + // checks. The null check must not be moved arr.length + arr[i] = 0x42; + } + + static public void main(String[] args) { + int[] int_arr = new int[10]; + for (int i = 0; i < 20000; i++) { + test(0, int_arr); + } + try { + test(0, null); + } catch (NullPointerException npe) {} + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/compiler/TestMaybeNullUnsafeAccess.java b/test/hotspot/jtreg/gc/shenandoah/compiler/TestMaybeNullUnsafeAccess.java new file mode 100644 index 00000000000..566f7e25989 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/compiler/TestMaybeNullUnsafeAccess.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test TestMaybeNullUnsafeAccess + * @summary cast before unsafe access moved in dominating null check null path causes crash + * @key gc + * @requires vm.gc.Shenandoah + * @modules java.base/jdk.internal.misc:+open + * + * @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:-TieredCompilation TestMaybeNullUnsafeAccess + * + */ + +import jdk.internal.misc.Unsafe; + +import java.lang.reflect.Field; + +public class TestMaybeNullUnsafeAccess { + + static final jdk.internal.misc.Unsafe UNSAFE = Unsafe.getUnsafe(); + static final long F_OFFSET; + + static class A { + int f; + } + + static { + try { + Field fField = A.class.getDeclaredField("f"); + F_OFFSET = UNSAFE.objectFieldOffset(fField); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + static A test_helper(Object o) { + return (A) o; + } + + static int test(Object o) { + int f = 0; + for (int i = 0; i < 100; i++) { + A a = test_helper(o); + f = UNSAFE.getInt(a, F_OFFSET); + } + return f; + } + + static public void main(String[] args) { + A a = new A(); + for (int i = 0; i < 20000; i++) { + test_helper(null); + test_helper(a); + test(a); + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/compiler/TestNullCheck.java b/test/hotspot/jtreg/gc/shenandoah/compiler/TestNullCheck.java new file mode 100644 index 00000000000..9c22a357030 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/compiler/TestNullCheck.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test TestNullCheck + * @summary implicit null check on brooks pointer must not cause crash + * @key gc + * @requires vm.gc.Shenandoah + * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:-TieredCompilation + * -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC + * -Xmx4G -XX:HeapBaseMinAddress=0x800000000 TestNullCheck + */ + +// HeapBaseMinAddress above forces compressed oops with a base + +public class TestNullCheck { + + int f; + + static int test1(TestNullCheck o) { + return o.f; + } + + static TestNullCheck static_obj = new TestNullCheck(); + + static int test2() { + return static_obj.f; + } + + static public void main(String[] args) { + TestNullCheck o = new TestNullCheck(); + for (int i = 0; i < 20000; i++) { + test1(o); + test2(); + } + try { + test1(null); + } catch (NullPointerException npe) {} + static_obj = null; + try { + test2(); + } catch (NullPointerException npe) {} + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/compiler/TestReferenceCAS.java b/test/hotspot/jtreg/gc/shenandoah/compiler/TestReferenceCAS.java new file mode 100644 index 00000000000..f1955493db7 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/compiler/TestReferenceCAS.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * Run standalone with: --add-exports java.base/jdk.internal.misc=ALL-UNNAMED --add-opens java.base/jdk.internal.misc=ALL-UNNAMED + */ + +/* + * @test TestReferenceCAS + * @summary Shenandoah reference CAS test + * @key gc + * @requires vm.gc.Shenandoah + * @modules java.base/jdk.internal.misc:+open + * + * @run main/othervm -Diters=20000 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCHeuristics=aggressive -XX:+UseShenandoahGC TestReferenceCAS + * @run main/othervm -Diters=100 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCHeuristics=aggressive -XX:+UseShenandoahGC -Xint TestReferenceCAS + * @run main/othervm -Diters=20000 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCHeuristics=aggressive -XX:+UseShenandoahGC -XX:-TieredCompilation TestReferenceCAS + * @run main/othervm -Diters=20000 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCHeuristics=aggressive -XX:+UseShenandoahGC -XX:TieredStopAtLevel=1 TestReferenceCAS + * @run main/othervm -Diters=20000 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCHeuristics=aggressive -XX:+UseShenandoahGC -XX:TieredStopAtLevel=4 TestReferenceCAS + * + * @run main/othervm -Diters=20000 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCHeuristics=aggressive -XX:+UseShenandoahGC -XX:-UseCompressedOops TestReferenceCAS + * @run main/othervm -Diters=100 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCHeuristics=aggressive -XX:+UseShenandoahGC -XX:-UseCompressedOops -Xint TestReferenceCAS + * @run main/othervm -Diters=20000 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCHeuristics=aggressive -XX:+UseShenandoahGC -XX:-UseCompressedOops -XX:-TieredCompilation TestReferenceCAS + * @run main/othervm -Diters=20000 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCHeuristics=aggressive -XX:+UseShenandoahGC -XX:-UseCompressedOops -XX:TieredStopAtLevel=1 TestReferenceCAS + * @run main/othervm -Diters=20000 -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCHeuristics=aggressive -XX:+UseShenandoahGC -XX:-UseCompressedOops -XX:TieredStopAtLevel=4 TestReferenceCAS + */ + +import java.lang.reflect.Field; + +public class TestReferenceCAS { + + static final int ITERS = Integer.getInteger("iters", 1); + static final int WEAK_ATTEMPTS = Integer.getInteger("weakAttempts", 10); + + static final jdk.internal.misc.Unsafe UNSAFE; + static final long V_OFFSET; + + static { + try { + Field f = jdk.internal.misc.Unsafe.class.getDeclaredField("theUnsafe"); + f.setAccessible(true); + UNSAFE = (jdk.internal.misc.Unsafe) f.get(null); + } catch (Exception e) { + throw new RuntimeException("Unable to get Unsafe instance.", e); + } + + try { + Field vField = TestReferenceCAS.class.getDeclaredField("v"); + V_OFFSET = UNSAFE.objectFieldOffset(vField); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + Object v; + + private static void assertEquals(boolean a, boolean b, String msg) { + if (a != b) { + throw new RuntimeException("a (" + a + ") != b (" + b + "): " + msg); + } + } + + private static void assertEquals(Object a, Object b, String msg) { + if (!a.equals(b)) { + throw new RuntimeException("a (" + a.toString() + ") != b (" + b.toString() + "): " + msg); + } + } + + public static void main(String[] args) { + TestReferenceCAS t = new TestReferenceCAS(); + for (int c = 0; c < ITERS; c++) { + testAccess(t, V_OFFSET); + } + } + + static void testAccess(Object base, long offset) { + String foo = new String("foo"); + String bar = new String("bar"); + String baz = new String("baz"); + UNSAFE.putReference(base, offset, "foo"); + { + String newval = bar; + boolean r = UNSAFE.compareAndSetReference(base, offset, "foo", newval); + assertEquals(r, true, "success compareAndSet Object"); + assertEquals(newval, "bar", "must not destroy newval"); + Object x = UNSAFE.getReference(base, offset); + assertEquals(x, "bar", "success compareAndSet Object value"); + } + + { + String newval = baz; + boolean r = UNSAFE.compareAndSetReference(base, offset, "foo", newval); + assertEquals(r, false, "failing compareAndSet Object"); + assertEquals(newval, "baz", "must not destroy newval"); + Object x = UNSAFE.getReference(base, offset); + assertEquals(x, "bar", "failing compareAndSet Object value"); + } + + UNSAFE.putReference(base, offset, "bar"); + { + String newval = foo; + Object r = UNSAFE.compareAndExchangeReference(base, offset, "bar", newval); + assertEquals(r, "bar", "success compareAndExchange Object"); + assertEquals(newval, "foo", "must not destroy newval"); + Object x = UNSAFE.getReference(base, offset); + assertEquals(x, "foo", "success compareAndExchange Object value"); + } + + { + String newval = baz; + Object r = UNSAFE.compareAndExchangeReference(base, offset, "bar", newval); + assertEquals(r, "foo", "failing compareAndExchange Object"); + assertEquals(newval, "baz", "must not destroy newval"); + Object x = UNSAFE.getReference(base, offset); + assertEquals(x, "foo", "failing compareAndExchange Object value"); + } + + UNSAFE.putReference(base, offset, "bar"); + { + String newval = foo; + boolean success = false; + for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { + success = UNSAFE.weakCompareAndSetReference(base, offset, "bar", newval); + assertEquals(newval, "foo", "must not destroy newval"); + } + assertEquals(success, true, "weakCompareAndSet Object"); + Object x = UNSAFE.getReference(base, offset); + assertEquals(x, "foo", "weakCompareAndSet Object"); + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/compiler/TestWriteBarrierClearControl.java b/test/hotspot/jtreg/gc/shenandoah/compiler/TestWriteBarrierClearControl.java new file mode 100644 index 00000000000..962dd4f1345 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/compiler/TestWriteBarrierClearControl.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test TestWriteBarrierClearControl + * @summary Clearing control during final graph reshape causes memory barrier to loose dependency on null check + * @key gc + * @requires vm.gc.Shenandoah + * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:-TieredCompilation + * -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC + * -XX:+UnlockDiagnosticVMOptions -XX:+StressLCM -XX:+StressGCM + * TestWriteBarrierClearControl + * + */ +public class TestWriteBarrierClearControl { + + int f; + + static void test1(TestWriteBarrierClearControl o) { + o.f = 0x42; + } + + static TestWriteBarrierClearControl fo = new TestWriteBarrierClearControl(); + + static void test2() { + TestWriteBarrierClearControl o = fo; + o.f = 0x42; + } + + static public void main(String[] args) { + TestWriteBarrierClearControl o = new TestWriteBarrierClearControl(); + for (int i = 0; i < 20000; i++) { + test1(o); + test2(); + } + try { + test1(null); + } catch (NullPointerException npe) {} + fo = null; + try { + test2(); + } catch (NullPointerException npe) {} + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/jni/TestJNICritical.java b/test/hotspot/jtreg/gc/shenandoah/jni/TestJNICritical.java new file mode 100644 index 00000000000..159910e07a6 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/jni/TestJNICritical.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* @test TestJNICritical + * @summary test JNI critical arrays support in Shenandoah + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ShenandoahVerify TestJNICritical + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive TestJNICritical + */ + +import java.util.Arrays; + +public class TestJNICritical { + static { + System.loadLibrary("TestJNICritical"); + } + + private static final int NUM_RUNS = 10000; + private static final int ARRAY_SIZE = 10000; + private static int[] a; + private static int[] b; + + private static native void copyAtoB(int[] a, int[] b); + + public static void main(String[] args) { + a = new int[ARRAY_SIZE]; + b = new int[ARRAY_SIZE]; + for (int i = 0; i < NUM_RUNS; i++) { + test(); + } + } + + private static void test() { + int[] a1 = new int[ARRAY_SIZE]; + int[] b1 = new int[ARRAY_SIZE]; + fillArray(a); + copyAtoB(a, b); + copyAtoB(a1, b1); // Don't optimize out garbage arrays. + if (!Arrays.equals(a, b)) { + throw new RuntimeException("arrays not equal"); + } + } + + private static void fillArray(int[] array) { + for (int i = 0; i < ARRAY_SIZE; i++) { + int val = (int) (Math.random() * Integer.MAX_VALUE); + array[i] = val; + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/jni/TestJNIGlobalRefs.java b/test/hotspot/jtreg/gc/shenandoah/jni/TestJNIGlobalRefs.java new file mode 100644 index 00000000000..775876a6468 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/jni/TestJNIGlobalRefs.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* @test TestJNIGlobalRefs + * @summary Test JNI Global Refs with Shenandoah + * @key gc + * @requires vm.gc.Shenandoah + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xlog:gc -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahVerify TestJNIGlobalRefs + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xlog:gc -XX:ShenandoahGCHeuristics=aggressive TestJNIGlobalRefs + */ + +import java.util.Arrays; +import java.util.Random; + +public class TestJNIGlobalRefs { + static { + System.loadLibrary("TestJNIGlobalRefs"); + } + + private static final int TIME_MSEC = 120000; + private static final int ARRAY_SIZE = 10000; + + private static native void makeGlobalRef(Object o); + private static native void makeWeakGlobalRef(Object o); + private static native Object readGlobalRef(); + private static native Object readWeakGlobalRef(); + + public static void main(String[] args) throws Throwable { + seedGlobalRef(); + seedWeakGlobalRef(); + long start = System.currentTimeMillis(); + long current = start; + while (current - start < TIME_MSEC) { + testGlobal(); + testWeakGlobal(); + Thread.sleep(1); + current = System.currentTimeMillis(); + } + } + + private static void seedGlobalRef() { + int[] a = new int[ARRAY_SIZE]; + fillArray(a, 1337); + makeGlobalRef(a); + } + + private static void seedWeakGlobalRef() { + int[] a = new int[ARRAY_SIZE]; + fillArray(a, 8080); + makeWeakGlobalRef(a); + } + + private static void testGlobal() { + int[] a = (int[]) readGlobalRef(); + checkArray(a, 1337); + } + + private static void testWeakGlobal() { + int[] a = (int[]) readWeakGlobalRef(); + if (a != null) { + checkArray(a, 8080); + } else { + // weak reference is cleaned, recreate: + seedWeakGlobalRef(); + } + } + + private static void fillArray(int[] array, int seed) { + Random r = new Random(seed); + for (int i = 0; i < ARRAY_SIZE; i++) { + array[i] = r.nextInt(); + } + } + + private static void checkArray(int[] array, int seed) { + Random r = new Random(seed); + if (array.length != ARRAY_SIZE) { + throw new IllegalStateException("Illegal array length: " + array.length + ", but expected " + ARRAY_SIZE); + } + for (int i = 0; i < ARRAY_SIZE; i++) { + int actual = array[i]; + int expected = r.nextInt(); + if (actual != expected) { + throw new IllegalStateException("Incorrect array data: " + actual + ", but expected " + expected); + } + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/jni/TestPinnedGarbage.java b/test/hotspot/jtreg/gc/shenandoah/jni/TestPinnedGarbage.java new file mode 100644 index 00000000000..3961d20941f --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/jni/TestPinnedGarbage.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* @test TestPinnedGarbage + * @summary Test that garbage in the pinned region does not crash VM + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx512m -XX:+ShenandoahVerify -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC TestPinnedGarbage + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx512m -XX:+ShenandoahVerify -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC TestPinnedGarbage + * + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx512m -XX:ShenandoahGCHeuristics=aggressive TestPinnedGarbage + * + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx512m -XX:+ShenandoahVerify TestPinnedGarbage + */ + +import java.util.Arrays; +import java.util.concurrent.*; + +public class TestPinnedGarbage { + static { + System.loadLibrary("TestPinnedGarbage"); + } + + private static final int NUM_RUNS = 1_000; + private static final int OBJS_COUNT = 1_000; + private static final int GARBAGE_COUNT = 1_000_000; + + private static native void pin(int[] a); + private static native void unpin(int[] a); + + public static void main(String[] args) { + for (int i = 0; i < NUM_RUNS; i++) { + test(); + } + } + + private static void test() { + Object[] objs = new Object[OBJS_COUNT]; + for (int i = 0; i < OBJS_COUNT; i++) { + objs[i] = new MyClass(); + } + + int[] cog = new int[10]; + int cogIdx = ThreadLocalRandom.current().nextInt(OBJS_COUNT); + objs[cogIdx] = cog; + pin(cog); + + for (int i = 0; i < GARBAGE_COUNT; i++) { + int rIdx = ThreadLocalRandom.current().nextInt(OBJS_COUNT); + if (rIdx != cogIdx) { + objs[rIdx] = new MyClass(); + } + } + + unpin(cog); + } + + public static class MyClass { + public Object ref = new Object(); + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/jni/libTestJNICritical.c b/test/hotspot/jtreg/gc/shenandoah/jni/libTestJNICritical.c new file mode 100644 index 00000000000..a39ee5ce332 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/jni/libTestJNICritical.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include +#include + +JNIEXPORT void JNICALL +Java_TestJNICritical_copyAtoB(JNIEnv *env, jclass unused, jintArray a, jintArray b) { + jint len = (*env)->GetArrayLength(env, a); + jint* aa = (*env)->GetPrimitiveArrayCritical(env, a, 0); + jint* bb = (*env)->GetPrimitiveArrayCritical(env, b, 0); + memcpy(bb, aa, len * sizeof(jint)); + (*env)->ReleasePrimitiveArrayCritical(env, b, bb, 0); + (*env)->ReleasePrimitiveArrayCritical(env, a, aa, 0); +} diff --git a/test/hotspot/jtreg/gc/shenandoah/jni/libTestJNIGlobalRefs.c b/test/hotspot/jtreg/gc/shenandoah/jni/libTestJNIGlobalRefs.c new file mode 100644 index 00000000000..af55fb10f67 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/jni/libTestJNIGlobalRefs.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include +#include + +jobject global_ref = NULL; +jobject weak_global_ref = NULL; + +JNIEXPORT void JNICALL +Java_TestJNIGlobalRefs_makeGlobalRef(JNIEnv *env, jclass unused, jobject o) { + global_ref = (*env)->NewGlobalRef(env, o); +} + +JNIEXPORT void JNICALL +Java_TestJNIGlobalRefs_makeWeakGlobalRef(JNIEnv *env, jclass unused, jobject o) { + weak_global_ref = (*env)->NewWeakGlobalRef(env, o); +} + +JNIEXPORT jobject JNICALL +Java_TestJNIGlobalRefs_readGlobalRef(JNIEnv *env, jclass unused) { + return global_ref; +} + +JNIEXPORT jobject JNICALL +Java_TestJNIGlobalRefs_readWeakGlobalRef(JNIEnv *env, jclass unused) { + return weak_global_ref; +} diff --git a/test/hotspot/jtreg/gc/shenandoah/jni/libTestPinnedGarbage.c b/test/hotspot/jtreg/gc/shenandoah/jni/libTestPinnedGarbage.c new file mode 100644 index 00000000000..87dfd4f8723 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/jni/libTestPinnedGarbage.c @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include +#include + +static jint* pinned; + +JNIEXPORT void JNICALL +Java_TestPinnedGarbage_pin(JNIEnv *env, jclass unused, jintArray a) { + pinned = (*env)->GetPrimitiveArrayCritical(env, a, 0); +} + +JNIEXPORT void JNICALL +Java_TestPinnedGarbage_unpin(JNIEnv *env, jclass unused, jintArray a) { + (*env)->ReleasePrimitiveArrayCritical(env, a, pinned, 0); +} diff --git a/test/hotspot/jtreg/gc/shenandoah/jvmti/TestHeapDump.java b/test/hotspot/jtreg/gc/shenandoah/jvmti/TestHeapDump.java new file mode 100644 index 00000000000..b90ec062481 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/jvmti/TestHeapDump.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test TestHeapDump + * @summary Tests JVMTI heap dumps + * @key gc + * @requires vm.gc.Shenandoah + * @compile TestHeapDump.java + * @run main/othervm/native/timeout=300 -agentlib:TestHeapDump -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx128m -XX:ShenandoahGCHeuristics=aggressive -XX:+UseCompressedOops TestHeapDump + * @run main/othervm/native/timeout=300 -agentlib:TestHeapDump -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx128m -XX:ShenandoahGCHeuristics=aggressive -XX:-UseCompressedOops TestHeapDump + */ + +public class TestHeapDump { + + private static final int NUM_ITER = 10000; + + private static final int ARRAY_SIZE = 1000; + + private static final int EXPECTED_OBJECTS = + ARRAY_SIZE + // array reachable from instance field + 1 + // static field root + 1; // local field root + + static { + try { + System.loadLibrary("TestHeapDump"); + } catch (UnsatisfiedLinkError ule) { + System.err.println("Could not load TestHeapDump library"); + System.err.println("java.library.path: " + + System.getProperty("java.library.path")); + throw ule; + } + } + + native static int heapdump(Class filterClass); + + public static void main(String args[]) { + new TestHeapDump().run(); + } + + // This root needs to be discovered + static Object root = new TestObject(); + + // This field needs to be discovered + TestObject[] array; + + public void run() { + array = new TestObject[ARRAY_SIZE]; + for (int i = 0; i < ARRAY_SIZE; i++) { + array[i] = new TestObject(); + } + TestObject localRoot = new TestObject(); + for (int i = 0; i < NUM_ITER; i++) { + int numObjs = heapdump(TestObject.class); + if (numObjs != EXPECTED_OBJECTS) { + throw new RuntimeException("Expected " + EXPECTED_OBJECTS + " objects, but got " + numObjs); + } + } + } + + // We look for the instances of this class during the heap scan + public static class TestObject {} +} diff --git a/test/hotspot/jtreg/gc/shenandoah/jvmti/libTestHeapDump.c b/test/hotspot/jtreg/gc/shenandoah/jvmti/libTestHeapDump.c new file mode 100644 index 00000000000..21d9985ad39 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/jvmti/libTestHeapDump.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include +#include +#include "jvmti.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef JNI_ENV_ARG + +#ifdef __cplusplus +#define JNI_ENV_ARG(x, y) y +#define JNI_ENV_PTR(x) x +#else +#define JNI_ENV_ARG(x,y) x, y +#define JNI_ENV_PTR(x) (*x) +#endif + +#endif + +#define TranslateError(err) "JVMTI error" + +#define PASSED 0 +#define FAILED 2 + +static const char *EXC_CNAME = "java/lang/Exception"; + +static jvmtiEnv *jvmti = NULL; +static jint result = PASSED; + +static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved); + +JNIEXPORT +jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) { + return Agent_Initialize(jvm, options, reserved); +} + +JNIEXPORT +jint JNICALL Agent_OnAttach(JavaVM *jvm, char *options, void *reserved) { + return Agent_Initialize(jvm, options, reserved); +} + +JNIEXPORT +jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { + return JNI_VERSION_1_8; +} + +static +jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) { + jvmtiCapabilities capabilities; + jint res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti), + JVMTI_VERSION_9); + if (res != JNI_OK || jvmti == NULL) { + printf(" Error: wrong result of a valid call to GetEnv!\n"); + return JNI_ERR; + } + + (void)memset(&capabilities, 0, sizeof(capabilities)); + capabilities.can_tag_objects = 1; + capabilities.can_generate_garbage_collection_events = 1; + (*jvmti)->AddCapabilities(jvmti, &capabilities); + + return JNI_OK; +} + +static +void throw_exc(JNIEnv *env, char *msg) { + jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME)); + jint rt = JNI_OK; + + if (exc_class == NULL) { + printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME); + return; + } + rt = JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); + if (rt == JNI_ERR) { + printf("throw_exc: Error in JNI ThrowNew(env, %s)\n", msg); + } +} + +static jint JNICALL heap_iter_callback(jlong class_tag, + jlong size, + jlong* tag_ptr, + jint length, + void* user_data) { + (*((jint*)(user_data)))++; + return JVMTI_VISIT_OBJECTS; +} + +JNIEXPORT jint JNICALL +Java_TestHeapDump_heapdump(JNIEnv *env, jclass cls, jclass filter_cls) { + jvmtiHeapCallbacks callbacks; + jint totalCount = 0; + if (jvmti == NULL) { + throw_exc(env, "JVMTI client was not properly loaded!\n"); + return 0; + } + + (void)memset(&callbacks, 0, sizeof(callbacks)); + callbacks.heap_iteration_callback = &heap_iter_callback; + (*jvmti)->IterateThroughHeap(jvmti, 0, filter_cls, &callbacks, (const void *)&totalCount); + return totalCount; +} + +#ifdef __cplusplus +} +#endif diff --git a/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestChurnNotifications.java b/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestChurnNotifications.java new file mode 100644 index 00000000000..7f27acd35bf --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestChurnNotifications.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestChurnNotifications + * @summary Check that MX notifications are reported for all cycles + * @requires vm.gc.Shenandoah + * + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -Dprecise=true TestChurnNotifications + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -Dprecise=true TestChurnNotifications + * + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive -Dprecise=false TestChurnNotifications + * + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=adaptive -Dprecise=false TestChurnNotifications + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=static -Dprecise=false TestChurnNotifications + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=compact -Dprecise=false TestChurnNotifications + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=traversal -Dprecise=false TestChurnNotifications + */ + +import java.util.*; +import java.util.concurrent.atomic.*; +import javax.management.*; +import java.lang.management.*; +import javax.management.openmbean.*; + +import com.sun.management.GarbageCollectionNotificationInfo; + +public class TestChurnNotifications { + + static final long HEAP_MB = 128; // adjust for test configuration above + static final long TARGET_MB = Long.getLong("target", 8_000); // 8 Gb allocation + + // Should we track the churn precisely? + // Precise tracking is only reliable when GC is fully stop-the-world. Otherwise, + // we cannot tell, looking at heap used before/after, what was the GC churn. + static final boolean PRECISE = Boolean.getBoolean("precise"); + + static final long M = 1024 * 1024; + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + final AtomicLong churnBytes = new AtomicLong(); + + NotificationListener listener = new NotificationListener() { + @Override + public void handleNotification(Notification n, Object o) { + if (n.getType().equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) { + GarbageCollectionNotificationInfo info = GarbageCollectionNotificationInfo.from((CompositeData) n.getUserData()); + Map mapBefore = info.getGcInfo().getMemoryUsageBeforeGc(); + Map mapAfter = info.getGcInfo().getMemoryUsageAfterGc(); + + MemoryUsage before = mapBefore.get("Shenandoah"); + MemoryUsage after = mapAfter.get("Shenandoah"); + + if ((before != null) && (after != null)) { + long diff = before.getUsed() - after.getUsed(); + if (diff > 0) { + churnBytes.addAndGet(diff); + } + } + } + } + }; + + for (GarbageCollectorMXBean bean : ManagementFactory.getGarbageCollectorMXBeans()) { + ((NotificationEmitter) bean).addNotificationListener(listener, null, null); + } + + final int size = 100_000; + long count = TARGET_MB * 1024 * 1024 / (16 + 4 * size); + + long mem = count * (16 + 4 * size); + + for (int c = 0; c < count; c++) { + sink = new int[size]; + } + + System.gc(); + + Thread.sleep(1000); + + long actual = churnBytes.get(); + + long minExpected = PRECISE ? (mem - HEAP_MB * 1024 * 1024) : 1; + long maxExpected = mem + HEAP_MB * 1024 * 1024; + + String msg = "Expected = [" + minExpected / M + "; " + maxExpected / M + "] (" + mem / M + "), actual = " + actual / M; + if (minExpected < actual && actual < maxExpected) { + System.out.println(msg); + } else { + throw new IllegalStateException(msg); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestMemoryMXBeans.java b/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestMemoryMXBeans.java new file mode 100644 index 00000000000..0d6647eeec5 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestMemoryMXBeans.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test TestMemoryMXBeans + * @summary Test JMX memory beans + * @key gc + * @requires vm.gc.Shenandoah + * @modules java.base/jdk.internal.misc + * java.management + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g TestMemoryMXBeans -1 1024 + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xms1g -Xmx1g TestMemoryMXBeans 1024 1024 + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xms128m -Xmx1g TestMemoryMXBeans 128 1024 + */ + +import java.lang.management.*; +import java.util.*; + +public class TestMemoryMXBeans { + + public static void main(String[] args) throws Exception { + if (args.length < 2) { + throw new IllegalStateException("Should provide expected heap sizes"); + } + + long initSize = 1L * Integer.parseInt(args[0]) * 1024 * 1024; + long maxSize = 1L * Integer.parseInt(args[1]) * 1024 * 1024; + + testMemoryBean(initSize, maxSize); + } + + public static void testMemoryBean(long initSize, long maxSize) { + MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); + long heapInit = memoryMXBean.getHeapMemoryUsage().getInit(); + long heapMax = memoryMXBean.getHeapMemoryUsage().getMax(); + long nonHeapInit = memoryMXBean.getNonHeapMemoryUsage().getInit(); + long nonHeapMax = memoryMXBean.getNonHeapMemoryUsage().getMax(); + + if (initSize > 0 && heapInit != initSize) { + throw new IllegalStateException("Init heap size is wrong: " + heapInit + " vs " + initSize); + } + if (maxSize > 0 && heapMax != maxSize) { + throw new IllegalStateException("Max heap size is wrong: " + heapMax + " vs " + maxSize); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestMemoryPools.java b/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestMemoryPools.java new file mode 100644 index 00000000000..c5cc859c2f6 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestMemoryPools.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test TestMemoryPools + * @summary Test JMX memory pools + * @key gc + * @requires vm.gc.Shenandoah + * @modules java.base/jdk.internal.misc + * java.management + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xmx1g -Xms1g TestMemoryPools + */ + +import java.lang.management.*; +import java.util.*; + +public class TestMemoryPools { + + public static void main(String[] args) throws Exception { + List mms = ManagementFactory.getMemoryManagerMXBeans(); + if (mms == null) { + throw new RuntimeException("getMemoryManagerMXBeans is null"); + } + if (mms.isEmpty()) { + throw new RuntimeException("getMemoryManagerMXBeans is empty"); + } + for (MemoryManagerMXBean mmBean : mms) { + String[] names = mmBean.getMemoryPoolNames(); + if (names == null) { + throw new RuntimeException("getMemoryPoolNames() is null"); + } + if (names.length == 0) { + throw new RuntimeException("getMemoryPoolNames() is empty"); + } + for (String name : names) { + if (name == null) { + throw new RuntimeException("pool name is null"); + } + if (name.length() == 0) { + throw new RuntimeException("pool name is empty"); + } + } + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestPauseNotifications.java b/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestPauseNotifications.java new file mode 100644 index 00000000000..8d7e08df2db --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestPauseNotifications.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestPauseNotifications + * @summary Check that MX notifications are reported for all cycles + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC TestPauseNotifications + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC TestPauseNotifications + * + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive TestPauseNotifications + * + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=adaptive TestPauseNotifications + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=static TestPauseNotifications + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=compact TestPauseNotifications + * @run main/othervm -Xmx128m -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=traversal TestPauseNotifications + */ + +import java.util.*; +import java.util.concurrent.atomic.*; +import javax.management.*; +import java.lang.management.*; +import javax.management.openmbean.*; + +import com.sun.management.GarbageCollectionNotificationInfo; + +public class TestPauseNotifications { + + static final long HEAP_MB = 128; // adjust for test configuration above + static final long TARGET_MB = Long.getLong("target", 8_000); // 8 Gb allocation + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + final AtomicLong pausesDuration = new AtomicLong(); + final AtomicLong cyclesDuration = new AtomicLong(); + + NotificationListener listener = new NotificationListener() { + @Override + public void handleNotification(Notification n, Object o) { + if (n.getType().equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) { + GarbageCollectionNotificationInfo info = GarbageCollectionNotificationInfo.from((CompositeData) n.getUserData()); + + System.out.println(info.getGcInfo().toString()); + System.out.println(info.getGcName()); + System.out.println(); + + long d = info.getGcInfo().getDuration(); + + String name = info.getGcName(); + if (name.contains("Shenandoah")) { + if (name.equals("Shenandoah Pauses")) { + pausesDuration.addAndGet(d); + } else if (name.equals("Shenandoah Cycles")) { + cyclesDuration.addAndGet(d); + } else { + throw new IllegalStateException("Unknown name: " + name); + } + } + } + } + }; + + for (GarbageCollectorMXBean bean : ManagementFactory.getGarbageCollectorMXBeans()) { + ((NotificationEmitter) bean).addNotificationListener(listener, null, null); + } + + final int size = 100_000; + long count = TARGET_MB * 1024 * 1024 / (16 + 4 * size); + + for (int c = 0; c < count; c++) { + sink = new int[size]; + } + + Thread.sleep(1000); + + long pausesActual = pausesDuration.get(); + long cyclesActual = cyclesDuration.get(); + + long minExpected = 1; + long maxExpected = Long.MAX_VALUE; + + { + String msg = "Pauses expected = [" + minExpected + "; " + maxExpected + "], actual = " + pausesActual; + if (minExpected < pausesActual && pausesActual < maxExpected) { + System.out.println(msg); + } else { + throw new IllegalStateException(msg); + } + } + + { + String msg = "Cycles expected = [" + minExpected + "; " + maxExpected + "], actual = " + cyclesActual; + if (minExpected < cyclesActual && cyclesActual < maxExpected) { + System.out.println(msg); + } else { + throw new IllegalStateException(msg); + } + } + + { + String msg = "Cycle duration (" + cyclesActual + "), pause duration (" + pausesActual + ")"; + if (pausesActual < cyclesActual) { + System.out.println(msg); + } else { + throw new IllegalStateException(msg); + } + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/oom/TestAllocLargeObj.java b/test/hotspot/jtreg/gc/shenandoah/oom/TestAllocLargeObj.java new file mode 100644 index 00000000000..a197779c604 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/oom/TestAllocLargeObj.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test TestAllocLargeObj + * @summary Test allocation of small object to result OOM, but not to crash JVM + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @run main TestAllocLargeObj + */ + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class TestAllocLargeObj { + + static final int SIZE = 1 * 1024 * 1024; + static final int COUNT = 16; + + static volatile Object sink; + + public static void work() throws Exception { + Object[] root = new Object[COUNT]; + sink = root; + for (int c = 0; c < COUNT; c++) { + root[c] = new Object[SIZE]; + } + } + + public static void main(String[] args) throws Exception { + if (args.length > 0) { + work(); + return; + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-Xmx16m", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + TestAllocLargeObj.class.getName(), + "test"); + + OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); + analyzer.shouldHaveExitValue(1); + analyzer.shouldContain("java.lang.OutOfMemoryError: Java heap space"); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-Xmx1g", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + TestAllocLargeObj.class.getName(), + "test"); + + OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); + analyzer.shouldHaveExitValue(0); + analyzer.shouldNotContain("java.lang.OutOfMemoryError: Java heap space"); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/oom/TestAllocLargerThanHeap.java b/test/hotspot/jtreg/gc/shenandoah/oom/TestAllocLargerThanHeap.java new file mode 100644 index 00000000000..e37f9e20dc2 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/oom/TestAllocLargerThanHeap.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test TestAllocLargerThanHeap + * @summary Test that allocation of the object larger than heap fails predictably + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @run main TestAllocLargerThanHeap + */ + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class TestAllocLargerThanHeap { + + static final int SIZE = 16 * 1024 * 1024; + + static volatile Object sink; + + public static void work() throws Exception { + sink = new Object[SIZE]; + } + + public static void main(String[] args) throws Exception { + if (args.length > 0) { + work(); + return; + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-Xmx16m", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + TestAllocLargerThanHeap.class.getName(), + "test"); + + OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); + analyzer.shouldHaveExitValue(1); + analyzer.shouldContain("java.lang.OutOfMemoryError: Java heap space"); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-Xmx1g", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + TestAllocLargerThanHeap.class.getName(), + "test"); + + OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); + analyzer.shouldHaveExitValue(0); + analyzer.shouldNotContain("java.lang.OutOfMemoryError: Java heap space"); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/oom/TestAllocSmallObj.java b/test/hotspot/jtreg/gc/shenandoah/oom/TestAllocSmallObj.java new file mode 100644 index 00000000000..084a07b796a --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/oom/TestAllocSmallObj.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test TestAllocSmallObj + * @summary Test allocation of small object to result OOM, but not to crash JVM + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @run main TestAllocSmallObj + */ + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class TestAllocSmallObj { + + static final int COUNT = 16 * 1024 * 1024; + + static volatile Object sink; + + public static void work() throws Exception { + Object[] root = new Object[COUNT]; + sink = root; + for (int c = 0; c < COUNT; c++) { + root[c] = new Object(); + } + } + + public static void main(String[] args) throws Exception { + if (args.length > 0) { + work(); + return; + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-Xmx16m", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + TestAllocSmallObj.class.getName(), + "test"); + + OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); + analyzer.shouldHaveExitValue(1); + analyzer.shouldContain("java.lang.OutOfMemoryError: Java heap space"); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-Xmx1g", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + TestAllocSmallObj.class.getName(), + "test"); + + OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); + analyzer.shouldHaveExitValue(0); + analyzer.shouldNotContain("java.lang.OutOfMemoryError: Java heap space"); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/oom/TestClassLoaderLeak.java b/test/hotspot/jtreg/gc/shenandoah/oom/TestClassLoaderLeak.java new file mode 100644 index 00000000000..1b0bea30487 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/oom/TestClassLoaderLeak.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test TestClassLoaderLeak + * @summary Test OOME in due to classloader leak + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @run main TestClassLoaderLeak + */ + +import java.util.*; +import java.io.*; +import java.nio.*; +import java.nio.file.*; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class TestClassLoaderLeak { + + static final int SIZE = 1 * 1024 * 1024; + static final int COUNT = 128; + + static volatile Object sink; + + static class Dummy { + static final int[] PAYLOAD = new int[SIZE]; + } + + static class MyClassLoader extends ClassLoader { + final String path; + + MyClassLoader(String path) { + this.path = path; + } + + public Class loadClass(String name) throws ClassNotFoundException { + try { + File f = new File(path, name + ".class"); + if (!f.exists()) { + return super.loadClass(name); + } + + Path path = Paths.get(f.getAbsolutePath()); + byte[] cls = Files.readAllBytes(path); + return defineClass(name, cls, 0, cls.length, null); + } catch (IOException e) { + throw new ClassNotFoundException(name); + } + } + } + + static void load(String path) throws Exception { + ClassLoader cl = new MyClassLoader(path); + Class c = (Class) Class.forName("TestClassLoaderLeak$Dummy", true, cl); + if (c.getClassLoader() != cl) { + throw new IllegalStateException("Should have loaded by target loader"); + } + sink = c; + } + + public static void passWith(String... args) throws Exception { + testWith(true, args); + } + + public static void failWith(String... args) throws Exception { + testWith(false, args); + } + + public static void testWith(boolean shouldPass, String... args) throws Exception { + List pbArgs = new ArrayList<>(); + pbArgs.add("-Xmx128m"); + pbArgs.add("-XX:+UnlockExperimentalVMOptions"); + pbArgs.add("-XX:+UnlockDiagnosticVMOptions"); + pbArgs.add("-XX:+UseShenandoahGC"); + pbArgs.addAll(Arrays.asList(args)); + pbArgs.add(TestClassLoaderLeak.class.getName()); + pbArgs.add("test"); + + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(pbArgs.toArray(new String[0])); + + OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); + + if (shouldPass) { + analyzer.shouldHaveExitValue(0); + analyzer.shouldNotContain("java.lang.OutOfMemoryError"); + analyzer.shouldContain("All good"); + } else { + analyzer.shouldHaveExitValue(1); + analyzer.shouldContain("java.lang.OutOfMemoryError"); + analyzer.shouldNotContain("All good"); + } + } + + public static void main(String[] args) throws Exception { + if (args.length > 0) { + String classDir = TestClassLoaderLeak.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + for (int c = 0; c < COUNT; c++) { + load(classDir); + } + System.out.println("All good"); + return; + } + + String[] heuristics = new String[] { + "adaptive", + "compact", + "static", + "traversal", + "aggressive", + "passive", + }; + + for (String h : heuristics) { + // Forceful enabling should work + passWith("-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading"); + passWith("-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloadingWithConcurrentMark"); + + // Even when concurrent unloading is disabled, Full GC has to recover + passWith("-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading", "-XX:-ClassUnloadingWithConcurrentMark"); + passWith("-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading", "-XX:-ClassUnloadingWithConcurrentMark", "-XX:ShenandoahUnloadClassesFrequency=0"); + passWith("-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading", "-XX:+ClassUnloadingWithConcurrentMark", "-XX:ShenandoahUnloadClassesFrequency=0"); + + // Should OOME when unloading forcefully disabled, even if local flags try to enable it back + failWith("-XX:ShenandoahGCHeuristics=" + h, "-XX:-ClassUnloading"); + failWith("-XX:ShenandoahGCHeuristics=" + h, "-XX:-ClassUnloading", "-XX:+ClassUnloadingWithConcurrentMark"); + failWith("-XX:ShenandoahGCHeuristics=" + h, "-XX:-ClassUnloading", "-XX:+ClassUnloadingWithConcurrentMark", "-XX:ShenandoahUnloadClassesFrequency=1"); + failWith("-XX:ShenandoahGCHeuristics=" + h, "-XX:-ClassUnloading", "-XX:-ClassUnloadingWithConcurrentMark", "-XX:ShenandoahUnloadClassesFrequency=1"); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/oom/TestThreadFailure.java b/test/hotspot/jtreg/gc/shenandoah/oom/TestThreadFailure.java new file mode 100644 index 00000000000..57b34637229 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/oom/TestThreadFailure.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test TestThreadFailure + * @summary Test OOME in separate thread is recoverable + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @run main TestThreadFailure + */ + +import java.util.*; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class TestThreadFailure { + + static final int SIZE = 1024; + static final int COUNT = 16; + + static class NastyThread extends Thread { + @Override + public void run() { + List root = new ArrayList(); + while (true) { + root.add(new Object[SIZE]); + } + } + } + + public static void main(String[] args) throws Exception { + if (args.length > 0) { + for (int t = 0; t < COUNT; t++) { + Thread thread = new NastyThread(); + thread.start(); + thread.join(); + } + System.out.println("All good"); + return; + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-Xmx16m", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + TestThreadFailure.class.getName(), + "test"); + + OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); + analyzer.shouldHaveExitValue(0); + analyzer.shouldContain("java.lang.OutOfMemoryError"); + analyzer.shouldContain("All good"); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-Xmx128m", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + TestThreadFailure.class.getName(), + "test"); + + OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); + analyzer.shouldHaveExitValue(0); + analyzer.shouldContain("java.lang.OutOfMemoryError"); + analyzer.shouldContain("All good"); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestAlwaysPreTouch.java b/test/hotspot/jtreg/gc/shenandoah/options/TestAlwaysPreTouch.java new file mode 100644 index 00000000000..6c80c6407e1 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestAlwaysPreTouch.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestAlwaysPreTouch + * @summary Check that Shenandoah's AlwaysPreTouch does not fire asserts + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+AlwaysPreTouch -Xmx1g TestAlwaysPreTouch + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+AlwaysPreTouch -XX:ConcGCThreads=2 -Xmx1g TestAlwaysPreTouch + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+AlwaysPreTouch -XX:ParallelGCThreads=2 -Xmx1g TestAlwaysPreTouch + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+AlwaysPreTouch -Xms128m -Xmx1g TestAlwaysPreTouch + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+AlwaysPreTouch -Xms1g -Xmx1g TestAlwaysPreTouch + */ + +public class TestAlwaysPreTouch { + + public static void main(String[] args) throws Exception { + // checking the initialization before entering main() + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestArgumentRanges.java b/test/hotspot/jtreg/gc/shenandoah/options/TestArgumentRanges.java new file mode 100644 index 00000000000..04417477d86 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestArgumentRanges.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestArgumentRanges + * @summary Test that Shenandoah arguments are checked for ranges where applicable + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver TestArgumentRanges + */ + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestArgumentRanges { + public static void main(String[] args) throws Exception { + testRange("ShenandoahGarbageThreshold", 0, 100); + testRange("ShenandoahFreeThreshold", 0, 100); + testRange("ShenandoahAllocationThreshold", 0, 100); + testHeuristics(); + } + + private static void testHeuristics() throws Exception { + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=aggressive", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=static", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=fluff", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Unknown -XX:ShenandoahGCHeuristics option"); + output.shouldHaveExitValue(1); + } + } + + private static void testRange(String option, int min, int max) throws Exception { + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:" + option + "=" + (max + 1), + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(1); + } + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:" + option + "=" + max, + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:" + option + "=" + (min - 1), + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(1); + } + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:" + option + "=" + min, + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestClassUnloadingArguments.java b/test/hotspot/jtreg/gc/shenandoah/options/TestClassUnloadingArguments.java new file mode 100644 index 00000000000..00f6e70cbee --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestClassUnloadingArguments.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestClassUnloadingArguments + * @summary Test that loop mining arguments are sane + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @run driver TestClassUnloadingArguments + */ + +import java.util.*; + +import jdk.test.lib.Asserts; +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestClassUnloadingArguments { + + public static void testWith(String msg, boolean cu, boolean cuConc, String... args) throws Exception { + String[] cmds = Arrays.copyOf(args, args.length + 2); + cmds[args.length] = "-XX:+PrintFlagsFinal"; + cmds[args.length + 1] = "-version"; + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(cmds); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + output.shouldContain("ClassUnloading"); + output.shouldContain("ClassUnloadingWithConcurrentMark"); + + Asserts.assertEQ(output.firstMatch("(.+?) ClassUnloading.+?= (.+?) (.+?)", 2), + Boolean.toString(cu), + msg + ", but got wrong ClassUnloading"); + Asserts.assertEQ(output.firstMatch("(.+?) ClassUnloadingWithConcurrentMark.+?= (.+?) (.+?)", 2), + Boolean.toString(cuConc), + msg + ", but got wrong ClassUnloadingWithConcurrentMark"); + } + + public static void main(String[] args) throws Exception { + testDefaultGC(); + testShenandoah(); + } + + public static void testDefaultGC() throws Exception { + testWith("Default GC should have class unloading enabled", + true, true); + + testWith("Default GC should disable everything", + false, false, + "-XX:-ClassUnloading"); + + testWith("Default GC should disable conc unload", + true, false, + "-XX:-ClassUnloadingWithConcurrentMark"); + + testWith("Default GC should not let conc unload to be enabled separately", + false, false, + "-XX:-ClassUnloading", + "-XX:+ClassUnloadingWithConcurrentMark"); + } + + public static void testShenandoah() throws Exception { + testWith("Shenandoah GC should have class unloading enabled", + true, false, + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC"); + + testWith("Shenandoah GC should disable everything", + false, false, + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:-ClassUnloading"); + + testWith("Shenandoah GC should enable conc unload", + true, true, + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:+ClassUnloadingWithConcurrentMark"); + + testWith("Shenandoah GC should not let conc unload to be enabled separately", + false, false, + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:-ClassUnloading", + "-XX:+ClassUnloadingWithConcurrentMark"); + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestCodeCacheRootStyles.java b/test/hotspot/jtreg/gc/shenandoah/options/TestCodeCacheRootStyles.java new file mode 100644 index 00000000000..70c529cc513 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestCodeCacheRootStyles.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* @test TestCodeCacheRootStyles + * @key gc + * @requires vm.gc.Shenandoah + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahCodeRootsStyle=0 TestCodeCacheRootStyles + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahCodeRootsStyle=1 TestCodeCacheRootStyles + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahCodeRootsStyle=2 TestCodeCacheRootStyles + */ + +public class TestCodeCacheRootStyles { + public static void main(String[] args) { + // Bug should crash before we get here. + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestEnabled.java b/test/hotspot/jtreg/gc/shenandoah/options/TestEnabled.java new file mode 100644 index 00000000000..7abe2f94bfb --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestEnabled.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.management.GarbageCollectorMXBean; +import java.lang.management.ManagementFactory; + +/* + * @test TestEnabled + * @key gc + * @requires vm.gc.Shenandoah & vm.gc == "null" + * @run main/othervm -Dexpected=false -Xmx64m TestEnabled + * @run main/othervm -Dexpected=true -Xmx64m -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC TestEnabled + */ + +/* + * @test TestEnabledAlready + * @key gc + * @requires vm.gc.Shenandoah & vm.gc == "Shenandoah" + * @run main/othervm -Dexpected=true -Xmx64m TestEnabled + */ +public class TestEnabled { + + public static void main(String... args) { + boolean expected = Boolean.getBoolean("expected"); + boolean actual = isEnabled(); + if (expected != actual) { + throw new IllegalStateException("Error: expected = " + expected + ", actual = " + actual); + } + } + + public static boolean isEnabled() { + for (GarbageCollectorMXBean bean : ManagementFactory.getGarbageCollectorMXBeans()) { + if (bean.getName().contains("Shenandoah")) { + return true; + } + } + return false; + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestExplicitGC.java b/test/hotspot/jtreg/gc/shenandoah/options/TestExplicitGC.java new file mode 100644 index 00000000000..c9f4b3a676f --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestExplicitGC.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestExplicitGC + * @summary Test that Shenandoah reacts to explicit GC flags appropriately + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver TestExplicitGC + */ + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestExplicitGC { + + enum Mode { + PRODUCT, + DIAGNOSTIC, + EXPERIMENTAL, + } + + public static void main(String[] args) throws Exception { + if (args.length > 0) { + System.out.println("Calling System.gc()"); + System.gc(); + return; + } + + String[] full = new String[] { + "Pause Full" + }; + + String[] concNormal = new String[] { + "Pause Init Mark", + "Pause Final Mark", + }; + + String[] concTraversal = new String[] { + "Pause Init Traversal", + "Pause Final Traversal", + }; + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xlog:gc", + TestExplicitGC.class.getName(), + "test"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + for (String p : full) { + output.shouldNotContain(p); + } + for (String p : concNormal) { + output.shouldContain(p); + } + for (String p : concTraversal) { + output.shouldNotContain(p); + } + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xlog:gc", + "-XX:+DisableExplicitGC", + TestExplicitGC.class.getName(), + "test"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + for (String p : full) { + output.shouldNotContain(p); + } + for (String p : concNormal) { + output.shouldNotContain(p); + } + for (String p : concTraversal) { + output.shouldNotContain(p); + } + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xlog:gc", + "-XX:+ExplicitGCInvokesConcurrent", + TestExplicitGC.class.getName(), + "test"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + for (String p : full) { + output.shouldNotContain(p); + } + for (String p : concNormal) { + output.shouldContain(p); + } + for (String p : concTraversal) { + output.shouldNotContain(p); + } + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xlog:gc", + "-XX:+ExplicitGCInvokesConcurrent", + "-XX:ShenandoahGCHeuristics=traversal", + TestExplicitGC.class.getName(), + "test"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + for (String p : full) { + output.shouldNotContain(p); + } + for (String p : concNormal) { + output.shouldNotContain(p); + } + for (String p : concTraversal) { + output.shouldContain(p); + } + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xlog:gc", + "-XX:-ExplicitGCInvokesConcurrent", + TestExplicitGC.class.getName(), + "test"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + for (String p : full) { + output.shouldContain(p); + } + for (String p : concNormal) { + output.shouldNotContain(p); + } + for (String p : concTraversal) { + output.shouldNotContain(p); + } + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestExplicitGCNoConcurrent.java b/test/hotspot/jtreg/gc/shenandoah/options/TestExplicitGCNoConcurrent.java new file mode 100644 index 00000000000..8cabce1b7d6 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestExplicitGCNoConcurrent.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestExplicitGCNoConcurrent + * @summary Test that Shenandoah reacts to explicit GC flags appropriately + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver TestExplicitGCNoConcurrent + */ + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestExplicitGCNoConcurrent { + + public static void main(String[] args) throws Exception { + if (args.length > 0) { + System.out.println("Calling System.gc()"); + System.gc(); + return; + } + + String[] concurrent = new String[] { + "Pause Init Mark", + "Pause Final Mark", + "Pause Init Update Refs", + "Pause Final Update Refs", + "Pause Init Traversal", + "Pause Final Traversal", + }; + + String[] opts = new String[] { + "", + "-XX:-ExplicitGCInvokesConcurrent", + "-XX:+ExplicitGCInvokesConcurrent" + }; + + for (String opt : opts) { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xlog:gc", + "-XX:+UnlockDiagnosticVMOptions", + opt, + "-XX:ShenandoahGCHeuristics=passive", + TestExplicitGCNoConcurrent.class.getName(), + "test"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + for (String p : concurrent) { + output.shouldNotContain(p); + } + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestHeuristicsUnlock.java b/test/hotspot/jtreg/gc/shenandoah/options/TestHeuristicsUnlock.java new file mode 100644 index 00000000000..bccdb94e656 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestHeuristicsUnlock.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestHeuristicsUnlock + * @summary Test that Shenandoah heuristics are unlocked properly + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver TestHeuristicsUnlock + */ + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestHeuristicsUnlock { + + enum Mode { + PRODUCT, + DIAGNOSTIC, + EXPERIMENTAL, + } + + public static void main(String[] args) throws Exception { + testWith("adaptive", Mode.PRODUCT); + testWith("static", Mode.PRODUCT); + testWith("compact", Mode.PRODUCT); + + testWith("traversal", Mode.EXPERIMENTAL); + + testWith("aggressive", Mode.DIAGNOSTIC); + testWith("passive", Mode.DIAGNOSTIC); + } + + private static void testWith(String h, Mode mode) throws Exception { + if (false) { // When ShenandoahGC is experimental flag, this makes no sense to test + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:-UnlockDiagnosticVMOptions", + "-XX:-UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=" + h, + "-version" + ); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + switch (mode) { + case PRODUCT: + output.shouldHaveExitValue(0); + break; + case DIAGNOSTIC: + case EXPERIMENTAL: + output.shouldNotHaveExitValue(0); + break; + } + } + + if (false) { // When ShenandoahGC is experimental flag, this makes no sense to test + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockDiagnosticVMOptions", + "-XX:-UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=" + h, + "-version" + ); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + switch (mode) { + case PRODUCT: + case DIAGNOSTIC: + output.shouldHaveExitValue(0); + break; + case EXPERIMENTAL: + output.shouldNotHaveExitValue(0); + break; + } + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:-UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=" + h, + "-version" + ); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + switch (mode) { + case PRODUCT: + case EXPERIMENTAL: + output.shouldHaveExitValue(0); + break; + case DIAGNOSTIC: + output.shouldNotHaveExitValue(0); + break; + } + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestHumongousThresholdArgs.java b/test/hotspot/jtreg/gc/shenandoah/options/TestHumongousThresholdArgs.java new file mode 100644 index 00000000000..e09954ee74e --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestHumongousThresholdArgs.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestHumongousThresholdArgs + * @summary Test that Shenandoah humongous threshold args are checked + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver TestHumongousThresholdArgs + */ + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestHumongousThresholdArgs { + public static void main(String[] args) throws Exception { + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + + int[] valid = new int[] {1, 10, 50, 90, 100}; + int[] invalid = new int[] {-100, -1, 0, 101, 1000}; + + for (int v : valid) { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahHumongousThreshold=" + v, + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + + for (int v : invalid) { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahHumongousThreshold=" + v, + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(1); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestLoopMiningArguments.java b/test/hotspot/jtreg/gc/shenandoah/options/TestLoopMiningArguments.java new file mode 100644 index 00000000000..cb9f536db05 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestLoopMiningArguments.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestLoopMiningArguments + * @summary Test that loop mining arguments are sane + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @run driver TestLoopMiningArguments + */ + +import java.util.*; + +import jdk.test.lib.Asserts; +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestLoopMiningArguments { + + public static void testWith(String msg, boolean cls, int iters, String... args) throws Exception { + String[] cmds = Arrays.copyOf(args, args.length + 2); + cmds[args.length] = "-XX:+PrintFlagsFinal"; + cmds[args.length + 1] = "-version"; + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(cmds); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + output.shouldContain("UseCountedLoopSafepoints"); + output.shouldContain("LoopStripMiningIter"); + + Asserts.assertEQ(output.firstMatch("(.+?) UseCountedLoopSafepoints.+?= (.+?) (.+?)", 2), Boolean.toString(cls), msg + ", but got wrong CLS"); + Asserts.assertEQ(output.firstMatch("(.+?) LoopStripMiningIter.+?= (.+?) (.+?)", 2), String.valueOf(iters), msg + ", but got wrong LSM"); + } + + public static void main(String[] args) throws Exception { + testDefaultGC(); + testShenandoah(); + } + + public static void testDefaultGC() throws Exception { + testWith("Default GC should have CLS enabled, LSM = 1000", + true, 1000); + + testWith("Default GC with +CLS should set LSM = 1", + true, 1, + "-XX:+UseCountedLoopSafepoints" + ); + + testWith("Default GC with +CLS should not override LSM>1", + true, 10, + "-XX:LoopStripMiningIter=10", + "-XX:+UseCountedLoopSafepoints" + ); + + testWith("Default GC with +CLS should not override LSM=1", + true, 1, + "-XX:LoopStripMiningIter=1", + "-XX:+UseCountedLoopSafepoints" + ); + + testWith("Default GC with +CLS should override LSM=0 to 1", + true, 1, + "-XX:LoopStripMiningIter=0", + "-XX:+UseCountedLoopSafepoints" + ); + + testWith("Default GC with -CLS should set LSM = 0", + false, 0, + "-XX:-UseCountedLoopSafepoints" + ); + + testWith("Default GC with -CLS should override LSM to 0", + false, 0, + "-XX:LoopStripMiningIter=10", + "-XX:-UseCountedLoopSafepoints" + ); + } + + public static void testShenandoah() throws Exception { + testWith("Shenandoah should have CLS and LSM enabled", + true, 1000, + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC" + ); + + testWith("Shenandoah with +CLS should set LSM = 1", + true, 1, + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:+UseCountedLoopSafepoints" + ); + + testWith("Shenandoah GC with +CLS should not override LSM>1", + true, 10, + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:LoopStripMiningIter=10", + "-XX:+UseCountedLoopSafepoints" + ); + + testWith("Shenandoah GC with +CLS should not override LSM=1", + true, 1, + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:LoopStripMiningIter=1", + "-XX:+UseCountedLoopSafepoints" + ); + + testWith("Shenandoah GC with +CLS should override LSM=0 to 1", + true, 1, + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:LoopStripMiningIter=0", + "-XX:+UseCountedLoopSafepoints" + ); + + testWith("Shenandoah GC with -CLS should set LSM = 0", + false, 0, + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:-UseCountedLoopSafepoints" + ); + + testWith("Shenandoah GC with -CLS should override LSM to 0", + false, 0, + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:LoopStripMiningIter=10", + "-XX:-UseCountedLoopSafepoints" + ); + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestObjectAlignment.java b/test/hotspot/jtreg/gc/shenandoah/options/TestObjectAlignment.java new file mode 100644 index 00000000000..afa8ac1533e --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestObjectAlignment.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestObjectAlignment + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 TestObjectAlignment + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 -Xmx16m TestObjectAlignment + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 -Xmx32m TestObjectAlignment + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 -Xmx64m TestObjectAlignment + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 -Xmx128m TestObjectAlignment + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 -Xmx256m TestObjectAlignment + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 -Xmx512m TestObjectAlignment + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ObjectAlignmentInBytes=16 -Xmx1g TestObjectAlignment + */ + +public class TestObjectAlignment { + + public static void main(String[] args) throws Exception { + // Testing the checking code on startup + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestPacing.java b/test/hotspot/jtreg/gc/shenandoah/options/TestPacing.java new file mode 100644 index 00000000000..0b8287443d1 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestPacing.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestPacing + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:-ShenandoahPacing -Xmx128m TestPacing + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+ShenandoahPacing -Xmx128m TestPacing + */ + +public class TestPacing { + static final long TARGET_MB = Long.getLong("target", 1000); // 1 Gb allocation + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + long count = TARGET_MB * 1024 * 1024 / 16; + for (long c = 0; c < count; c++) { + sink = new Object(); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestParallelRegionStride.java b/test/hotspot/jtreg/gc/shenandoah/options/TestParallelRegionStride.java new file mode 100644 index 00000000000..c8cdb135007 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestParallelRegionStride.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestParallelRegionStride + * @key gc + * @requires vm.gc.Shenandoah + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahParallelRegionStride=1 -Xmx128m TestParallelRegionStride + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahParallelRegionStride=10 -Xmx128m TestParallelRegionStride + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahParallelRegionStride=100 -Xmx128m TestParallelRegionStride + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahParallelRegionStride=1024 -Xmx128m TestParallelRegionStride + */ + +public class TestParallelRegionStride { + static final long TARGET_MB = Long.getLong("target", 1000); // 1 Gb allocation + + static volatile Object sink; + + public static void main(String[] args) throws Exception { + long count = TARGET_MB * 1024 * 1024 / 16; + for (long c = 0; c < count; c++) { + sink = new Object(); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestRegionSizeArgs.java b/test/hotspot/jtreg/gc/shenandoah/options/TestRegionSizeArgs.java new file mode 100644 index 00000000000..81bfd68682f --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestRegionSizeArgs.java @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestRegionSizeArgs + * @summary Test that Shenandoah region size args are checked + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * @run driver TestRegionSizeArgs + */ + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestRegionSizeArgs { + public static void main(String[] args) throws Exception { + testInvalidRegionSizes(); + testMinRegionSize(); + testMaxRegionSize(); + } + + private static void testInvalidRegionSizes() throws Exception { + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms2m", + "-Xmx1g", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Initial heap size"); + output.shouldHaveExitValue(1); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms4m", + "-Xmx1g", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms8m", + "-Xmx1g", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahHeapRegionSize=200m", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Invalid -XX:ShenandoahHeapRegionSize option"); + output.shouldHaveExitValue(1); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahHeapRegionSize=11m", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Invalid -XX:ShenandoahHeapRegionSize option"); + output.shouldHaveExitValue(1); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahHeapRegionSize=9m", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahHeapRegionSize=255K", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Invalid -XX:ShenandoahHeapRegionSize option"); + output.shouldHaveExitValue(1); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahHeapRegionSize=260K", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms1g", + "-Xmx1g", + "-XX:ShenandoahHeapRegionSize=32M", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms1g", + "-Xmx1g", + "-XX:ShenandoahHeapRegionSize=64M", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Invalid -XX:ShenandoahHeapRegionSize option"); + output.shouldHaveExitValue(1); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms1g", + "-Xmx1g", + "-XX:ShenandoahHeapRegionSize=256K", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms1g", + "-Xmx1g", + "-XX:ShenandoahHeapRegionSize=128K", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Invalid -XX:ShenandoahHeapRegionSize option"); + output.shouldHaveExitValue(1); + } + } + + private static void testMinRegionSize() throws Exception { + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahMinRegionSize=255K", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Invalid -XX:ShenandoahMinRegionSize option"); + output.shouldHaveExitValue(1); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahMinRegionSize=1M", + "-XX:ShenandoahMaxRegionSize=260K", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Invalid -XX:ShenandoahMinRegionSize or -XX:ShenandoahMaxRegionSize"); + output.shouldHaveExitValue(1); + } + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahMinRegionSize=200m", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Invalid -XX:ShenandoahMinRegionSize option"); + output.shouldHaveExitValue(1); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahMinRegionSize=11m", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Invalid -XX:ShenandoahMinRegionSize option"); + output.shouldHaveExitValue(1); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahMinRegionSize=9m", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + + } + + private static void testMaxRegionSize() throws Exception { + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahMaxRegionSize=255K", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Invalid -XX:ShenandoahMaxRegionSize option"); + output.shouldHaveExitValue(1); + } + + { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahMinRegionSize=1M", + "-XX:ShenandoahMaxRegionSize=260K", + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("Invalid -XX:ShenandoahMinRegionSize or -XX:ShenandoahMaxRegionSize"); + output.shouldHaveExitValue(1); + } + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestSelectiveBarrierFlags.java b/test/hotspot/jtreg/gc/shenandoah/options/TestSelectiveBarrierFlags.java new file mode 100644 index 00000000000..6c2d7c4da4e --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestSelectiveBarrierFlags.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* @test TestSelectiveBarrierFlags + * @summary Test selective barrier enabling works, by aggressively compiling HelloWorld with combinations + * of barrier flags + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @run main/othervm TestSelectiveBarrierFlags -Xint + * @run main/othervm TestSelectiveBarrierFlags -Xbatch -XX:CompileThreshold=100 -XX:TieredStopAtLevel=1 + * @run main/othervm TestSelectiveBarrierFlags -Xbatch -XX:CompileThreshold=100 -XX:-TieredCompilation -XX:+IgnoreUnrecognizedVMOptions -XX:+ShenandoahVerifyOptoBarriers + */ + +import java.util.*; +import java.util.concurrent.*; + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestSelectiveBarrierFlags { + + public static void main(String[] args) throws Exception { + String[][] opts = { + new String[] { "ShenandoahKeepAliveBarrier" }, + new String[] { "ShenandoahWriteBarrier" }, + new String[] { "ShenandoahReadBarrier" }, + // StoreValRead+SATB are actually compatible, but we need to protect against + // StorveValEnqueue+SATB. TODO: Make it better. + new String[] { "ShenandoahSATBBarrier", "ShenandoahStoreValReadBarrier", "ShenandoahStoreValEnqueueBarrier" }, + new String[] { "ShenandoahCASBarrier" }, + new String[] { "ShenandoahAcmpBarrier" }, + new String[] { "ShenandoahCloneBarrier" }, + }; + + int size = 1; + for (String[] l : opts) { + size *= (l.length + 1); + } + + ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + + for (int c = 0; c < size; c++) { + int t = c; + + List conf = new ArrayList<>(); + conf.addAll(Arrays.asList(args)); + conf.add("-Xmx128m"); + conf.add("-XX:+UnlockDiagnosticVMOptions"); + conf.add("-XX:+UnlockExperimentalVMOptions"); + conf.add("-XX:+UseShenandoahGC"); + conf.add("-XX:ShenandoahGCHeuristics=passive"); + + StringBuilder sb = new StringBuilder(); + for (String[] l : opts) { + // Make a choice which flag to select from the group. + // Zero means no flag is selected from the group. + int choice = t % (l.length + 1); + for (int e = 0; e < l.length; e++) { + conf.add("-XX:" + ((choice == (e + 1)) ? "+" : "-") + l[e]); + } + t = t / (l.length + 1); + } + + conf.add("TestSelectiveBarrierFlags$Test"); + + pool.submit(() -> { + try { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(conf.toArray(new String[0])); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + }); + } + + pool.shutdown(); + pool.awaitTermination(1, TimeUnit.HOURS); + } + + public static class Test { + public static void main(String... args) { + System.out.println("HelloWorld"); + } + } + +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestSingleThreaded.java b/test/hotspot/jtreg/gc/shenandoah/options/TestSingleThreaded.java new file mode 100644 index 00000000000..49548670ce4 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestSingleThreaded.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* @test TestSingleThreaded + * @summary test single worker threaded Shenandoah + * @key gc + * @requires vm.gc.Shenandoah + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions + * -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive + * -XX:ParallelGCThreads=1 -XX:ConcGCThreads=1 TestSingleThreaded + */ + +public class TestSingleThreaded { + + public static void main(String[] args) { + // Bug should crash before we get here. + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestWrongBarrierDisable.java b/test/hotspot/jtreg/gc/shenandoah/options/TestWrongBarrierDisable.java new file mode 100644 index 00000000000..e8b282fec37 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestWrongBarrierDisable.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* @test TestWrongBarrierDisable + * @summary Test that disabling wrong barriers fails early + * @key gc + * @requires vm.gc.Shenandoah + * @library /test/lib + * @run main/othervm TestWrongBarrierDisable + */ + +import java.util.*; + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestWrongBarrierDisable { + + public static void main(String[] args) throws Exception { + String[] concurrent = { + "ShenandoahReadBarrier", + "ShenandoahWriteBarrier", + "ShenandoahCASBarrier", + "ShenandoahAcmpBarrier", + "ShenandoahCloneBarrier", + "ShenandoahSATBBarrier", + "ShenandoahKeepAliveBarrier", + "ShenandoahStoreValReadBarrier", + }; + + String[] traversal = { + "ShenandoahReadBarrier", + "ShenandoahWriteBarrier", + "ShenandoahCASBarrier", + "ShenandoahAcmpBarrier", + "ShenandoahCloneBarrier", + }; + + shouldFailAll("adaptive", concurrent); + shouldFailAll("static", concurrent); + shouldFailAll("compact", concurrent); + shouldFailAll("aggressive", concurrent); + shouldFailAll("traversal", traversal); + shouldPassAll("passive", concurrent); + shouldPassAll("passive", traversal); + } + + private static void shouldFailAll(String h, String[] barriers) throws Exception { + for (String b : barriers) { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=" + h, + "-XX:-" + b, + "-version" + ); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldNotHaveExitValue(0); + output.shouldContain("Heuristics needs "); + output.shouldContain("to work correctly"); + } + } + + private static void shouldPassAll(String h, String[] barriers) throws Exception { + for (String b : barriers) { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-XX:ShenandoahGCHeuristics=" + h, + "-XX:-" + b, + "-version" + ); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + } + +} diff --git a/test/hotspot/jtreg/gc/startup_warnings/TestShenandoah.java b/test/hotspot/jtreg/gc/startup_warnings/TestShenandoah.java new file mode 100644 index 00000000000..e0f7a993216 --- /dev/null +++ b/test/hotspot/jtreg/gc/startup_warnings/TestShenandoah.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* +* @test TestShenandoah +* @key gc +* @requires vm.gc.Shenandoah +* @bug 8006398 +* @summary Test that the Shenandoah collector does not print a warning message +* @library /test/lib +* @modules java.base/jdk.internal.misc +* java.management +*/ + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestShenandoah { + + public static void main(String args[]) throws Exception { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions", "-XX:+UseShenandoahGC", "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldNotContain("deprecated"); + output.shouldNotContain("error"); + output.shouldHaveExitValue(0); + } + +} diff --git a/test/hotspot/jtreg/gc/stress/CriticalNativeStress.java b/test/hotspot/jtreg/gc/stress/CriticalNativeStress.java new file mode 100644 index 00000000000..1db525f2a4b --- /dev/null +++ b/test/hotspot/jtreg/gc/stress/CriticalNativeStress.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2018, Red Hat, Inc. and/or its affiliates. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +import java.util.Random; + +/* + * @test CriticalNativeStressEpsilon + * @key gc + * @bug 8199868 + * @requires (os.arch =="x86_64" | os.arch == "amd64") & vm.gc.Epsilon & !vm.graal.enabled + * @summary test argument pinning by nmethod wrapper of critical native method + * @run main/othervm/native -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xcomp -Xmx1G -XX:+CriticalJNINatives CriticalNativeStress + */ + +/* + * @test CriticalNativeStressShenandoah + * @key gc + * @bug 8199868 + * @requires (os.arch =="x86_64" | os.arch == "amd64") & vm.gc.Shenandoah & !vm.graal.enabled + * @summary test argument pinning by nmethod wrapper of critical native method + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -Xcomp -Xmx512M -XX:+CriticalJNINatives CriticalNativeStress + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -Xcomp -Xmx512M -XX:+CriticalJNINatives CriticalNativeStress + * + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive -Xcomp -Xmx512M -XX:+CriticalJNINatives CriticalNativeStress + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xcomp -Xmx256M -XX:+CriticalJNINatives CriticalNativeStress + * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=traversal -Xcomp -Xmx512M -XX:+CriticalJNINatives CriticalNativeStress + */ +public class CriticalNativeStress { + private static Random rand = new Random(); + static { + System.loadLibrary("CriticalNative"); + } + + // CYCLES and THREAD_PER_CASE are used to tune the tests for different GC settings, + // so that they can execrise enough GC cycles and not OOM + private static int CYCLES = Integer.getInteger("cycles", 3); + private static int THREAD_PER_CASE = Integer.getInteger("threadPerCase", 1); + + static native long sum1(long[] a); + + // More than 6 parameters + static native long sum2(long a1, int[] a2, int[] a3, long[] a4, int[] a5); + + static long sum(long[] a) { + long sum = 0; + for (int index = 0; index < a.length; index ++) { + sum += a[index]; + } + return sum; + } + + static long sum(int[] a) { + long sum = 0; + for (int index = 0; index < a.length; index ++) { + sum += a[index]; + } + return sum; + } + + private static volatile String garbage_array[]; + + // GC potentially moves arrays passed to critical native methods + // if they are not pinned correctly. + // Create enough garbages to exercise GC cycles, verify + // the arrays are pinned correctly. + static void create_garbage(int len) { + len = Math.max(len, 1024); + String array[] = new String[len]; + for (int index = 0; index < len; index ++) { + array[index] = "String " + index; + } + garbage_array = array; + } + + // Two test cases with different method signatures: + // Tests generate arbitrary length of arrays with + // arbitrary values, then calcuate sum of the array + // elements with critical native JNI methods and java + // methods, and compare the results for correctness. + static void run_test_case1() { + // Create testing arary with arbitrary length and + // values + int length = rand.nextInt(50) + 1; + long[] arr = new long[length]; + for (int index = 0; index < length; index ++) { + arr[index] = rand.nextLong() % 1002; + } + + // Generate garbages to trigger GCs + for (int index = 0; index < length; index ++) { + create_garbage(index); + } + + // Compare results for correctness. + long native_sum = sum1(arr); + long java_sum = sum(arr); + if (native_sum != java_sum) { + StringBuffer sb = new StringBuffer("Sums do not match: native = ") + .append(native_sum).append(" java = ").append(java_sum); + + throw new RuntimeException(sb.toString()); + } + } + + static void run_test_case2() { + // Create testing arary with arbitrary length and + // values + int index; + long a1 = rand.nextLong() % 1025; + + int a2_length = rand.nextInt(50) + 1; + int[] a2 = new int[a2_length]; + for (index = 0; index < a2_length; index ++) { + a2[index] = rand.nextInt(106); + } + + int a3_length = rand.nextInt(150) + 1; + int[] a3 = new int[a3_length]; + for (index = 0; index < a3_length; index ++) { + a3[index] = rand.nextInt(3333); + } + + int a4_length = rand.nextInt(200) + 1; + long[] a4 = new long[a4_length]; + for (index = 0; index < a4_length; index ++) { + a4[index] = rand.nextLong() % 122; + } + + int a5_length = rand.nextInt(350) + 1; + int[] a5 = new int[a5_length]; + for (index = 0; index < a5_length; index ++) { + a5[index] = rand.nextInt(333); + } + + // Generate garbages to trigger GCs + for (index = 0; index < a1; index ++) { + create_garbage(index); + } + + // Compare results for correctness. + long native_sum = sum2(a1, a2, a3, a4, a5); + long java_sum = a1 + sum(a2) + sum(a3) + sum(a4) + sum(a5); + if (native_sum != java_sum) { + StringBuffer sb = new StringBuffer("Sums do not match: native = ") + .append(native_sum).append(" java = ").append(java_sum); + + throw new RuntimeException(sb.toString()); + } + } + + static class Case1Runner extends Thread { + public Case1Runner() { + start(); + } + + public void run() { + for (int index = 0; index < CYCLES; index ++) { + run_test_case1(); + } + } + } + + static class Case2Runner extends Thread { + public Case2Runner() { + start(); + } + + public void run() { + for (int index = 0; index < CYCLES; index ++) { + run_test_case2(); + } + } + } + + public static void main(String[] args) { + Thread[] thrs = new Thread[THREAD_PER_CASE * 2]; + for (int index = 0; index < thrs.length; index = index + 2) { + thrs[index] = new Case1Runner(); + thrs[index + 1] = new Case2Runner(); + } + + for (int index = 0; index < thrs.length; index ++) { + try { + thrs[index].join(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff --git a/test/hotspot/jtreg/gc/stress/gcbasher/TestGCBasherWithShenandoah.java b/test/hotspot/jtreg/gc/stress/gcbasher/TestGCBasherWithShenandoah.java new file mode 100644 index 00000000000..f09d7cab6dc --- /dev/null +++ b/test/hotspot/jtreg/gc/stress/gcbasher/TestGCBasherWithShenandoah.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +import java.io.IOException; + +/* + * @test TestGCBasherWithShenandoah + * @key gc + * @key stress + * @requires vm.gc.Shenandoah + * @requires vm.flavor == "server" & !vm.emulatedClient & !vm.graal.enabled + * @summary Stress the Shenandoah GC by trying to make old objects more likely to be garbage than young objects. + * + * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahVerify -XX:+ShenandoahDegeneratedGC TestGCBasherWithShenandoah 120000 + * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahVerify -XX:-ShenandoahDegeneratedGC TestGCBasherWithShenandoah 120000 + * + * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot TestGCBasherWithShenandoah 120000 + * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot TestGCBasherWithShenandoah 120000 + * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive TestGCBasherWithShenandoah 120000 + * + * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahVerify TestGCBasherWithShenandoah 120000 + * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahVerify TestGCBasherWithShenandoah 120000 + * + * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=adaptive TestGCBasherWithShenandoah 120000 + * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=traversal TestGCBasherWithShenandoah 120000 + * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=compact TestGCBasherWithShenandoah 120000 + */ +public class TestGCBasherWithShenandoah { + public static void main(String[] args) throws IOException { + TestGCBasher.main(args); + } +} diff --git a/test/hotspot/jtreg/gc/stress/gclocker/TestGCLockerWithShenandoah.java b/test/hotspot/jtreg/gc/stress/gclocker/TestGCLockerWithShenandoah.java new file mode 100644 index 00000000000..98ee0c32d32 --- /dev/null +++ b/test/hotspot/jtreg/gc/stress/gclocker/TestGCLockerWithShenandoah.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestGCLockerWithShenandoah + * @key gc + * @requires vm.gc.Shenandoah + * @summary Stress Shenandoah's JNI handling by calling GetPrimitiveArrayCritical while concurrently filling up old gen. + * @run main/native/othervm/timeout=200 -Xlog:gc*=info -Xms1500m -Xmx1500m -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+ShenandoahVerify -XX:+UseShenandoahGC TestGCLockerWithShenandoah + * @run main/native/othervm/timeout=200 -Xlog:gc*=info -Xms1500m -Xmx1500m -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC TestGCLockerWithShenandoah + * @run main/native/othervm/timeout=200 -Xlog:gc*=info -Xms1500m -Xmx1500m -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+UseShenandoahGC -XX:+ShenandoahOOMDuringEvacALot -XX:ShenandoahGCHeuristics=aggressive TestGCLockerWithShenandoah + * @run main/native/othervm/timeout=200 -Xlog:gc*=info -Xms1500m -Xmx1500m -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+UseShenandoahGC -XX:+ShenandoahAllocFailureALot -XX:ShenandoahGCHeuristics=aggressive TestGCLockerWithShenandoah + */ +public class TestGCLockerWithShenandoah { + public static void main(String[] args) { + String[] testArgs = {"2", "Shenandoah heap"}; + TestGCLocker.main(testArgs); + } +} diff --git a/test/hotspot/jtreg/gc/stress/gcold/TestGCOldWithShenandoah.java b/test/hotspot/jtreg/gc/stress/gcold/TestGCOldWithShenandoah.java new file mode 100644 index 00000000000..8deb8cced57 --- /dev/null +++ b/test/hotspot/jtreg/gc/stress/gcold/TestGCOldWithShenandoah.java @@ -0,0 +1,54 @@ +/* +* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 only, as +* published by the Free Software Foundation. +* +* This code is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +* version 2 for more details (a copy is included in the LICENSE file that +* accompanied this code). +* +* You should have received a copy of the GNU General Public License version +* 2 along with this work; if not, write to the Free Software Foundation, +* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +* +* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +* or visit www.oracle.com if you need additional information or have any +* questions. +*/ + +/* + * @test TestGCOldWithShenandoah + * @key gc + * @key stress + * @requires vm.gc.Shenandoah & !vm.graal.enabled + * @summary Stress the GC by trying to make old objects more likely to be garbage than young objects. + * + * @run main/othervm/timeout=600 -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestGCOld 50 1 20 10 10000 + * @run main/othervm/timeout=600 -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -XX:+ShenandoahVerify TestGCOld 50 1 20 10 10000 + * @run main/othervm/timeout=600 -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC TestGCOld 50 1 20 10 10000 + * @run main/othervm/timeout=600 -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC TestGCOld 50 1 20 10 10000 + * + * @run main/othervm -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot TestGCOld 50 1 20 10 10000 + * @run main/othervm -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahAllocFailureALot TestGCOld 50 1 20 10 10000 + * @run main/othervm -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=aggressive TestGCOld 50 1 20 10 10000 + * + * @run main/othervm/timeout=600 -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=adaptive -XX:+ShenandoahVerify TestGCOld 50 1 20 10 10000 + * @run main/othervm/timeout=600 -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=traversal -XX:+ShenandoahVerify TestGCOld 50 1 20 10 10000 + * + * @run main/othervm -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=adaptive TestGCOld 50 1 20 10 10000 + * @run main/othervm -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=static TestGCOld 50 1 20 10 10000 + * @run main/othervm -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=compact TestGCOld 50 1 20 10 10000 + * @run main/othervm -Xmx384M -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=traversal TestGCOld 50 1 20 10 10000 + */ + +public class TestGCOldWithShenandoah { + + public static void main(String[] args) { + TestGCOld.main(args); + } +} diff --git a/test/hotspot/jtreg/gc/stress/systemgc/TestSystemGCWithShenandoah.java b/test/hotspot/jtreg/gc/stress/systemgc/TestSystemGCWithShenandoah.java new file mode 100644 index 00000000000..bce0770b13a --- /dev/null +++ b/test/hotspot/jtreg/gc/stress/systemgc/TestSystemGCWithShenandoah.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test TestSystemGCWithShenandoah + * @key gc + * @key stress + * @requires vm.gc.Shenandoah + * @summary Stress the Shenandoah GC full GC by allocating objects of different lifetimes concurrently with System.gc(). + * @run main/othervm/timeout=300 -Xlog:gc*=info -Xmx512m -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+ShenandoahVerify -XX:+UseShenandoahGC TestSystemGCWithShenandoah 270 + * @run main/othervm/timeout=300 -Xlog:gc*=info -Xmx512m -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+ShenandoahVerify -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=traversal TestSystemGCWithShenandoah 270 + * @run main/othervm/timeout=300 -Xlog:gc*=info -Xmx512m -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC TestSystemGCWithShenandoah 270 + */ +public class TestSystemGCWithShenandoah { + public static void main(String[] args) throws Exception { + TestSystemGC.main(args); + } +} diff --git a/test/hotspot/jtreg/gc/survivorAlignment/TestAllocationInEden.java b/test/hotspot/jtreg/gc/survivorAlignment/TestAllocationInEden.java index 583eaef0d86..586d55e77d1 100644 --- a/test/hotspot/jtreg/gc/survivorAlignment/TestAllocationInEden.java +++ b/test/hotspot/jtreg/gc/survivorAlignment/TestAllocationInEden.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ * @bug 8031323 * @summary Verify that object's alignment in eden space is not affected by * SurvivorAlignmentInBytes option. - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromEdenToTenured.java b/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromEdenToTenured.java index cba0a805561..854a08aae1a 100644 --- a/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromEdenToTenured.java +++ b/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromEdenToTenured.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ * @bug 8031323 * @summary Verify that objects promoted from eden space to tenured space during * full GC are not aligned to SurvivorAlignmentInBytes value. - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromSurvivorToTenuredAfterFullGC.java b/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromSurvivorToTenuredAfterFullGC.java index e35e9a9cf83..5464e017141 100644 --- a/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromSurvivorToTenuredAfterFullGC.java +++ b/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromSurvivorToTenuredAfterFullGC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ * @bug 8031323 * @summary Verify that objects promoted from survivor space to tenured space * during full GC are not aligned to SurvivorAlignmentInBytes value. - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromSurvivorToTenuredAfterMinorGC.java b/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromSurvivorToTenuredAfterMinorGC.java index 2fad59d3c88..03880f64891 100644 --- a/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromSurvivorToTenuredAfterMinorGC.java +++ b/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionFromSurvivorToTenuredAfterMinorGC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ * @summary Verify that objects promoted from survivor space to tenured space * when their age exceeded tenuring threshold are not aligned to * SurvivorAlignmentInBytes value. - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionToSurvivor.java b/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionToSurvivor.java index fb5841704e4..5b8cb4dc100 100644 --- a/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionToSurvivor.java +++ b/test/hotspot/jtreg/gc/survivorAlignment/TestPromotionToSurvivor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ * @bug 8031323 * @summary Verify that objects promoted from eden space to survivor space after * minor GC are aligned to SurvivorAlignmentInBytes. - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/gc/whitebox/TestWBGC.java b/test/hotspot/jtreg/gc/whitebox/TestWBGC.java index 6b9eec22f8c..c7357040c28 100644 --- a/test/hotspot/jtreg/gc/whitebox/TestWBGC.java +++ b/test/hotspot/jtreg/gc/whitebox/TestWBGC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ * @test TestWBGC * @bug 8055098 * @summary Test verify that WB methods isObjectInOldGen and youngGC works correctly. - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java b/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java index 659e2ca63fd..c05db7ecb03 100644 --- a/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java +++ b/test/hotspot/jtreg/runtime/CompressedOops/UseCompressedOops.java @@ -37,6 +37,7 @@ import java.util.Collections; import jdk.test.lib.Platform; import jdk.test.lib.process.ProcessTools; import jdk.test.lib.process.OutputAnalyzer; +import sun.hotspot.gc.GC; import sun.hotspot.code.Compiler; @@ -61,6 +62,9 @@ public class UseCompressedOops { testCompressedOopsModes(args, "-XX:+UseSerialGC"); testCompressedOopsModes(args, "-XX:+UseParallelGC"); testCompressedOopsModes(args, "-XX:+UseParallelOldGC"); + if (GC.Shenandoah.isSupported()) { + testCompressedOopsModes(args, "-XX:+UseShenandoahGC"); + } } public static void testCompressedOopsModes(ArrayList flags1, String... flags2) throws Exception { diff --git a/test/hotspot/jtreg/runtime/MemberName/MemberNameLeak.java b/test/hotspot/jtreg/runtime/MemberName/MemberNameLeak.java index bcd590f9e3a..8ce703244e0 100644 --- a/test/hotspot/jtreg/runtime/MemberName/MemberNameLeak.java +++ b/test/hotspot/jtreg/runtime/MemberName/MemberNameLeak.java @@ -37,6 +37,7 @@ import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.process.ProcessTools; import sun.hotspot.WhiteBox; import sun.hotspot.code.Compiler; +import sun.hotspot.gc.GC; public class MemberNameLeak { static class Leak { @@ -76,6 +77,7 @@ public class MemberNameLeak { // Run this Leak class with logging ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( "-Xlog:membername+table=trace", + "-XX:+UnlockExperimentalVMOptions", "-XX:+UnlockDiagnosticVMOptions", "-XX:+WhiteBoxAPI", "-Xbootclasspath/a:.", @@ -99,6 +101,10 @@ public class MemberNameLeak { if (!Compiler.isGraalEnabled()) { // Graal does not support CMS test("-XX:+UseConcMarkSweepGC", false); test("-XX:+UseConcMarkSweepGC", true); + if (GC.Shenandoah.isSupported()) { + test("-XX:+UseShenandoahGC", true); + test("-XX:+UseShenandoahGC", false); + } } } } diff --git a/test/hotspot/jtreg/runtime/NMT/MallocStressTest.java b/test/hotspot/jtreg/runtime/NMT/MallocStressTest.java index 730dcea3e3d..8d356055c30 100644 --- a/test/hotspot/jtreg/runtime/NMT/MallocStressTest.java +++ b/test/hotspot/jtreg/runtime/NMT/MallocStressTest.java @@ -57,21 +57,19 @@ public class MallocStressTest { release }; - static TestPhase phase = TestPhase.alloc; + static volatile TestPhase phase = TestPhase.alloc; // malloc'd memory - static ArrayList mallocd_memory = new ArrayList(); + static final ArrayList mallocd_memory = new ArrayList(); static long mallocd_total = 0; static WhiteBox whiteBox; static AtomicInteger pause_count = new AtomicInteger(); - static boolean is_64_bit_system; + static final boolean is_64_bit_system = Platform.is64bit(); private static boolean is_64_bit_system() { return is_64_bit_system; } public static void main(String args[]) throws Exception { - is_64_bit_system = (Platform.is64bit()); - OutputAnalyzer output; whiteBox = WhiteBox.getWhiteBox(); diff --git a/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorEventOnOffTest.java b/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorEventOnOffTest.java index 6afe7b951ee..f624f2ed61f 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorEventOnOffTest.java +++ b/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorEventOnOffTest.java @@ -35,7 +35,6 @@ import java.util.List; */ public class HeapMonitorEventOnOffTest { public static void main(String[] args) { - HeapMonitor.enableSamplingEvents(); HeapMonitor.allocateAndCheckFrames(); // Disabling the notification system should stop events. @@ -43,8 +42,8 @@ public class HeapMonitorEventOnOffTest { HeapMonitor.resetEventStorage(); HeapMonitor.allocateAndCheckFrames(false, false); - // Enabling the notification system should start events again. - HeapMonitor.enableSamplingEvents(); + // By calling allocateAndCheckFrames(), we enable the notifications and check if allocations + // get sampled again. HeapMonitor.allocateAndCheckFrames(); } } diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbJhisto.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbJhisto.java index b6fd53b231e..4b14acaaf29 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbJhisto.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbJhisto.java @@ -34,6 +34,7 @@ import jdk.test.lib.Utils; * @bug 8191658 * @summary Test clhsdb jhisto command * @requires vm.hasSA + * @requires vm.gc != "Shenandoah" * @requires vm.gc != "Z" * @library /test/lib * @run main/othervm ClhsdbJhisto diff --git a/test/hotspot/jtreg/serviceability/sa/TestHeapDumpForLargeArray.java b/test/hotspot/jtreg/serviceability/sa/TestHeapDumpForLargeArray.java index 557c8f98217..d1aa3c61558 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestHeapDumpForLargeArray.java +++ b/test/hotspot/jtreg/serviceability/sa/TestHeapDumpForLargeArray.java @@ -47,6 +47,7 @@ import jdk.test.lib.Asserts; * @library /test/lib * @bug 8171084 * @requires vm.hasSAandCanAttach & (vm.bits == "64" & os.maxMemory > 8g) + * @requires vm.gc != "Shenandoah" * @requires vm.gc != "Z" * @modules java.base/jdk.internal.misc * jdk.hotspot.agent/sun.jvm.hotspot diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstack/WaitNotifyThreadTest.java b/test/hotspot/jtreg/serviceability/tmtools/jstack/WaitNotifyThreadTest.java index c4fe1cc8ba9..21a012040a4 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstack/WaitNotifyThreadTest.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstack/WaitNotifyThreadTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,9 +41,9 @@ public class WaitNotifyThreadTest { private Object monitor = new Object(); private final String OBJECT = "a java.lang.Object"; private final String OBJECT_WAIT = "java.lang.Object.wait"; + private final String RUN_METHOD = "WaitNotifyThreadTest$WaitThread.run"; interface Action { - void doAction(Thread thread); } @@ -51,10 +51,12 @@ public class WaitNotifyThreadTest { @Override public void doAction(Thread thread) { - //Notify the waiting thread, so it stops waiting and sleeps + // Notify the waiting thread, so it stops waiting and sleeps synchronized (monitor) { monitor.notifyAll(); } + // Wait until MyWaitingThread exits the monitor and sleeps + while (thread.getState() != Thread.State.TIMED_WAITING) {} } } @@ -64,6 +66,8 @@ public class WaitNotifyThreadTest { public void doAction(Thread thread) { // Interrupt the thread thread.interrupt(); + // Wait until MyWaitingThread exits the monitor and sleeps + while (thread.getState() != Thread.State.TIMED_WAITING) {} } } @@ -99,10 +103,12 @@ public class WaitNotifyThreadTest { final String WAITING_THREAD_NAME = "MyWaitingThread"; - // Start athread that just waits + // Start a thread that just waits WaitThread waitThread = new WaitThread(); waitThread.setName(WAITING_THREAD_NAME); waitThread.start(); + // Wait until MyWaitingThread enters the monitor + while (waitThread.getState() != Thread.State.WAITING) {} // Collect output from the jstack tool JstackTool jstackTool = new JstackTool(ProcessHandle.current().pid()); @@ -122,7 +128,6 @@ public class WaitNotifyThreadTest { JStack jstack2 = new DefaultFormat().parse(results.getStdoutString()); ThreadStack ti2 = jstack2.getThreadStack(WAITING_THREAD_NAME); analyzeThreadStackNoWaiting(ti2); - } private void analyzeThreadStackWaiting(ThreadStack ti1) { @@ -134,45 +139,43 @@ public class WaitNotifyThreadTest { if (mi.getName().startsWith(OBJECT_WAIT) && mi.getCompilationUnit() == null /*native method*/) { if (mi.getLocks().size() == 1) { MonitorInfo monInfo = mi.getLocks().getFirst(); - if (monInfo.getType().equals("waiting on") && compareMonitorClass(monInfo)) { - monitorAddress = monInfo.getMonitorAddress(); - } else { - System.err.println("Error: incorrect monitor info: " + monInfo.getType() + ", " + monInfo.getMonitorClass()); - throw new RuntimeException("Incorrect lock record in " - + OBJECT_WAIT + " method"); - } - + monitorAddress = monInfo.getMonitorAddress(); + assertMonitorInfo("waiting on", monInfo, monitorAddress, OBJECT_WAIT); } else { - throw new RuntimeException(OBJECT_WAIT - + " method has to contain one lock record bu it contains " + mi.getLocks().size()); + throw new RuntimeException(OBJECT_WAIT + " method has to contain one lock record but it contains " + + mi.getLocks().size()); } } - if (mi.getName().startsWith("WaitThread.run")) { + if (mi.getName().startsWith(RUN_METHOD)) { if (monitorAddress == null) { throw new RuntimeException("Cannot found monitor info associated with " + OBJECT_WAIT + " method"); } - - int numLocks = mi.getLocks().size(); - for (int i = 0; i < numLocks - 1; ++i) { - assertMonitorInfo("waiting to re-lock in wait()", mi.getLocks().get(i), monitorAddress); + if (mi.getLocks().size() == 1) { + MonitorInfo monInfo = mi.getLocks().getLast(); + if (monitorAddress.equals("no object reference available")) { + monitorAddress = monInfo.getMonitorAddress(); + } + assertMonitorInfo("locked", monInfo, monitorAddress, RUN_METHOD); + } + else { + throw new RuntimeException(RUN_METHOD + " method has to contain one lock record but it contains " + + mi.getLocks().size()); } - assertMonitorInfo("locked", mi.getLocks().getLast(), monitorAddress); } } - } - private void assertMonitorInfo(String expectedMessage, MonitorInfo monInfo, String monitorAddress) { + private void assertMonitorInfo(String expectedMessage, MonitorInfo monInfo, String monitorAddress, String method) { if (monInfo.getType().equals(expectedMessage) && compareMonitorClass(monInfo) && monInfo.getMonitorAddress().equals( monitorAddress)) { - System.out.println("Correct monitor info found"); + System.out.println("Correct monitor info found in " + method + " method"); } else { System.err.println("Error: incorrect monitor info: " + monInfo.getType() + ", " + monInfo.getMonitorClass() + ", " + monInfo.getMonitorAddress()); System.err.println("Expected: " + expectedMessage + ", a java.lang.Object, " + monitorAddress); - throw new RuntimeException("Incorrect lock record in 'run' method"); + throw new RuntimeException("Incorrect lock record in " + method + " method"); } } diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCapacityTest.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCapacityTest.java index 4347b4e4565..848a9076eec 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCapacityTest.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCapacityTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ import utils.*; * @test * @summary Test checks the consistency of the output * displayed with jstat -gccapacity. - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @modules java.base/jdk.internal.misc * @library /test/lib * @library ../share diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest01.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest01.java index 6900b74eec4..d1348a12d0d 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest01.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,7 +32,7 @@ * @library /test/lib * @library ../share * @requires vm.opt.ExplicitGCInvokesConcurrent != true - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @run main/othervm -XX:+UsePerfData -Xmx128M GcCauseTest01 */ import utils.*; diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest02.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest02.java index 53c5aecf759..d3c92663d91 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest02.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest02.java @@ -28,7 +28,7 @@ * test forces debuggee application eat ~70% of heap and runs jstat. * jstat should show actual usage of old gen (OC/OU ~= old gen usage). * @requires vm.opt.ExplicitGCInvokesConcurrent != true - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @modules java.base/jdk.internal.misc * @library /test/lib * @library ../share diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest03.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest03.java index 018f7b61b95..a8afc771276 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest03.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcCauseTest03.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ * Test scenario: * test forces debuggee application call System.gc(), runs jstat and checks that * cause of last garbage collection displayed by jstat (LGCC) is 'System.gc()'. - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @modules java.base/jdk.internal.misc * @library /test/lib * @library ../share diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcNewTest.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcNewTest.java index c676689f895..abe80074770 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcNewTest.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcNewTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,7 @@ import utils.*; * test several times provokes garbage collection in the debuggee application and after each garbage * collection runs jstat. jstat should show that after garbage collection number of GC events and garbage * collection time increase. - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @modules java.base/jdk.internal.misc * @library /test/lib * @library ../share diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest01.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest01.java index c2ead3a11d9..74ac7132109 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest01.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest01.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ * @library /test/lib * @library ../share * @requires vm.opt.ExplicitGCInvokesConcurrent != true - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @run main/othervm -XX:+UsePerfData -Xmx128M GcTest01 */ import utils.*; diff --git a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest02.java b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest02.java index d18e546f0d3..0a3102625d6 100644 --- a/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest02.java +++ b/test/hotspot/jtreg/serviceability/tmtools/jstat/GcTest02.java @@ -28,7 +28,7 @@ * test forces debuggee application eat ~70% of heap and runs jstat. * jstat should show actual usage of old gen (OC/OU ~= old gen usage). * @requires vm.opt.ExplicitGCInvokesConcurrent != true - * @requires vm.gc != "Z" + * @requires vm.gc != "Z" & vm.gc != "Shenandoah" * @modules java.base/jdk.internal.misc * @library /test/lib * @library ../share diff --git a/test/hotspot/jtreg/testlibrary/ctw/Makefile b/test/hotspot/jtreg/testlibrary/ctw/Makefile index 4e66a8d42ff..395db33fa86 100644 --- a/test/hotspot/jtreg/testlibrary/ctw/Makefile +++ b/test/hotspot/jtreg/testlibrary/ctw/Makefile @@ -45,7 +45,7 @@ SRC_FILES = $(shell find $(SRC_DIR) -name '*.java') LIB_FILES = $(shell find $(TESTLIBRARY_DIR)/jdk/test/lib/ \ $(TESTLIBRARY_DIR)/jdk/test/lib/process \ $(TESTLIBRARY_DIR)/jdk/test/lib/util \ - -depth 1 -name '*.java') + -maxdepth 1 -name '*.java') WB_SRC_FILES = $(shell find $(TESTLIBRARY_DIR)/sun/hotspot -name '*.java') EXPORTS=--add-exports java.base/jdk.internal.jimage=ALL-UNNAMED \ --add-exports java.base/jdk.internal.misc=ALL-UNNAMED \ @@ -69,7 +69,7 @@ $(DST_DIR): @mkdir -p $@ $(DST_DIR)/ctw.sh: $(DST_DIR) - echo '$${JAVA_HOME}/bin/java $${JAVA_OPTIONS} $(EXPORTS) -jar -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:wb.jar -jar ctw.jar $$@' > $@ + echo '$${JAVA_HOME}/bin/java $${JAVA_OPTIONS} $(EXPORTS) -XX:-UseCounterDecay -Xbatch "-XX:CompileCommand=exclude,java/lang/invoke/MethodHandle.*" -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:wb.jar -jar ctw.jar $$@' > $@ chmod a+x $@ $(DST_DIR)/ctw.jar: filelist $(DST_DIR)/wb.jar diff --git a/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java b/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java index 4b4a02a56ad..6ab6b957212 100644 --- a/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java +++ b/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java @@ -272,6 +272,7 @@ public class CtwRunner { "--add-exports", "java.base/jdk.internal.jimage=ALL-UNNAMED", "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED", "--add-exports", "java.base/jdk.internal.reflect=ALL-UNNAMED", + "--add-exports", "java.base/jdk.internal.access=ALL-UNNAMED", // enable diagnostic logging "-XX:+LogCompilation", // use phase specific log, hs_err and ciReplay files diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/general_functions/GF08/gf08t001/TestDriver.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/general_functions/GF08/gf08t001/TestDriver.java index a1ea6c076f4..443c89ea443 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/general_functions/GF08/gf08t001/TestDriver.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/general_functions/GF08/gf08t001/TestDriver.java @@ -72,15 +72,16 @@ public class TestDriver { Boolean isUseG1GCon = wb.getBooleanVMFlag("UseG1GC"); Boolean isUseConcMarkSweepGCon = wb.getBooleanVMFlag("UseConcMarkSweepGC"); Boolean isUseZGCon = wb.getBooleanVMFlag("UseZGC"); + Boolean isShenandoahGCon = wb.getBooleanVMFlag("UseShenandoahGC"); Boolean isUseEpsilonGCon = wb.getBooleanVMFlag("UseEpsilonGC"); if (Compiler.isGraalEnabled() && - (isUseConcMarkSweepGCon || isUseZGCon || isUseEpsilonGCon)) { + (isUseConcMarkSweepGCon || isUseZGCon || isUseEpsilonGCon || isShenandoahGCon)) { return; // Graal does not support these GCs } String keyPhrase; - if ((isExplicitGCInvokesConcurrentOn && (isUseG1GCon || isUseConcMarkSweepGCon)) || isUseZGCon) { + if ((isExplicitGCInvokesConcurrentOn && (isUseG1GCon || isUseConcMarkSweepGCon)) || isUseZGCon || isShenandoahGCon) { keyPhrase = "GC"; } else { keyPhrase = "Pause Full"; diff --git a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network001.java b/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network001.java deleted file mode 100644 index 47a1275df6b..00000000000 --- a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network001.java +++ /dev/null @@ -1,544 +0,0 @@ -/* - * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @key stress - * - * @summary converted from VM testbase nsk/stress/network/network001. - * VM testbase keywords: [stress, diehard, slow, nonconcurrent, quick] - * VM testbase readme: - * DESCRIPTION - * This test transfers huge amount of data between server and client - * TCP/IP sockets, and checks if those data are transfered correctly. - * Both sockets are attached to local host name, or to the loopback - * "localhost" (having IP address 127.0.0.1). - * Information transfer is synchronized in this test. Client passes - * a large data parcel to server, and server reads that parcel and checks - * if it is same as expected (byte-to-byte equality). Then server passes - * (some other) parcel to client, and client reads and verifies those bytes. - * This ping-pong game is repeated 2000 times; and after that both sockets - * check if there are no extra bytes accudentally passed through their - * connection. - * Parcels lengths and contents are chosen randomly, and average parcel - * length is 125 bytes. So totally, each of the 2 sockets passes ~250Kb of - * data to its partner, and thus ~500Kb of data are transfered by this test. - * COMMENTS - * Note, that HotSpot 1.3beta-H fails to start this test due to the bug: - * #4245704 (P1/S1) Fails to launch with: jre/bin/net.dll ... - * - * @run main/othervm nsk.stress.network.network001 - */ - -package nsk.stress.network; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.Random; - -/** - * This test transfers huge amount of data between server and client - * TCP/IP sockets, and checks if those data are transfered correctly. - * Both sockets are attached to local host name, or to the loopback - * ``localhost'' (having IP address 127.0.0.1). - *

    - *

    Information transfer is synchronized in this test. Client passes - * a large data parcel to server, and server reads that parcel and checks - * if it is same as expected (byte-to-byte equality). Then server passes - * (some other) parcel to client, and client reads and verifies those bytes. - * This ping-pong game is repeated 2000 times; and after that both sockets - * check if there are no extra bytes accudentally passed through their - * connection. - *

    - *

    Parcels lengths and contents are chosen randomly, and average parcel - * length is 125 bytes. So totally, each of the 2 sockets passes ~250Kb of - * data to its partner, and thus ~500Kb of data are transfered by this test. - */ -public class network001 { - /** - * Number of parcels to be sent/recieve. - */ - private static final int DATA_PARCELS = 2000; - - /** - * Maximal length of data parcel to be sent/recieved - * (now it equals to 250 bytes). - */ - private static final int MAX_PARCEL = 250; - - /** - * Either actually display optional reports or not. - */ - static private final boolean DEBUG_MODE = false; - - /** - * Errors and optional reports log. Usually System.out. - */ - static private PrintStream out = System.out; - - /** - * Print error message: both client and server may print - * concurently. - */ - static private synchronized void println(Object message) { - out.println(message.toString()); - } - - /** - * Display optional report: comment ca va. - */ - static private void display(Object report) { - if (DEBUG_MODE) - println(report.toString()); - } - - /** - * Server thread intended to reply to data parcels sent by Client thread. - */ - static private class Server extends Thread { - /** - * This server thread listens the single socket. - */ - private ServerSocket serverSocket; - - /** - * Address and port of this server socket. - */ - public String toString() { - return serverSocket.toString(); - } - - /** - * Did the thread failed? If yes, what is the failure's reason. - */ - Exception exception = null; - - /** - * Which port does this socket is listening. - */ - int getPort() { - return serverSocket.getLocalPort(); - } - - /** - * Find some free port at the given address - * and attach new server to hear that port. - */ - Server(InetAddress address) throws IOException { - int someFreePort = 0; - int backlog = 50; // default for new ServerSocket(port) - serverSocket = new ServerSocket(someFreePort, backlog, address); - } - - /** - * Accept connection, read the string "abra", and respond "cadabra". - */ - public void run() { - try { - Socket socket = serverSocket.accept(); - display("Server socket: " + socket); - - InputStream istream = socket.getInputStream(); - OutputStream ostream = socket.getOutputStream(); - - Random random = new Random(0); - - for (int i = 0; i < DATA_PARCELS; i++) { - Parcel etalon = new Parcel(random); - - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - println("Server thread got unexpected parcel:"); - println("sample=" + sample); - println("etalon=" + etalon); - throw new TestFailure( - "server has read unexpected parcel"); - } - - etalon.send(ostream); - ostream.flush(); - } - - int datum = istream.read(); // wait for client close() - if (datum >= 0) - throw new TestFailure( - "server has read ambigous byte: " + datum); - - ostream.close(); // implies: socket.close(); - - } catch (Exception oops) { - exception = oops; - } - } - - } - - /** - * Client thread intended to send data parcels to Server thread and - * to recieve the server's replies. - */ - static private class Client extends Thread { - /** - * This thread uses the single client socket. - */ - private Socket socket; - - /** - * Address and port of this socket. - */ - public String toString() { - return socket.toString(); - } - - /** - * Did the thread failed? If yes, what is the failure's reason. - */ - Exception exception = null; - - /** - * Connect client socket on the given address - * and port. - */ - Client(InetAddress address, int port) throws IOException { - socket = new Socket(address, port); - } - - /** - * Accept connection, read the string "abra", and respond "cadabra". - */ - public void run() { - try { - InputStream istream = socket.getInputStream(); - OutputStream ostream = socket.getOutputStream(); - - Random random = new Random(0); - - for (int i = 0; i < DATA_PARCELS; i++) { - Parcel etalon = new Parcel(random); - etalon.send(ostream); - ostream.flush(); - - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - println("Client thread got unexpected parcel:"); - println("sample=" + sample); - println("etalon=" + etalon); - throw new TestFailure( - "parcel context is unexpected to client"); - } - } - - if (istream.available() > 0) { - int datum = istream.read(); - throw new TestFailure( - "client has read ambigous byte: " + datum); - } - ostream.close(); // implies: socket.close() - - } catch (Exception oops) { - exception = oops; - } - } - - } - - /** - * A data parcel to sent/recieved between Client and Server threads. - * When data parcel is sent, first 4 bytes transfered encode the size - * of the parcel (i.e.: number of data bytes in the parcel's contents). - * Then the parcel's contents bytes are transered. - */ - static class Parcel { - private byte[] parcel; - - /** - * Display all bytes as integer values from 0 to 255; - * or return ``null'' if this Parcel is not - * yet initialized. - */ - public String toString() { - if (parcel == null) - return "null"; - String s = "{"; - for (int i = 0; i < parcel.length; i++) - s += (i > 0 ? ", " : "") + ((int) parcel[i] & 0xFF); - return s + "}"; - } - - /** - * Generate new parcel[] array using the given - * random numbers generator. Client and Server - * threads should use identical random generators, - * so that those threads could generate equal data parcels and - * check the parcel just transfered. - */ - public Parcel(Random random) { - int size = random.nextInt(MAX_PARCEL) + 1; - parcel = new byte[size]; - for (int i = 0; i < size; i++) - parcel[i] = (byte) random.nextInt(256); - } - - /** - * Read exactly size bytes from the istream - * if possible, or throw TestFailure if unexpected end of - * istream occurs. - */ - private static byte[] readBytes(int size, InputStream istream) - throws IOException { - - byte data[] = new byte[size]; - for (int i = 0; i < size; i++) { - int datum = istream.read(); - if (datum < 0) - throw new TestFailure( - "unexpected EOF: have read: " + i + " bytes of " + size); - data[i] = (byte) datum; - } - return data; - } - - /** - * Read 4 bytes from istream and threat them to encode - * size of data parcel following these 4 bytes. - */ - private static int getSize(InputStream istream) throws IOException { - byte data[] = readBytes(4, istream); - int data0 = (int) data[0] & 0xFF; - int data1 = (int) data[1] & 0xFF; - int data2 = (int) data[2] & 0xFF; - int data3 = (int) data[3] & 0xFF; - int sizeWord = data0 + (data1 << 8) + (data2 << 16) + (data3 << 24); - int size = sizeWord + 1; - if (size <= 0) - throw new TestFailure("illegal size: " + size); - return size; - } - - /** - * Send 4 bytes encoding actual size of the parcel just to be transfered. - */ - private static void putSize(OutputStream ostream, int size) - throws IOException { - - if (size <= 0) - throw new TestFailure("illegal size: " + size); - - int sizeWord = size - 1; - byte data[] = new byte[4]; - data[0] = (byte) sizeWord; - data[1] = (byte) (sizeWord >> 8); - data[2] = (byte) (sizeWord >> 16); - data[3] = (byte) (sizeWord >> 24); - ostream.write(data); - } - - /** - * Recieve data parcel. - */ - public Parcel(InputStream istream) throws IOException { - int size = getSize(istream); - parcel = readBytes(size, istream); - } - - /** - * Send this data parcel. - */ - public void send(OutputStream ostream) throws IOException { - int size = parcel.length; - putSize(ostream, size); - ostream.write(parcel); - } - - /** - * Check byte-to-byte equality between this and the - * other parcels. - */ - public boolean equals(Parcel other) { - if (this.parcel.length != other.parcel.length) - return false; - int size = parcel.length; - for (int i = 0; i < size; i++) - if (this.parcel[i] != other.parcel[i]) - return false; - return true; - } - - } - - /** - * Server or Client thread may throw this exception to report the test - * failure. - */ - static class TestFailure extends RuntimeException { - /** - * Report particular purpose of the test failure. - */ - public TestFailure(String purpose) { - super(purpose); - } - - } - - /** - * Attach client and server sockets to the local host, and check if - * huge amount of data could be correctly transfered between these - * sockets. - *

    - *

    Command-line parameters provided with args[] may - * prompt the local host IP address or domain name. Execute: - *
       - * java network001 [IP-address | host_name | - * localhost ] - *
    where parameters are: - *
       - * IP-address - local hots's address, or 127.0.0.1 - *
       - * host_name - local host's domain name, or the - * keyword ``localhost'' - *
       - * localhost - placeholder for the IP-address 127.0.0.1 - *
    By default, the test uses the Internet address available via - * the method InetAddress.getLocalHost() - */ - public static int run(String args[], PrintStream out) { - network001.out = out; - - // - // Get IP address of the local machine. - // - - InetAddress address = null; - try { - switch (args.length) { - case 0: - address = InetAddress.getLocalHost(); - break; - case 1: - String hostName = args[0]; - address = InetAddress.getByName(args[0]); - break; - default: - println("Use:"); - println(" java network001"); - println("or:"); - println(" java network001 ${IP_ADDRESS}"); - println("or:"); - println(" java network001 ${HOST_NAME}"); - println("or:"); - println(" java network001 localhost"); - return 2; // FAILED - } - } catch (UnknownHostException exception) { - println(exception); - return 2; // FAILED - } - display("Host: " + address); - - // - // Incarnate the server & the client sockets. - // - - Server server = null; - try { - server = new Server(address); - } catch (IOException io) { - println("Failed to create server: " + io); - return 2; - } - display("Server: " + server); - - int port = server.getPort(); - - Client client = null; - try { - client = new Client(address, port); - } catch (IOException io) { - out.println("Failed to create client: " + io); - return 2; - } - display("Client socket: " + client); - - // - // Execute the server and client threads. - // - - Exception exception = null; - try { - server.start(); - client.start(); - while (client.isAlive() || server.isAlive()) - if (client.exception == null && server.exception == null) - Thread.yield(); - else - break; - } catch (TestFailure failure) { - exception = failure; - } - - // Failure diagnostics, if needed. - - Exception problem[] = new Exception[3]; - problem[0] = exception; - problem[1] = server.exception; - problem[2] = client.exception; - - int exitCode = 0; - - for (int i = 0; i < 3; i++) - if (problem[i] != null) { - out.println("#### OOPS ! ####"); - problem[i].printStackTrace(out); - exitCode = 2; - } - - if (exitCode != 0) { - out.println("#### OOPS ! ####"); - out.println("# Test failed."); - return 2; // FAILED - } - display("Test passed."); - return 0; // PASSED - } - - /** - * Re-calls to the method run(args[],out) actually - * performing the test; and stop with exit code 95 if the test - * has passed, or with code 97 if the test has failed. - * (This is JCK-like exit codes convention.) - * - * @see #run(String[], PrintStream) - */ - public static void main(String args[]) { - int exitCode = run(args, System.out); - System.exit(exitCode + 95); - // JCK-like exit code. - } - -} diff --git a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network002.java b/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network002.java deleted file mode 100644 index fdbaca17f16..00000000000 --- a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network002.java +++ /dev/null @@ -1,697 +0,0 @@ -/* - * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - - -/* - * @test - * @key stress - * - * @summary converted from VM testbase nsk/stress/network/network002. - * VM testbase keywords: [stress, slow, nonconcurrent, quick] - * VM testbase readme: - * DESCRIPTION - * This test transfers huge amount of data between 2 Java virtual machines - * using the TCP/IP protocol, and checks if those data are transfered correctly. - * Both client and server VMs run on the same local computer and attach TCP/IP - * sockets to the local host, or to the loopback domain "localhost" (having IP - * address 127.0.0.1). - * Information transfer is synchronized in this test. Client VM passes - * a large data parcel to server VM, and server reads that parcel and checks - * if it is same as expected (byte-to-byte equality). Then server passes - * (some other) parcel to client, and client reads and verifies those data. - * This ping-pong game is repeated 2000 times; and after that both VMs check - * if there are no extra bytes accudentally passed through their connection. - * Parcels lengths and contents are chosen randomly, and average parcel - * length is 125 bytes. So totally, each of the 2 VMs passes ~250Kb of data - * to its partner, and thus ~500Kb of data are transfered by this test. - * COMMENTS - * HotSpot 1.3beta-H fails to start this test due to the hotspot bug: - * #4245704 (P1/S1) Fails to launch with: jre/bin/net.dll ... - * Test was fixed: - * added WAITTIME parameter defined timeout for TCP/IP sockets in minutes - * - * @library /vmTestbase - * /test/lib - * @run driver jdk.test.lib.FileInstaller . . - * @build nsk.stress.network.network002 - * @run main/othervm PropertyResolvingWrapper - * nsk.stress.network.network002 - * "${test.jdk}/bin/java ${test.vm.opts} ${test.java.opts}" 5 - */ - -package nsk.stress.network; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.Random; - -/** - * This test transfers huge amount of data between 2 Java virtual machines - * using the TCP/IP protocol, and checks if those data are transfered correctly. - * Both client and server VMs run on the same local computer and attach TCP/IP - * sockets to the local host, or to the loopback domain ``localhost'' - * (having IP address 127.0.0.1). - *

    - *

    Information transfer is synchronized in this test. Client VM passes - * a large data parcel to server VM, and server reads that parcel and checks - * if it is same as expected (byte-to-byte equality). Then server passes - * (some other) parcel to client, and client reads and verifies those data. - * This ping-pong game is repeated 2000 times; and after that both VMs check - * if there are no extra bytes accudentally passed through their connection. - *

    - *

    Parcels lengths and contents are chosen randomly, and average parcel - * length is 125 bytes. So totally, each of the 2 VMs passes ~250Kb of data - * to its partner, and thus ~500Kb of data are transfered by this test. - */ -public class network002 { - /** - * Timeout for TCP/IP sockets (currently set to 1 min). - */ - private static int SO_TIMEOUT; - - /** - * Number of parcels to be sent/recieved. - */ - private static final int DATA_PARCELS = 2000; - - /** - * Maximal length of data parcel to be sent/recieved. - */ - private static final int MAX_PARCEL = 250; - - /** - * Either actually display optional reports or not. - */ - static private final boolean DEBUG_MODE = false; - - //----------------------------------------------------------------// - - /** - * Re-calls to the method run(args[],out) actually - * performing the test. After run(args[],out) stops, - * follow JDK-like convention for exit codes. I.e.: stop with - * exit status 95 if the test has passed, or with status 97 if - * the test has failed. - * - * @see #run(String[], PrintStream) - */ - public static void main(String args[]) { - int exitCode = run(args, System.out); - System.exit(exitCode + 95); - // JCK-like exit status. - } - - /** - * Incarnate new network002 instance reporting to the given - * out stream, and invoke the method run(args) - * for that instance to perform the test. - */ - public static int run(String args[], PrintStream out) { - network002 test = new network002(out); - int exitCode = test.run(args); - return exitCode; - } - - /** - * Parse command-line parameters stored into args[] array, - * then perform the test. I.e.: start the server thread at the same VM - * this method runs, then start the other client VM, and verify data - * transfer through TCP/IP connection between those different virtual - * machines. - *

    - *

    There should be 1 or 2 command-line parameters: - *
       - * java network002 java_command waittime - * [IP-address | host_name | localhost ] - *
    where parameters are: - *
       - * java_command - how to start java, - * e.g.: ``c:\jdk1.3\bin\java -classic'' - *
       - * waittime - timeout for TCP/IP sockets in minutes - *
       - * IP-address - local hots's address, or 127.0.0.1 - *
       - * host_name - local host's domain name, or the - * keyword ``localhost'' - *
       - * localhost - placeholder for the IP-address 127.0.0.1 - *

    - *

    Usually, java_command should point to the same - * Java machine just executing this test. However, every compatible Java 2 - * implementation is appropriate. - *

    - *

    If optional parameter is ommited, the test invokes the method - * InetAddress.getLocalHost() to get the domain name and - * IP-address of the local computer. - */ - private int run(String args[]) { - // - // Get the Internet address of the local machine. - // - InetAddress address = null; - try { - switch (args.length) { - case 2: - address = InetAddress.getLocalHost(); - break; - case 3: - address = InetAddress.getByName(args[2]); - break; - default: - complain("Illegal arguments number; execute:"); - complain(" java network002 $JAVA_COMMAND " + - "[$IP_ADDRESS | $HOST_NAME | localhost]"); - return 2; // FAILED - } - } catch (UnknownHostException exception) { - complain(exception.toString()); - return 2; // FAILED - } - display("Host: " + address); - - // - // Start the server thread on the same VM this method just runs. - // - Server server = null; - try { - server = new Server(address); - server.start(); - } catch (Exception exception) { - complain("Failed to start server: " + exception); - return 2; - } - display("Server: " + server); - - // - // Start the client process on different VM. - // - String IPAddress = server.getIPAddress(); // e.g.: 127.0.0.1 - int port = server.getPort(); - String command = args[0] + " " + network002.class.getName() + "$Client " + IPAddress + " " + port; - try { - SO_TIMEOUT = Integer.parseInt(args[1]) * 60 * 1000; - } catch (NumberFormatException e) { - complain("Wrong timeout argument: " + e); - return 2; - } - - Runtime runtime = Runtime.getRuntime(); - - Process client = null; - IORedirector redirectOut = null; - IORedirector redirectErr = null; - - try { - client = runtime.exec(command); - - InputStream clientOut = client.getInputStream(); - InputStream clientErr = client.getErrorStream(); - redirectOut = new IORedirector(clientOut, DEBUG_MODE ? out : null); - redirectErr = new IORedirector(clientErr, out); - redirectOut.start(); - redirectErr.start(); - - } catch (Exception exception) { - complain("Failed to start client: " + exception); - return 2; - } - - // - // Wait until the server and client both stop. - // - try { - client.waitFor(); - if (redirectOut.isAlive()) - redirectOut.join(); - if (redirectErr.isAlive()) - redirectErr.join(); - - // If client has crashed, also terminate the server (to avoid hangup). - int clientStatus = client.exitValue(); - if (clientStatus != 95) { - complain(""); - complain("Client VM has crashed: exit status=" + clientStatus); - if (server.isAlive()) - complain("Server also should be terminated."); - complain("Test failed."); - return 2; // failure - } - - // Client has finished OK; wait for the server. - if (server.isAlive()) - server.join(); - - } catch (Exception exception) { - complain("Test interrupted: " + exception); - complain("Test failed."); - return 2; // FAILURE - } - - // - // Complain failure, if occured. - // - - if (server.exception != null) { - complain("Server exception: " + server.exception); - complain("Test failed."); - return 2; // failure - } - - display("Test passed."); - return 0; // Ok - } - - //----------------------------------------------------------------// - - /** - * The test should report to the given out stream. - */ - private network002(PrintStream out) { - this.out = out; - } - - /** - * Log stream for error messages and/or (optional) execution trace. - */ - private PrintStream out; - - /** - * Print error message. - */ - private void complain(Object message) { - out.println("# " + message); - out.flush(); - } - - /** - * Display optional report: comment ca va? - */ - private void display(Object report) { - if (DEBUG_MODE) - out.println(report.toString()); - out.flush(); - } - - //----------------------------------------------------------------// - - /** - * Server thread should reply to data parcels sent by Client VM. - */ - private class Server extends Thread { - /** - * The socket to listen for a client. - */ - private ServerSocket serverSocket; - - /** - * Display the server socket. - */ - public String toString() { - return serverSocket.toString(); - } - - /** - * Server's IP-address in the form ``x.y.u.z'', - * or ``127.0.0.1'' for loopback connection. - */ - public String getIPAddress() { - return serverSocket.getInetAddress().getHostAddress(); - } - - /** - * Which port is this socket listening? - */ - int getPort() { - return serverSocket.getLocalPort(); - } - - /** - * Find some free port at the given address - * and attach new server to hear that port. - */ - public Server(InetAddress address) throws IOException { - int someFreePort = 0; - int backlog = 50; // default for new ServerSocket(port) - serverSocket = new ServerSocket(someFreePort, backlog, address); - } - - /** - * Exception just arisen while the server was working, - * or null if it was OK with the server. - */ - Exception exception = null; - - /** - * Accept connection, then reply to client's parcels. - */ - public void run() { - try { - Socket socket = serverSocket.accept(); - socket.setSoTimeout(SO_TIMEOUT); - - InputStream istream = socket.getInputStream(); - OutputStream ostream = socket.getOutputStream(); - - Random random = new Random(0); - - for (int i = 0; i < DATA_PARCELS; i++) { - display("Server: i=" + i); - Parcel etalon = new Parcel(random); - - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - complain("Server got unexpected parcel:\n" - + "sample=" + sample + "\n" - + "etalon=" + etalon); - throw new TestFailure( - "the parcel just read seems wrong for server"); - } - - etalon.send(ostream); - ostream.flush(); - } - - int datum = istream.read(); // wait for client close() - if (datum >= 0) - throw new TestFailure( - "server has read ambigous byte: " + datum); - - ostream.close(); // implies: socket.close(); - - } catch (Exception oops) { - exception = oops; - } - } - - } - - //----------------------------------------------------------------// - - /** - * Client VM should send data parcels to Server VM and - * recieve and verify the server's replies. - */ - private static class Client { - /** - * Print error message. - */ - private static void complain(Object message) { - System.err.println("# " + message); - System.err.flush(); - } - - /** - * Display execution trace. - */ - private static void display(Object message) { - System.out.println(message.toString()); - System.out.flush(); - } - - /** - * Exit with JCK-like status. - */ - private static void exit(int exitCode) { - System.exit(exitCode + 95); - } - - /** - * Atack server with huge data parcels, and check if it replies correctly. - * The command-line parameters prescribe the server's IP-address and port: - *
       - * java network002$Client IP-address port - *
    where: - *
       - * IP-address - local host's address, - * or 127.0.0.1 - *
       - * port - some port assigned by server - */ - public static void main(String args[]) { - if (args.length != 2) { - complain("Illegal number of client paramenets, try:"); - complain(" java network002$Client IP-address port"); - exit(2); // FAILED - } - - try { - InetAddress address = InetAddress.getByName(args[0]); - int port = Integer.parseInt(args[1]); - - Socket socket = new Socket(address, port); - socket.setSoTimeout(SO_TIMEOUT); - display("Client: " + socket); - - InputStream istream = socket.getInputStream(); - OutputStream ostream = socket.getOutputStream(); - - Random random = new Random(0); - - for (int i = 0; i < DATA_PARCELS; i++) { - display("Client: i=" + i); - Parcel etalon = new Parcel(random); - etalon.send(ostream); - ostream.flush(); - - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - complain("Client got unexpected parcel:\n" - + "sample=" + sample + "\n" - + "etalon=" + etalon); - throw new TestFailure( - "parcel context is unexpected to client"); - } - } - - if (istream.available() > 0) { - int datum = istream.read(); - throw new TestFailure( - "client has read ambigous byte: " + datum); - } - ostream.close(); // implies: socket.close() - - } catch (Exception exception) { - complain("Client exception: " + exception); - exit(2); // FAILED - } - exit(0); // PASSED, at least at the client side. - } - - } - - /** - * Two of such threads should redirect out and err - * streams of client VM. - */ - private static class IORedirector extends Thread { - /** - * Source stream. - */ - InputStream in; - /** - * Destination stream. - */ - OutputStream out; - - /** - * Redirect in to out. - */ - public IORedirector(InputStream in, OutputStream out) { - this.in = in; - this.out = out; - } - - /** - * Read input stream until the EOF, and write everithing to output stream. - * If output stream is assigned to null, do not print anything, - * but read the input stream anywhere. - */ - public void run() { - try { - for (; ; ) { - int symbol = in.read(); - if (symbol < 0) - break; // EOF - if (out != null) - out.write(symbol); - } - - if (out != null) - out.flush(); - - } catch (Exception exception) { - throw new TestFailure("IORedirector exception: " + exception); - } - } - } - - //----------------------------------------------------------------// - - /** - * A data parcel to be sent/recieved between Client VM and Server thread. - * When data parcel is sent, first 4 bytes are transfered which encode the - * int number equal to size of the parcel minus 1. I.e.: if - * number of data bytes in the parcel's contents is N, then - * the first 4 bytes encode the number N-1. After that, the - * parcel's contents bytes are transered. - */ - static class Parcel { - private byte[] parcel; - - /** - * Display all bytes as integer values from 0 to 255; - * or return ``null'' if this Parcel is not - * yet initialized. - */ - public String toString() { - if (parcel == null) - return "null"; - String s = "{"; - for (int i = 0; i < parcel.length; i++) - s += (i > 0 ? ", " : "") + ((int) parcel[i] & 0xFF); - return s + "}"; - } - - /** - * Generate new parcel[] array using the given - * random numbers generator. Client and Server - * threads should use identical random generators, - * so that those threads could generate equal data parcels and - * check the parcel just transfered. - */ - public Parcel(Random random) { - int size = random.nextInt(MAX_PARCEL) + 1; - parcel = new byte[size]; - for (int i = 0; i < size; i++) - parcel[i] = (byte) random.nextInt(256); - } - - /** - * Read exactly size bytes from the istream - * if possible, or throw TestFailure if unexpected end of - * istream occurs. - */ - private static byte[] readBytes(int size, InputStream istream) - throws IOException { - - byte data[] = new byte[size]; - for (int i = 0; i < size; i++) { - int datum = istream.read(); - if (datum < 0) - throw new TestFailure( - "unexpected EOF: have read: " + i + " bytes of " + size); - data[i] = (byte) datum; - } - return data; - } - - /** - * Read 4 bytes from istream and threat them to encode - * size of data parcel following these 4 bytes. - */ - private static int getSize(InputStream istream) throws IOException { - byte data[] = readBytes(4, istream); - int data0 = (int) data[0] & 0xFF; - int data1 = (int) data[1] & 0xFF; - int data2 = (int) data[2] & 0xFF; - int data3 = (int) data[3] & 0xFF; - int sizeWord = data0 + (data1 << 8) + (data2 << 16) + (data3 << 24); - int size = sizeWord + 1; - if (size <= 0) - throw new TestFailure("illegal size: " + size); - return size; - } - - /** - * Send 4 bytes encoding actual size of the parcel just to be transfered. - */ - private static void putSize(OutputStream ostream, int size) - throws IOException { - - if (size <= 0) - throw new TestFailure("illegal size: " + size); - - int sizeWord = size - 1; - byte data[] = new byte[4]; - data[0] = (byte) sizeWord; - data[1] = (byte) (sizeWord >> 8); - data[2] = (byte) (sizeWord >> 16); - data[3] = (byte) (sizeWord >> 24); - ostream.write(data); - } - - /** - * Recieve data parcel. - */ - public Parcel(InputStream istream) throws IOException { - int size = getSize(istream); - parcel = readBytes(size, istream); - } - - /** - * Send this data parcel. - */ - public void send(OutputStream ostream) throws IOException { - int size = parcel.length; - putSize(ostream, size); - ostream.write(parcel); - } - - /** - * Check byte-to-byte equality between this and the - * other parcels. - */ - public boolean equals(Parcel other) { - if (this.parcel.length != other.parcel.length) - return false; - int size = parcel.length; - for (int i = 0; i < size; i++) - if (this.parcel[i] != other.parcel[i]) - return false; - return true; - } - - } - - /** - * Server or Client may throw this exception to report the test failure. - */ - static class TestFailure extends RuntimeException { - /** - * Report particular purpose of the test failure. - */ - public TestFailure(String purpose) { - super(purpose); - } - - } - -} diff --git a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network003.java b/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network003.java deleted file mode 100644 index b3e44838ef2..00000000000 --- a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network003.java +++ /dev/null @@ -1,658 +0,0 @@ -/* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -/* - * @test - * @key stress - * - * @summary converted from VM testbase nsk/stress/network/network003. - * VM testbase keywords: [stress, slow, nonconcurrent, quick] - * VM testbase readme: - * DESCRIPTION - * This test transfers huge amount of data between one server and multiple - * clients communicating via TCP/IP sockets, and checks if those data are - * transfered correctly. All TCP/IP sockets are attached to local host - * (by its domain name), or to the ``localhost'' loopback (having the IP - * address 127.0.0.1). - * In this test, 128 client/server connections are established. Once a - * connection is established, client passes a large data parcel to server, - * and server reads that parcel and checks if it is same as expected - * (byte-to-byte equality is desired). Then server passes (some other) parcel - * to the client, and client reads and verifies those bytes. This ping-pong - * game is repeated 128 times; and after that each pair of sockets checks if - * there are no extra bytes accudentally passed through their connection. - * Parcels lengths and contents are chosen randomly, and average parcel - * length is 128 bytes. So totally, each pair of sockets passes ~16Kb of - * data to each other, and thus ~32Kb of data are transfered by each sockets - * pair. Totally, ~4Mb of data are transfered by all client/server pairs. - * COMMENTS - * The production Solaris_JDK_1.3-b12 Server VM crashes under this test: - * # - * # HotSpot Virtual Machine Error, Unexpected Signal 10 - * # Please report this error at - * # http://java.sun.com/cgi-bin/bugreport.cgi - * # - * # Error ID: 4F533F534F4C415249530E43505007D9 01 - * # - * # Problematic Thread: prio=5 tid=0x214418 nid=0x103 runnable - * # - * (ErrorID == "os_solaris.cpp, 2009") - * - * @run main/othervm nsk.stress.network.network003 - */ - -package nsk.stress.network; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.Random; - -/** - * This test transfers huge amount of data between one server and multiple - * clients communicating via TCP/IP sockets, and checks if those data are - * transfered correctly. All TCP/IP sockets are attached to local host - * (by its domain name), or to the ``localhost'' loopback (having the IP - * address 127.0.0.1). - *

    - *

    In this test, 128 client/server connections are established. Once a - * connection is established, client passes a large data parcel to server, - * and server reads that parcel and checks if it is same as expected - * (byte-to-byte equality is desired). Then server passes (some other) parcel - * to the client, and client reads and verifies those bytes. This ping-pong - * game is repeated 128 times; and after that each pair of sockets checks if - * there are no extra bytes accudentally passed through their connection. - *

    - *

    Parcels lengths and contents are chosen randomly, and average parcel - * length is 128 bytes. So totally, each pair of sockets passes ~16Kb of - * data to each other, and thus ~32Kb of data are transfered by each sockets - * pair. Totally, ~4Mb of data are transfered by all client/server pairs. - */ -public class network003 { - /** - * Do actually display optional reports? - */ - static private final boolean DEBUG_MODE = false; - - /** - * Errors and optional reports log. Usually System.out. - */ - static private PrintStream out = System.out; - - /** - * Print error message: all clients and servers may print concurently. - */ - static private synchronized void println(Object message) { - out.println(message.toString()); - } - - /** - * Display optional report: comment ca va. - */ - static private void display(Object report) { - if (DEBUG_MODE) - println(report.toString()); - } - - /** - * Maximal number of connections this test should open simultaneously. - */ - private final static int MAX_CONNECTIONS = 128; - - /** - * Check few more connections to make sure that MAX_CONNECTIONS are safe. - */ - private final static int CONNECTIONS_RESERVE = 10; - - /** - * Number of client/server connections to establish. - */ - private static final int CONNECTIONS = detectOSLimitation(); - - /** - * Number of parcels to be sent/recieved. - */ - private static final int DATA_PARCELS = 128; - - /** - * Maximal length of data parcel to be sent/recieved - * (it equals to 256 bytes now). - */ - private static final int MAX_PARCEL = 1 << 8; - - /** - * How many IP sockets can we open simultaneously? - * Check if MAX_CONNECTIONS connections - * can be open simultaneously. - */ - private static int detectOSLimitation() { - final int CONNECTIONS_TO_TRY = MAX_CONNECTIONS + CONNECTIONS_RESERVE; - ServerSocket ssoc[] = new ServerSocket[CONNECTIONS_TO_TRY]; - display("--- Trying to open " + CONNECTIONS_TO_TRY + " connections:"); - int i; - for (i = 0; i < CONNECTIONS_TO_TRY; i++) - try { - ssoc[i] = new ServerSocket(0); - display("--- Open: ssoc[" + i + "] = " + ssoc[i]); - } catch (IOException ioe) { - display("--- OOPS! -- failed to open connection #" + i); - break; - } - display("--- Could open " + - (i < CONNECTIONS_TO_TRY ? "only " : "") + i + " connections."); - display("--- Closing them:"); - for (int j = 0; j < i; j++) - try { - ssoc[j].close(); - } catch (IOException ioe) { - throw new Error("FATAL error while loading the test: " + ioe); - } - display("--- OK."); - int safeConnections = i - CONNECTIONS_RESERVE; - if (safeConnections < 1) - safeConnections = 1; - if (safeConnections < MAX_CONNECTIONS) { - println("# ------------------------- CAUTION: -------------------"); - println("# While checking the OS limitations, the test found that"); - println("# only " + i + " TCP/IP socket connections could be safely open"); - println("# simultaneously. However, possibility to open at least"); - println("# " + MAX_CONNECTIONS + "+" + CONNECTIONS_RESERVE - + " connections were expected."); - println("# "); - println("# So, the test will check only " + safeConnections + " connection" - + (safeConnections == 1 ? "" : "s") + " which seem"); - println("# safe to be open simultaneously."); - println("# ------------------------------------------------------"); - } - return safeConnections; - } - - /** - * Server thread intended to reply to data parcels sent by Client thread. - */ - static private class Server extends Thread { - /** - * This server thread listens the single socket. - */ - private ServerSocket serverSocket; - - /** - * Address and port of this server socket. - */ - public String toString() { - return serverSocket.toString(); - } - - /** - * Did the thread failed? If yes, what is the failure's reason. - */ - Exception exception = null; - - /** - * What is the port number this socket is listening for? - */ - int getPort() { - return serverSocket.getLocalPort(); - } - - /** - * Find some free port at the given address - * and attach new server to hear that port. - */ - Server(InetAddress address) throws IOException { - int someFreePort = 0; - int backlog = 50; // default for new ServerSocket(port) - serverSocket = new ServerSocket(someFreePort, backlog, address); - } - - /** - * Accept connection, then read/respond DATA_PARCELS parcels - * of random data. Set initial seed for pseudo-random numbers generator - * to the value of the local port number. - * - * @see #DATA_PARCELS - * @see #getPort() - */ - public void run() { - try { - Socket socket = serverSocket.accept(); - display("Server socket: " + socket); - - InputStream istream = socket.getInputStream(); - OutputStream ostream = socket.getOutputStream(); - - Random random = new Random(getPort()); - - for (int i = 0; i < DATA_PARCELS; i++) { - Parcel etalon = new Parcel(random); - - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - println("Server thread for port #" - + getPort() + " got unexpected parcel:\n" - + "sample=" + sample + "\n" - + "etalon=" + etalon); - throw new TestFailure( - "server has read unexpected parcel"); - } - - etalon.send(ostream); - ostream.flush(); - } - - int datum = istream.read(); // wait for client close() - if (datum >= 0) - throw new TestFailure( - "server has read ambigous byte: " + datum); - - ostream.close(); // implies: socket.close(); - - } catch (Exception oops) { - exception = oops; - } - } - - } - - /** - * Client thread intended to send data parcels to Server thread and - * to recieve the server's replies. - */ - static private class Client extends Thread { - /** - * This thread uses the single client socket. - */ - private Socket socket; - - /** - * Address and port of this socket. - */ - public String toString() { - return socket.toString(); - } - - /** - * Did the thread failed? If yes, what is the failure's reason. - */ - Exception exception = null; - - /** - * Connect client socket on the given address - * and port. - */ - Client(InetAddress address, int port) throws IOException { - socket = new Socket(address, port); - } - - /** - * What is the port number this socket is listening for? - */ - int getPort() { - return socket.getPort(); - } - - - /** - * Establish connection, then read/respond DATA_PARCELS parcels - * of random data. Set initial seed for pseudo-random numbers generator - * to the value of the local port number. - * - * @see #DATA_PARCELS - * @see #getPort() - */ - public void run() { - try { - InputStream istream = socket.getInputStream(); - OutputStream ostream = socket.getOutputStream(); - - Random random = new Random(getPort()); - - for (int i = 0; i < DATA_PARCELS; i++) { - Parcel etalon = new Parcel(random); - etalon.send(ostream); - ostream.flush(); - - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - println("Client thread for port #" - + getPort() + " got unexpected parcel:\n" - + "sample=" + sample + "\n" - + "etalon=" + etalon); - throw new TestFailure( - "parcel context is unexpected to client"); - } - } - - if (istream.available() > 0) { - int datum = istream.read(); - throw new TestFailure( - "client has read ambigous byte: " + datum); - } - ostream.close(); // implies: socket.close() - - } catch (Exception oops) { - exception = oops; - } - } - - } - - /** - * A data parcel to sent/recieved between Client and Server threads. - * When data parcel is sent, first 4 bytes transfered encode the size - * of the parcel (i.e.: number of data bytes in the parcel's contents). - * Then the parcel's contents bytes are transered. - */ - static class Parcel { - private byte[] parcel; - - /** - * Display all bytes as integer values from 0 to 255; - * or return ``null'' if this Parcel is not - * yet initialized. - */ - public String toString() { - if (parcel == null) - return "null"; - String s = "{"; - for (int i = 0; i < parcel.length; i++) - s += (i > 0 ? ", " : "") + ((int) parcel[i] & 0xFF); - return s + "}"; - } - - /** - * Generate new parcel[] array using the given - * random numbers generator. Client and Server - * threads should use identical random generators, - * so that those threads could generate equal data parcels and - * check the parcel just transfered. - */ - public Parcel(Random random) { - int size = random.nextInt(MAX_PARCEL) + 1; - parcel = new byte[size]; - for (int i = 0; i < size; i++) - parcel[i] = (byte) random.nextInt(256); - } - - /** - * Read exactly size bytes from the istream - * if possible, or throw TestFailure if unexpected end of - * istream occurs. - */ - private static byte[] readBytes(int size, InputStream istream) - throws IOException { - - byte data[] = new byte[size]; - for (int i = 0; i < size; i++) { - int datum = istream.read(); - if (datum < 0) - throw new TestFailure( - "unexpected EOF: have read: " + i + " bytes of " + size); - data[i] = (byte) datum; - } - return data; - } - - /** - * Read 4 bytes from istream and threat them to encode - * size of data parcel following these 4 bytes. - */ - private static int getSize(InputStream istream) throws IOException { - byte data[] = readBytes(4, istream); - int data0 = (int) data[0] & 0xFF; - int data1 = (int) data[1] & 0xFF; - int data2 = (int) data[2] & 0xFF; - int data3 = (int) data[3] & 0xFF; - int sizeWord = data0 + (data1 << 8) + (data2 << 16) + (data3 << 24); - int size = sizeWord + 1; - if (size <= 0) - throw new TestFailure("illegal size: " + size); - return size; - } - - /** - * Send 4 bytes encoding actual size of the parcel just to be transfered. - */ - private static void putSize(OutputStream ostream, int size) - throws IOException { - - if (size <= 0) - throw new TestFailure("illegal size: " + size); - - int sizeWord = size - 1; - byte data[] = new byte[4]; - data[0] = (byte) sizeWord; - data[1] = (byte) (sizeWord >> 8); - data[2] = (byte) (sizeWord >> 16); - data[3] = (byte) (sizeWord >> 24); - ostream.write(data); - } - - /** - * Recieve data parcel. - */ - public Parcel(InputStream istream) throws IOException { - int size = getSize(istream); - parcel = readBytes(size, istream); - } - - /** - * Send this data parcel. - */ - public void send(OutputStream ostream) throws IOException { - int size = parcel.length; - putSize(ostream, size); - ostream.write(parcel); - } - - /** - * Check byte-to-byte equality between this and the - * other parcels. - */ - public boolean equals(Parcel other) { - if (this.parcel.length != other.parcel.length) - return false; - int size = parcel.length; - for (int i = 0; i < size; i++) - if (this.parcel[i] != other.parcel[i]) - return false; - return true; - } - - } - - /** - * Server or Client thread may throw this exception to report the test - * failure. - */ - static class TestFailure extends RuntimeException { - /** - * Report particular purpose of the test failure. - */ - public TestFailure(String purpose) { - super(purpose); - } - - } - - /** - * Attach client and server sockets to the local host, and check if - * huge amount of data could be correctly transfered between these - * sockets. - *

    - *

    Command-line parameters provided with args[] may - * prompt the local host IP address or domain name. Execute: - *
       - * java network003 [IP-address | host_name | - * localhost ] - *
    where parameters are: - *
       - * IP-address - local hots's address, or 127.0.0.1 - *
       - * host_name - local host's domain name, or the - * keyword ``localhost'' - *
       - * localhost - placeholder for the IP-address 127.0.0.1 - *
    By default, the test uses the Internet address available via - * the method InetAddress.getLocalHost() - */ - public static int run(String args[], PrintStream out) { - network003.out = out; - - // - // Get IP address of the local machine. - // - - InetAddress address = null; - try { - switch (args.length) { - case 0: - address = InetAddress.getLocalHost(); - break; - case 1: - String hostName = args[0]; - address = InetAddress.getByName(args[0]); - break; - default: - println("Use:"); - println(" java network003"); - println("or:"); - println(" java network003 ${IP_ADDRESS}"); - println("or:"); - println(" java network003 ${HOST_NAME}"); - println("or:"); - println(" java network003 localhost"); - return 2; // FAILED - } - } catch (UnknownHostException exception) { - println(exception); - return 2; // FAILED - } - display("Host: " + address); - - // - // Incarnate the server & the client sockets. - // - - Server server[] = new Server[CONNECTIONS]; - Client client[] = new Client[CONNECTIONS]; - - for (int i = 0; i < CONNECTIONS; i++) { - try { - server[i] = new Server(address); - } catch (IOException io) { - println("Failed to create server #" + i + ": " + io); - return 2; - } - display("Server #" + i + ": " + server[i]); - } - - for (int i = 0; i < CONNECTIONS; i++) { - int port = server[i].getPort(); - try { - client[i] = new Client(address, port); - } catch (IOException io) { - out.println("Failed to create client #" + i + ": " + io); - return 2; - } - display("Client socket #" + i + ": " + client[i]); - } - - // - // Execute the server and client threads. - // - - Exception exception = null; - try { - for (int i = 0; i < CONNECTIONS; i++) - server[i].start(); - for (int i = 0; i < CONNECTIONS; i++) - client[i].start(); - boolean someIsAlive = true; - while (someIsAlive) { - boolean aliveFound = false; - boolean someBroken = false; - for (int i = 0; i < CONNECTIONS; i++) - if (client[i].isAlive() || server[i].isAlive()) { - if ((client[i].exception != null) || - (server[i].exception != null)) - someBroken = true; - aliveFound = true; - Thread.yield(); - } - someIsAlive = aliveFound; - if (someBroken) - break; - } - } catch (TestFailure failure) { - exception = failure; - } - - // Failure diagnostics, if needed. - - Exception problem[] = new Exception[2 * CONNECTIONS + 1]; - problem[0] = exception; - for (int i = 0; i < CONNECTIONS; i++) { - problem[2 * i + 1] = server[i].exception; - problem[2 * i + 2] = client[i].exception; - } - - int exitCode = 0; - - for (int i = 0; i < 2 * CONNECTIONS + 1; i++) - if (problem[i] != null) { - out.println("#### OOPS ! ####"); - problem[i].printStackTrace(out); - exitCode = 2; - } - - if (exitCode != 0) { - out.println("#### OOPS ! ####"); - out.println("# Test failed."); - return 2; // FAILED - } - display("Test passed."); - return 0; // PASSED - } - - /** - * Re-calls to the method run(args[],out) actually - * performing the test; and stop with exit code 95 if the test - * has passed, or with code 97 if the test has failed. - * (This is JCK-like exit codes convention.) - * - * @see #run(String[], PrintStream) - */ - public static void main(String args[]) { - int exitCode = run(args, System.out); - System.exit(exitCode + 95); - // JCK-like exit code. - } - -} diff --git a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network004.java b/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network004.java deleted file mode 100644 index 340bb49e8b3..00000000000 --- a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network004.java +++ /dev/null @@ -1,878 +0,0 @@ -/* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -/* - * @test - * @key stress - * - * @summary converted from VM testbase nsk/stress/network/network004. - * VM testbase keywords: [stress, slow, nonconcurrent, quick] - * VM testbase readme: - * DESCRIPTION - * This test transfers huge amount of data between 2 Java virtual machines - * using the TCP/IP protocol, and checks if those data are transfered correctly. - * Both client and server VMs run on the same local computer and attach TCP/IP - * sockets to the local host, or to the loopback domain ``localhost'' - * (having IP address 127.0.0.1). - * In this test, 128 client/server connections are established. Once a - * connection is established, client passes a large data parcel to server, - * and server reads that parcel and checks if it is same as expected - * (byte-to-byte equality is desired). Then server passes (some other) parcel - * to the client, and client reads and verifies those bytes. This ping-pong - * game is repeated 128 times; and after that each pair of sockets checks if - * there are no extra bytes accudentally passed through their connection. - * Parcels lengths and contents are chosen randomly, and average - * parcel length is 128 bytes. So totally, each pair of sockets passes ~16Kb of - * data to each other, and thus ~32Kb of data are transfered by each sockets - * pair. Totally, ~4Mb of data are transfered by all client/server pairs. - * COMMENTS - * The production Solaris_JDK_1.3-b12 Server VM intermittently crashes under - * this test, even when client part of the test is executed with Client HS: - * >>>> java -server network004 java - * # - * # HotSpot Virtual Machine Error, Unexpected Signal 10 - * # Please report this error at - * # http://java.sun.com/cgi-bin/bugreport.cgi - * # - * # Error ID: 4F533F534F4C415249530E43505007D9 01 - * # - * # Problematic Thread: prio=5 tid=0x214418 nid=0x103 runnable - * # - * (ErrorID == "os_solaris.cpp, 2009") - * If the client part of the test is executed with Server HS, the - * production Solaris_JDK_1.3-b12 Server VM intermittently fails - * this test due to timeout: - * >>>> time java -server network004 'java -server -showversion' - * java version "1.3" - * Java(TM) 2 Runtime Environment, Standard Edition (build Solaris_JDK_1.3-b12) - * Java HotSpot(TM) Server VM (build 1.3-b12, mixed mode) - * # Client #96: java.io.InterruptedIOException: Read timed out - * # Client VM has crashed: exit status=97 - * # Test failed. - * 156.0u 117.0s 7:06 63% 0+0k 0+0io 0pf+0w - * Test was fixed: - * added WAITTIME parameter defined timeout for TCP/IP sockets in minutes - * - * @library /vmTestbase - * /test/lib - * @run driver jdk.test.lib.FileInstaller . . - * @build nsk.stress.network.network004 - * @run main/othervm PropertyResolvingWrapper - * nsk.stress.network.network004 - * "${test.jdk}/bin/java ${test.vm.opts} ${test.java.opts}" 5 - */ - -package nsk.stress.network; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.PrintStream; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.Random; -import java.util.StringTokenizer; - -/** - * This test transfers huge amount of data between 2 Java virtual machines - * using the TCP/IP protocol, and checks if those data are transfered correctly. - * Both client and server VMs run on the same local computer and attach TCP/IP - * sockets to the local host, or to the loopback domain ``localhost'' - * (having IP address 127.0.0.1). - *

    - *

    In this test, 128 client/server connections are established. Once a - * connection is established, client passes a large data parcel to server, - * and server reads that parcel and checks if it is same as expected - * (byte-to-byte equality is desired). Then server passes (some other) parcel - * to the client, and client reads and verifies those bytes. This ping-pong - * game is repeated 128 times; and after that each pair of sockets checks if - * there are no extra bytes accudentally passed through their connection. - *

    - *

    Parcels lengths and contents are chosen randomly, and average - * parcel length is 128 bytes. So totally, each pair of sockets passes ~16Kb of - * data to each other, and thus ~32Kb of data are transfered by each sockets - * pair. Totally, ~4Mb of data are transfered by all client/server pairs. - */ -public class network004 { - /** - * Timeout for TCP/IP sockets (currently set to 1 min). - */ - private static int SO_TIMEOUT;// = 2*60*1000; - - /** - * Maximal number of connections this test should open simultaneously. - */ - private final static int MAX_CONNECTIONS = 128; - - /** - * Check few more connections to make sure that MAX_CONNECTIONS are safe. - */ - private final static int CONNECTIONS_RESERVE = 10; - - /** - * Number of parcels to be sent/recieved. - */ - private final static int DATA_PARCELS = 128; - - /** - * Maximal length of data parcel to be sent/recieved - * (it equals to 256 bytes now). - */ - private final static int MAX_PARCEL = 1 << 8; - - /** - * Either actually display optional reports or not. - */ - static private final boolean DEBUG_MODE = false; - - /** - * How many IP sockets can we open simultaneously? - * Check if MAX_CONNECTIONS connections - * can be open simultaneously. - */ - private static int detectOSLimitation() { - final int CONNECTIONS_TO_TRY = MAX_CONNECTIONS + CONNECTIONS_RESERVE; - ServerSocket ssoc[] = new ServerSocket[CONNECTIONS_TO_TRY]; - display("--- Trying to open " + CONNECTIONS_TO_TRY + " connections:"); - int i; - for (i = 0; i < CONNECTIONS_TO_TRY; i++) - try { - ssoc[i] = new ServerSocket(0); - display("--- Open: ssoc[" + i + "] = " + ssoc[i]); - } catch (IOException ioe) { - display("--- OOPS! -- failed to open connection #" + i); - break; - } - display("--- Could open " + - (i < CONNECTIONS_TO_TRY ? "only " : "") + i + " connections."); - display("--- Closing them:"); - for (int j = 0; j < i; j++) - try { - ssoc[j].close(); - } catch (IOException ioe) { - throw new Error("FATAL error while loading the test: " + ioe); - } - display("--- OK."); - int safeConnections = i - CONNECTIONS_RESERVE; - if (safeConnections < 1) - safeConnections = 1; - if (safeConnections < MAX_CONNECTIONS) { - complain("------------------------- CAUTION: -------------------"); - complain("While checking the OS limitations, the test found that"); - complain("only " + i + " TCP/IP socket connections could be safely open"); - complain("simultaneously. However, possibility to open at least"); - complain("" + MAX_CONNECTIONS + "+" + CONNECTIONS_RESERVE - + " connections were expected."); - complain(""); - complain("So, the test will check only " + safeConnections + " connection" - + (safeConnections == 1 ? "" : "s") + " which seem"); - complain("safe to be open simultaneously."); - complain("------------------------------------------------------"); - } - return safeConnections; - } - - //----------------------------------------------------------------// - - /** - * Re-calls to the method run(args[],out) actually - * performing the test. After run(args[],out) stops, - * follow JDK-like convention for exit codes. I.e.: stop with - * exit status 95 if the test has passed, or with status 97 if - * the test has failed. - * - * @see #run(String[], PrintStream) - */ - public static void main(String args[]) { - int exitCode = run(args, System.out); - System.exit(exitCode + 95); - // JCK-like exit status. - } - - /** - * Parse command-line parameters stored into args[] array, - * then perform the test. I.e.: start the server thread at the same VM - * this method runs, then start the other client VM, and verify data - * transfer through TCP/IP connection between those different virtual - * machines. - *

    - *

    There should be 1 or 2 command-line parameters: - *
       - * java network004 java_command - * [IP-address | host_name | localhost ] - *
    where parameters are: - *
       - * java_command - how to start java, - * e.g.: ``c:\jdk1.3\bin\java -classic'' - *
       - * waittime - timeout for TCP/IP sockets in minutes - *
       - * IP-address - local hots's address, or 127.0.0.1 - *
       - * host_name - local host's domain name, or the - * keyword ``localhost'' - *
       - * localhost - placeholder for the IP-address 127.0.0.1 - *

    - *

    Usually, java_command should point to the same - * Java machine just executing this test. However, every compatible Java 2 - * implementation is appropriate. - *

    - *

    If optional parameter is ommited, the test invokes the method - * InetAddress.getLocalHost() to get the domain name and - * IP-address of the local computer. - */ - public static int run(String args[], PrintStream out) { - network004.out = out; - - // - // Get the Internet address of the local machine. - // - InetAddress address = null; - try { - switch (args.length) { - case 2: - address = InetAddress.getLocalHost(); - break; - case 3: - address = InetAddress.getByName(args[2]); - break; - default: - complain("Illegal arguments number; execute:"); - complain(" java network004 $JAVA_COMMAND " + - "[$IP_ADDRESS | $HOST_NAME | localhost]"); - return 2; // FAILED - } - } catch (UnknownHostException exception) { - complain(exception.toString()); - return 2; // FAILED - } - display("Host: " + address); - - // - // Detect if it is safe to open MAX_CONNETIONS simultaneously: - // - final int CONNECTIONS = detectOSLimitation(); - - // - // Start the server thread on the same VM (which executes this method). - // - Server server[] = new Server[CONNECTIONS]; - for (int i = 0; i < CONNECTIONS; i++) { - try { - server[i] = new Server(address); - } catch (Exception exception) { - complain("Server #" + i + ": " + exception); - return 2; - } - display("Server #" + i + ": " + server[i]); - server[i].start(); - } - - // - // Start the client process on different VM. - // - String command = args[0] + " " + network004.class.getName() + "$Client"; - try { - SO_TIMEOUT = Integer.parseInt(args[1]) * 60 * 1000; - } catch (NumberFormatException e) { - complain("Wrong timeout argument: " + e); - return 2; - } - - Runtime runtime = Runtime.getRuntime(); - - Process client = null; - IORedirector redirectOut = null; - IORedirector redirectErr = null; - - try { - // Start clients on different JVM: - client = runtime.exec(command); - - // Provide clients with access to stderr and stdout: - InputStream clientOut = client.getInputStream(); - InputStream clientErr = client.getErrorStream(); - redirectOut = new IORedirector(clientOut, DEBUG_MODE ? out : null); - redirectErr = new IORedirector(clientErr, out); - redirectOut.start(); - redirectErr.start(); - - // Pass parameters to clients (number of connections, and IP adresses and ports): - PrintStream clientIn = new PrintStream(client.getOutputStream()); - clientIn.println(CONNECTIONS); - for (int i = 0; i < CONNECTIONS; i++) - clientIn.println(server[i].getIPAddress() + " " + server[i].getPort()); - clientIn.flush(); - clientIn.close(); - - } catch (Exception exception) { - complain("Failed to start client: " + exception); - return 2; - } - - // - // Wait until the server and client both stop. - // - boolean testFailed = false; - try { - client.waitFor(); - // Let I/O redirectors to flush: - if (redirectOut.isAlive()) - redirectOut.join(); - if (redirectErr.isAlive()) - redirectErr.join(); - - // If client has crashed, also terminate the server (to avoid hangup). - int clientStatus = client.exitValue(); - if (clientStatus != 95) { - complain("Client VM has failed: exit status=" + clientStatus); - testFailed = true; - } - - // Client has finished OK; wait for the server. - for (int i = 0; i < CONNECTIONS; i++) { - display("Server: waiting for #" + i); - while (server[i].isAlive()) - server[i].join(); - if (server[i].exception != null) { - complain("Server thread #" + i + ": " + server[i].exception); - testFailed = true; - } - } - - } catch (Exception exception) { - complain("Test interrupted: " + exception); - testFailed = true; - } - - if (testFailed) - complain("Test failed."); - else - display("Test passed."); - return testFailed ? 2 : 0; - } - - //----------------------------------------------------------------// - - /** - * Log stream for error messages and/or (optional) execution trace. - */ - private static PrintStream out; - - /** - * Print error message. - */ - private static synchronized void complain(Object message) { - out.println("# " + message); - out.flush(); - } - - /** - * Display optional report: comment ca va? - */ - private static synchronized void display(Object report) { - if (DEBUG_MODE) - out.println(report.toString()); - out.flush(); - } - - //----------------------------------------------------------------// - - /** - * Server thread should reply to data parcels sent by Client VM. - */ - private static class Server extends Thread { - /** - * The socket to listen for a client. - */ - private ServerSocket serverSocket; - - /** - * Display the server socket. - */ - public String toString() { - return serverSocket.toString(); - } - - /** - * Server's IP-address in the form ``x.y.u.z'', - * or ``127.0.0.1'' for loopback connection. - */ - public String getIPAddress() { - return serverSocket.getInetAddress().getHostAddress(); - } - - /** - * Which port is this socket listening? - */ - int getPort() { - return serverSocket.getLocalPort(); - } - - /** - * Find some free port at the given address - * and attach new server to hear that port. - */ - public Server(InetAddress address) throws IOException { - int someFreePort = 0; - int backlog = 50; // default for new ServerSocket(port) - serverSocket = new ServerSocket(someFreePort, backlog, address); - } - - /** - * Exception just arisen while the server was working, - * or null if it was OK with the server. - */ - Exception exception = null; - - /** - * Accept connection, then reply to client's parcels. - */ - public void run() { - try { - Socket socket = serverSocket.accept(); - socket.setSoTimeout(SO_TIMEOUT); -// display("Server: " + socket); - - InputStream istream = socket.getInputStream(); - OutputStream ostream = socket.getOutputStream(); - - Random random = new Random(getPort()); - - for (int i = 0; i < DATA_PARCELS; i++) { - Parcel etalon = new Parcel(random); - - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - complain("Server thread for port #" - + getPort() + " got unexpected parcel:\n" - + "sample=" + sample + "\n" - + "etalon=" + etalon); - throw new TestFailure( - "server has read unexpected parcel"); - } - - etalon.send(ostream); - ostream.flush(); - } - - int datum = istream.read(); // wait for client close() - if (datum >= 0) - throw new TestFailure( - "server has read ambigous byte: " + datum); - - ostream.close(); // implies: socket.close(); - - } catch (Exception oops) { - exception = oops; - } - } - - } - - //----------------------------------------------------------------// - - /** - * Client VM should send data parcels to Server VM and - * recieve and verify the server's replies. - */ - private static class Client extends Thread { - /** - * This thread uses the single client socket. - */ - private Socket socket; - - /** - * Address and port of this socket. - */ - public String toString() { - return socket.toString(); - } - - /** - * Did the thread failed? If yes, what is the failure's reason. - */ - Exception exception = null; - - /** - * Connect client socket on the given address - * and port. - */ - Client(InetAddress address, int port) throws IOException { - socket = new Socket(address, port); - socket.setSoTimeout(SO_TIMEOUT); - } - - /** - * What is the port number this socket is listening for? - */ - int getPort() { - return socket.getPort(); - } - - /** - * Establish connection, then read/respond DATA_PARCELS parcels - * of random data. Set initial seed for pseudo-random numbers generator - * to the value of the local port number. - * - * @see #DATA_PARCELS - * @see #getPort() - */ - public void run() { - try { - InputStream istream = socket.getInputStream(); - OutputStream ostream = socket.getOutputStream(); - - Random random = new Random(getPort()); - - for (int i = 0; i < DATA_PARCELS; i++) { - Parcel etalon = new Parcel(random); - etalon.send(ostream); - ostream.flush(); - - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - complain("Client thread for port #" - + getPort() + " got unexpected parcel:\n" - + "sample=" + sample + "\n" - + "etalon=" + etalon); - throw new TestFailure( - "parcel context is unexpected to client"); - } - } - - if (istream.available() > 0) { - int datum = istream.read(); - throw new TestFailure( - "client has read ambigous byte: " + datum); - } - ostream.close(); // implies: socket.close() - - } catch (Exception oops) { - exception = oops; - } - } - - /** - * Establish connections to lots of server sockets, atack servers with - * huge data parcels, and check if it replies correctly. The addresses - * and port numbers for server sockets are passed through stdin. - * The input stream must consist of the stipulated number (up to 128+1) of - * lines containing the pair of symbolic server domain name and the port number, - * like: - *
       actual_number_of_sockets - *
       address_1 port_1 - *
       address_2 port_2 - *
       . . . - *
       address_N port_N - *
    where N must equal to the actual_number_of_sockets. - */ - public static void main(String args[]) { - // ---- Parse stdin for the list of server sockets: ---- // - BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - - final int CONNECTIONS; - try { - String line = in.readLine(); - if (line == null) { - complain("Client expects paramenets passed through stdin:"); - complain(" actual_number_of_sockets"); - complain(" IP-address_1 port_1"); - complain(" IP-address_2 port_2"); - complain(" . . ."); - complain(" IP-address_N port_N"); - exit(2); // FAILED - } - CONNECTIONS = Integer.parseInt(line); - } catch (IOException ioe) { - complain("Client failed to read the actual number of CONNECTIONS"); - throw new RuntimeException(ioe.toString()); - } - - Client client[] = new Client[CONNECTIONS]; - for (int i = 0; i < CONNECTIONS; i++) - try { - String line = in.readLine(); - if (line == null) { - complain("Client: failed to read address/port for client #" + i); - exit(3); - } - - StringTokenizer tokenz = new StringTokenizer(line); - if (tokenz.countTokens() != 2) { - complain("Client: illegal input string: " + line); - exit(3); - } - String serverName = (String) tokenz.nextElement(); - InetAddress address = InetAddress.getByName(serverName); - int port = Integer.parseInt((String) tokenz.nextElement()); - - client[i] = new Client(address, port); - - display("Client #" + i + ": " + client[i]); - - } catch (IOException ioe) { - complain("Client #" + i + ": " + ioe); - exit(3); - } - - // ---- Start testing: ---- // - - for (int i = 0; i < CONNECTIONS; i++) - client[i].start(); - - int status = 0; - for (int i = 0; i < CONNECTIONS; i++) { - display("Client: waiting for #" + i); - while (client[i].isAlive()) - yield(); - if (client[i].exception != null) { - complain("Client #" + i + ": " + client[i].exception); - status = 2; - } - } - - exit(status); - } - - /** - * Print error message. - */ - private static synchronized void complain(Object message) { - System.err.println("# " + message); - System.err.flush(); - } - - /** - * Display execution trace. - */ - private static synchronized void display(Object message) { - if (!DEBUG_MODE) - return; - System.out.println(message.toString()); - System.out.flush(); - } - - /** - * Exit with JCK-like status. - */ - private static void exit(int exitCode) { - System.exit(exitCode + 95); - } - - } - - /** - * Two of such threads should redirect out and err - * streams of client VM. - */ - private static class IORedirector extends Thread { - /** - * Source stream. - */ - InputStream in; - /** - * Destination stream. - */ - OutputStream out; - - /** - * Redirect in to out. - */ - public IORedirector(InputStream in, OutputStream out) { - this.in = in; - this.out = out; - } - - /** - * Read input stream until the EOF, and write everithing to output stream. - * If output stream is assigned to null, do not print anything, - * but read the input stream anywhere. - */ - public void run() { - try { - for (; ; ) { - int symbol = in.read(); - if (symbol < 0) - break; // EOF - if (out != null) - out.write(symbol); - } - - if (out != null) - out.flush(); - - } catch (Exception exception) { - throw new TestFailure("IORedirector exception: " + exception); - } - } - } - - //----------------------------------------------------------------// - - /** - * A data parcel to be sent/recieved between Client VM and Server thread. - * When data parcel is sent, first 4 bytes are transfered which encode the - * int number equal to size of the parcel minus 1. I.e.: if - * number of data bytes in the parcel's contents is N, then - * the first 4 bytes encode the number N-1. After that, the - * parcel's contents bytes are transered. - */ - static class Parcel { - private byte[] parcel; - - /** - * Display all bytes as integer values from 0 to 255; - * or return ``null'' if this Parcel is not - * yet initialized. - */ - public String toString() { - if (parcel == null) - return "null"; - String s = "{"; - for (int i = 0; i < parcel.length; i++) - s += (i > 0 ? ", " : "") + ((int) parcel[i] & 0xFF); - return s + "}"; - } - - /** - * Generate new parcel[] array using the given - * random numbers generator. Client and Server - * threads should use identical random generators, - * so that those threads could generate equal data parcels and - * check the parcel just transfered. - */ - public Parcel(Random random) { - int size = random.nextInt(MAX_PARCEL) + 1; - parcel = new byte[size]; - for (int i = 0; i < size; i++) - parcel[i] = (byte) random.nextInt(256); - } - - /** - * Read exactly size bytes from the istream - * if possible, or throw TestFailure if unexpected end of - * istream occurs. - */ - private static byte[] readBytes(int size, InputStream istream) - throws IOException { - - byte data[] = new byte[size]; - for (int i = 0; i < size; i++) { - int datum = istream.read(); - if (datum < 0) - throw new TestFailure( - "unexpected EOF: have read: " + i + " bytes of " + size); - data[i] = (byte) datum; - } - return data; - } - - /** - * Read 4 bytes from istream and threat them to encode - * size of data parcel following these 4 bytes. - */ - private static int getSize(InputStream istream) throws IOException { - byte data[] = readBytes(4, istream); - int data0 = (int) data[0] & 0xFF; - int data1 = (int) data[1] & 0xFF; - int data2 = (int) data[2] & 0xFF; - int data3 = (int) data[3] & 0xFF; - int sizeWord = data0 + (data1 << 8) + (data2 << 16) + (data3 << 24); - int size = sizeWord + 1; - if (size <= 0) - throw new TestFailure("illegal size: " + size); - return size; - } - - /** - * Send 4 bytes encoding actual size of the parcel just to be transfered. - */ - private static void putSize(OutputStream ostream, int size) - throws IOException { - - if (size <= 0) - throw new TestFailure("illegal size: " + size); - - int sizeWord = size - 1; - byte data[] = new byte[4]; - data[0] = (byte) sizeWord; - data[1] = (byte) (sizeWord >> 8); - data[2] = (byte) (sizeWord >> 16); - data[3] = (byte) (sizeWord >> 24); - ostream.write(data); - } - - /** - * Recieve data parcel. - */ - public Parcel(InputStream istream) throws IOException { - int size = getSize(istream); - parcel = readBytes(size, istream); - } - - /** - * Send this data parcel. - */ - public void send(OutputStream ostream) throws IOException { - int size = parcel.length; - putSize(ostream, size); - ostream.write(parcel); - } - - /** - * Check byte-to-byte equality between this and the - * other parcels. - */ - public boolean equals(Parcel other) { - if (this.parcel.length != other.parcel.length) - return false; - int size = parcel.length; - for (int i = 0; i < size; i++) - if (this.parcel[i] != other.parcel[i]) - return false; - return true; - } - - } - - /** - * Server or Client may throw this exception to report the test failure. - */ - static class TestFailure extends RuntimeException { - /** - * Report particular purpose of the test failure. - */ - public TestFailure(String purpose) { - super(purpose); - } - - } - -} diff --git a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network005.java b/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network005.java deleted file mode 100644 index 013b8311f3e..00000000000 --- a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network005.java +++ /dev/null @@ -1,635 +0,0 @@ -/* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -/* - * @test - * @key stress - * - * @summary converted from VM testbase nsk/stress/network/network005. - * VM testbase keywords: [stress, slow, nonconcurrent, quick] - * VM testbase readme: - * DESCRIPTION - * This test make huge number of data transers between one server and - * multiple clients communicating via TCP/IP sockets, and checks if those - * data are transfered correctly. All TCP/IP sockets are attached to local - * host (by its domain name), or to the ``localhost'' loopback (having the - * IP address 127.0.0.1). - * In this test, 128 client/server connections are established. Once a - * connection is established, client passes a large data parcel to server, - * and server reads that parcel and checks if it is same as expected - * (byte-to-byte equality is desired). Then server passes (some other) parcel - * to the client, and client reads and verifies those bytes. This ping-pong - * game is repeated 128 times; and after that each pair of sockets checks if - * there are no extra bytes accudentally passed through their connection. - * Parcels lengths and contents are chosen randomly, and average parcel - * length is 128 bytes. So totally, each pair of sockets passes ~16Kb of - * data to each other, and thus ~32Kb of data are transfered by each sockets - * pair. Totally, ~4Mb of data are transfered by all client/server pairs. - * COMMENTS - * - * @run main/othervm nsk.stress.network.network005 - */ - -package nsk.stress.network; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.Random; - -/** - * This test make huge number of data transers between one server and - * multiple clients communicating via TCP/IP sockets, and checks if those - * data are transfered correctly. All TCP/IP sockets are attached to local - * host (by its domain name), or to the ``localhost'' loopback (having the - * IP address 127.0.0.1). - *

    - *

    In this test, 128 client/server connections are established. Once a - * connection is established, client passes a large data parcel to server, - * and server reads that parcel and checks if it is same as expected - * (byte-to-byte equality is desired). Then server passes (some other) parcel - * to the client, and client reads and verifies those bytes. This ping-pong - * game is repeated 128 times; and after that each pair of sockets checks if - * there are no extra bytes accudentally passed through their connection. - *

    - *

    Parcels lengths and contents are chosen randomly, and average parcel - * length is 128 bytes. So totally, each pair of sockets passes ~16Kb of - * data to each other, and thus ~32Kb of data are transfered by each sockets - * pair. Totally, ~4Mb of data are transfered by all client/server pairs. - */ -public class network005 { - /** - * Do actually display optional reports? - */ - static private final boolean DEBUG_MODE = false; - - /** - * Errors and optional reports log. Usually System.out. - */ - static private PrintStream out = System.out; - - /** - * Print error message: all clients and servers may print concurently. - */ - static private synchronized void println(Object message) { - out.println(message.toString()); - } - - /** - * Display optional report: comment ca va. - */ - static private void display(Object report) { - if (DEBUG_MODE) - println(report.toString()); - } - - /** - * Maximal number of connections this test should open simultaneously. - */ - private final static int MAX_CONNECTIONS = 128; - - /** - * Check few more connections to make sure that MAX_CONNECTIONS are safe. - */ - private final static int CONNECTIONS_RESERVE = 10; - - /** - * Number of client/server connections to establish. - */ - private static final int CONNECTIONS = detectOSLimitation(); - - /** - * Number of parcels to be sent/recieved. - */ - private static final int DATA_PARCELS = 128; - - /** - * Maximal length of data parcel to be sent/recieved - * (it equals to 256 bytes now). - */ - private static final int MAX_PARCEL = 1 << 8; - - /** - * How many IP sockets can we open simultaneously? - * Check if MAX_CONNECTIONS connections - * can be open simultaneously. - */ - private static int detectOSLimitation() { - final int CONNECTIONS_TO_TRY = MAX_CONNECTIONS + CONNECTIONS_RESERVE; - display("--- Trying to open " + CONNECTIONS_TO_TRY + " connections:"); - - InetAddress address; - ServerSocket serverSocket; - try { - address = InetAddress.getLocalHost(); - int anyPort = 0; - int defaultBacklog = 50; - serverSocket = new ServerSocket(anyPort, defaultBacklog, address); - } catch (IOException ioe) { - throw new Error("FATAL error while loading the test: " + ioe); - } - display(serverSocket.toString()); - - Socket server[] = new Socket[CONNECTIONS_TO_TRY]; - Socket client[] = new Socket[CONNECTIONS_TO_TRY]; - - int i, port = serverSocket.getLocalPort(); - for (i = 0; i < CONNECTIONS_TO_TRY; i++) - try { - client[i] = new Socket(address, port); - display("--- Open: client[" + i + "] = " + client[i]); - server[i] = serverSocket.accept(); - display("--- Open: server[" + i + "] = " + server[i]); - } catch (IOException ioe) { - display("--- OOPS! -- failed to open connection #" + i); - break; - } - display("--- Could open " + - (i < CONNECTIONS_TO_TRY ? "only " : "") + i + " connections."); - display("--- Closing them:"); - for (int j = 0; j < i; j++) - try { - server[j].close(); - client[j].close(); - } catch (IOException ioe) { - throw new Error("FATAL error while loading the test: " + ioe); - } - display("--- OK."); - int safeConnections = i - CONNECTIONS_RESERVE; - if (safeConnections < 1) - safeConnections = 1; - if (safeConnections < MAX_CONNECTIONS) { - println("# ------------------------- CAUTION: -------------------"); - println("# While checking the OS limitations, the test found that"); - println("# only " + i + " TCP/IP socket connections could be safely open"); - println("# simultaneously. However, possibility to open at least"); - println("# " + MAX_CONNECTIONS + "+" + CONNECTIONS_RESERVE - + " connections were expected."); - println("# "); - println("# So, the test will check only " + safeConnections + " connection" - + (safeConnections == 1 ? "" : "s") + " which seem"); - println("# safe to be open simultaneously."); - println("# ------------------------------------------------------"); - } - return safeConnections; - } - - /** - * Server (or client) thread intended to transfer data parcels to - * another client (or server) Agent. - */ - static private class Agent extends Thread { - /** - * Agent's client mode. - */ - final static int CLIENT = 1; - /** - * Agen's server mode. - */ - final static int SERVER = 2; - - /** - * Is this agent is client or server one? - */ - private int mode; - - /** - * This server thread listens the single socket. - */ - private Socket socket; - - /** - * What is the port number this socket is listening for? - */ - int getPort() { - if (mode == SERVER) - return socket.getLocalPort(); - else - return socket.getPort(); - } - - /** - * Address and port of this server socket. - */ - public String toString() { - String mode = (this.mode == CLIENT) ? "Client" : "Server"; - return mode + ": " + socket.toString(); - } - - /** - * Did the thread failed? If yes, what is the failure's reason. - */ - Exception exception = null; - - /** - * Find some free port at the given address - * and attach new server to hear that port. - */ - Agent(Socket socket, int mode) { - if ((mode != SERVER) && (mode != CLIENT)) - throw new IllegalArgumentException("unknown mode=" + mode); - this.socket = socket; - this.mode = mode; - } - - /** - * Transfer DATA_PARCELS parcels of random data. - * Set initial seed for pseudo-random numbers generator - * to the value of the local port number. - * - * @see #DATA_PARCELS - * @see #getPort() - */ - public void run() { - try { - InputStream istream = socket.getInputStream(); - OutputStream ostream = socket.getOutputStream(); - - Random random = new Random(getPort()); - - for (int i = 0; i < DATA_PARCELS; i++) { - Parcel etalon = new Parcel(random); - - if (mode == SERVER) { - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - println("Server agent for port #" - + getPort() + " got unexpected parcel:\n" - + "sample=" + sample + "\n" - + "etalon=" + etalon); - throw new TestFailure( - "server has read unexpected parcel"); - } - - etalon.send(ostream); // reply - ostream.flush(); - - } else { - etalon.send(ostream); // init transfer - ostream.flush(); - - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - println("Client agent for port #" - + getPort() + " got unexpected parcel:\n" - + "sample=" + sample + "\n" - + "etalon=" + etalon); - throw new TestFailure( - "parcel context is unexpected to client"); - } - } - } - - if (mode == SERVER) { - int datum = istream.read(); // wait until client's close() - if (datum >= 0) - throw new TestFailure( - "server has read ambigous byte: " + datum); - - ostream.close(); // implies: socket.close(); - - } else { - if (istream.available() > 0) { - int datum = istream.read(); - throw new TestFailure( - "client has read ambigous byte: " + datum); - } - ostream.close(); // implies: socket.close() - } - - } catch (Exception oops) { - exception = oops; - } - } - - } - - /** - * A data parcel to sent/recieved between Client and Server threads. - * When data parcel is sent, first 4 bytes transfered encode the size - * of the parcel (i.e.: number of data bytes in the parcel's contents). - * Then the parcel's contents bytes are transered. - */ - static class Parcel { - private byte[] parcel; - - /** - * Display all bytes as integer values from 0 to 255; - * or return ``null'' if this Parcel is not - * yet initialized. - */ - public String toString() { - if (parcel == null) - return "null"; - String s = "{"; - for (int i = 0; i < parcel.length; i++) - s += (i > 0 ? ", " : "") + ((int) parcel[i] & 0xFF); - return s + "}"; - } - - /** - * Generate new parcel[] array using the given - * random numbers generator. Client and Server - * threads should use identical random generators, - * so that those threads could generate equal data parcels and - * check the parcel just transfered. - */ - public Parcel(Random random) { - int size = random.nextInt(MAX_PARCEL) + 1; - parcel = new byte[size]; - for (int i = 0; i < size; i++) - parcel[i] = (byte) random.nextInt(256); - } - - /** - * Read exactly size bytes from the istream - * if possible, or throw TestFailure if unexpected end of - * istream occurs. - */ - private static byte[] readBytes(int size, InputStream istream) - throws IOException { - - byte data[] = new byte[size]; - for (int i = 0; i < size; i++) { - int datum = istream.read(); - if (datum < 0) - throw new TestFailure( - "unexpected EOF: have read: " + i + " bytes of " + size); - data[i] = (byte) datum; - } - return data; - } - - /** - * Read 4 bytes from istream and threat them to encode - * size of data parcel following these 4 bytes. - */ - private static int getSize(InputStream istream) throws IOException { - byte data[] = readBytes(4, istream); - int data0 = (int) data[0] & 0xFF; - int data1 = (int) data[1] & 0xFF; - int data2 = (int) data[2] & 0xFF; - int data3 = (int) data[3] & 0xFF; - int sizeWord = data0 + (data1 << 8) + (data2 << 16) + (data3 << 24); - int size = sizeWord + 1; - if (size <= 0) - throw new TestFailure("illegal size: " + size); - return size; - } - - /** - * Send 4 bytes encoding actual size of the parcel just to be transfered. - */ - private static void putSize(OutputStream ostream, int size) - throws IOException { - - if (size <= 0) - throw new TestFailure("illegal size: " + size); - - int sizeWord = size - 1; - byte data[] = new byte[4]; - data[0] = (byte) sizeWord; - data[1] = (byte) (sizeWord >> 8); - data[2] = (byte) (sizeWord >> 16); - data[3] = (byte) (sizeWord >> 24); - ostream.write(data); - } - - /** - * Recieve data parcel. - */ - public Parcel(InputStream istream) throws IOException { - int size = getSize(istream); - parcel = readBytes(size, istream); - } - - /** - * Send this data parcel. - */ - public void send(OutputStream ostream) throws IOException { - int size = parcel.length; - putSize(ostream, size); - ostream.write(parcel); - } - - /** - * Check byte-to-byte equality between this and the - * other parcels. - */ - public boolean equals(Parcel other) { - if (this.parcel.length != other.parcel.length) - return false; - int size = parcel.length; - for (int i = 0; i < size; i++) - if (this.parcel[i] != other.parcel[i]) - return false; - return true; - } - - } - - /** - * Server or Client thread may throw this exception to report the test - * failure. - */ - static class TestFailure extends RuntimeException { - /** - * Report particular purpose of the test failure. - */ - public TestFailure(String purpose) { - super(purpose); - } - - } - - /** - * Attach client and server sockets to the local host, and check if - * huge number of data transfers could be correctly transfered between - * these sockets. - *

    - *

    Command-line parameters provided with args[] may - * prompt the local host IP address or domain name. Execute: - *
       - * java network005 [IP-address | host_name | - * localhost ] - *
    where parameters are: - *
       - * IP-address - local hots's address, or 127.0.0.1 - *
       - * host_name - local host's domain name, or the - * keyword ``localhost'' - *
       - * localhost - placeholder for the IP-address 127.0.0.1 - *
    By default, the test uses the Internet address available via - * the method InetAddress.getLocalHost() - */ - public static int run(String args[], PrintStream out) { - network005.out = out; - - // - // Get IP address of the local machine. - // - - InetAddress address = null; - try { - switch (args.length) { - case 0: - address = InetAddress.getLocalHost(); - break; - case 1: - String hostName = args[0]; - address = InetAddress.getByName(args[0]); - break; - default: - println("Use:"); - println(" java network005"); - println("or:"); - println(" java network005 ${IP_ADDRESS}"); - println("or:"); - println(" java network005 ${HOST_NAME}"); - println("or:"); - println(" java network005 localhost"); - return 2; // FAILED - } - } catch (UnknownHostException exception) { - println(exception); - return 2; // FAILED - } - display("Host: " + address); - - // - // Assign ServerSocket to the local host: - // - - ServerSocket serverSocket; - try { - final int anyPort = 0; - final int defaultBacklog = 50; - serverSocket = new ServerSocket(anyPort, defaultBacklog, address); - } catch (IOException ioe) { - println("# Failed to assign ServerSocket on: " + address); - return 2; - } - display(serverSocket.toString()); - - final int port = serverSocket.getLocalPort(); - - // - // Incarnate the server & the client agents. - // - - Agent server[] = new Agent[CONNECTIONS]; - Agent client[] = new Agent[CONNECTIONS]; - - for (int i = 0; i < CONNECTIONS; i++) - try { - Socket socket; - socket = new Socket(address, port); - client[i] = new Agent(socket, Agent.CLIENT); - display("Client #" + i + ": " + socket); - socket = serverSocket.accept(); - server[i] = new Agent(socket, Agent.SERVER); - display("Server #" + i + ": " + socket); - } catch (IOException io) { - println("Failed establish conection #" + i + ": " + io); - return 2; - } - - // - // Execute the server and client threads. - // - - Exception exception = null; - for (int i = 0; i < CONNECTIONS; i++) { - server[i].start(); - client[i].start(); - } - try { - boolean someIsAlive = true; - while (someIsAlive) { - boolean aliveFound = false; - boolean someBroken = false; - for (int i = 0; i < CONNECTIONS; i++) - if (client[i].isAlive() || server[i].isAlive()) { - if ((client[i].exception != null) || - (server[i].exception != null)) - someBroken = true; - aliveFound = true; - Thread.yield(); - } - someIsAlive = aliveFound; - if (someBroken) - break; - } - } catch (TestFailure failure) { - exception = failure; - } - - // Failure diagnostics, if needed. - - Exception problem[] = new Exception[2 * CONNECTIONS + 1]; - problem[0] = exception; - for (int i = 0; i < CONNECTIONS; i++) { - problem[2 * i + 1] = server[i].exception; - problem[2 * i + 2] = client[i].exception; - } - - int exitCode = 0; - - for (int i = 0; i < 2 * CONNECTIONS + 1; i++) - if (problem[i] != null) { - out.println("#### OOPS ! ####"); - problem[i].printStackTrace(out); - exitCode = 2; - } - - if (exitCode != 0) { - out.println("#### OOPS ! ####"); - out.println("# Test failed."); - return 2; // FAILED - } - display("Test passed."); - return 0; // PASSED - } - - /** - * Re-calls to the method run(args[],out) actually - * performing the test; and stop with exit code 95 if the test - * has passed, or with code 97 if the test has failed. - * (This is JCK-like exit codes convention.) - * - * @see #run(String[], PrintStream) - */ - public static void main(String args[]) { - int exitCode = run(args, System.out); - System.exit(exitCode + 95); - // JCK-like exit code. - } - -} diff --git a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network006.java b/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network006.java deleted file mode 100644 index 8745a9f8648..00000000000 --- a/test/hotspot/jtreg/vmTestbase/nsk/stress/network/network006.java +++ /dev/null @@ -1,916 +0,0 @@ -/* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -/* - * @test - * @key stress - * - * @summary converted from VM testbase nsk/stress/network/network006. - * VM testbase keywords: [stress, slow, nonconcurrent, quick, quarantine] - * VM testbase comments: 8185072 - * VM testbase readme: - * DESCRIPTION - * This test makes huge number of data transfers between 2 Java virtual - * machines using the TCP/IP protocol, and checks if those data are transfered - * correctly. Both client and server VMs run on the same local computer and - * attach TCP/IP sockets to the local host, or to the loopback domain - * ``localhost'' (having IP address 127.0.0.1). - * In this test, 128 client/server connections are established. Once a - * connection is established, client passes a data parcel to server, and server - * reads that parcel and checks if it is same as expected (byte-to-byte equality - * is desired). Then server passes (some other) parcel to the client, and client - * reads and verifies those bytes. This ping-pong game is repeated 128 times; and - * after that each pair of sockets checks if there are no extra bytes accudentally - * passed through their connection. - * Parcels lengths and contents are chosen randomly, and average parcel length - * is 128 bytes. So totally, each pair of sockets passes ~16Kb of data to each other, - * and thus ~32Kb of data are transfered by each sockets pair. Totally, ~4Mb of data - * are transfered by all client/server pairs. - * COMMENTS - * Test was fixed: - * added WAITTIME parameter defined timeout for TCP/IP sockets in minutes - * - * @library /vmTestbase - * /test/lib - * @run driver jdk.test.lib.FileInstaller . . - * @build nsk.stress.network.network006 - * @run main/othervm PropertyResolvingWrapper - * nsk.stress.network.network006 - * "${test.jdk}/bin/java ${test.vm.opts} ${test.java.opts}" 5 - */ - -package nsk.stress.network; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.Random; - -/** - * This test makes huge number of data transfers between 2 Java virtual - * machines using the TCP/IP protocol, and checks if those data are transfered - * correctly. Both client and server VMs run on the same local computer and - * attach TCP/IP sockets to the local host, or to the loopback domain - * ``localhost'' (having IP address 127.0.0.1). - *

    - *

    In this test, 128 client/server connections are established. Once a - * connection is established, client passes a data parcel to server, and server - * reads that parcel and checks if it is same as expected (byte-to-byte equality - * is desired). Then server passes (some other) parcel to the client, and client - * reads and verifies those bytes. This ping-pong game is repeated 128 times; and - * after that each pair of sockets checks if there are no extra bytes accudentally - * passed through their connection. - *

    - *

    Parcels lengths and contents are chosen randomly, and average parcel length - * is 128 bytes. So totally, each pair of sockets passes ~16Kb of data to each other, - * and thus ~32Kb of data are transfered by each sockets pair. Totally, ~4Mb of data - * are transfered by all client/server pairs. - */ -public class network006 { - /** - * Timeout for TCP/IP sockets (currently set to 1 min). - */ - private static int SO_TIMEOUT;// = 2*60*1000; - - /** - * Maximal number of connections this test should open simultaneously. - */ - private final static int MAX_CONNECTIONS = 128; - - /** - * Check few more connections to make sure that MAX_CONNECTIONS are safe. - */ - private final static int CONNECTIONS_RESERVE = 10; - - /** - * The test used to fail with connection reset by peer set to 50. - * (and once in a three if it was set to 10). - * So now we set it to MAX_CONNECTIONS (128). - */ - private final static int BACKLOG_QUEUE_LENGTH = MAX_CONNECTIONS; - - /** - * Number of parcels to be sent/recieved. - */ - private final static int DATA_PARCELS = 128; - - /** - * Maximal length of data parcel to be sent/recieved - * (it equals to 256 bytes now). - */ - private final static int MAX_PARCEL = 1 << 8; - - /** - * Either actually display optional reports or not. - */ - static private final boolean DEBUG_MODE = false; - - /** - * How many IP sockets can we open simultaneously? - * Check if MAX_CONNECTIONS connections - * can be open simultaneously. - */ - private static int detectOSLimitation() { - final int CONNECTIONS_TO_TRY = MAX_CONNECTIONS + CONNECTIONS_RESERVE; - display("--- Trying to open " + CONNECTIONS_TO_TRY + " connections:"); - - InetAddress address; - ServerSocket serverSocket; - try { - address = InetAddress.getLocalHost(); - int anyPort = 0; - int defaultBacklog = BACKLOG_QUEUE_LENGTH; - serverSocket = new ServerSocket(anyPort, defaultBacklog, address); - } catch (IOException ioe) { - throw new Error("FATAL error while loading the test: " + ioe); - } - display(serverSocket.toString()); - - Socket server[] = new Socket[CONNECTIONS_TO_TRY]; - Socket client[] = new Socket[CONNECTIONS_TO_TRY]; - - int i, port = serverSocket.getLocalPort(); - for (i = 0; i < CONNECTIONS_TO_TRY; i++) - try { - client[i] = new Socket(address, port); - display(">Open: client[" + i + "] = " + client[i]); - server[i] = serverSocket.accept(); - display(">Open: server[" + i + "] = " + server[i]); - } catch (IOException ioe) { - display(">OOPS! -- failed to open connection #" + i); - break; - } - display("> Could open " + - (i < CONNECTIONS_TO_TRY ? "only " : "") + i + " connections."); - display(">Closing them:"); - for (int j = 0; j < i; j++) - try { - server[j].close(); - client[j].close(); - } catch (IOException ioe) { - throw new Error("FATAL error while loading the test: " + ioe); - } - display(">OK."); - int safeConnections = i - CONNECTIONS_RESERVE; - if (safeConnections < 1) - safeConnections = 1; - if (safeConnections < MAX_CONNECTIONS) { - complain("------------------------- CAUTION: -------------------"); - complain("While checking the OS limitations, the test found that"); - complain("only " + i + " TCP/IP socket connections could be safely open"); - complain("simultaneously. However, possibility to open at least"); - complain("" + MAX_CONNECTIONS + "+" + CONNECTIONS_RESERVE - + " connections were expected."); - complain(""); - complain("So, the test will check only " + safeConnections + " connection" - + (safeConnections == 1 ? "" : "s") + " which seem"); - complain("safe to be open simultaneously."); - complain("------------------------------------------------------"); - } - return safeConnections; - } - - //----------------------------------------------------------------// - - /** - * Re-calls to the method run(args[],out) actually - * performing the test. After run(args[],out) stops, - * follow JDK-like convention for exit codes. I.e.: stop with - * exit status 95 if the test has passed, or with status 97 if - * the test has failed. - * - * @see #run(String[], PrintStream) - */ - public static void main(String args[]) { - int exitCode = run(args, System.out); - System.exit(exitCode + 95); - // JCK-like exit status. - } - - /** - * Parse command-line parameters stored into args[] array, - * then perform the test. I.e.: start the server thread at the same VM - * this method runs, then start the other client VM, and verify data - * transfer through TCP/IP connection between those different virtual - * machines. - *

    - *

    There should be 2 or 3 command-line parameters: - *
       - * java network006 java_command - * [IP-address | host_name | localhost ] - *
    where parameters are: - *
       - * java_command - how to start java, - * e.g.: ``c:\jdk1.3\bin\java -classic'' - *
       - * waittime - timeout for TCP/IP sockets in minutes - *
       - * IP-address - local hots's address, or 127.0.0.1 - *
       - * host_name - local host's domain name, or the - * keyword ``localhost'' - *
       - * localhost - placeholder for the IP-address 127.0.0.1 - *

    - *

    Usually, java_command should point to the same - * Java machine just executing this test. However, every compatible Java 2 - * implementation is appropriate. - *

    - *

    If optional parameter is ommited, the test invokes the method - * InetAddress.getLocalHost() to get the domain name and - * IP-address of the local computer. - */ - public static int run(String args[], PrintStream out) { - network006.out = out; - - // - // Get the Internet address of the local machine. - // - InetAddress address = null; - try { - switch (args.length) { - case 2: - address = InetAddress.getLocalHost(); - break; - case 3: - address = InetAddress.getByName(args[2]); - break; - default: - complain("Illegal arguments number; execute:"); - complain(" java " + network006.class.getName() + " $JAVA_COMMAND " + - "[$IP_ADDRESS | $HOST_NAME | localhost]"); - return 2; // FAILED - } - } catch (UnknownHostException exception) { - complain(exception.toString()); - return 2; // FAILED - } - display("Host: " + address); - - // - // Detect if it is safe to open MAX_CONNETIONS simultaneously: - // - final int CONNECTIONS = detectOSLimitation(); - - // - // Assign ServerSocket, and start client VM which should open - // the prescribed number of CONNECTIONS to that ServerSocket. - // - - ServerSocket serverSocket; - try { - final int anyPort = 0; - final int defaultBacklog = BACKLOG_QUEUE_LENGTH; - serverSocket = new ServerSocket(anyPort, defaultBacklog, address); - } catch (IOException exception) { - complain("Cannot assign a ServerSocket on: " + address); - return 2; - } - - // - // Start the client process on different VM. - // - - String IPAddress = address.getHostAddress(); - int localPort = serverSocket.getLocalPort(); - String arguments = " " + CONNECTIONS + " " + IPAddress + " " + localPort; - //String command = args[0] + " " + network006.class.getName() + "$Client " + arguments; - String command = args[0] + " " + Client.class.getName() + " " + arguments; - try { - SO_TIMEOUT = Integer.parseInt(args[1]) * 60 * 1000; - } catch (NumberFormatException e) { - complain("Wrong timeout argument: " + e); - return 2; - } - - Runtime runtime = Runtime.getRuntime(); - - Process client = null; - IORedirector redirectOut = null; - IORedirector redirectErr = null; - - try { - // Start clients on different JVM: - client = runtime.exec(command); - - // Provide clients with access to stderr and stdout: - InputStream clientOut = client.getInputStream(); - InputStream clientErr = client.getErrorStream(); - redirectOut = new IORedirector(clientOut, DEBUG_MODE ? out : null); - redirectErr = new IORedirector(clientErr, out); - redirectOut.start(); - redirectErr.start(); - - } catch (Exception exception) { - complain("Failed to start client: " + exception); - return 2; - } - // - // Start the server threads (and let them establish connections): - // - - Server server[] = new Server[CONNECTIONS]; - for (int i = 0; i < CONNECTIONS; i++) { - server[i] = new Server(serverSocket); - display("Server #" + i + ": " + server[i]); - server[i].start(); - } - - // - // Wait for the servers and the clients: - // - - boolean testFailed = false; - - try { - client.waitFor(); - int clientStatus = client.exitValue(); - display("Client VM exitCode=" + clientStatus); - - // Let I/O redirectors to flush: - if (redirectOut.isAlive()) - redirectOut.join(); - if (redirectErr.isAlive()) - redirectErr.join(); - - // If client has crashed, also terminate the server (to avoid hangup). - if (clientStatus != 95) { - complain("Client VM has crashed: exit status=" + clientStatus); - testFailed = true; - } - - // Client has finished OK; wait for the server. - for (int i = 0; i < CONNECTIONS; i++) { - display("Server: waiting for #" + i); - if (server[i].isAlive()) { - display("Server #" + i + ": (joining...)" + server[i]); - server[i].join(); - } - if (server[i].exception != null) { - if (server[i].message != null) - complain("Server #" + i + "(finished): with message:" + server[i].message); - - complain("Server #" + i + "(finished): " + server[i].exception); - server[i].exception.printStackTrace(out); - out.flush(); -// complain("Server #"+i+": "+server[i].exception.getStackTrace()); - testFailed = true; - } - } - - } catch (Exception exception) { - complain("Test interrupted: " + exception); - testFailed = true; - } - - if (testFailed) - complain("Test failed."); - else - display("Test passed."); - return testFailed ? 2 : 0; - } - - //----------------------------------------------------------------// - - /** - * Log stream for error messages and/or (optional) execution trace. - */ - private static PrintStream out; - - /** - * Print error message. - */ - private static synchronized void complain(Object message) { - out.println("# " + message); - out.flush(); - } - - /** - * Display optional report: comment ca va? - */ - private static synchronized void display(Object report) { - if (DEBUG_MODE) - out.println(report.toString()); - out.flush(); //todo shouldn't this be inside if?? - } - - //----------------------------------------------------------------// - - /** - * Server thread should reply to data parcels sent by Client VM. - */ - private static class Server extends Thread { - /** - * The socket is assigned at the Server instantiation. - */ - private ServerSocket serverSocket; - - /** - * The socket is assigned at the Server runtime. - */ - private Socket socket; - - /** - * Display the server socket. - */ - public String toString() { - - return "ServerSocket: " + serverSocket.toString(); -// + " socket: " + socket.toString(); - } - - /** - * Which port is this socket listening? - */ - int getPort() { - return serverSocket.getLocalPort(); - } - - /** - * Find some free port at the given address - * and attach new server to hear that port. // lidsten to?? - */ - public Server(ServerSocket serverSocket) { - this.serverSocket = serverSocket; - } - - /** - * Exception just arisen while the server was working, - * or null if it was OK with the server. - */ - Exception exception = null; - String message = null; - - /** - * Accept connection, then reply to client's parcels. - */ - public void run() { - try { - socket = serverSocket.accept(); - socket.setSoTimeout(SO_TIMEOUT); - - InputStream istream = socket.getInputStream(); - OutputStream ostream = socket.getOutputStream(); - - Random random = new Random(getPort()); - - for (int i = 0; i < DATA_PARCELS; i++) { - Parcel etalon = new Parcel(random); - message = "reading parcel number " + i; - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - complain("Server thread for port #" - + getPort() + " got unexpected parcel:\n" - + "sample=" + sample + "\n" - + "etalon=" + etalon); - throw new TestFailure( //received?? - "server has read unexpected parcel"); - } - message = "sending parcel number " + i; - etalon.send(ostream); - ostream.flush(); - } - - int datum = istream.read(); // wait for client close() - if (datum >= 0) - throw new TestFailure( - "server has read ambigous byte: " + datum); - - ostream.close(); // implies: socket.close(); - - } catch (Exception oops) { - exception = oops; - } - } - } - - //----------------------------------------------------------------// - - /** - * Client VM should send data parcels to Server VM and - * recieve and verify the server's replies. - */ - private static class Client extends Thread { - /** - * This thread uses the single client socket. - */ - private Socket socket; - - /** - * Address and port of this socket. - */ - public String toString() { - return socket.toString(); - } - - /** - * Did the thread failed? If yes, what is the failure's reason. - */ - Exception exception = null; - String message = null; - - - public static java.io.PrintStream complainStream = System.out; - public static java.io.PrintStream displayStream = System.err; - - /** - * Connect client socket on the given address - * and port. - */ - Client(InetAddress address, int port) throws IOException { - socket = new Socket(address, port); - socket.setSoTimeout(SO_TIMEOUT); - } - - /** - * What is the port number this socket is listening for? - */ - int getPort() { - return socket.getPort(); - } - - /** - * Establish connection, then read/respond DATA_PARCELS parcels - * of random data. Set initial seed for pseudo-random numbers generator - * to the value of the local port number. - * - * @see #DATA_PARCELS - * @see #getPort() - */ - public void run() { - try { - InputStream istream = socket.getInputStream(); - OutputStream ostream = socket.getOutputStream(); - - Random random = new Random(getPort()); - // suggested by Oleg -- to avoid race conditions - /* try{ - Thread.sleep(500); - } - catch (java.lang.InterruptedException e) - { - }*/ - - for (int i = 0; i < DATA_PARCELS; i++) { - Parcel etalon = new Parcel(random); - message = "sending parcel number: " + i; - etalon.send(ostream); - ostream.flush(); - - message = "reading parcel number: " + i; - Parcel sample = new Parcel(istream); // read - if (!sample.equals(etalon)) { - complain("Client thread for port #" - + getPort() + " got unexpected parcel:\n" - + "sample=" + sample + "\n" - + "etalon=" + etalon); - throw new TestFailure( - "parcel context is unexpected to client"); - } - } - - if (istream.available() > 0) { - int datum = istream.read(); - throw new TestFailure( - "client has read ambigous byte: " + datum); - } - ostream.close(); // implies: socket.close() - - } catch (Exception oops) { - exception = oops; - } - } - - /** - * Establish lots of connections to server socket, attack servers with - * huge data parcels, and check if they reply correctly. The number of - * connections to try, the address and port number for the server socket - * are passed through args[], like: - *

    -         *    java network006$Client connections_to_try address port
    -         * 
    - */ - public static void main(String args[]) { - if (DEBUG_MODE) { - try { - String filename = "Client" + ((args.length == 3) ? args[2] : "new"); - displayStream = new PrintStream(filename + ".out"); - complainStream = new PrintStream(filename + ".err"); - } catch (FileNotFoundException exception) { - complain(exception); - } - - } - - if (args.length != 3) { - complain("Client expects 3 paramenets:"); - complain(" java " + Client.class.getName() + " connections_to_try address port"); - exit(1); // FAILED - } - - int CONNECTIONS = Integer.parseInt(args[0]); - display("Client VM: will try " + CONNECTIONS + " connections."); - InetAddress address; - try { - address = InetAddress.getByName(args[1]); - } catch (UnknownHostException exception) { - address = null; - complain("Client: cannot find host: \"" + args[1] + "\""); - exit(4); - } - display("Client: host to contact: " + address); - int port = Integer.parseInt(args[2]); - display("Client: port to contact: " + port); - - // - // Establish connections, and start client processes: - // - - Client client[] = new Client[CONNECTIONS]; - for (int i = 0; i < CONNECTIONS; i++) - try { - client[i] = new Client(address, port); - display("Client #" + i + ": " + client[i]); - - } catch (IOException ioe) { - complain("Client #" + i + "(creation): " + ioe); - ioe.printStackTrace(complainStream); - complainStream.flush(); -// complain("Client #" + i + "(creation): " + ioe.getStackTrace()); - exit(3); - } - - for (int i = 0; i < CONNECTIONS; i++) - client[i].start(); - - // - // Wait until testing is not finished: - // - - int status = 0; - for (int i = 0; i < CONNECTIONS; i++) { - display("Client: waiting for #" + i); - if (client[i].isAlive()) { - display("Client #" + i + ": (joining...)" + client[i]); - - try { - client[i].join(); - } catch (InterruptedException ie) { - complain("Client #" + i + ": " + ie); - status = 3; - } - } - if (client[i].exception != null) { - if (client[i].message != null) - complain("Client #" + i + "(finished) with message: " + client[i].message); - complain("Client #" + i + "(finished): " + client[i].exception); - client[i].exception.printStackTrace(complainStream); - complainStream.flush(); - if (status == 0) - status = 2; - } - } - - exit(status); - } - - /** - * Print error message. - */ - private static synchronized void complain(Object message) { - complainStream.println("# " + message); - complainStream.flush(); - } - - /** - * Display execution trace. - */ - private static synchronized void display(Object message) { - if (!DEBUG_MODE) - return; - displayStream.println(message.toString()); - displayStream.flush(); - } - - /** - * Exit with JCK-like status. - */ - private static void exit(int exitCode) { - int status = exitCode + 95; -// display("Client: exiting with code=" + status); - System.exit(status); - } - } - - /** - * Two of such threads should redirect out and err - * streams of client VM. - */ - private static class IORedirector extends Thread { - /** - * Source stream. - */ - InputStream in; - /** - * Destination stream. - */ - OutputStream out; - - /** - * Redirect in to out. - */ - public IORedirector(InputStream in, OutputStream out) { - this.in = in; - this.out = out; - } - - /** - * Read input stream until the EOF, and write everithing to output stream. - * If output stream is assigned to null, do not print anything, - * but read the input stream anywhere. - */ - public void run() { - try { - for (; ; ) { - int symbol = in.read(); - if (symbol < 0) - break; // EOF - if (out != null) - out.write(symbol); - } - - if (out != null) - out.flush(); - - } catch (Exception exception) { - throw new TestFailure("IORedirector exception: " + exception); - } - } - } - - //----------------------------------------------------------------// - - /** - * A data parcel to be sent/recieved between Client VM and Server thread. - * When data parcel is sent, first 4 bytes are transfered which encode the - * int number equal to size of the parcel minus 1. I.e.: if - * number of data bytes in the parcel's contents is N, then - * the first 4 bytes encode the number N-1. After that, the - * parcel's contents bytes are transered. - */ - static class Parcel { - private byte[] parcel; - - /** - * Display all bytes as integer values from 0 to 255; - * or return ``null'' if this Parcel is not - * yet initialized. - */ - public String toString() { - if (parcel == null) - return "null"; - String s = "{"; - for (int i = 0; i < parcel.length; i++) - s += (i > 0 ? ", " : "") + ((int) parcel[i] & 0xFF); - return s + "}"; - } - - /** - * Generate new parcel[] array using the given - * random numbers generator. Client and Server - * threads should use identical random generators, - * so that those threads could generate equal data parcels and - * check the parcel just transfered. - */ - public Parcel(Random random) { - int size = random.nextInt(MAX_PARCEL) + 1; - parcel = new byte[size]; - for (int i = 0; i < size; i++) - parcel[i] = (byte) random.nextInt(256); - } - - /** - * Read exactly size bytes from the istream - * if possible, or throw TestFailure if unexpected end of - * istream occurs. - */ - private static byte[] readBytes(int size, InputStream istream) - throws IOException { - - byte data[] = new byte[size]; - for (int i = 0; i < size; i++) { - int datum = istream.read(); - if (datum < 0) - throw new TestFailure( - "unexpected EOF: have read: " + i + " bytes of " + size); - data[i] = (byte) datum; - } - return data; - } - - /** - * Read 4 bytes from istream and threat them to encode - * size of data parcel following these 4 bytes. - */ - private static int getSize(InputStream istream) throws IOException { - byte data[] = readBytes(4, istream); - int data0 = (int) data[0] & 0xFF; - int data1 = (int) data[1] & 0xFF; - int data2 = (int) data[2] & 0xFF; - int data3 = (int) data[3] & 0xFF; - int sizeWord = data0 + (data1 << 8) + (data2 << 16) + (data3 << 24); - int size = sizeWord + 1; - if (size <= 0) - throw new TestFailure("illegal size: " + size); - return size; - } - - /** - * Send 4 bytes encoding actual size of the parcel just to be transfered. - */ - private static void putSize(OutputStream ostream, int size) - throws IOException { - - if (size <= 0) - throw new TestFailure("illegal size: " + size); - - int sizeWord = size - 1; - byte data[] = new byte[4]; - data[0] = (byte) sizeWord; - data[1] = (byte) (sizeWord >> 8); - data[2] = (byte) (sizeWord >> 16); - data[3] = (byte) (sizeWord >> 24); - ostream.write(data); - } - - /** - * Recieve data parcel. - */ - public Parcel(InputStream istream) throws IOException { - int size = getSize(istream); - parcel = readBytes(size, istream); - } - - /** - * Send this data parcel. - */ - public void send(OutputStream ostream) throws IOException { - int size = parcel.length; - putSize(ostream, size); - ostream.write(parcel); - } - - /** - * Check byte-to-byte equality between this and the - * other parcels. - */ - public boolean equals(Parcel other) { - if (this.parcel.length != other.parcel.length) - return false; - int size = parcel.length; - for (int i = 0; i < size; i++) - if (this.parcel[i] != other.parcel[i]) - return false; - return true; - } - } - - /** - * Server or Client may throw this exception to report the test failure. - */ - static class TestFailure extends RuntimeException { - /** - * Report particular purpose of the test failure. - */ - public TestFailure(String purpose) { - super(purpose); - } - } -} diff --git a/test/hotspot/jtreg/vmTestbase/vm/compiler/CodeCacheInfoOnCompilation/run.sh b/test/hotspot/jtreg/vmTestbase/vm/compiler/CodeCacheInfoOnCompilation/run.sh index 3c41316d891..3159eb22e1a 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/compiler/CodeCacheInfoOnCompilation/run.sh +++ b/test/hotspot/jtreg/vmTestbase/vm/compiler/CodeCacheInfoOnCompilation/run.sh @@ -27,7 +27,7 @@ TESTED_JAVA_HOME="$TESTJAVA" ver=$(${TESTED_JAVA_HOME}/bin/java ${JAVA_OPTS} -version 2>&1) isComp=$( echo ${ver} | grep -c "compiled mode") -if [[ $isComp != 1 ]]; then +if [ "$isComp" -ne 1 ]; then echo "skipped. This test works only with -Xcomp" exit fi @@ -40,7 +40,7 @@ pattern="(CodeCache|(CodeHeap.*)): size=${size_pattern} used=${size_pattern} max res=$(${TESTED_JAVA_HOME}/bin/java ${JAVA_OPTS} -XX:+PrintCodeCacheOnCompilation -XX:-Inline vm.compiler.CodeCacheInfoOnCompilation.PrintOnCall | egrep -ce "${pattern}") echo "res: " ${res} -if (( "${res}" != "0" )); then +if [ "$res" -ne 0 ]; then echo "passed" true else diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index f97fc6236ca..d8011fac82f 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -881,4 +881,3 @@ javax/rmi/ssl/SSLSocketParametersTest.sh 8162906 generic- # jdk_jfr jdk/jfr/event/io/TestInstrumentation.java 8202142 generic-all -jdk/jfr/event/sampling/TestNative.java 8202142 generic-all diff --git a/test/jdk/java/io/InputStream/NullInputStream.java b/test/jdk/java/io/InputStream/NullInputStream.java index 07b8ca5d191..4b7ff51ebea 100644 --- a/test/jdk/java/io/InputStream/NullInputStream.java +++ b/test/jdk/java/io/InputStream/NullInputStream.java @@ -22,6 +22,7 @@ */ import java.io.ByteArrayOutputStream; +import java.io.EOFException; import java.io.InputStream; import java.io.IOException; import org.testng.annotations.AfterGroups; @@ -31,7 +32,7 @@ import static org.testng.Assert.*; /* * @test - * @bug 4358774 8139206 + * @bug 4358774 6516099 8139206 * @run testng NullInputStream * @summary Check for expected behavior of InputStream.nullInputStream(). */ @@ -145,6 +146,21 @@ public class NullInputStream { } } + @Test(groups = "open") + public static void testSkipNBytes() { + try { + openStream.skipNBytes(-1); + openStream.skipNBytes(0); + } catch (IOException ioe) { + fail("Unexpected IOException"); + } + } + + @Test(groups = "open", expectedExceptions = EOFException.class) + public static void testSkipNBytesEOF() throws IOException { + openStream.skipNBytes(1); + } + @Test(groups = "open") public static void testTransferTo() { try { @@ -218,6 +234,15 @@ public class NullInputStream { } } + @Test(groups = "closed") + public static void testSkipNBytesClosed() { + try { + closedStream.skipNBytes(1); + fail("Expected IOException not thrown"); + } catch (IOException e) { + } + } + @Test(groups = "closed") public static void testTransferToClosed() { try { diff --git a/test/jdk/java/io/InputStream/Skip.java b/test/jdk/java/io/InputStream/Skip.java index 9d840e0eb92..534b6e3dae7 100644 --- a/test/jdk/java/io/InputStream/Skip.java +++ b/test/jdk/java/io/InputStream/Skip.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,24 +21,22 @@ * questions. */ +/** + * @test + * @bug 4016710 6516099 + * @summary check for correct implementation of InputStream.skip{NBytes} + */ -/* @test - @bug 4016710 - @summary check for correct implementation of InputStream.skip - */ +import java.io.EOFException; +import java.io.InputStream; +import java.io.IOException; -import java.io.*; - - -public class Skip{ - - private static void dotest(InputStream in , int curpos , - long total , long toskip , long expected) - throws Exception - { +public class Skip { + private static final int EOF = -1; + private static void dotest(InputStream in, int curpos, long total, + long toskip, long expected) throws Exception { try { - System.err.println("\n\nCurrently at pos = " + curpos + "\nTotal bytes in the Stream = " + total + "\nNumber of bytes to skip = " + toskip + @@ -50,43 +48,69 @@ public class Skip{ System.err.println("actual number skipped: "+ skipped); if ((skipped < 0) || (skipped > expected)) { - throw new RuntimeException("Unexpected number of bytes skipped"); + throw new RuntimeException("Unexpected byte count skipped"); } - } catch (IOException e) { - System.err.println("IOException is thrown - possible result"); + System.err.println("IOException is thrown: " + e); } catch (Throwable e) { - throw new RuntimeException("Unexpected "+e+" is thrown!"); + throw new RuntimeException("Unexpected " + e + " is thrown!"); } + } + private static void dotestExact(MyInputStream in, long curpos, long total, + long toskip, boolean expectIOE, boolean expectEOFE) { + + System.err.println("\n\nCurrently at pos = " + curpos + + "\nTotal bytes in the Stream = " + total + + "\nNumber of bytes to skip = " + toskip); + + try { + long pos = in.position(); + assert pos == curpos : pos + " != " + curpos; + in.skipNBytes(toskip); + if (in.position() != pos + (toskip < 0 ? 0 : toskip)) { + throw new RuntimeException((in.position() - pos) + + " bytes skipped; expected " + toskip); + } + } catch (EOFException eofe) { + if (!expectEOFE) { + throw new RuntimeException("Unexpected EOFException", eofe); + } + System.err.println("Caught expected EOFException"); + } catch (IOException ioe) { + if (!expectIOE) { + throw new RuntimeException("Unexpected IOException", ioe); + } + System.err.println("Caught expected IOException"); + } } public static void main( String argv[] ) throws Exception { - MyInputStream in = new MyInputStream(11); - /* test for negative skip */ + // test for negative skip dotest(in, 0, 11, -23, 0); - /* check for skip beyond EOF starting from before EOF */ + // check for skip beyond EOF starting from before EOF dotest(in, 0, 11, 20, 11); - /* check for skip after EOF */ - dotest(in, -1, 11, 20, 0); + // check for skip after EOF + dotest(in, EOF, 11, 20, 0); in = new MyInputStream(9000); - /* check for skip equal to the read chunk size in InputStream.java */ + + // check for skip equal to the read chunk size in InputStream.java dotest(in, 0, 9000, 2048, 2048); - /* check for skip greater than the read chunk size in InputStream.java */ + // check for skip larger than the read chunk size in InputStream.java dotest(in, 2048, 9000, 5000, 5000); - /* check for skip beyond EOF starting from before EOF */ + // check for skip beyond EOF starting from before EOF dotest(in, 7048, 9000, 5000, 1952); in = new MyInputStream(5000); - /* check for multiple chunk reads */ + // check for multiple chunk reads dotest(in, 0, 5000, 6000, 5000); /* @@ -98,23 +122,86 @@ public class Skip{ * dotest(in, 0, total, toskip, toskip); */ - } + // tests for skipping an exact number of bytes + final long streamLength = Long.MAX_VALUE; + in = new MyInputStream(streamLength); + + // negative skip: OK + dotestExact(in, 0, streamLength, -1, false, false); + + // negative skip at EOF: OK + in.position(streamLength); + dotestExact(in, streamLength, streamLength, -1, false, false); + in.position(0); + + // zero skip: OK + dotestExact(in, 0, streamLength, 0, false, false); + + // zero skip at EOF: OK + in.position(streamLength); + dotestExact(in, streamLength, streamLength, 0, false, false); + + // skip(1) at EOF: EOFE + dotestExact(in, streamLength, streamLength, 1, false, true); + in.position(0); + + final long n = 31; // skip count + long pos = 0; + + // skip(n) returns negative value: IOE + in.setState(-1, 100); + dotestExact(in, pos, streamLength, n, true, false); + + // skip(n) returns n + 1: IOE + in.setState(n + 1, 100); + dotestExact(in, pos, streamLength, n, true, false); + pos += n + 1; + + // skip(n) returns n/2 but only n/4 subsequent reads succeed: EOFE + in.setState(n/2, n/2 + n/4); + dotestExact(in, pos, streamLength, n, false, true); + pos += n/2 + n/4; + + // skip(n) returns n/2 but n - n/2 subsequent reads succeed: OK + in.setState(n/2, n); + dotestExact(in, pos, streamLength, n, false, false); + pos += n; + } } class MyInputStream extends InputStream { + private static final int EOF = -1; - private int readctr = 0; - private long endoffile; + private final long endoffile; + + private long readctr = 0; + + private boolean isStateSet = false; + private long skipReturn; + private long readLimit; public MyInputStream(long endoffile) { this.endoffile = endoffile; } - public int read() { + /** + * Limits the behavior of skip() and read(). + * + * @param skipReturn the value to be returned by skip() + * @param maxReads the maximum number of reads past the current position + * before EOF is reached + */ + public void setState(long skipReturn, long maxReads) { + this.skipReturn = skipReturn; + this.readLimit = readctr + maxReads; + isStateSet = true; + } - if (readctr == endoffile) { - return -1; + public int read() { + if (readctr == endoffile || + (isStateSet && readctr >= readLimit)) { + return EOF; } else { readctr++; @@ -123,4 +210,19 @@ class MyInputStream extends InputStream { } public int available() { return 0; } + + public long position() { return readctr; } + + public void position(long pos) { + readctr = pos < 0 ? 0 : Math.min(pos, endoffile); + } + + public long skip(long n) throws IOException { + if (isStateSet) { + return skipReturn < 0 ? skipReturn : super.skip(skipReturn); + } + + // InputStream skip implementation. + return super.skip(n); // readctr is implicitly incremented + } } diff --git a/test/jdk/java/lang/constant/ClassDescTest.java b/test/jdk/java/lang/constant/ClassDescTest.java new file mode 100644 index 00000000000..d1d0d9b3d42 --- /dev/null +++ b/test/jdk/java/lang/constant/ClassDescTest.java @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.invoke.MethodHandles; +import java.lang.constant.ClassDesc; +import java.lang.constant.ConstantDescs; +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.fail; + +/** + * @test + * @compile ClassDescTest.java + * @run testng ClassDescTest + * @summary unit tests for java.lang.constant.ClassDesc + */ +@Test +public class ClassDescTest extends SymbolicDescTest { + + private void testClassDesc(ClassDesc r) throws ReflectiveOperationException { + testSymbolicDesc(r); + + // Test descriptor accessor, factory, equals + assertEquals(r, ClassDesc.ofDescriptor(r.descriptorString())); + + if (!r.descriptorString().equals("V")) { + assertEquals(r, r.arrayType().componentType()); + // Commutativity: array -> resolve -> componentType -> toSymbolic + assertEquals(r, ((Class) r.arrayType().resolveConstantDesc(LOOKUP)).getComponentType().describeConstable().orElseThrow()); + // Commutativity: resolve -> array -> toSymbolic -> component type + assertEquals(r, Array.newInstance(((Class) r.resolveConstantDesc(LOOKUP)), 0).getClass().describeConstable().orElseThrow().componentType()); + } + + if (r.isArray()) { + assertEquals(r, r.componentType().arrayType()); + assertEquals(r, ((Class) r.resolveConstantDesc(LOOKUP)).getComponentType().describeConstable().orElseThrow().arrayType()); + assertEquals(r, Array.newInstance(((Class) r.componentType().resolveConstantDesc(LOOKUP)), 0).getClass().describeConstable().orElseThrow()); + } + } + + private void testClassDesc(ClassDesc r, Class c) throws ReflectiveOperationException { + testClassDesc(r); + + assertEquals(r.resolveConstantDesc(LOOKUP), c); + assertEquals(c.describeConstable().orElseThrow(), r); + assertEquals(ClassDesc.ofDescriptor(c.descriptorString()), r); + } + + public void testSymbolicDescsConstants() throws ReflectiveOperationException { + int tested = 0; + Field[] fields = ConstantDescs.class.getDeclaredFields(); + for (Field f : fields) { + try { + if (f.getType().equals(ClassDesc.class) + && ((f.getModifiers() & Modifier.STATIC) != 0) + && ((f.getModifiers() & Modifier.PUBLIC) != 0)) { + ClassDesc cr = (ClassDesc) f.get(null); + Class c = (Class)cr.resolveConstantDesc(MethodHandles.lookup()); + testClassDesc(cr, c); + ++tested; + } + } + catch (Throwable e) { + System.out.println(e.getMessage()); + fail("Error testing field " + f.getName(), e); + } + } + + assertTrue(tested > 0); + } + + public void testPrimitiveClassDesc() throws ReflectiveOperationException { + for (Primitives p : Primitives.values()) { + List descs = List.of(ClassDesc.ofDescriptor(p.descriptor), + p.classDesc, + (ClassDesc) p.clazz.describeConstable().orElseThrow()); + for (ClassDesc c : descs) { + testClassDesc(c, p.clazz); + assertTrue(c.isPrimitive()); + assertEquals(p.descriptor, c.descriptorString()); + assertEquals(p.name, c.displayName()); + descs.forEach(cc -> assertEquals(c, cc)); + if (p != Primitives.VOID) { + testClassDesc(c.arrayType(), p.arrayClass); + assertEquals(c, ((ClassDesc) p.arrayClass.describeConstable().orElseThrow()).componentType()); + assertEquals(c, p.classDesc.arrayType().componentType()); + } + } + + for (Primitives other : Primitives.values()) { + ClassDesc otherDescr = ClassDesc.ofDescriptor(other.descriptor); + if (p != other) + descs.forEach(c -> assertNotEquals(c, otherDescr)); + else + descs.forEach(c -> assertEquals(c, otherDescr)); + } + } + } + + public void testSimpleClassDesc() throws ReflectiveOperationException { + + List stringClassDescs = Arrays.asList(ClassDesc.ofDescriptor("Ljava/lang/String;"), + ClassDesc.of("java.lang", "String"), + ClassDesc.of("java.lang.String"), + ClassDesc.of("java.lang.String").arrayType().componentType(), + String.class.describeConstable().orElseThrow()); + for (ClassDesc r : stringClassDescs) { + testClassDesc(r, String.class); + assertFalse(r.isPrimitive()); + assertEquals("Ljava/lang/String;", r.descriptorString()); + assertEquals("String", r.displayName()); + assertEquals(r.arrayType().resolveConstantDesc(LOOKUP), String[].class); + stringClassDescs.forEach(rr -> assertEquals(r, rr)); + } + + testClassDesc(ClassDesc.of("java.lang.String").arrayType(), String[].class); + testClassDesc(ClassDesc.of("java.util.Map").nested("Entry"), Map.Entry.class); + + ClassDesc thisClassDesc = ClassDesc.ofDescriptor("LClassDescTest;"); + assertEquals(thisClassDesc, ClassDesc.of("", "ClassDescTest")); + assertEquals(thisClassDesc, ClassDesc.of("ClassDescTest")); + assertEquals(thisClassDesc.displayName(), "ClassDescTest"); + testClassDesc(thisClassDesc, ClassDescTest.class); + } + + public void testPackageName() { + assertEquals("com.foo", ClassDesc.of("com.foo.Bar").packageName()); + assertEquals("com.foo", ClassDesc.of("com.foo.Bar").nested("Baz").packageName()); + assertEquals("", ClassDesc.of("Bar").packageName()); + assertEquals("", ClassDesc.of("Bar").nested("Baz").packageName()); + assertEquals("", ClassDesc.of("Bar").nested("Baz", "Foo").packageName()); + + assertEquals("", ConstantDescs.CD_int.packageName()); + assertEquals("", ConstantDescs.CD_int.arrayType().packageName()); + assertEquals("", ConstantDescs.CD_String.arrayType().packageName()); + assertEquals("", ClassDesc.of("Bar").arrayType().packageName()); + } + + private void testBadArrayRank(ClassDesc cr) { + try { + cr.arrayType(-1); + fail(""); + } catch (IllegalArgumentException e) { + // good + } + } + + public void testArrayClassDesc() throws ReflectiveOperationException { + for (String d : basicDescs) { + ClassDesc a0 = ClassDesc.ofDescriptor(d); + ClassDesc a1 = a0.arrayType(); + ClassDesc a2 = a1.arrayType(); + + testClassDesc(a0); + testClassDesc(a1); + testClassDesc(a2); + assertFalse(a0.isArray()); + assertTrue(a1.isArray()); + assertTrue(a2.isArray()); + assertFalse(a1.isPrimitive()); + assertFalse(a2.isPrimitive()); + assertEquals(a0.descriptorString(), d); + assertEquals(a1.descriptorString(), "[" + a0.descriptorString()); + assertEquals(a2.descriptorString(), "[[" + a0.descriptorString()); + + assertNull(a0.componentType()); + assertEquals(a0, a1.componentType()); + assertEquals(a1, a2.componentType()); + + assertNotEquals(a0, a1); + assertNotEquals(a1, a2); + + assertEquals(a1, ClassDesc.ofDescriptor("[" + d)); + assertEquals(a2, ClassDesc.ofDescriptor("[[" + d)); + assertEquals(classToDescriptor((Class) a0.resolveConstantDesc(LOOKUP)), a0.descriptorString()); + assertEquals(classToDescriptor((Class) a1.resolveConstantDesc(LOOKUP)), a1.descriptorString()); + assertEquals(classToDescriptor((Class) a2.resolveConstantDesc(LOOKUP)), a2.descriptorString()); + + testBadArrayRank(ConstantDescs.CD_int); + testBadArrayRank(ConstantDescs.CD_String); + testBadArrayRank(ClassDesc.of("Bar")); + } + } + + public void testBadClassDescs() { + List badDescriptors = List.of("II", "I;", "Q", "L", + "java.lang.String", "[]", "Ljava/lang/String", + "Ljava.lang.String;", "java/lang/String"); + + for (String d : badDescriptors) { + try { + ClassDesc constant = ClassDesc.ofDescriptor(d); + fail(d); + } + catch (IllegalArgumentException e) { + // good + } + } + + List badBinaryNames = List.of("I;", "[]", "Ljava/lang/String", + "Ljava.lang.String;", "java/lang/String"); + for (String d : badBinaryNames) { + try { + ClassDesc constant = ClassDesc.of(d); + fail(d); + } catch (IllegalArgumentException e) { + // good + } + } + + for (Primitives p : Primitives.values()) { + testBadNestedClasses(ClassDesc.ofDescriptor(p.descriptor), "any"); + testBadNestedClasses(ClassDesc.ofDescriptor(p.descriptor), "any", "other"); + } + } + + private void testBadNestedClasses(ClassDesc cr, String firstNestedName, String... moreNestedNames) { + try { + cr.nested(firstNestedName, moreNestedNames); + fail(""); + } catch (IllegalStateException e) { + // good + } + } + + public void testLangClasses() { + Double d = 1.0; + assertEquals(d.resolveConstantDesc(LOOKUP), d); + assertEquals(d.describeConstable().get(), d); + + Integer i = 1; + assertEquals(i.resolveConstantDesc(LOOKUP), i); + assertEquals(i.describeConstable().get(), i); + + Float f = 1.0f; + assertEquals(f.resolveConstantDesc(LOOKUP), f); + assertEquals(f.describeConstable().get(), f); + + Long l = 1L; + assertEquals(l.resolveConstantDesc(LOOKUP), l); + assertEquals(l.describeConstable().get(), l); + + String s = ""; + assertEquals(s.resolveConstantDesc(LOOKUP), s); + assertEquals(s.describeConstable().get(), s); + } +} diff --git a/test/jdk/java/lang/constant/CondyDescTest.java b/test/jdk/java/lang/constant/CondyDescTest.java new file mode 100644 index 00000000000..2fad740d565 --- /dev/null +++ b/test/jdk/java/lang/constant/CondyDescTest.java @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.Enum.EnumDesc; +import java.lang.constant.MethodTypeDesc; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.lang.invoke.VarHandle.VarHandleDesc; +import java.lang.constant.ClassDesc; +import java.lang.constant.ConstantDesc; +import java.lang.constant.ConstantDescs; +import java.lang.constant.DirectMethodHandleDesc; +import java.lang.constant.DynamicConstantDesc; +import java.lang.constant.MethodHandleDesc; + +import org.testng.annotations.Test; + +import static java.lang.constant.ConstantDescs.CD_MethodHandle; +import static java.lang.constant.ConstantDescs.CD_Object; +import static java.lang.constant.ConstantDescs.CD_String; +import static java.lang.constant.ConstantDescs.CD_VarHandle; +import static java.lang.constant.ConstantDescs.CD_int; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertNotSame; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertSame; +import static org.testng.Assert.assertTrue; + +/** + * @test + * @compile CondyDescTest.java + * @run testng CondyDescTest + * @summary unit tests for java.lang.constant.CondyDescTest + */ +@Test +public class CondyDescTest extends SymbolicDescTest { + private final static ConstantDesc[] EMPTY_ARGS = new ConstantDesc[0]; + private final static ClassDesc CD_ConstantBootstraps = ClassDesc.of("java.lang.invoke.ConstantBootstraps"); + + private static void testDCR(DynamicConstantDesc r, T c) throws ReflectiveOperationException { + assertEquals(r, DynamicConstantDesc.ofNamed(r.bootstrapMethod(), r.constantName(), r.constantType(), r.bootstrapArgs())); + assertEquals(r.resolveConstantDesc(LOOKUP), c); + } + + private void testVarHandleDesc(DynamicConstantDesc r, VarHandle vh) throws ReflectiveOperationException { + testSymbolicDesc(r); + assertEquals(r.resolveConstantDesc(LOOKUP), vh); + assertEquals(vh.describeConstable().orElseThrow(), r); + } + + private static> void testEnumDesc(EnumDesc r, E e) throws ReflectiveOperationException { + testSymbolicDesc(r); + + assertEquals(r, EnumDesc.of(r.constantType(), r.constantName())); + assertEquals(r.resolveConstantDesc(LOOKUP), e); + } + + public void testNullConstant() throws ReflectiveOperationException { + DynamicConstantDesc r = (DynamicConstantDesc) ConstantDescs.NULL; + assertEquals(r, DynamicConstantDesc.ofNamed(r.bootstrapMethod(), r.constantName(), r.constantType(), r.bootstrapArgs())); + assertNull(r.resolveConstantDesc(LOOKUP)); + } + + static String concatBSM(MethodHandles.Lookup lookup, String name, Class type, String a, String b) { + return a + b; + } + + public void testDynamicConstant() throws ReflectiveOperationException { + DirectMethodHandleDesc bsmDesc = ConstantDescs.ofConstantBootstrap(ClassDesc.of("CondyDescTest"), "concatBSM", + CD_String, CD_String, CD_String); + DynamicConstantDesc r = DynamicConstantDesc.of(bsmDesc, "foo", "bar"); + testDCR(r, "foobar"); + } + + public void testNested() throws Throwable { + DirectMethodHandleDesc invoker = ConstantDescs.ofConstantBootstrap(CD_ConstantBootstraps, "invoke", CD_Object, CD_MethodHandle, CD_Object.arrayType()); + DirectMethodHandleDesc format = MethodHandleDesc.ofMethod(DirectMethodHandleDesc.Kind.STATIC, CD_String, "format", + MethodTypeDesc.of(CD_String, CD_String, CD_Object.arrayType())); + + String s = (String) ((MethodHandle) invoker.resolveConstantDesc(LOOKUP)) + .invoke(LOOKUP, "", String.class, + format.resolveConstantDesc(LOOKUP), "%s%s", "moo", "cow"); + assertEquals(s, "moocow"); + + DynamicConstantDesc desc = DynamicConstantDesc.of(invoker, format, "%s%s", "moo", "cow"); + testDCR(desc, "moocow"); + + DynamicConstantDesc desc2 = DynamicConstantDesc.of(invoker, format, "%s%s", desc, "cow"); + testDCR(desc2, "moocowcow"); + } + + enum MyEnum { A, B, C } + + public void testEnumDesc() throws ReflectiveOperationException { + ClassDesc enumClass = ClassDesc.of("CondyDescTest").nested("MyEnum"); + + testEnumDesc(EnumDesc.of(enumClass, "A"), MyEnum.A); + testEnumDesc(EnumDesc.of(enumClass, "B"), MyEnum.B); + testEnumDesc(EnumDesc.of(enumClass, "C"), MyEnum.C); + + DynamicConstantDesc denum = DynamicConstantDesc.ofNamed(ConstantDescs.BSM_ENUM_CONSTANT, "A", enumClass, EMPTY_ARGS); + assertEquals(MyEnum.A, denum.resolveConstantDesc(LOOKUP)); + + EnumDesc enumDesc = (EnumDesc)DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_ENUM_CONSTANT, "A", enumClass, EMPTY_ARGS); + assertEquals(MyEnum.A, enumDesc.resolveConstantDesc(LOOKUP)); + } + + static class MyClass { + static int sf; + int f; + } + + public void testVarHandles() throws ReflectiveOperationException { + ClassDesc testClass = ClassDesc.of("CondyDescTest").nested("MyClass"); + MyClass instance = new MyClass(); + + // static varHandle + VarHandleDesc vhc = VarHandleDesc.ofStaticField(testClass, "sf", CD_int); + VarHandle varHandle = LOOKUP.findStaticVarHandle(MyClass.class, "sf", int.class); + testVarHandleDesc(vhc, varHandle); + + assertEquals(varHandle.varType(), int.class); + varHandle.set(8); + assertEquals(8, (int) varHandle.get()); + assertEquals(MyClass.sf, 8); + + // static varHandle + vhc = VarHandleDesc.ofField(testClass, "f", CD_int); + varHandle = LOOKUP.findVarHandle(MyClass.class, "f", int.class); + testVarHandleDesc(vhc, varHandle); + + assertEquals(varHandle.varType(), int.class); + varHandle.set(instance, 9); + assertEquals(9, (int) varHandle.get(instance)); + assertEquals(instance.f, 9); + + vhc = VarHandleDesc.ofArray(CD_int.arrayType()); + varHandle = MethodHandles.arrayElementVarHandle(int[].class); + testVarHandleDesc(vhc, varHandle); + + int[] ints = new int[3]; + varHandle.set(ints, 0, 1); + varHandle.set(ints, 1, 2); + varHandle.set(ints, 2, 3); + + assertEquals(1, varHandle.get(ints, 0)); + assertEquals(2, varHandle.get(ints, 1)); + assertEquals(3, varHandle.get(ints, 2)); + assertEquals(1, ints[0]); + assertEquals(2, ints[1]); + assertEquals(3, ints[2]); + + // static var handle obtained using the DynamicConstantDesc + DynamicConstantDesc dcd = DynamicConstantDesc.ofNamed(ConstantDescs.BSM_VARHANDLE_STATIC_FIELD, "sf", CD_VarHandle, new ConstantDesc[] {testClass, CD_int }); + VarHandle vh = dcd.resolveConstantDesc(LOOKUP); + testVarHandleDesc(dcd, vh); + + VarHandleDesc vhd = (VarHandleDesc) DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_VARHANDLE_STATIC_FIELD, "sf", CD_VarHandle, new ConstantDesc[] {testClass, CD_int }); + vh = vhd.resolveConstantDesc(LOOKUP); + testVarHandleDesc(vhd, vh); + + dcd = DynamicConstantDesc.ofNamed(ConstantDescs.BSM_VARHANDLE_FIELD, "f", CD_VarHandle, new ConstantDesc[] {testClass, CD_int }); + vh = dcd.resolveConstantDesc(LOOKUP); + testVarHandleDesc(dcd, vh); + + vhd = (VarHandleDesc) DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_VARHANDLE_FIELD, "f", CD_VarHandle, new ConstantDesc[] {testClass, CD_int }); + vh = vhd.resolveConstantDesc(LOOKUP); + testVarHandleDesc(vhd, vh); + + dcd = DynamicConstantDesc.ofNamed(ConstantDescs.BSM_VARHANDLE_ARRAY, "_", CD_VarHandle, new ConstantDesc[] {CD_int.arrayType() }); + vh = dcd.resolveConstantDesc(LOOKUP); + testVarHandleDesc(dcd, vh); + + vhd = (VarHandleDesc)DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_VARHANDLE_ARRAY, "_", CD_VarHandle, new ConstantDesc[] {CD_int.arrayType() }); + vh = vhd.resolveConstantDesc(LOOKUP); + testVarHandleDesc(vhd, vh); + } + + private void assertLifted(ConstantDesc prototype, + DynamicConstantDesc nonCanonical, + ConstantDesc canonical) { + Class clazz = prototype.getClass(); + + assertNotSame(canonical, nonCanonical); + assertTrue(clazz.isAssignableFrom(canonical.getClass())); + assertFalse(clazz.isAssignableFrom(nonCanonical.getClass())); + assertEquals(prototype, canonical); + assertEquals(canonical, prototype); + if (prototype instanceof DynamicConstantDesc) { + assertEquals(canonical, nonCanonical); + assertEquals(nonCanonical, canonical); + assertEquals(prototype, nonCanonical); + assertEquals(nonCanonical, prototype); + } + } + + public void testLifting() { + DynamicConstantDesc unliftedNull = DynamicConstantDesc.ofNamed(ConstantDescs.BSM_NULL_CONSTANT, "_", CD_Object, EMPTY_ARGS); + assertEquals(ConstantDescs.NULL, unliftedNull); + assertNotSame(ConstantDescs.NULL, unliftedNull); + assertSame(ConstantDescs.NULL, DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_NULL_CONSTANT, "_", CD_Object, EMPTY_ARGS)); + assertSame(ConstantDescs.NULL, DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_NULL_CONSTANT, "_", CD_String, EMPTY_ARGS)); + assertSame(ConstantDescs.NULL, DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_NULL_CONSTANT, "wahoo", CD_Object, EMPTY_ARGS)); + + assertLifted(CD_int, + DynamicConstantDesc.ofNamed(ConstantDescs.BSM_PRIMITIVE_CLASS, "I", ConstantDescs.CD_Class, EMPTY_ARGS), + DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_PRIMITIVE_CLASS, "I", ConstantDescs.CD_Class, EMPTY_ARGS)); + + ClassDesc enumClass = ClassDesc.of("CondyDescTest").nested("MyEnum"); + assertLifted(EnumDesc.of(enumClass, "A"), + DynamicConstantDesc.ofNamed(ConstantDescs.BSM_ENUM_CONSTANT, "A", enumClass, EMPTY_ARGS), + DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_ENUM_CONSTANT, "A", enumClass, EMPTY_ARGS)); + + + ClassDesc testClass = ClassDesc.of("CondyDescTest").nested("MyClass"); + + assertLifted(VarHandleDesc.ofStaticField(testClass, "sf", CD_int), + DynamicConstantDesc.ofNamed(ConstantDescs.BSM_VARHANDLE_STATIC_FIELD, "sf", CD_VarHandle, new ConstantDesc[] {testClass, CD_int }), + DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_VARHANDLE_STATIC_FIELD, "sf", CD_VarHandle, new ConstantDesc[] {testClass, CD_int })); + assertLifted(VarHandleDesc.ofField(testClass, "f", CD_int), + DynamicConstantDesc.ofNamed(ConstantDescs.BSM_VARHANDLE_FIELD, "f", CD_VarHandle, new ConstantDesc[] {testClass, CD_int }), + DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_VARHANDLE_FIELD, "f", CD_VarHandle, new ConstantDesc[] {testClass, CD_int })); + + assertLifted(VarHandleDesc.ofArray(CD_int.arrayType()), + DynamicConstantDesc.ofNamed(ConstantDescs.BSM_VARHANDLE_ARRAY, "_", CD_VarHandle, new ConstantDesc[] {CD_int.arrayType() }), + DynamicConstantDesc.ofCanonical(ConstantDescs.BSM_VARHANDLE_ARRAY, "_", CD_VarHandle, new ConstantDesc[] {CD_int.arrayType() })); + } +} diff --git a/test/jdk/java/lang/constant/IndyDescTest.java b/test/jdk/java/lang/constant/IndyDescTest.java new file mode 100644 index 00000000000..13862fecd0b --- /dev/null +++ b/test/jdk/java/lang/constant/IndyDescTest.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.invoke.CallSite; +import java.lang.invoke.ConstantCallSite; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.constant.ClassDesc; +import java.lang.constant.DirectMethodHandleDesc; +import java.lang.constant.DynamicCallSiteDesc; +import java.lang.constant.MethodHandleDesc; +import java.lang.constant.MethodTypeDesc; + +import org.testng.annotations.Test; + +import static java.lang.constant.ConstantDescs.*; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotEquals; + +/** + * @test + * @compile IndyDescTest.java + * @run testng IndyDescTest + * @summary unit tests for java.lang.constant.IndyDescTest + */ +@Test +public class IndyDescTest { + public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type, + Object... args) { + if (args.length == 0) + return new ConstantCallSite(MethodHandles.constant(String.class, "Foo")); + else + return new ConstantCallSite(MethodHandles.constant(String.class, (String) args[0])); + } + + public void testIndyDesc() throws Throwable { + ClassDesc c = ClassDesc.of("IndyDescTest"); + MethodTypeDesc mt = MethodTypeDesc.of(CD_CallSite, CD_MethodHandles_Lookup, CD_String, CD_MethodType, CD_Object.arrayType()); + DirectMethodHandleDesc mh = MethodHandleDesc.ofMethod(DirectMethodHandleDesc.Kind.STATIC, c, "bootstrap", mt); + DynamicCallSiteDesc csd = DynamicCallSiteDesc.of(mh, "wooga", MethodTypeDesc.of(CD_String)); + CallSite cs = csd.resolveCallSiteDesc(MethodHandles.lookup()); + MethodHandle target = cs.getTarget(); + assertEquals("Foo", target.invoke()); + assertEquals("wooga", csd.invocationName()); + + mh = ofCallsiteBootstrap(c, "bootstrap", CD_CallSite, CD_Object.arrayType()); + csd = DynamicCallSiteDesc.of(mh, "wooga", MethodTypeDesc.of(CD_String)); + cs = csd.resolveCallSiteDesc(MethodHandles.lookup()); + target = cs.getTarget(); + assertEquals("Foo", target.invoke()); + assertEquals("wooga", csd.invocationName()); + + DynamicCallSiteDesc csd2 = DynamicCallSiteDesc.of(mh, "foo", MethodTypeDesc.of(CD_String), "Bar"); + CallSite cs2 = csd2.resolveCallSiteDesc(MethodHandles.lookup()); + MethodHandle target2 = cs2.getTarget(); + assertEquals("Bar", target2.invoke()); + assertEquals("foo", csd2.invocationName()); + + DynamicCallSiteDesc csd3 = DynamicCallSiteDesc.of(mh, MethodTypeDesc.of(CD_String)); + CallSite cs3 = csd.resolveCallSiteDesc(MethodHandles.lookup()); + MethodHandle target3 = cs3.getTarget(); + assertEquals("Foo", target3.invoke()); + assertEquals("_", csd3.invocationName()); + + DynamicCallSiteDesc csd4 = DynamicCallSiteDesc.of(mh, "foo", MethodTypeDesc.of(CD_String)).withArgs("Bar"); + CallSite cs4 = csd4.resolveCallSiteDesc(MethodHandles.lookup()); + MethodHandle target4 = cs4.getTarget(); + assertEquals("Bar", target4.invoke()); + + DynamicCallSiteDesc csd5 = DynamicCallSiteDesc.of(mh, MethodTypeDesc.of(CD_String, CD_String)) + .withNameAndType("foo", MethodTypeDesc.of(CD_String)).withArgs("Bar"); + CallSite cs5 = csd5.resolveCallSiteDesc(MethodHandles.lookup()); + MethodHandle target5 = cs5.getTarget(); + assertEquals("Bar", target5.invoke()); + assertEquals("foo", csd5.invocationName()); + } + + public void testEqualsHashToString() throws Throwable { + ClassDesc c = ClassDesc.of("IndyDescTest"); + MethodTypeDesc mt = MethodTypeDesc.of(CD_CallSite, CD_MethodHandles_Lookup, CD_String, CD_MethodType, CD_Object.arrayType()); + DirectMethodHandleDesc mh = MethodHandleDesc.ofMethod(DirectMethodHandleDesc.Kind.STATIC, c, "bootstrap", mt); + + DynamicCallSiteDesc csd1 = DynamicCallSiteDesc.of(mh, "wooga", MethodTypeDesc.of(CD_String)); + DynamicCallSiteDesc csd2 = DynamicCallSiteDesc.of(mh, "wooga", MethodTypeDesc.of(CD_String)); + DynamicCallSiteDesc csd3 = DynamicCallSiteDesc.of(mh, "foo", MethodTypeDesc.of(CD_String)); + assertEquals(csd1, csd2); + assertEquals(csd1.hashCode(), csd2.hashCode()); + assertNotEquals(csd1, csd3); + assertNotEquals(csd1.hashCode(), csd3.hashCode()); + + assertEquals(csd1.toString(), "DynamicCallSiteDesc[IndyDescTest::bootstrap(wooga/):()String]"); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testEmptyInvocationName() throws Throwable { + ClassDesc c = ClassDesc.of("IndyDescTest"); + MethodTypeDesc mt = MethodTypeDesc.of(CD_CallSite, CD_MethodHandles_Lookup, CD_String, CD_MethodType, CD_Object.arrayType()); + DirectMethodHandleDesc mh = MethodHandleDesc.ofMethod(DirectMethodHandleDesc.Kind.STATIC, c, "bootstrap", mt); + DynamicCallSiteDesc csd1 = DynamicCallSiteDesc.of(mh, "", MethodTypeDesc.of(CD_String)); + } +} diff --git a/test/jdk/java/lang/constant/MethodHandleDescTest.java b/test/jdk/java/lang/constant/MethodHandleDescTest.java new file mode 100644 index 00000000000..c6a4be5297e --- /dev/null +++ b/test/jdk/java/lang/constant/MethodHandleDescTest.java @@ -0,0 +1,340 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandleInfo; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.invoke.WrongMethodTypeException; +import java.lang.constant.ClassDesc; +import java.lang.constant.ConstantDescs; +import java.lang.constant.DirectMethodHandleDesc; +import java.lang.constant.MethodHandleDesc; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.lang.constant.MethodTypeDesc; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import org.testng.annotations.Test; + +import static java.lang.constant.ConstantDescs.CD_Void; +import static java.lang.constant.ConstantDescs.CD_boolean; +import static java.lang.constant.DirectMethodHandleDesc.*; +import static java.lang.constant.DirectMethodHandleDesc.Kind.GETTER; +import static java.lang.constant.DirectMethodHandleDesc.Kind.SETTER; +import static java.lang.constant.DirectMethodHandleDesc.Kind.STATIC_GETTER; +import static java.lang.constant.DirectMethodHandleDesc.Kind.STATIC_SETTER; +import static java.lang.constant.DirectMethodHandleDesc.Kind.VIRTUAL; +import static java.lang.constant.ConstantDescs.CD_Integer; +import static java.lang.constant.ConstantDescs.CD_List; +import static java.lang.constant.ConstantDescs.CD_Object; +import static java.lang.constant.ConstantDescs.CD_String; +import static java.lang.constant.ConstantDescs.CD_int; +import static java.lang.constant.ConstantDescs.CD_void; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotSame; +import static org.testng.Assert.assertSame; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.fail; + +/** + * @test + * @compile MethodHandleDescTest.java + * @run testng MethodHandleDescTest + * @summary unit tests for java.lang.constant.MethodHandleDesc + */ +@Test +public class MethodHandleDescTest extends SymbolicDescTest { + private static ClassDesc helperHolderClass = ClassDesc.of("TestHelpers"); + private static ClassDesc testClass = helperHolderClass.nested("TestClass"); + private static ClassDesc testInterface = helperHolderClass.nested("TestInterface"); + private static ClassDesc testSuperclass = helperHolderClass.nested("TestSuperclass"); + + + private static void assertMHEquals(MethodHandle a, MethodHandle b) { + MethodHandleInfo ia = LOOKUP.revealDirect(a); + MethodHandleInfo ib = LOOKUP.revealDirect(b); + assertEquals(ia.getDeclaringClass(), ib.getDeclaringClass()); + assertEquals(ia.getName(), ib.getName()); + assertEquals(ia.getMethodType(), ib.getMethodType()); + assertEquals(ia.getReferenceKind(), ib.getReferenceKind()); + } + + private void testMethodHandleDesc(MethodHandleDesc r) throws ReflectiveOperationException { + if (r instanceof DirectMethodHandleDesc) { + testSymbolicDesc(r); + + DirectMethodHandleDesc rr = (DirectMethodHandleDesc) r; + assertEquals(r, MethodHandleDesc.of(rr.kind(), rr.owner(), rr.methodName(), rr.lookupDescriptor())); + assertEquals(r.invocationType().resolveConstantDesc(LOOKUP), ((MethodHandle) r.resolveConstantDesc(LOOKUP)).type()); + } + else { + testSymbolicDescForwardOnly(r); + } + } + + private String lookupDescriptor(DirectMethodHandleDesc rr) { + switch (rr.kind()) { + case VIRTUAL: + case SPECIAL: + case INTERFACE_VIRTUAL: + case INTERFACE_SPECIAL: + return rr.invocationType().dropParameterTypes(0, 1).descriptorString(); + case CONSTRUCTOR: + return rr.invocationType().changeReturnType(CD_void).descriptorString(); + default: + return rr.invocationType().descriptorString(); + } + } + + private void testMethodHandleDesc(MethodHandleDesc r, MethodHandle mh) throws ReflectiveOperationException { + testMethodHandleDesc(r); + + assertMHEquals(((MethodHandle) r.resolveConstantDesc(LOOKUP)), mh); + assertEquals(mh.describeConstable().orElseThrow(), r); + + // compare extractable properties: refKind, owner, name, type + MethodHandleInfo mhi = LOOKUP.revealDirect(mh); + DirectMethodHandleDesc rr = (DirectMethodHandleDesc) r; + assertEquals(mhi.getDeclaringClass().descriptorString(), rr.owner().descriptorString()); + assertEquals(mhi.getName(), rr.methodName()); + assertEquals(mhi.getReferenceKind(), rr.kind().refKind); + MethodType type = mhi.getMethodType(); + assertEquals(type.toMethodDescriptorString(), lookupDescriptor(rr)); + } + + public void testSimpleMHs() throws ReflectiveOperationException { + MethodHandle MH_String_isEmpty = LOOKUP.findVirtual(String.class, "isEmpty", MethodType.fromMethodDescriptorString("()Z", null)); + testMethodHandleDesc(MethodHandleDesc.of(Kind.VIRTUAL, CD_String, "isEmpty", "()Z"), MH_String_isEmpty); + testMethodHandleDesc(MethodHandleDesc.ofMethod(Kind.VIRTUAL, CD_String, "isEmpty", MethodTypeDesc.of(CD_boolean)), MH_String_isEmpty); + + MethodHandle MH_List_isEmpty = LOOKUP.findVirtual(List.class, "isEmpty", MethodType.fromMethodDescriptorString("()Z", null)); + testMethodHandleDesc(MethodHandleDesc.of(Kind.INTERFACE_VIRTUAL, CD_List, "isEmpty", "()Z"), MH_List_isEmpty); + testMethodHandleDesc(MethodHandleDesc.ofMethod(Kind.INTERFACE_VIRTUAL, CD_List, "isEmpty", MethodTypeDesc.of(CD_boolean)), MH_List_isEmpty); + + MethodHandle MH_String_format = LOOKUP.findStatic(String.class, "format", MethodType.methodType(String.class, String.class, Object[].class)); + testMethodHandleDesc(MethodHandleDesc.of(Kind.STATIC, CD_String, "format", MethodType.methodType(String.class, String.class, Object[].class).descriptorString()), + MH_String_format); + testMethodHandleDesc(MethodHandleDesc.ofMethod(Kind.STATIC, CD_String, "format", MethodTypeDesc.of(CD_String, CD_String, CD_Object.arrayType())), + MH_String_format); + + MethodHandle MH_ArrayList_new = LOOKUP.findConstructor(ArrayList.class, MethodType.methodType(void.class)); + testMethodHandleDesc(MethodHandleDesc.ofMethod(Kind.CONSTRUCTOR, ClassDesc.of("java.util.ArrayList"), "", MethodTypeDesc.of(CD_void)), + MH_ArrayList_new); + testMethodHandleDesc(MethodHandleDesc.ofConstructor(ClassDesc.of("java.util.ArrayList")), MH_ArrayList_new); + + // bad constructor non void return type + try { + MethodHandleDesc.of(Kind.CONSTRUCTOR, ClassDesc.of("java.util.ArrayList"), "", "()I"); + fail("should have failed: non void return type for constructor"); + } catch (IllegalArgumentException ex) { + // good + } + } + + public void testAsType() throws Throwable { + MethodHandleDesc mhr = MethodHandleDesc.ofMethod(Kind.STATIC, ClassDesc.of("java.lang.Integer"), "valueOf", + MethodTypeDesc.of(CD_Integer, CD_int)); + MethodHandleDesc takesInteger = mhr.asType(MethodTypeDesc.of(CD_Integer, CD_Integer)); + testMethodHandleDesc(takesInteger); + MethodHandle mh1 = (MethodHandle) takesInteger.resolveConstantDesc(LOOKUP); + assertEquals((Integer) 3, (Integer) mh1.invokeExact((Integer) 3)); + assertEquals(takesInteger.toString(), "MethodHandleDesc[STATIC/Integer::valueOf(int)Integer].asType(Integer)Integer"); + + try { + Integer i = (Integer) mh1.invokeExact(3); + fail("Expected WMTE"); + } + catch (WrongMethodTypeException ignored) { } + + MethodHandleDesc takesInt = takesInteger.asType(MethodTypeDesc.of(CD_Integer, CD_int)); + testMethodHandleDesc(takesInt); + MethodHandle mh2 = (MethodHandle) takesInt.resolveConstantDesc(LOOKUP); + assertEquals((Integer) 3, (Integer) mh2.invokeExact(3)); + + try { + Integer i = (Integer) mh2.invokeExact((Integer) 3); + fail("Expected WMTE"); + } + catch (WrongMethodTypeException ignored) { } + + // Short circuit optimization + MethodHandleDesc same = mhr.asType(mhr.invocationType()); + assertSame(mhr, same); + + // @@@ Test varargs adaptation + // @@@ Test bad adaptations and assert runtime error on resolution + // @@@ Test intrinsification of adapted MH + } + + public void testMethodHandleDesc() throws Throwable { + MethodHandleDesc ctorDesc = MethodHandleDesc.of(Kind.CONSTRUCTOR, testClass, "", "()V"); + MethodHandleDesc staticMethodDesc = MethodHandleDesc.of(Kind.STATIC, testClass, "sm", "(I)I"); + MethodHandleDesc staticIMethodDesc = MethodHandleDesc.of(Kind.INTERFACE_STATIC, testInterface, "sm", "(I)I"); + MethodHandleDesc instanceMethodDesc = MethodHandleDesc.of(Kind.VIRTUAL, testClass, "m", "(I)I"); + MethodHandleDesc instanceIMethodDesc = MethodHandleDesc.of(Kind.INTERFACE_VIRTUAL, testInterface, "m", "(I)I"); + MethodHandleDesc superMethodDesc = MethodHandleDesc.of(Kind.SPECIAL, testSuperclass, "m", "(I)I"); + MethodHandleDesc superIMethodDesc = MethodHandleDesc.of(Kind.INTERFACE_SPECIAL, testInterface, "m", "(I)I"); + MethodHandleDesc privateMethodDesc = MethodHandleDesc.of(Kind.SPECIAL, testClass, "pm", "(I)I"); + MethodHandleDesc privateIMethodDesc = MethodHandleDesc.of(Kind.INTERFACE_SPECIAL, testInterface, "pm", "(I)I"); + MethodHandleDesc privateStaticMethodDesc = MethodHandleDesc.of(Kind.STATIC, testClass, "psm", "(I)I"); + MethodHandleDesc privateStaticIMethodDesc = MethodHandleDesc.of(Kind.INTERFACE_STATIC, testInterface, "psm", "(I)I"); + + assertEquals(ctorDesc.invocationType(), MethodTypeDesc.of(testClass)); + assertEquals(((DirectMethodHandleDesc) ctorDesc).lookupDescriptor(), "()V"); + + assertEquals(staticMethodDesc.invocationType().descriptorString(), "(I)I"); + assertEquals(((DirectMethodHandleDesc) staticMethodDesc).lookupDescriptor(), "(I)I"); + + assertEquals(instanceMethodDesc.invocationType().descriptorString(), "(" + testClass.descriptorString() + "I)I"); + assertEquals(((DirectMethodHandleDesc) instanceMethodDesc).lookupDescriptor(), "(I)I"); + + for (MethodHandleDesc r : List.of(ctorDesc, staticMethodDesc, staticIMethodDesc, instanceMethodDesc, instanceIMethodDesc)) + testMethodHandleDesc(r); + + TestHelpers.TestClass instance = (TestHelpers.TestClass) ((MethodHandle)ctorDesc.resolveConstantDesc(LOOKUP)).invokeExact(); + TestHelpers.TestClass instance2 = (TestHelpers.TestClass) ((MethodHandle)ctorDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(); + TestHelpers.TestInterface instanceI = instance; + + assertNotSame(instance, instance2); + + assertEquals(5, (int) ((MethodHandle)staticMethodDesc.resolveConstantDesc(LOOKUP)).invokeExact(5)); + assertEquals(5, (int) ((MethodHandle)staticMethodDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(5)); + assertEquals(0, (int) ((MethodHandle)staticIMethodDesc.resolveConstantDesc(LOOKUP)).invokeExact(5)); + assertEquals(0, (int) ((MethodHandle)staticIMethodDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(5)); + + assertEquals(5, (int) ((MethodHandle)instanceMethodDesc.resolveConstantDesc(LOOKUP)).invokeExact(instance, 5)); + assertEquals(5, (int) ((MethodHandle)instanceMethodDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(instance, 5)); + assertEquals(5, (int) ((MethodHandle)instanceIMethodDesc.resolveConstantDesc(LOOKUP)).invokeExact(instanceI, 5)); + assertEquals(5, (int) ((MethodHandle)instanceIMethodDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(instanceI, 5)); + + try { superMethodDesc.resolveConstantDesc(LOOKUP); fail(); } + catch (IllegalAccessException e) { /* expected */ } + assertEquals(-1, (int) ((MethodHandle)superMethodDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(instance, 5)); + + try { superIMethodDesc.resolveConstantDesc(LOOKUP); fail(); } + catch (IllegalAccessException e) { /* expected */ } + assertEquals(0, (int) ((MethodHandle)superIMethodDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(instance, 5)); + + try { privateMethodDesc.resolveConstantDesc(LOOKUP); fail(); } + catch (IllegalAccessException e) { /* expected */ } + assertEquals(5, (int) ((MethodHandle)privateMethodDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(instance, 5)); + + try { privateIMethodDesc.resolveConstantDesc(LOOKUP); fail(); } + catch (IllegalAccessException e) { /* expected */ } + assertEquals(0, (int) ((MethodHandle)privateIMethodDesc.resolveConstantDesc(TestHelpers.TestInterface.LOOKUP)).invokeExact(instanceI, 5)); + assertEquals(0, (int) ((MethodHandle)privateIMethodDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invoke(instanceI, 5)); + + try { privateStaticMethodDesc.resolveConstantDesc(LOOKUP); fail(); } + catch (IllegalAccessException e) { /* expected */ } + assertEquals(5, (int) ((MethodHandle)privateStaticMethodDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(5)); + + try { privateStaticIMethodDesc.resolveConstantDesc(LOOKUP); fail(); } + catch (IllegalAccessException e) { /* expected */ } + assertEquals(0, (int) ((MethodHandle)privateStaticIMethodDesc.resolveConstantDesc(TestHelpers.TestInterface.LOOKUP)).invokeExact(5)); + assertEquals(0, (int) ((MethodHandle)privateStaticIMethodDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(5)); + + MethodHandleDesc staticSetterDesc = MethodHandleDesc.ofField(STATIC_SETTER, testClass, "sf", CD_int); + MethodHandleDesc staticGetterDesc = MethodHandleDesc.ofField(STATIC_GETTER, testClass, "sf", CD_int); + MethodHandleDesc staticGetterIDesc = MethodHandleDesc.ofField(STATIC_GETTER, testInterface, "sf", CD_int); + MethodHandleDesc setterDesc = MethodHandleDesc.ofField(SETTER, testClass, "f", CD_int); + MethodHandleDesc getterDesc = MethodHandleDesc.ofField(GETTER, testClass, "f", CD_int); + + for (MethodHandleDesc r : List.of(staticSetterDesc, staticGetterDesc, staticGetterIDesc, setterDesc, getterDesc)) + testMethodHandleDesc(r); + + ((MethodHandle)staticSetterDesc.resolveConstantDesc(LOOKUP)).invokeExact(6); assertEquals(TestHelpers.TestClass.sf, 6); + assertEquals(6, (int) ((MethodHandle)staticGetterDesc.resolveConstantDesc(LOOKUP)).invokeExact()); + assertEquals(6, (int) ((MethodHandle)staticGetterDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact()); + ((MethodHandle)staticSetterDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(7); assertEquals(TestHelpers.TestClass.sf, 7); + assertEquals(7, (int) ((MethodHandle)staticGetterDesc.resolveConstantDesc(LOOKUP)).invokeExact()); + assertEquals(7, (int) ((MethodHandle)staticGetterDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact()); + + assertEquals(3, (int) ((MethodHandle)staticGetterIDesc.resolveConstantDesc(LOOKUP)).invokeExact()); + assertEquals(3, (int) ((MethodHandle)staticGetterIDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact()); + + ((MethodHandle)setterDesc.resolveConstantDesc(LOOKUP)).invokeExact(instance, 6); assertEquals(instance.f, 6); + assertEquals(6, (int) ((MethodHandle)getterDesc.resolveConstantDesc(LOOKUP)).invokeExact(instance)); + assertEquals(6, (int) ((MethodHandle)getterDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(instance)); + ((MethodHandle)setterDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(instance, 7); assertEquals(instance.f, 7); + assertEquals(7, (int) ((MethodHandle)getterDesc.resolveConstantDesc(LOOKUP)).invokeExact(instance)); + assertEquals(7, (int) ((MethodHandle)getterDesc.resolveConstantDesc(TestHelpers.TestClass.LOOKUP)).invokeExact(instance)); + } + + private void assertBadArgs(Supplier supplier, String s) { + try { + MethodHandleDesc r = supplier.get(); + fail("Expected failure for " + s); + } + catch (IllegalArgumentException e) { + // succeed + } + } + + public void testBadFieldMHs() { + List badGetterDescs = List.of("()V", "(Ljava/lang/Object;)V", "(I)I", "(Ljava/lang/Object;I)I"); + List badStaticGetterDescs = List.of("()V", "(Ljava/lang/Object;)I", "(I)I", "(Ljava/lang/Object;I)I"); + List badSetterDescs = List.of("()V", "(I)V", "(Ljava/lang/Object;)V", "(Ljava/lang/Object;I)I", "(Ljava/lang/Object;II)V"); + List badStaticSetterDescs = List.of("()V", "(II)V", "()I"); + + badGetterDescs.forEach(s -> assertBadArgs(() -> MethodHandleDesc.of(GETTER, helperHolderClass, "x", s), s)); + badSetterDescs.forEach(s -> assertBadArgs(() -> MethodHandleDesc.of(SETTER, helperHolderClass, "x", s), s)); + badStaticGetterDescs.forEach(s -> assertBadArgs(() -> MethodHandleDesc.of(STATIC_GETTER, helperHolderClass, "x", s), s)); + badStaticSetterDescs.forEach(s -> assertBadArgs(() -> MethodHandleDesc.of(STATIC_SETTER, helperHolderClass, "x", s), s)); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testBadOwners() { + MethodHandleDesc.ofMethod(VIRTUAL, ClassDesc.ofDescriptor("I"), "x", MethodTypeDesc.ofDescriptor("()I")); + } + + public void testSymbolicDescsConstants() throws ReflectiveOperationException { + int tested = 0; + Field[] fields = ConstantDescs.class.getDeclaredFields(); + for (Field f : fields) { + try { + if (f.getType().equals(DirectMethodHandleDesc.class) + && ((f.getModifiers() & Modifier.STATIC) != 0) + && ((f.getModifiers() & Modifier.PUBLIC) != 0)) { + MethodHandleDesc r = (MethodHandleDesc) f.get(null); + MethodHandle m = (MethodHandle)r.resolveConstantDesc(MethodHandles.lookup()); + testMethodHandleDesc(r, m); + ++tested; + } + } + catch (Throwable e) { + fail("Error testing field " + f.getName(), e); + } + } + + assertTrue(tested > 0); + } + + public void testKind() { + for (Kind k : Kind.values()) { + assertEquals(Kind.valueOf(k.refKind, k.isInterface), k); + } + } +} diff --git a/test/jdk/java/lang/constant/MethodTypeDescTest.java b/test/jdk/java/lang/constant/MethodTypeDescTest.java new file mode 100644 index 00000000000..d5205f33cb1 --- /dev/null +++ b/test/jdk/java/lang/constant/MethodTypeDescTest.java @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.invoke.MethodType; +import java.lang.constant.ClassDesc; +import java.lang.constant.MethodTypeDesc; +import java.util.Arrays; +import java.util.List; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.testng.annotations.Test; + +import static java.lang.constant.ConstantDescs.CD_int; +import static java.lang.constant.ConstantDescs.CD_void; +import static java.util.stream.Collectors.joining; +import static java.util.stream.Collectors.toList; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; + +/** + * @test + * @compile MethodTypeDescTest.java + * @run testng MethodTypeDescTest + * @summary unit tests for java.lang.constant.MethodTypeDesc + */ +@Test +public class MethodTypeDescTest extends SymbolicDescTest { + + private void testMethodTypeDesc(MethodTypeDesc r) throws ReflectiveOperationException { + testSymbolicDesc(r); + + // Tests accessors (rType, pType, pCount, pList, pArray, descriptorString), + // factories (ofDescriptor, of), equals + assertEquals(r, MethodTypeDesc.ofDescriptor(r.descriptorString())); + assertEquals(r, MethodTypeDesc.of(r.returnType(), r.parameterArray())); + assertEquals(r, MethodTypeDesc.of(r.returnType(), r.parameterList().toArray(new ClassDesc[0]))); + assertEquals(r, MethodTypeDesc.of(r.returnType(), r.parameterList().stream().toArray(ClassDesc[]::new))); + assertEquals(r, MethodTypeDesc.of(r.returnType(), IntStream.range(0, r.parameterCount()) + .mapToObj(r::parameterType) + .toArray(ClassDesc[]::new))); + } + + private void testMethodTypeDesc(MethodTypeDesc r, MethodType mt) throws ReflectiveOperationException { + testMethodTypeDesc(r); + + assertEquals(r.resolveConstantDesc(LOOKUP), mt); + assertEquals(mt.describeConstable().get(), r); + + assertEquals(r.descriptorString(), mt.toMethodDescriptorString()); + assertEquals(r.parameterCount(), mt.parameterCount()); + assertEquals(r.parameterList(), mt.parameterList().stream().map(SymbolicDescTest::classToDesc).collect(toList())); + assertEquals(r.parameterArray(), Stream.of(mt.parameterArray()).map(SymbolicDescTest::classToDesc).toArray(ClassDesc[]::new)); + for (int i=0; i)rc.resolveConstantDesc(LOOKUP))); + } + + // changeParamType + for (int i=0; i)pc.resolveConstantDesc(LOOKUP))); + } + } + + // dropParamType + for (int i=0; i j != k) + .mapToObj(j -> paramTypes[j]) + .toArray(ClassDesc[]::new); + MethodTypeDesc newDesc = mtDesc.dropParameterTypes(i, i + 1); + assertEquals(newDesc, MethodTypeDesc.of(returnType, ps)); + testMethodTypeDesc(newDesc, mt.dropParameterTypes(i, i+1)); + } + + badDropParametersTypes(CD_void, paramDescs); + + // addParam + for (int i=0; i <= paramTypes.length; i++) { + for (ClassDesc p : paramTypes) { + int k = i; + ClassDesc[] ps = IntStream.range(0, paramTypes.length + 1) + .mapToObj(j -> (j < k) ? paramTypes[j] : (j == k) ? p : paramTypes[j-1]) + .toArray(ClassDesc[]::new); + MethodTypeDesc newDesc = mtDesc.insertParameterTypes(i, p); + assertEquals(newDesc, MethodTypeDesc.of(returnType, ps)); + testMethodTypeDesc(newDesc, mt.insertParameterTypes(i, (Class)p.resolveConstantDesc(LOOKUP))); + } + } + + badInsertParametersTypes(CD_void, paramDescs); + } + + private void badInsertParametersTypes(ClassDesc returnType, String... paramDescTypes) { + ClassDesc[] paramTypes = + IntStream.rangeClosed(0, paramDescTypes.length - 1) + .mapToObj(i -> ClassDesc.ofDescriptor(paramDescTypes[i])).toArray(ClassDesc[]::new); + MethodTypeDesc mtDesc = MethodTypeDesc.of(returnType, paramTypes); + try { + MethodTypeDesc newDesc = mtDesc.insertParameterTypes(-1, paramTypes); + fail("pos < 0 should have failed"); + } catch (IndexOutOfBoundsException ex) { + // good + } + + try { + MethodTypeDesc newDesc = mtDesc.insertParameterTypes(paramTypes.length + 1, paramTypes); + fail("pos > current arguments length should have failed"); + } catch (IndexOutOfBoundsException ex) { + // good + } + } + + private void badDropParametersTypes(ClassDesc returnType, String... paramDescTypes) { + ClassDesc[] paramTypes = + IntStream.rangeClosed(0, paramDescTypes.length - 1) + .mapToObj(i -> ClassDesc.ofDescriptor(paramDescTypes[i])).toArray(ClassDesc[]::new); + MethodTypeDesc mtDesc = MethodTypeDesc.of(returnType, paramTypes); + try { + MethodTypeDesc newDesc = mtDesc.dropParameterTypes(-1, 0); + fail("start index < 0 should have failed"); + } catch (IndexOutOfBoundsException ex) { + // good + } + + try { + MethodTypeDesc newDesc = mtDesc.dropParameterTypes(paramTypes.length, 0); + fail("start index = arguments.length should have failed"); + } catch (IndexOutOfBoundsException ex) { + // good + } + + try { + MethodTypeDesc newDesc = mtDesc.dropParameterTypes(paramTypes.length + 1, 0); + fail("start index > arguments.length should have failed"); + } catch (IndexOutOfBoundsException ex) { + // good + } + + try { + MethodTypeDesc newDesc = mtDesc.dropParameterTypes(0, paramTypes.length + 1); + fail("end index > arguments.length should have failed"); + } catch (IndexOutOfBoundsException ex) { + // good + } + + try { + MethodTypeDesc newDesc = mtDesc.dropParameterTypes(1, 0); + fail("start index > end index should have failed"); + } catch (IllegalArgumentException ex) { + // good + } + } + + public void testMethodTypeDesc() throws ReflectiveOperationException { + for (String r : returnDescs) { + assertMethodType(ClassDesc.ofDescriptor(r)); + for (String p1 : paramDescs) { + assertMethodType(ClassDesc.ofDescriptor(r), ClassDesc.ofDescriptor(p1)); + for (String p2 : paramDescs) { + assertMethodType(ClassDesc.ofDescriptor(r), ClassDesc.ofDescriptor(p1), ClassDesc.ofDescriptor(p2)); + } + } + } + } + + public void testBadMethodTypeRefs() { + List badDescriptors = List.of("()II", "()I;", "(I;)", "(I)", "()L", "(V)V", + "(java.lang.String)V", "()[]", "(Ljava/lang/String)V", + "(Ljava.lang.String;)V", "(java/lang/String)V"); + + for (String d : badDescriptors) { + try { + MethodTypeDesc r = MethodTypeDesc.ofDescriptor(d); + fail(d); + } + catch (IllegalArgumentException e) { + // good + } + } + + // try with void arguments, this will stress another code path in particular + // ConstantMethodTypeDesc::init + try { + MethodTypeDesc r = MethodTypeDesc.of(CD_int, CD_void); + fail("can't reach here"); + } + catch (IllegalArgumentException e) { + // good + } + } +} diff --git a/test/jdk/java/lang/constant/NameValidationTest.java b/test/jdk/java/lang/constant/NameValidationTest.java new file mode 100644 index 00000000000..fae22c338bd --- /dev/null +++ b/test/jdk/java/lang/constant/NameValidationTest.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @compile NameValidationTest.java + * @run testng NameValidationTest + * @summary unit tests for verifying member names + */ + +import java.lang.constant.*; +import java.lang.invoke.*; + +import org.testng.annotations.Test; + +import static java.lang.constant.DirectMethodHandleDesc.*; +import static java.lang.constant.ConstantDescs.*; +import static java.lang.constant.DirectMethodHandleDesc.Kind.VIRTUAL; + +import static org.testng.Assert.fail; + +@Test +public class NameValidationTest { + + private static final String[] badMemberNames = new String[] {"xx.xx", "zz;zz", "[l", "aa/aa", ""}; + private static final String[] goodMemberNames = new String[] {"", "", "3", "~", "$", "qq"}; + + private static final String[] badClassNames = new String[] {"zz;zz", "[l", "aa/aa"}; + private static final String[] goodClassNames = new String[] {"3", "~", "$", "qq", ".", "a.a"}; + + public void testMemberNames() { + DirectMethodHandleDesc mh = MethodHandleDesc.of(Kind.VIRTUAL, CD_String, "isEmpty", "()Z"); + for (String badName : badMemberNames) { + try { + memberNamesHelper(badName, mh, CD_int, null); + fail("Expected failure for name " + badName); + } catch (IllegalArgumentException iae) { + // expected + } + try { + memberNamesHelper(badName, mh, CD_int, new ConstantDesc[0]); + fail("Expected failure for name " + badName); + } catch (IllegalArgumentException iae) { + // expected + } + } + + for (String badName : goodMemberNames) { + memberNamesHelper(badName, mh, CD_int, null); + memberNamesHelper(badName, mh, CD_int, new ConstantDesc[0]); + } + } + + private void memberNamesHelper(String constantName, + DirectMethodHandleDesc bootstrapMethod, + ClassDesc constantType, + ConstantDesc... bootstrapArgs) { + if (bootstrapArgs == null) { + DynamicConstantDesc.ofNamed(bootstrapMethod, constantName, constantType); + } else { + DynamicConstantDesc.ofNamed(bootstrapMethod, constantName, constantType, bootstrapArgs); + } + } + + public void testClassNames() { + for (String badName : badClassNames) { + try { + ClassDesc.of(badName); + fail("Expected failure for name " + badName); + } catch (IllegalArgumentException iae) { + // expected + } + } + + for (String goodName : goodClassNames) { + ClassDesc.of(goodName); + } + } +} diff --git a/test/jdk/java/lang/constant/SymbolicDescTest.java b/test/jdk/java/lang/constant/SymbolicDescTest.java new file mode 100644 index 00000000000..5eb0ca10da6 --- /dev/null +++ b/test/jdk/java/lang/constant/SymbolicDescTest.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.Class; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.constant.ClassDesc; +import java.lang.constant.Constable; +import java.lang.constant.ConstantDesc; +import java.lang.constant.ConstantDescs; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import static org.testng.Assert.assertEquals; + +/** + * Base class for XxxDesc tests + */ +public abstract class SymbolicDescTest { + + public static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + + static List someDescs = List.of("Ljava/lang/String;", "Ljava/util/List;"); + static String[] basicDescs = Stream.concat(Stream.of(Primitives.values()) + .filter(p -> p != Primitives.VOID) + .map(p -> p.descriptor), + someDescs.stream()) + .toArray(String[]::new); + static String[] paramDescs = Stream.of(basicDescs) + .flatMap(d -> Stream.of(d, "[" + d)) + .toArray(String[]::new); + static String[] returnDescs = Stream.concat(Stream.of(paramDescs), Stream.of("V")).toArray(String[]::new); + + enum Primitives { + INT("I", "int", int.class, int[].class, ConstantDescs.CD_int), + LONG("J", "long", long.class, long[].class, ConstantDescs.CD_long), + SHORT("S", "short", short.class, short[].class, ConstantDescs.CD_short), + BYTE("B", "byte", byte.class, byte[].class, ConstantDescs.CD_byte), + CHAR("C", "char", char.class, char[].class, ConstantDescs.CD_char), + FLOAT("F", "float", float.class, float[].class, ConstantDescs.CD_float), + DOUBLE("D", "double", double.class, double[].class, ConstantDescs.CD_double), + BOOLEAN("Z", "boolean", boolean.class, boolean[].class, ConstantDescs.CD_boolean), + VOID("V", "void", void.class, null, ConstantDescs.CD_void); + + public final String descriptor; + public final String name; + public final Class clazz; + public final Class arrayClass; + public final ClassDesc classDesc; + + Primitives(String descriptor, String name, Class clazz, Class arrayClass, ClassDesc desc) { + this.descriptor = descriptor; + this.name = name; + this.clazz = clazz; + this.arrayClass = arrayClass; + classDesc = desc; + } + } + + static String classToDescriptor(Class clazz) { + return MethodType.methodType(clazz).toMethodDescriptorString().substring(2); + } + + static ClassDesc classToDesc(Class c) { + return ClassDesc.ofDescriptor(c.descriptorString()); + } + + static void testSymbolicDesc(ConstantDesc desc) throws ReflectiveOperationException { + testSymbolicDesc(desc, false); + } + + static void testSymbolicDescForwardOnly(ConstantDesc desc) throws ReflectiveOperationException { + testSymbolicDesc(desc, true); + } + + private static void testSymbolicDesc(ConstantDesc desc, boolean forwardOnly) throws ReflectiveOperationException { + // Round trip sym -> resolve -> toSymbolicDesc + Constable constable = (Constable) desc.resolveConstantDesc(LOOKUP); + Optional described = constable.describeConstable(); + if (!forwardOnly) { + assertEquals(desc, described.orElseThrow()); + } + + // Round trip sym -> quoted sym -> resolve + if (desc instanceof Constable) { + Optional opt = (Optional) ((Constable) desc).describeConstable(); + ConstantDesc sr = (ConstantDesc) opt.orElseThrow().resolveConstantDesc(LOOKUP); + assertEquals(sr, desc); + } + } +} diff --git a/test/jdk/java/lang/constant/TestHelpers.java b/test/jdk/java/lang/constant/TestHelpers.java new file mode 100644 index 00000000000..fc18a41bb75 --- /dev/null +++ b/test/jdk/java/lang/constant/TestHelpers.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.invoke.MethodHandles; + +/** + * TestHelpers + * + * @author Brian Goetz + */ +class TestHelpers { + interface TestInterface { + public static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + + public static final int sf = 3; + + static int sm(int x) { return 0; } + default int m(int x) { return 0; } + private int pm(int x) { return 0; } + private static int psm(int x) { return 0; } + } + + static class TestSuperclass { + public int m(int x) { return -1; } + } + + static class TestClass extends TestSuperclass implements TestInterface { + public static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + + static int sf; + int f; + + public TestClass() {} + + public static int sm(int x) { return x; } + public int m(int x) { return x; } + private static int psm(int x) { return x; } + private int pm(int x) { return x; } + } +} diff --git a/test/jdk/java/lang/constant/TypeDescriptorTest.java b/test/jdk/java/lang/constant/TypeDescriptorTest.java new file mode 100644 index 00000000000..9ffbd886f41 --- /dev/null +++ b/test/jdk/java/lang/constant/TypeDescriptorTest.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.invoke.TypeDescriptor; +import java.lang.constant.ClassDesc; + +import org.testng.annotations.Test; + +import static java.lang.constant.ConstantDescs.*; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; + +/** + * @test + * @compile TypeDescriptorTest.java + * @run testng TypeDescriptorTest + * @summary unit tests for implementations of java.lang.invoke.TypeDescriptor + */ +@Test +public class TypeDescriptorTest { + private> void testArray(F f, boolean isArray, F component, F array) { + if (isArray) { + assertTrue(f.isArray()); + assertEquals(f.arrayType(), array); + assertEquals(f.componentType(), component); + } + else { + assertFalse(f.isArray()); + assertEquals(f.arrayType(), array); + assertNull(f.componentType()); + } + } + + public void testClass() { + testArray(int.class, false, null, int[].class); + testArray(int[].class, true, int.class, int[][].class); + testArray(int[][].class, true, int[].class, int[][][].class); + testArray(String.class, false, null, String[].class); + testArray(String[].class, true, String.class, String[][].class); + testArray(String[][].class, true, String[].class, String[][][].class); + + assertTrue(int.class.isPrimitive()); + assertFalse(int[].class.isPrimitive()); + assertFalse(String.class.isPrimitive()); + assertFalse(String[].class.isPrimitive()); + } + + public void testClassDesc() { + + testArray(CD_int, false, null, CD_int.arrayType()); + testArray(CD_int.arrayType(), true, CD_int, CD_int.arrayType(2)); + testArray(CD_int.arrayType(2), true, CD_int.arrayType(), CD_int.arrayType(3)); + testArray(CD_String, false, null, CD_String.arrayType()); + testArray(CD_String.arrayType(), true, CD_String, CD_String.arrayType(2)); + testArray(CD_String.arrayType(2), true, CD_String.arrayType(), CD_String.arrayType(3)); + + assertTrue(CD_int.isPrimitive()); + assertFalse(CD_int.arrayType().isPrimitive()); + assertFalse(CD_String.isPrimitive()); + assertFalse(CD_String.arrayType().isPrimitive()); + } + +} diff --git a/test/jdk/java/lang/constant/boottest/TEST.properties b/test/jdk/java/lang/constant/boottest/TEST.properties new file mode 100644 index 00000000000..565242e959b --- /dev/null +++ b/test/jdk/java/lang/constant/boottest/TEST.properties @@ -0,0 +1,4 @@ +# This file identifies root(s) of the test-ng hierarchy. + +TestNG.dirs = . +lib.dirs = /lib/testlibrary/bootlib diff --git a/test/jdk/java/lang/constant/boottest/java.base/java/lang/constant/ConstantUtilsTest.java b/test/jdk/java/lang/constant/boottest/java.base/java/lang/constant/ConstantUtilsTest.java new file mode 100644 index 00000000000..0d45cafb9b4 --- /dev/null +++ b/test/jdk/java/lang/constant/boottest/java.base/java/lang/constant/ConstantUtilsTest.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.lang.constant; + +import java.lang.invoke.*; +import java.lang.constant.*; +import java.util.*; + +import org.testng.annotations.Test; + +import static org.testng.Assert.*; + +/** + * @test + * @compile ConstantUtilsTest.java + * @run testng ConstantUtilsTest + * @summary unit tests for methods of java.lang.constant.ConstantUtils that are not covered by other unit tests + */ +@Test +public class ConstantUtilsTest { + private static ClassDesc thisClass = ClassDesc.of("MethodHandleDescTest"); + + public void testValidateMemberName() { + try { + ConstantUtils.validateMemberName(null); + fail(""); + } catch (NullPointerException e) { + // good + } + + try { + ConstantUtils.validateMemberName(""); + fail(""); + } catch (IllegalArgumentException e) { + // good + } + + List badNames = List.of(".", ";", "[", "/", "<", ">"); + for (String n : badNames) { + try { + ConstantUtils.validateMemberName(n); + fail(n); + } catch (IllegalArgumentException e) { + // good + } + } + } +} diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleBaseByteArrayTest.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleBaseByteArrayTest.java index 6d90d77e0de..9d74f2da26e 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleBaseByteArrayTest.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleBaseByteArrayTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -338,10 +338,10 @@ public abstract class VarHandleBaseByteArrayTest extends VarHandleBaseTest { @BeforeClass public void setup() { setupByteSources(); - setupVarHandleSources(); + vhss = setupVarHandleSources(true); } - abstract void setupVarHandleSources(); + abstract List setupVarHandleSources(boolean same); @DataProvider diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java index ea85761a9a9..df5570b92f4 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,6 +50,14 @@ public class VarHandleTestAccessBoolean extends VarHandleBaseTest { boolean v; + static final boolean static_final_v2 = true; + + static boolean static_v2; + + final boolean final_v2 = true; + + boolean v2; + VarHandle vhFinalField; VarHandle vhField; @@ -61,6 +69,41 @@ public class VarHandleTestAccessBoolean extends VarHandleBaseTest { VarHandle vhArray; + VarHandle[] allocate(boolean same) { + List vhs = new ArrayList<>(); + + String postfix = same ? "" : "2"; + VarHandle vh; + try { + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessBoolean.class, "final_v" + postfix, boolean.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessBoolean.class, "v" + postfix, boolean.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessBoolean.class, "static_final_v" + postfix, boolean.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessBoolean.class, "static_v" + postfix, boolean.class); + vhs.add(vh); + + if (same) { + vh = MethodHandles.arrayElementVarHandle(boolean[].class); + } + else { + vh = MethodHandles.arrayElementVarHandle(String[].class); + } + vhs.add(vh); + } catch (Exception e) { + throw new InternalError(e); + } + return vhs.toArray(new VarHandle[0]); + } + @BeforeClass public void setup() throws Exception { vhFinalField = MethodHandles.lookup().findVarHandle( @@ -89,6 +132,31 @@ public class VarHandleTestAccessBoolean extends VarHandleBaseTest { return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = allocate(true); + VarHandle[] vhs2 = allocate(true); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = allocate(false); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } + @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandle vh) { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java index 033451a7753..09bb91c9efa 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,6 +50,14 @@ public class VarHandleTestAccessByte extends VarHandleBaseTest { byte v; + static final byte static_final_v2 = (byte)0x01; + + static byte static_v2; + + final byte final_v2 = (byte)0x01; + + byte v2; + VarHandle vhFinalField; VarHandle vhField; @@ -61,6 +69,41 @@ public class VarHandleTestAccessByte extends VarHandleBaseTest { VarHandle vhArray; + VarHandle[] allocate(boolean same) { + List vhs = new ArrayList<>(); + + String postfix = same ? "" : "2"; + VarHandle vh; + try { + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessByte.class, "final_v" + postfix, byte.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessByte.class, "v" + postfix, byte.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessByte.class, "static_final_v" + postfix, byte.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessByte.class, "static_v" + postfix, byte.class); + vhs.add(vh); + + if (same) { + vh = MethodHandles.arrayElementVarHandle(byte[].class); + } + else { + vh = MethodHandles.arrayElementVarHandle(String[].class); + } + vhs.add(vh); + } catch (Exception e) { + throw new InternalError(e); + } + return vhs.toArray(new VarHandle[0]); + } + @BeforeClass public void setup() throws Exception { vhFinalField = MethodHandles.lookup().findVarHandle( @@ -89,6 +132,31 @@ public class VarHandleTestAccessByte extends VarHandleBaseTest { return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = allocate(true); + VarHandle[] vhs2 = allocate(true); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = allocate(false); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } + @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandle vh) { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java index ecd685f073e..8246824ac49 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,6 +50,14 @@ public class VarHandleTestAccessChar extends VarHandleBaseTest { char v; + static final char static_final_v2 = '\u0123'; + + static char static_v2; + + final char final_v2 = '\u0123'; + + char v2; + VarHandle vhFinalField; VarHandle vhField; @@ -61,6 +69,41 @@ public class VarHandleTestAccessChar extends VarHandleBaseTest { VarHandle vhArray; + VarHandle[] allocate(boolean same) { + List vhs = new ArrayList<>(); + + String postfix = same ? "" : "2"; + VarHandle vh; + try { + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessChar.class, "final_v" + postfix, char.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessChar.class, "v" + postfix, char.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessChar.class, "static_final_v" + postfix, char.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessChar.class, "static_v" + postfix, char.class); + vhs.add(vh); + + if (same) { + vh = MethodHandles.arrayElementVarHandle(char[].class); + } + else { + vh = MethodHandles.arrayElementVarHandle(String[].class); + } + vhs.add(vh); + } catch (Exception e) { + throw new InternalError(e); + } + return vhs.toArray(new VarHandle[0]); + } + @BeforeClass public void setup() throws Exception { vhFinalField = MethodHandles.lookup().findVarHandle( @@ -89,6 +132,31 @@ public class VarHandleTestAccessChar extends VarHandleBaseTest { return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = allocate(true); + VarHandle[] vhs2 = allocate(true); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = allocate(false); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } + @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandle vh) { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java index 3aa12aa4098..a93efa1e1ac 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,6 +50,14 @@ public class VarHandleTestAccessDouble extends VarHandleBaseTest { double v; + static final double static_final_v2 = 1.0d; + + static double static_v2; + + final double final_v2 = 1.0d; + + double v2; + VarHandle vhFinalField; VarHandle vhField; @@ -61,6 +69,41 @@ public class VarHandleTestAccessDouble extends VarHandleBaseTest { VarHandle vhArray; + VarHandle[] allocate(boolean same) { + List vhs = new ArrayList<>(); + + String postfix = same ? "" : "2"; + VarHandle vh; + try { + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessDouble.class, "final_v" + postfix, double.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessDouble.class, "v" + postfix, double.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessDouble.class, "static_final_v" + postfix, double.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessDouble.class, "static_v" + postfix, double.class); + vhs.add(vh); + + if (same) { + vh = MethodHandles.arrayElementVarHandle(double[].class); + } + else { + vh = MethodHandles.arrayElementVarHandle(String[].class); + } + vhs.add(vh); + } catch (Exception e) { + throw new InternalError(e); + } + return vhs.toArray(new VarHandle[0]); + } + @BeforeClass public void setup() throws Exception { vhFinalField = MethodHandles.lookup().findVarHandle( @@ -89,6 +132,31 @@ public class VarHandleTestAccessDouble extends VarHandleBaseTest { return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = allocate(true); + VarHandle[] vhs2 = allocate(true); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = allocate(false); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } + @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandle vh) { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java index 81f19fb91dd..31b206f8d91 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,6 +50,14 @@ public class VarHandleTestAccessFloat extends VarHandleBaseTest { float v; + static final float static_final_v2 = 1.0f; + + static float static_v2; + + final float final_v2 = 1.0f; + + float v2; + VarHandle vhFinalField; VarHandle vhField; @@ -61,6 +69,41 @@ public class VarHandleTestAccessFloat extends VarHandleBaseTest { VarHandle vhArray; + VarHandle[] allocate(boolean same) { + List vhs = new ArrayList<>(); + + String postfix = same ? "" : "2"; + VarHandle vh; + try { + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessFloat.class, "final_v" + postfix, float.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessFloat.class, "v" + postfix, float.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessFloat.class, "static_final_v" + postfix, float.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessFloat.class, "static_v" + postfix, float.class); + vhs.add(vh); + + if (same) { + vh = MethodHandles.arrayElementVarHandle(float[].class); + } + else { + vh = MethodHandles.arrayElementVarHandle(String[].class); + } + vhs.add(vh); + } catch (Exception e) { + throw new InternalError(e); + } + return vhs.toArray(new VarHandle[0]); + } + @BeforeClass public void setup() throws Exception { vhFinalField = MethodHandles.lookup().findVarHandle( @@ -89,6 +132,31 @@ public class VarHandleTestAccessFloat extends VarHandleBaseTest { return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = allocate(true); + VarHandle[] vhs2 = allocate(true); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = allocate(false); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } + @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandle vh) { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java index bfa7665a8f5..ef6cba1d069 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,6 +50,14 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest { int v; + static final int static_final_v2 = 0x01234567; + + static int static_v2; + + final int final_v2 = 0x01234567; + + int v2; + VarHandle vhFinalField; VarHandle vhField; @@ -61,6 +69,41 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest { VarHandle vhArray; + VarHandle[] allocate(boolean same) { + List vhs = new ArrayList<>(); + + String postfix = same ? "" : "2"; + VarHandle vh; + try { + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessInt.class, "final_v" + postfix, int.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessInt.class, "v" + postfix, int.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessInt.class, "static_final_v" + postfix, int.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessInt.class, "static_v" + postfix, int.class); + vhs.add(vh); + + if (same) { + vh = MethodHandles.arrayElementVarHandle(int[].class); + } + else { + vh = MethodHandles.arrayElementVarHandle(String[].class); + } + vhs.add(vh); + } catch (Exception e) { + throw new InternalError(e); + } + return vhs.toArray(new VarHandle[0]); + } + @BeforeClass public void setup() throws Exception { vhFinalField = MethodHandles.lookup().findVarHandle( @@ -89,6 +132,31 @@ public class VarHandleTestAccessInt extends VarHandleBaseTest { return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = allocate(true); + VarHandle[] vhs2 = allocate(true); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = allocate(false); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } + @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandle vh) { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java index 6d948593f86..73212b4ba11 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,6 +50,14 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest { long v; + static final long static_final_v2 = 0x0123456789ABCDEFL; + + static long static_v2; + + final long final_v2 = 0x0123456789ABCDEFL; + + long v2; + VarHandle vhFinalField; VarHandle vhField; @@ -61,6 +69,41 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest { VarHandle vhArray; + VarHandle[] allocate(boolean same) { + List vhs = new ArrayList<>(); + + String postfix = same ? "" : "2"; + VarHandle vh; + try { + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessLong.class, "final_v" + postfix, long.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessLong.class, "v" + postfix, long.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessLong.class, "static_final_v" + postfix, long.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessLong.class, "static_v" + postfix, long.class); + vhs.add(vh); + + if (same) { + vh = MethodHandles.arrayElementVarHandle(long[].class); + } + else { + vh = MethodHandles.arrayElementVarHandle(String[].class); + } + vhs.add(vh); + } catch (Exception e) { + throw new InternalError(e); + } + return vhs.toArray(new VarHandle[0]); + } + @BeforeClass public void setup() throws Exception { vhFinalField = MethodHandles.lookup().findVarHandle( @@ -89,6 +132,31 @@ public class VarHandleTestAccessLong extends VarHandleBaseTest { return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = allocate(true); + VarHandle[] vhs2 = allocate(true); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = allocate(false); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } + @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandle vh) { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java index 088de606734..23594095320 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,6 +50,14 @@ public class VarHandleTestAccessShort extends VarHandleBaseTest { short v; + static final short static_final_v2 = (short)0x0123; + + static short static_v2; + + final short final_v2 = (short)0x0123; + + short v2; + VarHandle vhFinalField; VarHandle vhField; @@ -61,6 +69,41 @@ public class VarHandleTestAccessShort extends VarHandleBaseTest { VarHandle vhArray; + VarHandle[] allocate(boolean same) { + List vhs = new ArrayList<>(); + + String postfix = same ? "" : "2"; + VarHandle vh; + try { + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessShort.class, "final_v" + postfix, short.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessShort.class, "v" + postfix, short.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessShort.class, "static_final_v" + postfix, short.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessShort.class, "static_v" + postfix, short.class); + vhs.add(vh); + + if (same) { + vh = MethodHandles.arrayElementVarHandle(short[].class); + } + else { + vh = MethodHandles.arrayElementVarHandle(String[].class); + } + vhs.add(vh); + } catch (Exception e) { + throw new InternalError(e); + } + return vhs.toArray(new VarHandle[0]); + } + @BeforeClass public void setup() throws Exception { vhFinalField = MethodHandles.lookup().findVarHandle( @@ -89,6 +132,31 @@ public class VarHandleTestAccessShort extends VarHandleBaseTest { return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = allocate(true); + VarHandle[] vhs2 = allocate(true); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = allocate(false); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } + @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandle vh) { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessString.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessString.java index 04ed5de6c35..12d835c7e8a 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessString.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestAccessString.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,6 +50,14 @@ public class VarHandleTestAccessString extends VarHandleBaseTest { String v; + static final String static_final_v2 = "foo"; + + static String static_v2; + + final String final_v2 = "foo"; + + String v2; + VarHandle vhFinalField; VarHandle vhField; @@ -62,6 +70,41 @@ public class VarHandleTestAccessString extends VarHandleBaseTest { VarHandle vhArrayObject; + VarHandle[] allocate(boolean same) { + List vhs = new ArrayList<>(); + + String postfix = same ? "" : "2"; + VarHandle vh; + try { + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessString.class, "final_v" + postfix, String.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccessString.class, "v" + postfix, String.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessString.class, "static_final_v" + postfix, String.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccessString.class, "static_v" + postfix, String.class); + vhs.add(vh); + + if (same) { + vh = MethodHandles.arrayElementVarHandle(String[].class); + } + else { + vh = MethodHandles.arrayElementVarHandle(int[].class); + } + vhs.add(vh); + } catch (Exception e) { + throw new InternalError(e); + } + return vhs.toArray(new VarHandle[0]); + } + @BeforeClass public void setup() throws Exception { vhFinalField = MethodHandles.lookup().findVarHandle( @@ -91,6 +134,31 @@ public class VarHandleTestAccessString extends VarHandleBaseTest { return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = allocate(true); + VarHandle[] vhs2 = allocate(true); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = allocate(false); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } + @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandle vh) { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java index 7d0cce20885..9cf9074da4b 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java @@ -54,25 +54,61 @@ public class VarHandleTestByteArrayAsChar extends VarHandleBaseByteArrayTest { @Override - public void setupVarHandleSources() { + public List setupVarHandleSources(boolean same) { // Combinations of VarHandle byte[] or ByteBuffer - vhss = new ArrayList<>(); - for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + List vhss = new ArrayList<>(); + for (MemoryMode endianess : List.of(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; + + Class arrayType; + if (same) { + arrayType = char[].class; + } + else { + arrayType = int[].class; + } VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(char[].class, bo), + MethodHandles.byteArrayViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(char[].class, bo), + MethodHandles.byteBufferViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } + return vhss; } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + VarHandle[] vhs2 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = setupVarHandleSources(false).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandleSource vhs) { diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java index 8d2c9359ae1..e3211949e07 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java @@ -54,25 +54,61 @@ public class VarHandleTestByteArrayAsDouble extends VarHandleBaseByteArrayTest { @Override - public void setupVarHandleSources() { + public List setupVarHandleSources(boolean same) { // Combinations of VarHandle byte[] or ByteBuffer - vhss = new ArrayList<>(); - for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + List vhss = new ArrayList<>(); + for (MemoryMode endianess : List.of(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; + + Class arrayType; + if (same) { + arrayType = double[].class; + } + else { + arrayType = int[].class; + } VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(double[].class, bo), + MethodHandles.byteArrayViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(double[].class, bo), + MethodHandles.byteBufferViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } + return vhss; } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + VarHandle[] vhs2 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = setupVarHandleSources(false).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandleSource vhs) { diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java index b9be42bb311..9ff026cb239 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java @@ -54,25 +54,61 @@ public class VarHandleTestByteArrayAsFloat extends VarHandleBaseByteArrayTest { @Override - public void setupVarHandleSources() { + public List setupVarHandleSources(boolean same) { // Combinations of VarHandle byte[] or ByteBuffer - vhss = new ArrayList<>(); - for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + List vhss = new ArrayList<>(); + for (MemoryMode endianess : List.of(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; + + Class arrayType; + if (same) { + arrayType = float[].class; + } + else { + arrayType = int[].class; + } VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(float[].class, bo), + MethodHandles.byteArrayViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(float[].class, bo), + MethodHandles.byteBufferViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } + return vhss; } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + VarHandle[] vhs2 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = setupVarHandleSources(false).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandleSource vhs) { diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java index d8c48ddafec..1f15b1e43df 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java @@ -54,25 +54,61 @@ public class VarHandleTestByteArrayAsInt extends VarHandleBaseByteArrayTest { @Override - public void setupVarHandleSources() { + public List setupVarHandleSources(boolean same) { // Combinations of VarHandle byte[] or ByteBuffer - vhss = new ArrayList<>(); - for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + List vhss = new ArrayList<>(); + for (MemoryMode endianess : List.of(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; + + Class arrayType; + if (same) { + arrayType = int[].class; + } + else { + arrayType = long[].class; + } VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(int[].class, bo), + MethodHandles.byteArrayViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(int[].class, bo), + MethodHandles.byteBufferViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } + return vhss; } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + VarHandle[] vhs2 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = setupVarHandleSources(false).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandleSource vhs) { diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java index 8f622f188a1..f11a0139b6e 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java @@ -54,25 +54,61 @@ public class VarHandleTestByteArrayAsLong extends VarHandleBaseByteArrayTest { @Override - public void setupVarHandleSources() { + public List setupVarHandleSources(boolean same) { // Combinations of VarHandle byte[] or ByteBuffer - vhss = new ArrayList<>(); - for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + List vhss = new ArrayList<>(); + for (MemoryMode endianess : List.of(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; + + Class arrayType; + if (same) { + arrayType = long[].class; + } + else { + arrayType = int[].class; + } VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(long[].class, bo), + MethodHandles.byteArrayViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(long[].class, bo), + MethodHandles.byteBufferViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } + return vhss; } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + VarHandle[] vhs2 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = setupVarHandleSources(false).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandleSource vhs) { diff --git a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java index 7e8f99f7500..06ae89eab3b 100644 --- a/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java +++ b/test/jdk/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java @@ -54,25 +54,61 @@ public class VarHandleTestByteArrayAsShort extends VarHandleBaseByteArrayTest { @Override - public void setupVarHandleSources() { + public List setupVarHandleSources(boolean same) { // Combinations of VarHandle byte[] or ByteBuffer - vhss = new ArrayList<>(); - for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + List vhss = new ArrayList<>(); + for (MemoryMode endianess : List.of(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; + + Class arrayType; + if (same) { + arrayType = short[].class; + } + else { + arrayType = int[].class; + } VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(short[].class, bo), + MethodHandles.byteArrayViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(short[].class, bo), + MethodHandles.byteBufferViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } + return vhss; } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + VarHandle[] vhs2 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = setupVarHandleSources(false).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandleSource vhs) { diff --git a/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestAccess.java.template b/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestAccess.java.template index 5014fc1b187..0e1ff3fb673 100644 --- a/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestAccess.java.template +++ b/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestAccess.java.template @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,6 +50,14 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { $type$ v; + static final $type$ static_final_v2 = $value1$; + + static $type$ static_v2; + + final $type$ final_v2 = $value1$; + + $type$ v2; + VarHandle vhFinalField; VarHandle vhField; @@ -64,6 +72,45 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { VarHandle vhArrayObject; #end[String] + VarHandle[] allocate(boolean same) { + List vhs = new ArrayList<>(); + + String postfix = same ? "" : "2"; + VarHandle vh; + try { + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccess$Type$.class, "final_v" + postfix, $type$.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findVarHandle( + VarHandleTestAccess$Type$.class, "v" + postfix, $type$.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccess$Type$.class, "static_final_v" + postfix, $type$.class); + vhs.add(vh); + + vh = MethodHandles.lookup().findStaticVarHandle( + VarHandleTestAccess$Type$.class, "static_v" + postfix, $type$.class); + vhs.add(vh); + + if (same) { + vh = MethodHandles.arrayElementVarHandle($type$[].class); + } + else { +#if[String] + vh = MethodHandles.arrayElementVarHandle(int[].class); +#else[String] + vh = MethodHandles.arrayElementVarHandle(String[].class); +#end[String] + } + vhs.add(vh); + } catch (Exception e) { + throw new InternalError(e); + } + return vhs.toArray(new VarHandle[0]); + } + @BeforeClass public void setup() throws Exception { vhFinalField = MethodHandles.lookup().findVarHandle( @@ -95,6 +142,31 @@ public class VarHandleTestAccess$Type$ extends VarHandleBaseTest { return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new); } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = allocate(true); + VarHandle[] vhs2 = allocate(true); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = allocate(false); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } + @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandle vh) { assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET)); diff --git a/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template b/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template index e476324489b..90016864da2 100644 --- a/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template +++ b/test/jdk/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template @@ -54,25 +54,65 @@ public class VarHandleTestByteArrayAs$Type$ extends VarHandleBaseByteArrayTest { @Override - public void setupVarHandleSources() { + public List setupVarHandleSources(boolean same) { // Combinations of VarHandle byte[] or ByteBuffer - vhss = new ArrayList<>(); - for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + List vhss = new ArrayList<>(); + for (MemoryMode endianess : List.of(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; + + Class arrayType; + if (same) { + arrayType = $type$[].class; + } + else { +#if[int] + arrayType = long[].class; +#else[int] + arrayType = int[].class; +#end[int] + } VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle($type$[].class, bo), + MethodHandles.byteArrayViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle($type$[].class, bo), + MethodHandles.byteBufferViewVarHandle(arrayType, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } + return vhss; } + @Test + public void testEqualsAndHashCode() { + VarHandle[] vhs1 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + VarHandle[] vhs2 = setupVarHandleSources(true).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + + for (int i = 0; i < vhs1.length; i++) { + for (int j = 0; j < vhs1.length; j++) { + if (i == j) { + assertEquals(vhs1[i], vhs1[i]); + assertEquals(vhs1[i], vhs2[i]); + assertEquals(vhs1[i].hashCode(), vhs2[i].hashCode()); + } + else { + assertNotEquals(vhs1[i], vhs1[j]); + assertNotEquals(vhs1[i], vhs2[j]); + } + } + } + + VarHandle[] vhs3 = setupVarHandleSources(false).stream(). + map(vhs -> vhs.s).toArray(VarHandle[]::new); + for (int i = 0; i < vhs1.length; i++) { + assertNotEquals(vhs1[i], vhs3[i]); + } + } @Test(dataProvider = "varHandlesProvider") public void testIsAccessModeSupported(VarHandleSource vhs) { diff --git a/test/jdk/java/text/Format/CompactNumberFormat/CompactFormatAndParseHelper.java b/test/jdk/java/text/Format/CompactNumberFormat/CompactFormatAndParseHelper.java new file mode 100644 index 00000000000..6d74906b506 --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/CompactFormatAndParseHelper.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.math.BigDecimal; +import java.text.NumberFormat; +import java.text.ParseException; +import java.text.ParsePosition; +import static org.testng.Assert.*; + +class CompactFormatAndParseHelper { + + static void testFormat(NumberFormat cnf, Object number, + String expected) { + String result = cnf.format(number); + assertEquals(result, expected, "Incorrect formatting of the number '" + + number + "'"); + } + + static void testParse(NumberFormat cnf, String parseString, + Number expected, ParsePosition position, Class returnType) throws ParseException { + + Number number; + if (position == null) { + number = cnf.parse(parseString); + } else { + number = cnf.parse(parseString, position); + } + + if (returnType != null) { + assertEquals(number.getClass(), returnType, "Incorrect return type for string" + parseString); + } + + if (number instanceof Double) { + assertEquals(number.doubleValue(), (double) expected, + "Incorrect parsing of the string '" + parseString + "'"); + } else if (number instanceof Long) { + assertEquals(number.longValue(), (long) expected, + "Incorrect parsing of the string '" + parseString + "'"); + } else if (number instanceof BigDecimal) { + BigDecimal num = (BigDecimal) number; + assertEquals(num, (BigDecimal) expected, + "Incorrect parsing of the string '" + parseString + "'"); + } else { + assertEquals(number, expected, "Incorrect parsing of the string '" + + parseString + "'"); + } + } +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/TestCNFRounding.java b/test/jdk/java/text/Format/CompactNumberFormat/TestCNFRounding.java new file mode 100644 index 00000000000..b4dddfa1df7 --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/TestCNFRounding.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8177552 + * @summary Checks the rounding of formatted number in compact number formatting + * @run testng/othervm TestCNFRounding + */ + +import java.math.RoundingMode; +import java.text.NumberFormat; +import java.util.List; +import java.util.Locale; +import static org.testng.Assert.*; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class TestCNFRounding { + + private static final List MODES = List.of( + RoundingMode.HALF_EVEN, + RoundingMode.HALF_UP, + RoundingMode.HALF_DOWN, + RoundingMode.UP, + RoundingMode.DOWN, + RoundingMode.CEILING, + RoundingMode.FLOOR); + + @DataProvider(name = "roundingData") + Object[][] roundingData() { + return new Object[][]{ + // Number, half_even, half_up, half_down, up, down, ceiling, floor + {5500, new String[]{"6K", "6K", "5K", "6K", "5K", "6K", "5K"}}, + {2500, new String[]{"2K", "3K", "2K", "3K", "2K", "3K", "2K"}}, + {1600, new String[]{"2K", "2K", "2K", "2K", "1K", "2K", "1K"}}, + {1100, new String[]{"1K", "1K", "1K", "2K", "1K", "2K", "1K"}}, + {1000, new String[]{"1K", "1K", "1K", "1K", "1K", "1K", "1K"}}, + {-1000, new String[]{"-1K", "-1K", "-1K", "-1K", "-1K", "-1K", "-1K"}}, + {-1100, new String[]{"-1K", "-1K", "-1K", "-2K", "-1K", "-1K", "-2K"}}, + {-1600, new String[]{"-2K", "-2K", "-2K", "-2K", "-1K", "-1K", "-2K"}}, + {-2500, new String[]{"-2K", "-3K", "-2K", "-3K", "-2K", "-2K", "-3K"}}, + {-5500, new String[]{"-6K", "-6K", "-5K", "-6K", "-5K", "-5K", "-6K"}}, + {5501, new String[]{"6K", "6K", "6K", "6K", "5K", "6K", "5K"}}, + {-5501, new String[]{"-6K", "-6K", "-6K", "-6K", "-5K", "-5K", "-6K"}}, + {1001, new String[]{"1K", "1K", "1K", "2K", "1K", "2K", "1K"}}, + {-1001, new String[]{"-1K", "-1K", "-1K", "-2K", "-1K", "-1K", "-2K"}}, + {4501, new String[]{"5K", "5K", "5K", "5K", "4K", "5K", "4K"}}, + {-4501, new String[]{"-5K", "-5K", "-5K", "-5K", "-4K", "-4K", "-5K"}}, + {4500, new String[]{"4K", "5K", "4K", "5K", "4K", "5K", "4K"}}, + {-4500, new String[]{"-4K", "-5K", "-4K", "-5K", "-4K", "-4K", "-5K"}},}; + } + + @DataProvider(name = "roundingFract") + Object[][] roundingFract() { + return new Object[][]{ + // Number, half_even, half_up, half_down, up, down, ceiling, floor + {5550, new String[]{"5.5K", "5.5K", "5.5K", "5.6K", "5.5K", "5.6K", "5.5K"}}, + {2550, new String[]{"2.5K", "2.5K", "2.5K", "2.6K", "2.5K", "2.6K", "2.5K"}}, + {1660, new String[]{"1.7K", "1.7K", "1.7K", "1.7K", "1.6K", "1.7K", "1.6K"}}, + {1110, new String[]{"1.1K", "1.1K", "1.1K", "1.2K", "1.1K", "1.2K", "1.1K"}}, + {1000, new String[]{"1.0K", "1.0K", "1.0K", "1.0K", "1.0K", "1.0K", "1.0K"}}, + {-1000, new String[]{"-1.0K", "-1.0K", "-1.0K", "-1.0K", "-1.0K", "-1.0K", "-1.0K"}}, + {-1110, new String[]{"-1.1K", "-1.1K", "-1.1K", "-1.2K", "-1.1K", "-1.1K", "-1.2K"}}, + {-1660, new String[]{"-1.7K", "-1.7K", "-1.7K", "-1.7K", "-1.6K", "-1.6K", "-1.7K"}}, + {-2550, new String[]{"-2.5K", "-2.5K", "-2.5K", "-2.6K", "-2.5K", "-2.5K", "-2.6K"}}, + {-5550, new String[]{"-5.5K", "-5.5K", "-5.5K", "-5.6K", "-5.5K", "-5.5K", "-5.6K"}}, + {5551, new String[]{"5.6K", "5.6K", "5.6K", "5.6K", "5.5K", "5.6K", "5.5K"}}, + {-5551, new String[]{"-5.6K", "-5.6K", "-5.6K", "-5.6K", "-5.5K", "-5.5K", "-5.6K"}}, + {1001, new String[]{"1.0K", "1.0K", "1.0K", "1.1K", "1.0K", "1.1K", "1.0K"}}, + {-1001, new String[]{"-1.0K", "-1.0K", "-1.0K", "-1.1K", "-1.0K", "-1.0K", "-1.1K"}}, + {4551, new String[]{"4.6K", "4.6K", "4.6K", "4.6K", "4.5K", "4.6K", "4.5K"}}, + {-4551, new String[]{"-4.6K", "-4.6K", "-4.6K", "-4.6K", "-4.5K", "-4.5K", "-4.6K"}}, + {4500, new String[]{"4.5K", "4.5K", "4.5K", "4.5K", "4.5K", "4.5K", "4.5K"}}, + {-4500, new String[]{"-4.5K", "-4.5K", "-4.5K", "-4.5K", "-4.5K", "-4.5K", "-4.5K"}},}; + } + + @DataProvider(name = "rounding2Fract") + Object[][] rounding2Fract() { + return new Object[][]{ + // Number, half_even, half_up, half_down + {1115, new String[]{"1.11K", "1.11K", "1.11K"}}, + {1125, new String[]{"1.12K", "1.13K", "1.12K"}}, + {1135, new String[]{"1.14K", "1.14K", "1.14K"}}, + {3115, new String[]{"3.12K", "3.12K", "3.12K"}}, + {3125, new String[]{"3.12K", "3.13K", "3.12K"}}, + {3135, new String[]{"3.13K", "3.13K", "3.13K"}}, + {6865, new String[]{"6.87K", "6.87K", "6.87K"}}, + {6875, new String[]{"6.88K", "6.88K", "6.87K"}}, + {6885, new String[]{"6.88K", "6.88K", "6.88K"}}, + {3124, new String[]{"3.12K", "3.12K", "3.12K"}}, + {3126, new String[]{"3.13K", "3.13K", "3.13K"}}, + {3128, new String[]{"3.13K", "3.13K", "3.13K"}}, + {6864, new String[]{"6.86K", "6.86K", "6.86K"}}, + {6865, new String[]{"6.87K", "6.87K", "6.87K"}}, + {6868, new String[]{"6.87K", "6.87K", "6.87K"}}, + {4685, new String[]{"4.68K", "4.68K", "4.68K"}}, + {4687, new String[]{"4.69K", "4.69K", "4.69K"}}, + {4686, new String[]{"4.69K", "4.69K", "4.69K"}},}; + } + + @Test(expectedExceptions = NullPointerException.class) + public void testNullMode() { + NumberFormat fmt = NumberFormat + .getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); + fmt.setRoundingMode(null); + } + + @Test + public void testDefaultRoundingMode() { + NumberFormat fmt = NumberFormat + .getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); + assertEquals(fmt.getRoundingMode(), RoundingMode.HALF_EVEN, + "Default RoundingMode should be " + RoundingMode.HALF_EVEN); + } + + @Test(dataProvider = "roundingData") + public void testRounding(Object number, String[] expected) { + for (int index = 0; index < MODES.size(); index++) { + testRoundingMode(number, expected[index], 0, MODES.get(index)); + } + } + + @Test(dataProvider = "roundingFract") + public void testRoundingFract(Object number, String[] expected) { + for (int index = 0; index < MODES.size(); index++) { + testRoundingMode(number, expected[index], 1, MODES.get(index)); + } + } + + @Test(dataProvider = "rounding2Fract") + public void testRounding2Fract(Object number, String[] expected) { + List rModes = List.of(RoundingMode.HALF_EVEN, + RoundingMode.HALF_UP, RoundingMode.HALF_DOWN); + for (int index = 0; index < rModes.size(); index++) { + testRoundingMode(number, expected[index], 2, rModes.get(index)); + } + } + + private void testRoundingMode(Object number, String expected, + int fraction, RoundingMode rounding) { + NumberFormat fmt = NumberFormat + .getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); + fmt.setRoundingMode(rounding); + assertEquals(fmt.getRoundingMode(), rounding, + "RoundingMode set is not returned by getRoundingMode"); + + fmt.setMinimumFractionDigits(fraction); + String result = fmt.format(number); + assertEquals(result, expected, "Incorrect formatting of number " + + number + " using rounding mode: " + rounding); + } + +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/TestCompactNumber.java b/test/jdk/java/text/Format/CompactNumberFormat/TestCompactNumber.java new file mode 100644 index 00000000000..55e95daddba --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/TestCompactNumber.java @@ -0,0 +1,589 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8177552 + * @summary Checks the functioning of compact number format + * @modules jdk.localedata + * @run testng/othervm TestCompactNumber + */ +import java.math.BigDecimal; +import java.math.BigInteger; +import java.text.FieldPosition; +import java.text.Format; +import java.text.NumberFormat; +import java.text.ParseException; +import java.text.ParsePosition; +import java.util.Locale; +import java.util.stream.Stream; +import static org.testng.Assert.*; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class TestCompactNumber { + + private static final NumberFormat FORMAT_DZ_LONG = NumberFormat + .getCompactNumberInstance(new Locale("dz"), NumberFormat.Style.LONG); + + private static final NumberFormat FORMAT_EN_US_SHORT = NumberFormat + .getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); + + private static final NumberFormat FORMAT_EN_LONG = NumberFormat + .getCompactNumberInstance(new Locale("en"), NumberFormat.Style.LONG); + + private static final NumberFormat FORMAT_HI_IN_LONG = NumberFormat + .getCompactNumberInstance(new Locale("hi", "IN"), NumberFormat.Style.LONG); + + private static final NumberFormat FORMAT_JA_JP_SHORT = NumberFormat + .getCompactNumberInstance(Locale.JAPAN, NumberFormat.Style.SHORT); + + private static final NumberFormat FORMAT_IT_SHORT = NumberFormat + .getCompactNumberInstance(new Locale("it"), NumberFormat.Style.SHORT); + + private static final NumberFormat FORMAT_CA_LONG = NumberFormat + .getCompactNumberInstance(new Locale("ca"), NumberFormat.Style.LONG); + + private static final NumberFormat FORMAT_AS_LONG = NumberFormat + .getCompactNumberInstance(new Locale("as"), NumberFormat.Style.LONG); + + private static final NumberFormat FORMAT_BRX_SHORT = NumberFormat + .getCompactNumberInstance(new Locale("brx"), NumberFormat.Style.SHORT); + + private static final NumberFormat FORMAT_SW_LONG = NumberFormat + .getCompactNumberInstance(new Locale("sw"), NumberFormat.Style.LONG); + + private static final NumberFormat FORMAT_SE_SHORT = NumberFormat + .getCompactNumberInstance(new Locale("se"), NumberFormat.Style.SHORT); + + @DataProvider(name = "format") + Object[][] compactFormatData() { + return new Object[][]{ + // compact number format instance, number to format, formatted output + {FORMAT_DZ_LONG, 1000.09, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55" + + "\u0FB2\u0F42 \u0F21"}, + {FORMAT_DZ_LONG, -999.99, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55" + + "\u0FB2\u0F42 \u0F21"}, + {FORMAT_DZ_LONG, -0.0, "-\u0F20"}, + {FORMAT_DZ_LONG, 3000L, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55" + + "\u0FB2\u0F42 \u0F23"}, + {FORMAT_DZ_LONG, new BigInteger("12345678901234567890"), "\u0F51" + + "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66" + + "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"}, + // negative + {FORMAT_DZ_LONG, new BigInteger("-12345678901234567890"), "-\u0F51" + + "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66" + + "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"}, + {FORMAT_DZ_LONG, new BigDecimal("12345678901234567890.89"), "\u0F51" + + "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66" + + "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"}, + {FORMAT_DZ_LONG, new BigDecimal("-12345678901234567890.89"), "-\u0F51" + + "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66" + + "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"}, + // Zeros + {FORMAT_EN_US_SHORT, 0, "0"}, + {FORMAT_EN_US_SHORT, 0.0, "0"}, + {FORMAT_EN_US_SHORT, -0.0, "-0"}, + // Less than 1000 no suffix + {FORMAT_EN_US_SHORT, 499, "499"}, + // Boundary number + {FORMAT_EN_US_SHORT, 1000.0, "1K"}, + // Long + {FORMAT_EN_US_SHORT, 3000L, "3K"}, + {FORMAT_EN_US_SHORT, 30000L, "30K"}, + {FORMAT_EN_US_SHORT, 300000L, "300K"}, + {FORMAT_EN_US_SHORT, 3000000L, "3M"}, + {FORMAT_EN_US_SHORT, 30000000L, "30M"}, + {FORMAT_EN_US_SHORT, 300000000L, "300M"}, + {FORMAT_EN_US_SHORT, 3000000000L, "3B"}, + {FORMAT_EN_US_SHORT, 30000000000L, "30B"}, + {FORMAT_EN_US_SHORT, 300000000000L, "300B"}, + {FORMAT_EN_US_SHORT, 3000000000000L, "3T"}, + {FORMAT_EN_US_SHORT, 30000000000000L, "30T"}, + {FORMAT_EN_US_SHORT, 300000000000000L, "300T"}, + {FORMAT_EN_US_SHORT, 3000000000000000L, "3000T"}, + // Negatives + {FORMAT_EN_US_SHORT, -3000L, "-3K"}, + {FORMAT_EN_US_SHORT, -30000L, "-30K"}, + {FORMAT_EN_US_SHORT, -300000L, "-300K"}, + {FORMAT_EN_US_SHORT, -3000000L, "-3M"}, + {FORMAT_EN_US_SHORT, -30000000L, "-30M"}, + {FORMAT_EN_US_SHORT, -300000000L, "-300M"}, + {FORMAT_EN_US_SHORT, -3000000000L, "-3B"}, + {FORMAT_EN_US_SHORT, -30000000000L, "-30B"}, + {FORMAT_EN_US_SHORT, -300000000000L, "-300B"}, + {FORMAT_EN_US_SHORT, -3000000000000L, "-3T"}, + {FORMAT_EN_US_SHORT, -30000000000000L, "-30T"}, + {FORMAT_EN_US_SHORT, -300000000000000L, "-300T"}, + {FORMAT_EN_US_SHORT, -3000000000000000L, "-3000T"}, + // Double + {FORMAT_EN_US_SHORT, 3000.0, "3K"}, + {FORMAT_EN_US_SHORT, 30000.0, "30K"}, + {FORMAT_EN_US_SHORT, 300000.0, "300K"}, + {FORMAT_EN_US_SHORT, 3000000.0, "3M"}, + {FORMAT_EN_US_SHORT, 30000000.0, "30M"}, + {FORMAT_EN_US_SHORT, 300000000.0, "300M"}, + {FORMAT_EN_US_SHORT, 3000000000.0, "3B"}, + {FORMAT_EN_US_SHORT, 30000000000.0, "30B"}, + {FORMAT_EN_US_SHORT, 300000000000.0, "300B"}, + {FORMAT_EN_US_SHORT, 3000000000000.0, "3T"}, + {FORMAT_EN_US_SHORT, 30000000000000.0, "30T"}, + {FORMAT_EN_US_SHORT, 300000000000000.0, "300T"}, + {FORMAT_EN_US_SHORT, 3000000000000000.0, "3000T"}, + // Negatives + {FORMAT_EN_US_SHORT, -3000.0, "-3K"}, + {FORMAT_EN_US_SHORT, -30000.0, "-30K"}, + {FORMAT_EN_US_SHORT, -300000.0, "-300K"}, + {FORMAT_EN_US_SHORT, -3000000.0, "-3M"}, + {FORMAT_EN_US_SHORT, -30000000.0, "-30M"}, + {FORMAT_EN_US_SHORT, -300000000.0, "-300M"}, + {FORMAT_EN_US_SHORT, -3000000000.0, "-3B"}, + {FORMAT_EN_US_SHORT, -30000000000.0, "-30B"}, + {FORMAT_EN_US_SHORT, -300000000000.0, "-300B"}, + {FORMAT_EN_US_SHORT, -3000000000000.0, "-3T"}, + {FORMAT_EN_US_SHORT, -30000000000000.0, "-30T"}, + {FORMAT_EN_US_SHORT, -300000000000000.0, "-300T"}, + {FORMAT_EN_US_SHORT, -3000000000000000.0, "-3000T"}, + // BigInteger + {FORMAT_EN_US_SHORT, new BigInteger("12345678901234567890"), + "12345679T"}, + {FORMAT_EN_US_SHORT, new BigInteger("-12345678901234567890"), + "-12345679T"}, + //BigDecimal + {FORMAT_EN_US_SHORT, new BigDecimal("12345678901234567890.89"), + "12345679T"}, + {FORMAT_EN_US_SHORT, new BigDecimal("-12345678901234567890.89"), + "-12345679T"}, + {FORMAT_EN_US_SHORT, new BigDecimal("12345678901234567890123466767.89"), + "12345678901234568T"}, + {FORMAT_EN_US_SHORT, new BigDecimal( + "12345678901234567890878732267863209.89"), + "12345678901234567890879T"}, + // number as exponent + {FORMAT_EN_US_SHORT, 9.78313E+3, "10K"}, + // Less than 1000 no suffix + {FORMAT_EN_LONG, 999, "999"}, + // Round the value and then format + {FORMAT_EN_LONG, 999.99, "1 thousand"}, + // 10 thousand + {FORMAT_EN_LONG, 99000, "99 thousand"}, + // Long path + {FORMAT_EN_LONG, 330000, "330 thousand"}, + // Double path + {FORMAT_EN_LONG, 3000.90, "3 thousand"}, + // BigInteger path + {FORMAT_EN_LONG, new BigInteger("12345678901234567890"), + "12345679 trillion"}, + //BigDecimal path + {FORMAT_EN_LONG, new BigDecimal("12345678901234567890.89"), + "12345679 trillion"}, + // Less than 1000 no suffix + {FORMAT_HI_IN_LONG, -999, "-999"}, + // Round the value with 0 fraction digits and format it + {FORMAT_HI_IN_LONG, -999.99, "-1 \u0939\u091C\u093C\u093E\u0930"}, + // 10 thousand + {FORMAT_HI_IN_LONG, 99000, "99 \u0939\u091C\u093C\u093E\u0930"}, + // Long path + {FORMAT_HI_IN_LONG, 330000, "3 \u0932\u093E\u0916"}, + // Double path + {FORMAT_HI_IN_LONG, 3000.90, "3 \u0939\u091C\u093C\u093E\u0930"}, + // BigInteger path + {FORMAT_HI_IN_LONG, new BigInteger("12345678901234567890"), + "123456789 \u0916\u0930\u092C"}, + // BigDecimal path + {FORMAT_HI_IN_LONG, new BigDecimal("12345678901234567890.89"), + "123456789 \u0916\u0930\u092C"}, + // 1000 does not have any suffix in "ja" locale + {FORMAT_JA_JP_SHORT, -999.99, "-1,000"}, + // 0-9999 does not have any suffix + {FORMAT_JA_JP_SHORT, 9999, "9,999"}, + // 99000/10000 => 9.9\u4E07 rounded to 10\u4E07 + {FORMAT_JA_JP_SHORT, 99000, "10\u4E07"}, + // Negative + {FORMAT_JA_JP_SHORT, -99000, "-10\u4E07"}, + // Long path + {FORMAT_JA_JP_SHORT, 330000, "33\u4E07"}, + // Double path + {FORMAT_JA_JP_SHORT, 3000.90, "3,001"}, + // BigInteger path + {FORMAT_JA_JP_SHORT, new BigInteger("12345678901234567890"), + "12345679\u5146"}, + // BigDecimal path + {FORMAT_JA_JP_SHORT, new BigDecimal("12345678901234567890.89"), + "12345679\u5146"}, + // less than 1000 no suffix + {FORMAT_IT_SHORT, 499, "499"}, + // Boundary number + {FORMAT_IT_SHORT, 1000, "1.000"}, + // Long path + {FORMAT_IT_SHORT, 3000000L, "3\u00a0Mln"}, + // Double path + {FORMAT_IT_SHORT, 3000000.0, "3\u00a0Mln"}, + // BigInteger path + {FORMAT_IT_SHORT, new BigInteger("12345678901234567890"), + "12345679\u00a0Bln"}, + // BigDecimal path + {FORMAT_IT_SHORT, new BigDecimal("12345678901234567890.89"), + "12345679\u00a0Bln"}, + {FORMAT_CA_LONG, 999, "999"}, + {FORMAT_CA_LONG, 999.99, "1 miler"}, + {FORMAT_CA_LONG, 99000, "99 milers"}, + {FORMAT_CA_LONG, 330000, "330 milers"}, + {FORMAT_CA_LONG, 3000.90, "3 miler"}, + {FORMAT_CA_LONG, 1000000, "1 mili\u00f3"}, + {FORMAT_CA_LONG, new BigInteger("12345678901234567890"), + "12345679 bilions"}, + {FORMAT_CA_LONG, new BigDecimal("12345678901234567890.89"), + "12345679 bilions"}, + {FORMAT_AS_LONG, 5000.0, "\u09eb \u09b9\u09be\u099c\u09be\u09f0"}, + {FORMAT_AS_LONG, 50000.0, "\u09eb\u09e6 \u09b9\u09be\u099c\u09be\u09f0"}, + {FORMAT_AS_LONG, 500000.0, "\u09eb \u09b2\u09be\u0996"}, + {FORMAT_AS_LONG, 5000000.0, "\u09eb \u09a8\u09bf\u09af\u09c1\u09a4"}, + {FORMAT_AS_LONG, 50000000.0, "\u09eb\u09e6 \u09a8\u09bf\u09af\u09c1\u09a4"}, + {FORMAT_AS_LONG, 500000000.0, "\u09eb\u09e6\u09e6 \u09a8\u09bf\u09af\u09c1\u09a4"}, + {FORMAT_AS_LONG, 5000000000.0, "\u09eb \u09b6\u09a4 \u0995\u09cb\u099f\u09bf"}, + {FORMAT_AS_LONG, 50000000000.0, "\u09eb\u09e6 \u09b6\u09a4 \u0995\u09cb\u099f\u09bf"}, + {FORMAT_AS_LONG, 500000000000.0, "\u09eb\u09e6\u09e6 \u09b6\u09a4 \u0995\u09cb\u099f\u09bf"}, + {FORMAT_AS_LONG, 5000000000000.0, "\u09eb \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, + {FORMAT_AS_LONG, 50000000000000.0, "\u09eb\u09e6 \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, + {FORMAT_AS_LONG, 500000000000000.0, "\u09eb\u09e6\u09e6 \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, + {FORMAT_AS_LONG, 5000000000000000.0, "\u09eb\u09e6\u09e6\u09e6 \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, + {FORMAT_AS_LONG, new BigInteger("12345678901234567890"), + "\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ef \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, + {FORMAT_AS_LONG, new BigDecimal("12345678901234567890123466767.89"), + "\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ee \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, + {FORMAT_BRX_SHORT, 999, "999"}, + {FORMAT_BRX_SHORT, 999.99, "1K"}, + {FORMAT_BRX_SHORT, 99000, "99K"}, + {FORMAT_BRX_SHORT, 330000, "330K"}, + {FORMAT_BRX_SHORT, 3000.90, "3K"}, + {FORMAT_BRX_SHORT, 1000000, "1M"}, + {FORMAT_BRX_SHORT, new BigInteger("12345678901234567890"), + "12345679T"}, + {FORMAT_BRX_SHORT, new BigDecimal("12345678901234567890.89"), + "12345679T"}, + // Less than 1000 no suffix + {FORMAT_SW_LONG, 499, "499"}, + // Boundary number + {FORMAT_SW_LONG, 1000, "elfu 1"}, + // Long path + {FORMAT_SW_LONG, 3000000L, "milioni 3"}, + // Long path, negative + {FORMAT_SW_LONG, -3000000L, "milioni -3"}, + // Double path + {FORMAT_SW_LONG, 3000000.0, "milioni 3"}, + // Double path, negative + {FORMAT_SW_LONG, -3000000.0, "milioni -3"}, + // BigInteger path + {FORMAT_SW_LONG, new BigInteger("12345678901234567890"), + "trilioni 12345679"}, + // BigDecimal path + {FORMAT_SW_LONG, new BigDecimal("12345678901234567890.89"), + "trilioni 12345679"}, + // Positives + // No compact form + {FORMAT_SE_SHORT, 999, "999"}, + // Long + {FORMAT_SE_SHORT, 8000000L, "8\u00a0mn"}, + // Double + {FORMAT_SE_SHORT, 8000.98, "8\u00a0dt"}, + // Big integer + {FORMAT_SE_SHORT, new BigInteger("12345678901234567890"), "12345679\u00a0bn"}, + // Big decimal + {FORMAT_SE_SHORT, new BigDecimal("12345678901234567890.98"), "12345679\u00a0bn"}, + // Negatives + // No compact form + {FORMAT_SE_SHORT, -999, "\u2212999"}, + // Long + {FORMAT_SE_SHORT, -8000000L, "\u22128\u00a0mn"}, + // Double + {FORMAT_SE_SHORT, -8000.98, "\u22128\u00a0dt"}, + // BigInteger + {FORMAT_SE_SHORT, new BigInteger("-12345678901234567890"), "\u221212345679\u00a0bn"}, + // BigDecimal + {FORMAT_SE_SHORT, new BigDecimal("-12345678901234567890.98"), "\u221212345679\u00a0bn"},}; + } + + @DataProvider(name = "parse") + Object[][] compactParseData() { + return new Object[][]{ + // compact number format instance, string to parse, parsed number, return type + {FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" + + "\u0F42 \u0F21", 1000L, Long.class}, + {FORMAT_DZ_LONG, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" + + "\u0F42 \u0F23", -3000L, Long.class}, + {FORMAT_DZ_LONG, "\u0F51\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62" + + "\u0F0B\u0F66\u0F0B\u0F61\u0F0B \u0F21" + + "\u0F22\u0F23\u0F24\u0F25\u0F27", 1.23457E19, Double.class}, + {FORMAT_DZ_LONG, "-\u0F51\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62" + + "\u0F0B\u0F66\u0F0B\u0F61\u0F0B \u0F21" + + "\u0F22\u0F23\u0F24\u0F25\u0F27", -1.23457E19, Double.class}, + {FORMAT_EN_US_SHORT, "-0.0", -0.0, Double.class}, + {FORMAT_EN_US_SHORT, "-0", -0.0, Double.class}, + {FORMAT_EN_US_SHORT, "0", 0L, Long.class}, + {FORMAT_EN_US_SHORT, "499", 499L, Long.class}, + {FORMAT_EN_US_SHORT, "-499", -499L, Long.class}, + {FORMAT_EN_US_SHORT, "499.89", 499.89, Double.class}, + {FORMAT_EN_US_SHORT, "-499.89", -499.89, Double.class}, + {FORMAT_EN_US_SHORT, "1K", 1000L, Long.class}, + {FORMAT_EN_US_SHORT, "-1K", -1000L, Long.class}, + {FORMAT_EN_US_SHORT, "3K", 3000L, Long.class}, + {FORMAT_EN_US_SHORT, "17K", 17000L, Long.class}, + {FORMAT_EN_US_SHORT, "-17K", -17000L, Long.class}, + {FORMAT_EN_US_SHORT, "-3K", -3000L, Long.class}, + {FORMAT_EN_US_SHORT, "12345678901234567890", 1.2345678901234567E19, Double.class}, + {FORMAT_EN_US_SHORT, "12345679T", 1.2345679E19, Double.class}, + {FORMAT_EN_US_SHORT, "-12345679T", -1.2345679E19, Double.class}, + {FORMAT_EN_US_SHORT, "599.01K", 599010L, Long.class}, + {FORMAT_EN_US_SHORT, "-599.01K", -599010L, Long.class}, + {FORMAT_EN_US_SHORT, "599444444.90T", 5.994444449E20, Double.class}, + {FORMAT_EN_US_SHORT, "-599444444.90T", -5.994444449E20, Double.class}, + {FORMAT_EN_US_SHORT, "123456789012345.5678K", 123456789012345568L, Long.class}, + {FORMAT_EN_US_SHORT, "17.000K", 17000L, Long.class}, + {FORMAT_EN_US_SHORT, "123.56678K", 123566.78000, Double.class}, + {FORMAT_EN_US_SHORT, "-123.56678K", -123566.78000, Double.class}, + {FORMAT_EN_LONG, "999", 999L, Long.class}, + {FORMAT_EN_LONG, "1 thousand", 1000L, Long.class}, + {FORMAT_EN_LONG, "3 thousand", 3000L, Long.class}, + {FORMAT_EN_LONG, "12345679 trillion", 1.2345679E19, Double.class}, + {FORMAT_HI_IN_LONG, "999", 999L, Long.class}, + {FORMAT_HI_IN_LONG, "-999", -999L, Long.class}, + {FORMAT_HI_IN_LONG, "1 \u0939\u091C\u093C\u093E\u0930", 1000L, Long.class}, + {FORMAT_HI_IN_LONG, "-1 \u0939\u091C\u093C\u093E\u0930", -1000L, Long.class}, + {FORMAT_HI_IN_LONG, "3 \u0939\u091C\u093C\u093E\u0930", 3000L, Long.class}, + {FORMAT_HI_IN_LONG, "12345679 \u0916\u0930\u092C", 1234567900000000000L, Long.class}, + {FORMAT_HI_IN_LONG, "-12345679 \u0916\u0930\u092C", -1234567900000000000L, Long.class}, + {FORMAT_JA_JP_SHORT, "-99", -99L, Long.class}, + {FORMAT_JA_JP_SHORT, "1\u4E07", 10000L, Long.class}, + {FORMAT_JA_JP_SHORT, "30\u4E07", 300000L, Long.class}, + {FORMAT_JA_JP_SHORT, "-30\u4E07", -300000L, Long.class}, + {FORMAT_JA_JP_SHORT, "12345679\u5146", 1.2345679E19, Double.class}, + {FORMAT_JA_JP_SHORT, "-12345679\u5146", -1.2345679E19, Double.class}, + {FORMAT_IT_SHORT, "-99", -99L, Long.class}, + {FORMAT_IT_SHORT, "1\u00a0Mln", 1000000L, Long.class}, + {FORMAT_IT_SHORT, "30\u00a0Mln", 30000000L, Long.class}, + {FORMAT_IT_SHORT, "-30\u00a0Mln", -30000000L, Long.class}, + {FORMAT_IT_SHORT, "12345679\u00a0Bln", 1.2345679E19, Double.class}, + {FORMAT_IT_SHORT, "-12345679\u00a0Bln", -1.2345679E19, Double.class}, + {FORMAT_SW_LONG, "-0.0", -0.0, Double.class}, + {FORMAT_SW_LONG, "499", 499L, Long.class}, + {FORMAT_SW_LONG, "elfu 1", 1000L, Long.class}, + {FORMAT_SW_LONG, "elfu 3", 3000L, Long.class}, + {FORMAT_SW_LONG, "elfu 17", 17000L, Long.class}, + {FORMAT_SW_LONG, "elfu -3", -3000L, Long.class}, + {FORMAT_SW_LONG, "499", 499L, Long.class}, + {FORMAT_SW_LONG, "-499", -499L, Long.class}, + {FORMAT_SW_LONG, "elfu 1", 1000L, Long.class}, + {FORMAT_SW_LONG, "elfu 3", 3000L, Long.class}, + {FORMAT_SW_LONG, "elfu -3", -3000L, Long.class}, + {FORMAT_SW_LONG, "elfu 17", 17000L, Long.class}, + {FORMAT_SW_LONG, "trilioni 12345679", 1.2345679E19, Double.class}, + {FORMAT_SW_LONG, "trilioni -12345679", -1.2345679E19, Double.class}, + {FORMAT_SW_LONG, "elfu 599.01", 599010L, Long.class}, + {FORMAT_SW_LONG, "elfu -599.01", -599010L, Long.class}, + {FORMAT_SE_SHORT, "999", 999L, Long.class}, + {FORMAT_SE_SHORT, "8\u00a0mn", 8000000L, Long.class}, + {FORMAT_SE_SHORT, "8\u00a0dt", 8000L, Long.class}, + {FORMAT_SE_SHORT, "12345679\u00a0bn", 1.2345679E19, Double.class}, + {FORMAT_SE_SHORT, "12345679,89\u00a0bn", 1.2345679890000001E19, Double.class}, + {FORMAT_SE_SHORT, "\u2212999", -999L, Long.class}, + {FORMAT_SE_SHORT, "\u22128\u00a0mn", -8000000L, Long.class}, + {FORMAT_SE_SHORT, "\u22128\u00a0dt", -8000L, Long.class}, + {FORMAT_SE_SHORT, "\u221212345679\u00a0bn", -1.2345679E19, Double.class}, + {FORMAT_SE_SHORT, "\u221212345679,89\u00a0bn", -1.2345679890000001E19, Double.class},}; + } + + @DataProvider(name = "exceptionParse") + Object[][] exceptionParseData() { + return new Object[][]{ + // compact number instance, string to parse, null (no o/p; must throws exception) + // no number + {FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" + + "\u0F42", null}, + // Invalid prefix + {FORMAT_DZ_LONG, "-\u0F66\u0F9F\u0F7C\u0F44,\u0F0B\u0F55\u0FB2" + + "\u0F42 \u0F23", null}, + // Invalid prefix for en_US + {FORMAT_EN_US_SHORT, "K12,347", null}, + // Invalid prefix for ja_JP + {FORMAT_JA_JP_SHORT, "\u4E071", null}, + // Localized minus sign should be used + {FORMAT_SE_SHORT, "-8\u00a0mn", null},}; + } + + @DataProvider(name = "invalidParse") + Object[][] invalidParseData() { + return new Object[][]{ + // compact number instance, string to parse, parsed number + // Prefix and suffix do not match + {FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" + + "\u0F42 \u0F21 KM", 1000L}, + // Exponents are unparseable + {FORMAT_EN_US_SHORT, "-1.05E4K", -1.05}, + // Default instance does not allow grouping + {FORMAT_EN_US_SHORT, "12,347", 12L}, + // Take partial suffix "K" as 1000 for en_US_SHORT patterns + {FORMAT_EN_US_SHORT, "12KM", 12000L}, + // Invalid suffix + {FORMAT_HI_IN_LONG, "-1 \u00a0\u0915.", -1L},}; + } + + @DataProvider(name = "fieldPosition") + Object[][] formatFieldPositionData() { + return new Object[][]{ + //compact number instance, number to format, field, start position, end position, formatted string + {FORMAT_DZ_LONG, -3500, NumberFormat.Field.SIGN, 0, 1, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"}, + {FORMAT_DZ_LONG, 3500, NumberFormat.Field.INTEGER, 9, 10, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"}, + {FORMAT_DZ_LONG, -3500, NumberFormat.Field.INTEGER, 10, 11, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"}, + {FORMAT_DZ_LONG, 999, NumberFormat.Field.INTEGER, 0, 3, "\u0F29\u0F29\u0F29"}, + {FORMAT_DZ_LONG, -999, NumberFormat.Field.INTEGER, 1, 4, "-\u0F29\u0F29\u0F29"}, + {FORMAT_DZ_LONG, 3500, NumberFormat.Field.PREFIX, 0, 9, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"}, + {FORMAT_DZ_LONG, -3500, NumberFormat.Field.PREFIX, 0, 10, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"}, + {FORMAT_DZ_LONG, 999, NumberFormat.Field.PREFIX, 0, 0, "\u0F29\u0F29\u0F29"}, + {FORMAT_EN_US_SHORT, -3500, NumberFormat.Field.SIGN, 0, 1, "-4K"}, + {FORMAT_EN_US_SHORT, 3500, NumberFormat.Field.INTEGER, 0, 1, "4K"}, + {FORMAT_EN_US_SHORT, 14900000067L, NumberFormat.Field.INTEGER, 0, 2, "15B"}, + {FORMAT_EN_US_SHORT, -1000, NumberFormat.Field.PREFIX, 0, 1, "-1K"}, + {FORMAT_EN_US_SHORT, 3500, NumberFormat.Field.SUFFIX, 1, 2, "4K"}, + {FORMAT_EN_US_SHORT, 14900000067L, NumberFormat.Field.SUFFIX, 2, 3, "15B"}, + {FORMAT_EN_LONG, 3500, NumberFormat.Field.INTEGER, 0, 1, "4 thousand"}, + {FORMAT_EN_LONG, 14900000067L, NumberFormat.Field.INTEGER, 0, 2, "15 billion"}, + {FORMAT_EN_LONG, 3500, NumberFormat.Field.SUFFIX, 1, 10, "4 thousand"}, + {FORMAT_EN_LONG, 14900000067L, NumberFormat.Field.SUFFIX, 2, 10, "15 billion"}, + {FORMAT_JA_JP_SHORT, 14900000067L, NumberFormat.Field.INTEGER, 0, 3, "149\u5104"}, + {FORMAT_JA_JP_SHORT, -999.99, NumberFormat.Field.INTEGER, 1, 6, "-1,000"}, + {FORMAT_JA_JP_SHORT, 14900000067L, NumberFormat.Field.SUFFIX, 3, 4, "149\u5104"}, + {FORMAT_JA_JP_SHORT, -999.99, NumberFormat.Field.SUFFIX, 0, 0, "-1,000"}, + {FORMAT_JA_JP_SHORT, -999.99, NumberFormat.Field.SIGN, 0, 1, "-1,000"}, + {FORMAT_HI_IN_LONG, -14900000067L, NumberFormat.Field.SIGN, 0, 1, + "-15 \u0905\u0930\u092C"}, + {FORMAT_HI_IN_LONG, 3500, NumberFormat.Field.INTEGER, 0, 1, + "4 \u0939\u091C\u093C\u093E\u0930"}, + {FORMAT_HI_IN_LONG, 14900000067L, NumberFormat.Field.INTEGER, 0, 2, + "15 \u0905\u0930\u092C"}, + {FORMAT_HI_IN_LONG, 3500, NumberFormat.Field.SUFFIX, 1, 7, + "4 \u0939\u091C\u093C\u093E\u0930"}, + {FORMAT_HI_IN_LONG, 14900000067L, NumberFormat.Field.SUFFIX, 2, 6, + "15 \u0905\u0930\u092C"}, + {FORMAT_SE_SHORT, 8000000L, NumberFormat.Field.SUFFIX, 1, 4, "8\u00a0mn"}, + {FORMAT_SE_SHORT, 8000.98, NumberFormat.Field.SUFFIX, 1, 4, "8\u00a0dt"}, + {FORMAT_SE_SHORT, new BigInteger("12345678901234567890"), NumberFormat.Field.SUFFIX, 8, 11, "12345679\u00a0bn"}, + {FORMAT_SE_SHORT, new BigDecimal("12345678901234567890.98"), NumberFormat.Field.SUFFIX, 8, 11, "12345679\u00a0bn"}, + {FORMAT_SE_SHORT, -8000000L, NumberFormat.Field.INTEGER, 1, 2, "\u22128\u00a0mn"}, + {FORMAT_SE_SHORT, -8000.98, NumberFormat.Field.SIGN, 0, 1, "\u22128\u00a0dt"}, + {FORMAT_SE_SHORT, new BigDecimal("-48982865901234567890.98"), NumberFormat.Field.INTEGER, 1, 9, "\u221248982866\u00a0bn"},}; + } + + @DataProvider(name = "varParsePosition") + Object[][] varParsePosition() { + return new Object[][]{ + // compact number instance, parse string, parsed number, + // start position, end position, error index + {FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" + + "\u0F42 \u0F21 KM", 1000L, 0, 10, -1}, + // Invalid prefix returns null + {FORMAT_DZ_LONG, "Number is: -\u0F66\u0F9F\u0F7C\u0F44,\u0F0B\u0F55\u0FB2" + + "\u0F42 \u0F23", null, 11, 11, 11}, + // Returns null + {FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" + + "\u0F42", null, 0, 0, 0}, + {FORMAT_EN_US_SHORT, "Exponent: -1.05E4K", -1.05, 10, 15, -1}, + // Default instance does not allow grouping + {FORMAT_EN_US_SHORT, "12,347", 12L, 0, 2, -1}, + // Invalid suffix "KM" for en_US_SHORT patterns + {FORMAT_EN_US_SHORT, "12KM", 12000L, 0, 3, -1}, + // Invalid suffix + {FORMAT_HI_IN_LONG, "-1 \u00a0\u0915.", -1L, 0, 2, -1}, + {FORMAT_EN_LONG, "Number is: 12345679 trillion", + 1.2345679E19, 11, 28, -1}, + {FORMAT_EN_LONG, "Number is: -12345679 trillion", + -1.2345679E19, 11, 29, -1}, + {FORMAT_EN_LONG, "parse 12 thousand and four", 12000L, 6, 17, -1},}; + } + + @Test + public void testInstanceCreation() { + Stream.of(NumberFormat.getAvailableLocales()).forEach(l -> NumberFormat + .getCompactNumberInstance(l, NumberFormat.Style.SHORT).format(10000)); + Stream.of(NumberFormat.getAvailableLocales()).forEach(l -> NumberFormat + .getCompactNumberInstance(l, NumberFormat.Style.LONG).format(10000)); + } + + @Test(dataProvider = "format") + public void testFormat(NumberFormat cnf, Object number, + String expected) { + CompactFormatAndParseHelper.testFormat(cnf, number, expected); + } + + @Test(dataProvider = "parse") + public void testParse(NumberFormat cnf, String parseString, + Number expected, Class returnType) throws ParseException { + CompactFormatAndParseHelper.testParse(cnf, parseString, expected, null, returnType); + } + + @Test(dataProvider = "parse") + public void testParsePosition(NumberFormat cnf, String parseString, + Number expected, Class returnType) throws ParseException { + ParsePosition pos = new ParsePosition(0); + CompactFormatAndParseHelper.testParse(cnf, parseString, expected, pos, returnType); + assertEquals(pos.getIndex(), parseString.length()); + assertEquals(pos.getErrorIndex(), -1); + } + + @Test(dataProvider = "varParsePosition") + public void testVarParsePosition(NumberFormat cnf, String parseString, + Number expected, int startPosition, int indexPosition, + int errPosition) throws ParseException { + ParsePosition pos = new ParsePosition(startPosition); + CompactFormatAndParseHelper.testParse(cnf, parseString, expected, pos, null); + assertEquals(pos.getIndex(), indexPosition); + assertEquals(pos.getErrorIndex(), errPosition); + } + + @Test(dataProvider = "exceptionParse", expectedExceptions = ParseException.class) + public void throwsParseException(NumberFormat cnf, String parseString, + Number expected) throws ParseException { + CompactFormatAndParseHelper.testParse(cnf, parseString, expected, null, null); + } + + @Test(dataProvider = "invalidParse") + public void testInvalidParse(NumberFormat cnf, String parseString, + Number expected) throws ParseException { + CompactFormatAndParseHelper.testParse(cnf, parseString, expected, null, null); + } + + @Test(dataProvider = "fieldPosition") + public void testFormatWithFieldPosition(NumberFormat nf, + Object number, Format.Field field, int posStartExpected, + int posEndExpected, String expected) { + FieldPosition pos = new FieldPosition(field); + StringBuffer buf = new StringBuffer(); + StringBuffer result = nf.format(number, buf, pos); + assertEquals(result.toString(), expected, "Incorrect formatting of the number '" + + number + "'"); + assertEquals(pos.getBeginIndex(), posStartExpected, "Incorrect start position" + + " while formatting the number '" + number + "', for the field " + field); + assertEquals(pos.getEndIndex(), posEndExpected, "Incorrect end position" + + " while formatting the number '" + number + "', for the field " + field); + } + +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/TestCompactPatternsValidity.java b/test/jdk/java/text/Format/CompactNumberFormat/TestCompactPatternsValidity.java new file mode 100644 index 00000000000..962393eaff3 --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/TestCompactPatternsValidity.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8177552 + * @summary Checks the validity of compact number patterns specified through + * CompactNumberFormat constructor + * @run testng/othervm TestCompactPatternsValidity + */ + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.text.CompactNumberFormat; +import java.text.DecimalFormatSymbols; +import java.text.ParseException; +import java.util.List; +import java.util.Locale; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class TestCompactPatternsValidity { + + // Max range 10^4 + private static final String[] COMPACT_PATTERN1 = new String[]{"0", "0", "0", "0K", "00K"}; + // Quoted special character '.' as prefix + private static final String[] COMPACT_PATTERN2 = new String[]{"0", "'.'K0"}; + // Quoted special character '.' as suffix + private static final String[] COMPACT_PATTERN3 = new String[]{"0", "0", "0", "0K", "00K'.'"}; + // Containing both prefix and suffix + private static final String[] COMPACT_PATTERN4 = new String[]{"", "", "H0H", "0K", "00K", "H0G"}; + // Differing while specifying prefix and suffix + private static final String[] COMPACT_PATTERN5 = new String[]{"", "", "", "0K", "K0"}; + // Containing both prefix ('.') and suffix (K) + private static final String[] COMPACT_PATTERN6 = new String[]{"0", "", "", "'.'0K"}; + // Quoted special character ',' as suffix + private static final String[] COMPACT_PATTERN7 = new String[]{"", "0", "0", "0K','"}; + // Most commonly used type of compact patterns with 15 elements + private static final String[] COMPACT_PATTERN8 = new String[]{"", "", "", "0K", "00K", "000K", "0M", + "00M", "000M", "0B", "00B", "000B", "0T", "00T", "000T"}; + // All empty or special patterns; checking the default formatting behaviour + private static final String[] COMPACT_PATTERN9 = new String[]{"", "", "", "0", "0", "", "", "", "", "", "", "", "", "", ""}; + // Patterns beyond 10^19; divisors beyond long range + private static final String[] COMPACT_PATTERN10 = new String[]{"", "", "", "0K", "00K", "000K", "0M", "00M", + "000M", "0B", "00B", "000B", "0T", "00T", "000T", "0L", "00L", "000L", "0XL", "00XL"}; + // Containing positive;negative subpatterns + private static final String[] COMPACT_PATTERN11 = new String[]{"", "", "", "elfu 0;elfu -0", "elfu 00;elfu -00", + "elfu 000;elfu -000", "milioni 0;milioni -0", "milioni 00;milioni -00", "milioni 000;milioni -000"}; + // Containing both prefix and suffix and positive;negative subpatern + private static final String[] COMPACT_PATTERN12 = new String[]{"", "", "H0H;H-0H", "0K;0K-", "00K;-00K", "H0G;-H0G"}; + + @DataProvider(name = "invalidPatterns") + Object[][] invalidCompactPatterns() { + return new Object[][]{ + // compact patterns + // Pattern containing unquoted special character '.' + {new String[]{"", "", "", "0K", "00K."}}, + // Pattern containing invalid single quote + {new String[]{"", "", "", "0 'do", "00K"}}, + {new String[]{"", "", "", "0K", "00 don't"}}, + // A non empty pattern containing no 0s (min integer digits) + {new String[]{"K", "0K", "00K"}}, + // 0s (min integer digits) exceeding for the range at index 3 + {new String[]{"", "", "0K", "00000K"}},}; + } + + @DataProvider(name = "validPatternsFormat") + Object[][] validPatternsFormat() { + return new Object[][]{ + // compact patterns, numbers, expected output + {COMPACT_PATTERN1, List.of(200, 1000, 3000, 500000), List.of("200", "1K", "3K", "500K")}, + {COMPACT_PATTERN2, List.of(1, 20, 3000), List.of("1", ".K2", ".K300")}, + {COMPACT_PATTERN3, List.of(100.99, 1000, 30000), List.of("101", "1K", "30K.")}, + {COMPACT_PATTERN4, List.of(0.0, 500, -500, 30000, 5000000), List.of("0", "H5H", "-H5H", "30K", "H50G")}, + {COMPACT_PATTERN5, List.of(100, 1000, 30000), List.of("100", "1K", "K3")}, + {COMPACT_PATTERN6, List.of(20.99, 1000, 30000), List.of("21", ".1K", ".30K")}, + {COMPACT_PATTERN7, List.of(100, 1000, new BigInteger("12345678987654321")), List.of("100", "1K,", "12345678987654K,")}, + {COMPACT_PATTERN8, List.of(new BigInteger("223565686837667632"), new BigDecimal("12322456774334.89766"), 30000, 3456.78), + List.of("223566T", "12T", "30K", "3K")}, + {COMPACT_PATTERN9, List.of(new BigInteger("223566000000000000"), new BigDecimal("12345678987654567"), 30000, 3000), + List.of("223,566,000,000,000,000", "12,345,678,987,654,567", "30,000", "3,000")}, + {COMPACT_PATTERN10, List.of(new BigInteger("100000000000000000"), new BigInteger("10000000000000000000"), new BigDecimal("555555555555555555555.89766"), 30000), + List.of("100L", "10XL", "556XL", "30K")}, + {COMPACT_PATTERN11, List.of(20.99, -20.99, 1000, -1000, 30000, -30000, new BigInteger("12345678987654321"), new BigInteger("-12345678987654321")), + List.of("21", "-21", "elfu 1", "elfu -1", "elfu 30", "elfu -30", "milioni 12345678988", "milioni -12345678988")}, + {COMPACT_PATTERN12, List.of(0, 500, -500, 30000, -3000, 5000000), List.of("0", "H5H", "H-5H", "30K", "3K-", "H50G")},}; + } + + @DataProvider(name = "validPatternsParse") + Object[][] validPatternsParse() { + return new Object[][]{ + // compact patterns, parse string, expected output + {COMPACT_PATTERN1, List.of(".56", "200", ".1K", "3K", "500K"), List.of(0.56, 200L, 100L, 3000L, 500000L)}, + {COMPACT_PATTERN2, List.of("1", ".K2", ".K300"), List.of(1L, 20L, 3000L)}, + {COMPACT_PATTERN3, List.of("101", "1K", "30K."), List.of(101L, 1000L, 30000L)}, + {COMPACT_PATTERN4, List.of("0", "H5H", "-H5H", "30K", "H50G"), List.of(0L, 500L, -500L, 30000L, 5000000L)}, + {COMPACT_PATTERN5, List.of("100", "1K", "K3"), List.of(100L, 1000L, 30000L)}, + {COMPACT_PATTERN6, List.of("21", ".1K", ".30K"), List.of(21L, 1000L, 30000L)}, + {COMPACT_PATTERN7, List.of("100", "1K,", "12345678987654K,"), List.of(100L, 1000L, 12345678987654000L)}, + {COMPACT_PATTERN8, List.of("223566T", "12T", "30K", "3K"), List.of(223566000000000000L, 12000000000000L, 30000L, 3000L)}, + {COMPACT_PATTERN10, List.of("1L", "100L", "10XL", "556XL", "30K"), List.of(1000000000000000L, 100000000000000000L, 1.0E19, 5.56E20, 30000L)}, + {COMPACT_PATTERN11, List.of("21", "-21", "100.90", "-100.90", "elfu 1", "elfu -1", "elfu 30", "elfu -30", "milioni 12345678988", "milioni -12345678988"), + List.of(21L, -21L, 100.90, -100.90, 1000L, -1000L, 30000L, -30000L, 12345678988000000L, -12345678988000000L)}, + {COMPACT_PATTERN12, List.of("0", "H5H", "H-5H", "30K", "30K-", "H50G"), List.of(0L, 500L, -500L, 30000L, -30000L, 5000000L)},}; + } + + @Test(dataProvider = "invalidPatterns", + expectedExceptions = RuntimeException.class) + public void testInvalidCompactPatterns(String[] compactPatterns) { + new CompactNumberFormat("#,##0.0#", DecimalFormatSymbols + .getInstance(Locale.US), compactPatterns); + } + + @Test(dataProvider = "validPatternsFormat") + public void testValidPatternsFormat(String[] compactPatterns, + List numbers, List expected) { + CompactNumberFormat fmt = new CompactNumberFormat("#,##0.0#", + DecimalFormatSymbols.getInstance(Locale.US), compactPatterns); + for (int index = 0; index < numbers.size(); index++) { + CompactFormatAndParseHelper.testFormat(fmt, numbers.get(index), + expected.get(index)); + } + } + + @Test(dataProvider = "validPatternsParse") + public void testValidPatternsParse(String[] compactPatterns, + List parseString, List numbers) throws ParseException { + CompactNumberFormat fmt = new CompactNumberFormat("#,##0.0#", + DecimalFormatSymbols.getInstance(Locale.US), compactPatterns); + for (int index = 0; index < parseString.size(); index++) { + CompactFormatAndParseHelper.testParse(fmt, parseString.get(index), + numbers.get(index), null, null); + } + } +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/TestEquality.java b/test/jdk/java/text/Format/CompactNumberFormat/TestEquality.java new file mode 100644 index 00000000000..242dd53ca38 --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/TestEquality.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8177552 + * @summary Checks the equals and hashCode method of CompactNumberFormat + * @modules jdk.localedata + * @run testng/othervm TestEquality + * + */ + +import java.text.CompactNumberFormat; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.util.Locale; +import org.testng.annotations.Test; + +public class TestEquality { + + @Test + public void testEquality() { + CompactNumberFormat cnf1 = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); + + CompactNumberFormat cnf2 = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); + + // A custom compact instance with the same state as + // compact number instance of "en_US" locale with SHORT style + String decimalPattern = "#,##0.###"; + String[] compactPatterns = new String[]{"", "", "", "0K", "00K", "000K", "0M", "00M", "000M", "0B", "00B", "000B", "0T", "00T", "000T"}; + DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(Locale.US); + CompactNumberFormat cnf3 = new CompactNumberFormat(decimalPattern, symbols, compactPatterns); + + // A compact instance created with different decimalPattern than cnf3 + CompactNumberFormat cnf4 = new CompactNumberFormat("#,#0.0#", symbols, compactPatterns); + + // A compact instance created with different format symbols than cnf3 + CompactNumberFormat cnf5 = new CompactNumberFormat(decimalPattern, + DecimalFormatSymbols.getInstance(Locale.JAPAN), compactPatterns); + + // A compact instance created with different compact patterns than cnf3 + CompactNumberFormat cnf6 = new CompactNumberFormat(decimalPattern, + symbols, new String[]{"", "", "", "0K", "00K", "000K"}); + + // Checking reflexivity + if (!cnf1.equals(cnf1)) { + throw new RuntimeException("[testEquality() reflexivity FAILED: The compared" + + " objects must be equal]"); + } + + // Checking symmetry, checking equality of two same objects + if (!cnf1.equals(cnf2) || !cnf2.equals(cnf1)) { + throw new RuntimeException("[testEquality() symmetry FAILED: The compared" + + " objects must be equal]"); + } + + // Checking transitivity, three objects must be equal + if (!cnf1.equals(cnf2) || !cnf2.equals(cnf3) || !cnf1.equals(cnf3)) { + throw new RuntimeException("[testEquality() transitivity FAILED: The compared" + + " objects must be equal]"); + } + + // Objects must not be equal as the decimalPattern is different + checkEquals(cnf3, cnf4, false, "1st", "different decimal pattern"); + + // Objects must not be equal as the format symbols instance is different + checkEquals(cnf3, cnf5, false, "2nd", "different format symbols"); + + // Objects must not be equal as the compact patters are different + checkEquals(cnf3, cnf6, false, "3rd", "different compact patterns"); + + // Changing the min integer digits of first object; objects must not + // be equal + cnf1.setMinimumIntegerDigits(5); + checkEquals(cnf1, cnf2, false, "4th", "different min integer digits"); + + // Changing the min integer digits of second object; objects must + // be equal + cnf2.setMinimumIntegerDigits(5); + checkEquals(cnf1, cnf2, true, "5th", ""); + + // Changing the grouping size of first object; objects must not + // be equal + cnf1.setGroupingSize(4); + checkEquals(cnf1, cnf2, false, "6th", "different grouping size"); + + // Changing the grouping size if second object; objects must be equal + cnf2.setGroupingSize(4); + checkEquals(cnf1, cnf2, true, "7th", ""); + + // Changing the parseBigDecimal of first object; objects must not + // be equal + cnf1.setParseBigDecimal(true); + checkEquals(cnf1, cnf2, false, "8th", "different parse big decimal"); + + } + + private void checkEquals(CompactNumberFormat cnf1, CompactNumberFormat cnf2, + boolean mustEqual, String nthComparison, String message) { + if (cnf1.equals(cnf2) != mustEqual) { + if (mustEqual) { + throw new RuntimeException("[testEquality() " + nthComparison + + " comparison FAILED: The compared objects must be equal]"); + } else { + throw new RuntimeException("[testEquality() " + nthComparison + + " comparison FAILED: The compared objects must" + + " not be equal because of " + message + "]"); + } + } + } + + @Test + public void testHashCode() { + NumberFormat cnf1 = NumberFormat + .getCompactNumberInstance(Locale.JAPAN, NumberFormat.Style.SHORT); + NumberFormat cnf2 = NumberFormat + .getCompactNumberInstance(Locale.JAPAN, NumberFormat.Style.SHORT); + + if (cnf1.hashCode() != cnf2.hashCode()) { + throw new RuntimeException("[testHashCode() FAILED: hashCode of the" + + " compared objects must match]"); + } + } + + // Test the property of equals and hashCode i.e. two equal object must + // always have the same hashCode + @Test + public void testEqualsAndHashCode() { + NumberFormat cnf1 = NumberFormat + .getCompactNumberInstance(new Locale("hi", "IN"), NumberFormat.Style.SHORT); + cnf1.setMinimumIntegerDigits(5); + NumberFormat cnf2 = NumberFormat + .getCompactNumberInstance(new Locale("hi", "IN"), NumberFormat.Style.SHORT); + cnf2.setMinimumIntegerDigits(5); + if (cnf1.equals(cnf2)) { + if (cnf1.hashCode() != cnf2.hashCode()) { + throw new RuntimeException("[testEqualsAndHashCode() FAILED: two" + + " equal objects must have same hashCode]"); + } + } else { + throw new RuntimeException("[testEqualsAndHashCode() FAILED: The" + + " compared objects must be equal]"); + } + } + +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/TestFormatToCharacterIterator.java b/test/jdk/java/text/Format/CompactNumberFormat/TestFormatToCharacterIterator.java new file mode 100644 index 00000000000..67990455668 --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/TestFormatToCharacterIterator.java @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8177552 + * @summary Checks the functioning of + * CompactNumberFormat.formatToCharacterIterator method + * @modules jdk.localedata + * @run testng/othervm TestFormatToCharacterIterator + */ +import java.math.BigDecimal; +import java.math.BigInteger; +import java.text.AttributedCharacterIterator; +import java.text.CharacterIterator; +import java.text.Format; +import java.text.NumberFormat; +import java.util.Locale; +import java.util.Set; +import static org.testng.Assert.assertEquals; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class TestFormatToCharacterIterator { + + private static final NumberFormat FORMAT_DZ = NumberFormat + .getCompactNumberInstance(new Locale("dz"), + NumberFormat.Style.LONG); + + private static final NumberFormat FORMAT_EN_US = NumberFormat + .getCompactNumberInstance(Locale.US, + NumberFormat.Style.SHORT); + + private static final NumberFormat FORMAT_EN_LONG = NumberFormat + .getCompactNumberInstance(new Locale("en"), + NumberFormat.Style.LONG); + + @DataProvider(name = "fieldPositions") + Object[][] compactFieldPositionData() { + return new Object[][]{ + // compact format instance, number, resulted string, attributes/fields, attribute positions + {FORMAT_DZ, 1000.09, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F21", + new Format.Field[]{NumberFormat.Field.PREFIX, NumberFormat.Field.INTEGER}, new int[]{0, 9, 9, 10}}, + {FORMAT_DZ, -999.99, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F21", + new Format.Field[]{NumberFormat.Field.SIGN, NumberFormat.Field.PREFIX, NumberFormat.Field.INTEGER}, + new int[]{0, 1, 1, 10, 10, 11}}, + {FORMAT_DZ, -0.0, "-\u0F20", new Format.Field[]{NumberFormat.Field.SIGN, NumberFormat.Field.INTEGER}, new int[]{0, 1, 1, 2}}, + {FORMAT_DZ, 3000L, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F23", + new Format.Field[]{NumberFormat.Field.PREFIX, NumberFormat.Field.INTEGER}, new int[]{0, 9, 9, 10}}, + {FORMAT_DZ, new BigInteger("12345678901234567890"), + "\u0F51\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27", + new Format.Field[]{NumberFormat.Field.PREFIX, NumberFormat.Field.INTEGER}, new int[]{0, 14, 14, 20}}, + {FORMAT_DZ, new BigDecimal("12345678901234567890.89"), + "\u0F51\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27", + new Format.Field[]{NumberFormat.Field.PREFIX, NumberFormat.Field.INTEGER}, new int[]{0, 14, 14, 20}}, + // Zeros + {FORMAT_EN_US, 0, "0", new Format.Field[]{NumberFormat.Field.INTEGER}, new int[]{0, 1}}, + {FORMAT_EN_US, 0.0, "0", new Format.Field[]{NumberFormat.Field.INTEGER}, new int[]{0, 1}}, + {FORMAT_EN_US, -0.0, "-0", new Format.Field[]{NumberFormat.Field.SIGN, NumberFormat.Field.INTEGER}, new int[]{0, 1, 1, 2}}, + // Less than 1000 no suffix + {FORMAT_EN_US, 499, "499", new Format.Field[]{NumberFormat.Field.INTEGER}, new int[]{0, 3}}, + // Boundary number + {FORMAT_EN_US, 1000.0, "1K", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 1, 1, 2}}, + // Long + {FORMAT_EN_US, 3000L, "3K", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 1, 1, 2}}, + {FORMAT_EN_US, 30000L, "30K", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 2, 2, 3}}, + {FORMAT_EN_US, 300000L, "300K", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 3, 3, 4}}, + {FORMAT_EN_US, 3000000L, "3M", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 1, 1, 2}}, + {FORMAT_EN_US, 30000000L, "30M", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 2, 2, 3}}, + {FORMAT_EN_US, 300000000L, "300M", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 3, 3, 4}}, + {FORMAT_EN_US, 3000000000L, "3B", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 1, 1, 2}}, + {FORMAT_EN_US, 30000000000L, "30B", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 2, 2, 3}}, + {FORMAT_EN_US, 300000000000L, "300B", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 3, 3, 4}}, + {FORMAT_EN_US, 3000000000000L, "3T", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 1, 1, 2}}, + {FORMAT_EN_US, 30000000000000L, "30T", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 2, 2, 3}}, + {FORMAT_EN_US, 300000000000000L, "300T", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 3, 3, 4}}, + {FORMAT_EN_US, 3000000000000000L, "3000T", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 4, 4, 5}}, + // Double + {FORMAT_EN_US, 3000.0, "3K", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 1, 1, 2}}, + {FORMAT_EN_US, 30000.0, "30K", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 2, 2, 3}}, + {FORMAT_EN_US, 300000.0, "300K", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 3, 3, 4}}, + {FORMAT_EN_US, 3000000000000000.0, "3000T", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 4, 4, 5}}, + // BigInteger + {FORMAT_EN_US, new BigInteger("12345678901234567890"), "12345679T", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 8, 8, 9}}, + // BigDecimal + {FORMAT_EN_US, new BigDecimal("12345678901234567890.89"), "12345679T", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 8, 8, 9}}, + // Number as exponent + {FORMAT_EN_US, 9.78313E+3, "10K", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 2, 2, 3}}, + // Less than 1000 no suffix + {FORMAT_EN_LONG, 999, "999", new Format.Field[]{NumberFormat.Field.INTEGER}, new int[]{0, 3}}, + // Round the value and then format + {FORMAT_EN_LONG, 999.99, "1 thousand", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 1, 1, 10}}, + // 10 thousand + {FORMAT_EN_LONG, 99000, "99 thousand", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 2, 2, 11}}, + // Long path + {FORMAT_EN_LONG, 330000, "330 thousand", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 3, 3, 12}}, + // Double path + {FORMAT_EN_LONG, 3000.90, "3 thousand", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 1, 1, 10}}, + // BigInteger path + {FORMAT_EN_LONG, new BigInteger("12345678901234567890"), "12345679 trillion", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 8, 8, 17}}, + // BigDecimal path + {FORMAT_EN_LONG, new BigDecimal("12345678901234567890.89"), "12345679 trillion", + new Format.Field[]{NumberFormat.Field.INTEGER, NumberFormat.Field.SUFFIX}, new int[]{0, 8, 8, 17}} + }; + } + + @Test(dataProvider = "fieldPositions") + public void testFormatToCharacterIterator(NumberFormat fmt, Object number, + String expected, Format.Field[] expectedFields, int[] positions) { + AttributedCharacterIterator iterator = fmt.formatToCharacterIterator(number); + assertEquals(getText(iterator), expected, "Incorrect formatting of the number '" + + number + "'"); + + iterator.first(); + // Check start and end index of the formatted string + assertEquals(iterator.getBeginIndex(), 0, "Incorrect start index: " + + iterator.getBeginIndex() + " of the formatted string: " + expected); + assertEquals(iterator.getEndIndex(), expected.length(), "Incorrect end index: " + + iterator.getEndIndex() + " of the formatted string: " + expected); + + // Check the attributes returned by the formatToCharacterIterator + assertEquals(iterator.getAllAttributeKeys(), Set.of(expectedFields), + "Attributes do not match while formatting number: " + number); + + // Check the begin and end index for attributes + iterator.first(); + int currentPosition = 0; + do { + int start = iterator.getRunStart(); + int end = iterator.getRunLimit(); + assertEquals(start, positions[currentPosition], + "Incorrect start position for the attribute(s): " + + iterator.getAttributes().keySet()); + assertEquals(end, positions[currentPosition + 1], + "Incorrect end position for the attribute(s): " + + iterator.getAttributes().keySet()); + currentPosition = currentPosition + 2; + iterator.setIndex(end); + } while (iterator.current() != CharacterIterator.DONE); + } + + // Create the formatted string from returned AttributedCharacterIterator + private String getText(AttributedCharacterIterator iterator) { + StringBuffer buffer = new StringBuffer(); + for (char c = iterator.first(); c != CharacterIterator.DONE; + c = iterator.next()) { + buffer.append(c); + } + return buffer.toString(); + } + +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/TestMutatingInstance.java b/test/jdk/java/text/Format/CompactNumberFormat/TestMutatingInstance.java new file mode 100644 index 00000000000..b900b7d4468 --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/TestMutatingInstance.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8177552 + * @summary Checks the functioning of compact number format by changing the + * formatting parameters. For example, min fraction digits, grouping + * size etc. + * @modules jdk.localedata + * @run testng/othervm TestMutatingInstance + */ +import java.math.BigDecimal; +import java.math.BigInteger; +import java.text.CompactNumberFormat; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Locale; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class TestMutatingInstance { + + private static final NumberFormat FORMAT_FRACTION = NumberFormat + .getCompactNumberInstance(new Locale("en"), NumberFormat.Style.LONG); + + private static final CompactNumberFormat FORMAT_GROUPING = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(new Locale("en"), NumberFormat.Style.LONG); + + private static final NumberFormat FORMAT_MININTEGER = NumberFormat + .getCompactNumberInstance(new Locale("en"), NumberFormat.Style.LONG); + + private static final NumberFormat FORMAT_PARSEINTONLY = NumberFormat + .getCompactNumberInstance(new Locale("en"), NumberFormat.Style.LONG); + + // No compact patterns are specified for this instance except at index 4. + // This is to test how the behaviour differs between compact number formatting + // and general number formatting + private static final NumberFormat FORMAT_NO_PATTERNS = new CompactNumberFormat( + "#,##0.0#", DecimalFormatSymbols.getInstance(Locale.US), + new String[]{"", "", "", "", "00K", "", "", "", "", "", "", "", "", "", ""}); + + @BeforeTest + public void mutateInstances() { + FORMAT_FRACTION.setMinimumFractionDigits(2); + FORMAT_GROUPING.setGroupingSize(3); + FORMAT_GROUPING.setGroupingUsed(true); + FORMAT_MININTEGER.setMinimumIntegerDigits(5); + FORMAT_PARSEINTONLY.setParseIntegerOnly(true); + FORMAT_PARSEINTONLY.setGroupingUsed(true); + // Setting min fraction digits and other fields does not effect + // the general number formatting behaviour, when no compact number + // patterns are specified + FORMAT_NO_PATTERNS.setMinimumFractionDigits(2); + } + + @DataProvider(name = "format") + Object[][] compactFormatData() { + return new Object[][]{ + {FORMAT_FRACTION, 1900, "1.90 thousand"}, + {FORMAT_FRACTION, 1000, "1.00 thousand"}, + {FORMAT_FRACTION, 9090.99, "9.09 thousand"}, + {FORMAT_FRACTION, new BigDecimal(12346567890987654.32), + "12346.57 trillion"}, + {FORMAT_FRACTION, new BigInteger("12346567890987654"), + "12346.57 trillion"}, + {FORMAT_GROUPING, new BigDecimal(12346567890987654.32), + "12,347 trillion"}, + {FORMAT_GROUPING, 100000, "100 thousand"}, + {FORMAT_MININTEGER, 10000, "00010 thousand"}, + {FORMAT_NO_PATTERNS, 100000, "100,000"}, + {FORMAT_NO_PATTERNS, 1000.998, "1,001"}, + {FORMAT_NO_PATTERNS, 10900, "10.90K"}, + {FORMAT_NO_PATTERNS, new BigDecimal(12346567890987654.32), "12,346,567,890,987,654"},}; + } + + @DataProvider(name = "parse") + Object[][] compactParseData() { + return new Object[][]{ + {FORMAT_FRACTION, "190 thousand", 190000L}, + {FORMAT_FRACTION, "19.9 thousand", 19900L}, + {FORMAT_GROUPING, "12,346 thousand", 12346000L}, + {FORMAT_PARSEINTONLY, "12345 thousand", 12345000L}, + {FORMAT_PARSEINTONLY, "12,345 thousand", 12345000L}, + {FORMAT_PARSEINTONLY, "12.345 thousand", 12000L},}; + } + + @Test(dataProvider = "format") + public void formatCompactNumber(NumberFormat nf, + Object number, String expected) { + CompactFormatAndParseHelper.testFormat(nf, number, expected); + } + + @Test(dataProvider = "parse") + public void parseCompactNumber(NumberFormat nf, + String parseString, Number expected) throws ParseException { + CompactFormatAndParseHelper.testParse(nf, parseString, expected, null, null); + } + +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/TestParseBigDecimal.java b/test/jdk/java/text/Format/CompactNumberFormat/TestParseBigDecimal.java new file mode 100644 index 00000000000..673c18d7cac --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/TestParseBigDecimal.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8177552 + * @summary Checks CNF.parse() when parseBigDecimal is set to true + * @modules jdk.localedata + * @run testng/othervm TestParseBigDecimal + */ + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.math.BigDecimal; +import java.text.CompactNumberFormat; +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Locale; + +public class TestParseBigDecimal { + + private static final CompactNumberFormat FORMAT_DZ_LONG = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(new Locale("dz"), NumberFormat.Style.LONG); + + private static final CompactNumberFormat FORMAT_EN_US_SHORT = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); + + private static final CompactNumberFormat FORMAT_EN_LONG = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(new Locale("en"), NumberFormat.Style.LONG); + + private static final CompactNumberFormat FORMAT_HI_IN_LONG = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(new Locale("hi", "IN"), NumberFormat.Style.LONG); + + private static final CompactNumberFormat FORMAT_JA_JP_SHORT = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(Locale.JAPAN, NumberFormat.Style.SHORT); + + private static final CompactNumberFormat FORMAT_IT_SHORT = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(new Locale("it"), NumberFormat.Style.SHORT); + + private static final CompactNumberFormat FORMAT_SW_LONG = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(new Locale("sw"), NumberFormat.Style.LONG); + + private static final CompactNumberFormat FORMAT_SE_SHORT = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(new Locale("se"), NumberFormat.Style.SHORT); + + @BeforeTest + public void mutateInstances() { + FORMAT_DZ_LONG.setParseBigDecimal(true); + FORMAT_EN_US_SHORT.setParseBigDecimal(true); + FORMAT_EN_LONG.setParseBigDecimal(true); + FORMAT_HI_IN_LONG.setParseBigDecimal(true); + FORMAT_JA_JP_SHORT.setParseBigDecimal(true); + FORMAT_IT_SHORT.setParseBigDecimal(true); + FORMAT_SW_LONG.setParseBigDecimal(true); + FORMAT_SE_SHORT.setParseBigDecimal(true); + } + + @DataProvider(name = "parse") + Object[][] compactParseData() { + return new Object[][]{ + // compact number format instance, string to parse, parsed number + {FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" + + "\u0F42 \u0F21", new BigDecimal("1000")}, + {FORMAT_DZ_LONG, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" + + "\u0F42 \u0F23", new BigDecimal("-3000")}, + {FORMAT_DZ_LONG, "\u0F51\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62" + + "\u0F0B\u0F66\u0F0B\u0F61\u0F0B \u0F21" + + "\u0F22\u0F23\u0F24\u0F25\u0F27", new BigDecimal("12345700000000000000")}, + {FORMAT_DZ_LONG, "-\u0F51\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62" + + "\u0F0B\u0F66\u0F0B\u0F61\u0F0B \u0F21" + + "\u0F22\u0F23\u0F24\u0F25\u0F27", new BigDecimal("-12345700000000000000")}, + {FORMAT_EN_US_SHORT, "-0.0", new BigDecimal("-0.0")}, + {FORMAT_EN_US_SHORT, "0", new BigDecimal("0")}, + {FORMAT_EN_US_SHORT, "499", new BigDecimal("499")}, + {FORMAT_EN_US_SHORT, "-499", new BigDecimal("-499")}, + {FORMAT_EN_US_SHORT, "499.89", new BigDecimal("499.89")}, + {FORMAT_EN_US_SHORT, "-499.89", new BigDecimal("-499.89")}, + {FORMAT_EN_US_SHORT, "1K", new BigDecimal("1000")}, + {FORMAT_EN_US_SHORT, "-1K", new BigDecimal("-1000")}, + {FORMAT_EN_US_SHORT, "3K", new BigDecimal("3000")}, + {FORMAT_EN_US_SHORT, "-3K", new BigDecimal("-3000")}, + {FORMAT_EN_US_SHORT, "17K", new BigDecimal("17000")}, + {FORMAT_EN_US_SHORT, "-17K", new BigDecimal("-17000")}, + {FORMAT_EN_US_SHORT, "12345678901234567890", + new BigDecimal("12345678901234567890")}, + {FORMAT_EN_US_SHORT, "12345679T", new BigDecimal("12345679000000000000")}, + {FORMAT_EN_US_SHORT, "-12345679T", new BigDecimal("-12345679000000000000")}, + {FORMAT_EN_US_SHORT, "599.01K", new BigDecimal("599010.00")}, + {FORMAT_EN_US_SHORT, "-599.01K", new BigDecimal("-599010.00")}, + {FORMAT_EN_US_SHORT, "599444444.90T", new BigDecimal("599444444900000000000.00")}, + {FORMAT_EN_US_SHORT, "-599444444.90T", new BigDecimal("-599444444900000000000.00")}, + {FORMAT_EN_US_SHORT, "123456789012345.5678K", + new BigDecimal("123456789012345567.8000")}, + {FORMAT_EN_US_SHORT, "17.000K", new BigDecimal("17000.000")}, + {FORMAT_EN_US_SHORT, "123.56678K", new BigDecimal("123566.78000")}, + {FORMAT_EN_US_SHORT, "-123.56678K", new BigDecimal("-123566.78000")}, + {FORMAT_EN_LONG, "999", new BigDecimal("999")}, + {FORMAT_EN_LONG, "1 thousand", new BigDecimal("1000")}, + {FORMAT_EN_LONG, "3 thousand", new BigDecimal("3000")}, + {FORMAT_EN_LONG, "12345679 trillion", new BigDecimal("12345679000000000000")}, + {FORMAT_HI_IN_LONG, "999", new BigDecimal("999")}, + {FORMAT_HI_IN_LONG, "-999", new BigDecimal("-999")}, + {FORMAT_HI_IN_LONG, "1 \u0939\u091C\u093C\u093E\u0930", new BigDecimal("1000")}, + {FORMAT_HI_IN_LONG, "-1 \u0939\u091C\u093C\u093E\u0930", new BigDecimal("-1000")}, + {FORMAT_HI_IN_LONG, "3 \u0939\u091C\u093C\u093E\u0930", new BigDecimal("3000")}, + {FORMAT_HI_IN_LONG, "12345679 \u0916\u0930\u092C", new BigDecimal("1234567900000000000")}, + {FORMAT_HI_IN_LONG, "-12345679 \u0916\u0930\u092C", new BigDecimal("-1234567900000000000")}, + {FORMAT_JA_JP_SHORT, "-99", new BigDecimal("-99")}, + {FORMAT_JA_JP_SHORT, "1\u4E07", new BigDecimal("10000")}, + {FORMAT_JA_JP_SHORT, "30\u4E07", new BigDecimal("300000")}, + {FORMAT_JA_JP_SHORT, "-30\u4E07", new BigDecimal("-300000")}, + {FORMAT_JA_JP_SHORT, "12345679\u5146", new BigDecimal("12345679000000000000")}, + {FORMAT_JA_JP_SHORT, "-12345679\u5146", new BigDecimal("-12345679000000000000")}, + {FORMAT_IT_SHORT, "-99", new BigDecimal("-99")}, + {FORMAT_IT_SHORT, "1\u00a0Mln", new BigDecimal("1000000")}, + {FORMAT_IT_SHORT, "30\u00a0Mln", new BigDecimal("30000000")}, + {FORMAT_IT_SHORT, "-30\u00a0Mln", new BigDecimal("-30000000")}, + {FORMAT_IT_SHORT, "12345679\u00a0Bln", new BigDecimal("12345679000000000000")}, + {FORMAT_IT_SHORT, "-12345679\u00a0Bln", new BigDecimal("-12345679000000000000")}, + {FORMAT_SW_LONG, "-0.0", new BigDecimal("-0.0")}, + {FORMAT_SW_LONG, "499", new BigDecimal("499")}, + {FORMAT_SW_LONG, "elfu 1", new BigDecimal("1000")}, + {FORMAT_SW_LONG, "elfu 3", new BigDecimal("3000")}, + {FORMAT_SW_LONG, "elfu 17", new BigDecimal("17000")}, + {FORMAT_SW_LONG, "elfu -3", new BigDecimal("-3000")}, + {FORMAT_SW_LONG, "-499", new BigDecimal("-499")}, + {FORMAT_SW_LONG, "elfu 1", new BigDecimal("1000")}, + {FORMAT_SW_LONG, "elfu 3", new BigDecimal("3000")}, + {FORMAT_SW_LONG, "elfu -3", new BigDecimal("-3000")}, + {FORMAT_SW_LONG, "elfu 17", new BigDecimal("17000")}, + {FORMAT_SW_LONG, "trilioni 12345679", new BigDecimal("12345679000000000000")}, + {FORMAT_SW_LONG, "trilioni -12345679", new BigDecimal("-12345679000000000000")}, + {FORMAT_SW_LONG, "elfu 599.01", new BigDecimal("599010.00")}, + {FORMAT_SW_LONG, "elfu -599.01", new BigDecimal("-599010.00")}, + {FORMAT_SE_SHORT, "999", new BigDecimal("999")}, + {FORMAT_SE_SHORT, "8\u00a0mn", new BigDecimal("8000000")}, + {FORMAT_SE_SHORT, "8\u00a0dt", new BigDecimal("8000")}, + {FORMAT_SE_SHORT, "12345679\u00a0bn", new BigDecimal("12345679000000000000")}, + {FORMAT_SE_SHORT, "12345679,89\u00a0bn", new BigDecimal("12345679890000000000.00")}, + {FORMAT_SE_SHORT, "\u2212999", new BigDecimal("-999")}, + {FORMAT_SE_SHORT, "\u22128\u00a0mn", new BigDecimal("-8000000")}, + {FORMAT_SE_SHORT, "\u22128\u00a0dt", new BigDecimal("-8000")}, + {FORMAT_SE_SHORT, "\u221212345679\u00a0bn", new BigDecimal("-12345679000000000000")}, + {FORMAT_SE_SHORT, "\u221212345679,89\u00a0bn", new BigDecimal("-12345679890000000000.00")},}; + } + + @Test(dataProvider = "parse") + public void testParse(NumberFormat cnf, String parseString, + Number expected) throws ParseException { + CompactFormatAndParseHelper.testParse(cnf, parseString, expected, null, BigDecimal.class); + } +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/TestSpecialValues.java b/test/jdk/java/text/Format/CompactNumberFormat/TestSpecialValues.java new file mode 100644 index 00000000000..e8ac2489faf --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/TestSpecialValues.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8177552 + * @summary Checks the formatting and parsing of special values + * @modules jdk.localedata + * @run testng/othervm TestSpecialValues + */ +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Locale; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class TestSpecialValues { + + private static final NumberFormat FORMAT = NumberFormat + .getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); + + @DataProvider(name = "formatSpecialValues") + Object[][] formatSpecialValues() { + return new Object[][]{ + // number , formatted ouput + {+0.0, "0"}, + {-0.0, "-0"}, + {Double.MIN_VALUE, "0"}, + {Double.MIN_NORMAL, "0"}, + {Double.NaN, "NaN"}, + {Double.POSITIVE_INFINITY, "\u221E"}, + {Double.NEGATIVE_INFINITY, "-\u221E"}, + {Long.MIN_VALUE, "-9223372T"}, + {Long.MAX_VALUE, "9223372T"},}; + } + + @DataProvider(name = "parseSpecialValues") + Object[][] parseSpecialValues() { + return new Object[][]{ + // parse string, parsed number + {"-0.0", -0.0}, + {"" + Long.MIN_VALUE, Long.MIN_VALUE}, + {"" + Long.MAX_VALUE, Long.MAX_VALUE}, + {"NaN", Double.NaN}, + {"\u221E", Double.POSITIVE_INFINITY}, + {"-\u221E", Double.NEGATIVE_INFINITY},}; + } + + @Test(dataProvider = "formatSpecialValues") + public void testFormatSpecialValues(Object number, String expected) { + CompactFormatAndParseHelper.testFormat(FORMAT, number, expected); + } + + @Test(dataProvider = "parseSpecialValues") + public void testParseSpecialValues(String parseString, Number expected) + throws ParseException { + CompactFormatAndParseHelper.testParse(FORMAT, parseString, expected, null, null); + } +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/TestUExtensionOverride.java b/test/jdk/java/text/Format/CompactNumberFormat/TestUExtensionOverride.java new file mode 100644 index 00000000000..46cd12c9f0f --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/TestUExtensionOverride.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8177552 + * @summary Checks the behaviour of Unicode BCP 47 U Extension with + * compact number format + * @modules jdk.localedata + * @run testng/othervm TestUExtensionOverride + */ +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Locale; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class TestUExtensionOverride { + + @DataProvider(name = "compactFormatData") + Object[][] compactFormatData() { + return new Object[][]{ + // locale, number, formatted string + + // -nu + {Locale.forLanguageTag("en-US-u-nu-deva"), 12345, "\u0967\u0968K"}, + {Locale.forLanguageTag("en-US-u-nu-sinh"), 12345, "\u0de7\u0de8K"}, + {Locale.forLanguageTag("en-US-u-nu-zzzz"), 12345, "12K"}, + // -rg + {Locale.forLanguageTag("fr-FR-u-rg-cazzzz"), 1234567, + "1\u00a0234\u00a0567"}, + {Locale.forLanguageTag("fr-FR-u-rg-cazzzz"), 1234567890, + "1\u00a0G"}, + // -nu and -rg + {Locale.forLanguageTag("en-US-u-nu-deva-rg-dezzzz"), 12345, + "\u0967\u0968K"}, + {Locale.forLanguageTag("fr-FR-u-nu-zzzz-rg-cazzzz"), 1234567890, + "1\u00a0Md"}, + {Locale.forLanguageTag("fr-FR-u-nu-zzzz-rg-zzzz"), 12345, + "12\u00a0k"}, + {Locale.forLanguageTag("fr-FR-u-rg-cazzzz-nu-deva"), 12345, + "\u0967\u0968\u00a0k"},}; + } + + @DataProvider(name = "compactParseData") + Object[][] compactParseData() { + return new Object[][]{ + // locale, parse string, parsed number + + // -nu + {Locale.forLanguageTag("en-US-u-nu-deva"), + "\u0967\u0968K", 12000L}, + {Locale.forLanguageTag("en-US-u-nu-sinh"), + "\u0de7\u0de8K", 12000L}, + {Locale.forLanguageTag("en-US-u-nu-zzzz"), + "12K", 12000L}, + // -rg + {Locale.forLanguageTag("fr-FR-u-rg-cazzzz"), + "1\u00a0G", 1000000000L}, + // -nu and -rg + {Locale.forLanguageTag("en-US-u-nu-deva-rg-dezzzz"), + "\u0967\u0968K", 12000L}, + {Locale.forLanguageTag("fr-FR-u-nu-zzzz-rg-cazzzz"), + "1\u00a0Md", 1000000000L}, + {Locale.forLanguageTag("fr-FR-u-nu-zzzz-rg-zzzz"), + "12\u00a0k", 12000L}, + {Locale.forLanguageTag("fr-FR-u-rg-cazzzz-nu-deva"), + "\u0967\u0968\u00a0k", 12000L},}; + } + + @Test(dataProvider = "compactFormatData") + public void testFormat(Locale locale, double num, + String expected) { + NumberFormat cnf = NumberFormat.getCompactNumberInstance(locale, + NumberFormat.Style.SHORT); + CompactFormatAndParseHelper.testFormat(cnf, num, expected); + } + + @Test(dataProvider = "compactParseData") + public void testParse(Locale locale, String parseString, + Number expected) throws ParseException { + NumberFormat cnf = NumberFormat.getCompactNumberInstance(locale, + NumberFormat.Style.SHORT); + CompactFormatAndParseHelper.testParse(cnf, parseString, expected, null, null); + } + +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/TestWithCompatProvider.java b/test/jdk/java/text/Format/CompactNumberFormat/TestWithCompatProvider.java new file mode 100644 index 00000000000..e06e26091b0 --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/TestWithCompatProvider.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8177552 + * @summary Checks the compact number format with COMPAT provider. Since the + * compact number resources are only provided by CLDR, using COMPAT + * as a provider should always use the default patterns added in the + * FormatData.java resource bundle + * @modules jdk.localedata + * @run testng/othervm -Djava.locale.providers=COMPAT TestWithCompatProvider + */ +import java.math.BigDecimal; +import java.math.BigInteger; +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Locale; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class TestWithCompatProvider { + + private static final NumberFormat FORMAT_DZ_SHORT = NumberFormat + .getCompactNumberInstance(new Locale("dz"), NumberFormat.Style.SHORT); + + private static final NumberFormat FORMAT_EN_US_SHORT = NumberFormat + .getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); + + @DataProvider(name = "format") + Object[][] compactFormatData() { + return new Object[][]{ + {FORMAT_DZ_SHORT, 1000.09, "1K"}, + {FORMAT_DZ_SHORT, -999.99, "-1K"}, + {FORMAT_DZ_SHORT, -0.0, "-0"}, + {FORMAT_DZ_SHORT, new BigInteger("12345678901234567890"), "12345679T"}, + {FORMAT_DZ_SHORT, new BigDecimal("12345678901234567890.89"), "12345679T"}, + {FORMAT_EN_US_SHORT, -999.99, "-1K"}, + {FORMAT_EN_US_SHORT, 9999, "10K"}, + {FORMAT_EN_US_SHORT, 3000.90, "3K"}, + {FORMAT_EN_US_SHORT, new BigInteger("12345678901234567890"), "12345679T"}, + {FORMAT_EN_US_SHORT, new BigDecimal("12345678901234567890.89"), "12345679T"},}; + } + + @DataProvider(name = "parse") + Object[][] compactParseData() { + return new Object[][]{ + {FORMAT_DZ_SHORT, "1K", 1000L}, + {FORMAT_DZ_SHORT, "-3K", -3000L}, + {FORMAT_DZ_SHORT, "12345700T", 1.23457E19}, + {FORMAT_EN_US_SHORT, "-99", -99L}, + {FORMAT_EN_US_SHORT, "10K", 10000L}, + {FORMAT_EN_US_SHORT, "12345679T", 1.2345679E19},}; + } + + @Test(dataProvider = "format") + public void testFormat(NumberFormat cnf, Object number, + String expected) { + CompactFormatAndParseHelper.testFormat(cnf, number, expected); + } + + @Test(dataProvider = "parse") + public void testParse(NumberFormat cnf, String parseString, + Number expected) throws ParseException { + CompactFormatAndParseHelper.testParse(cnf, parseString, expected, null, null); + } + +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/serialization/TestDeserializeCNF.java b/test/jdk/java/text/Format/CompactNumberFormat/serialization/TestDeserializeCNF.java new file mode 100644 index 00000000000..5b9a2f98c8e --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/serialization/TestDeserializeCNF.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8177552 + * @modules jdk.localedata + * @summary Checks deserialization of compact number format + * @library /java/text/testlib + * @build TestDeserializeCNF HexDumpReader + * @run testng/othervm TestDeserializeCNF + */ + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.math.RoundingMode; +import java.text.CompactNumberFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; +import static org.testng.Assert.*; + +public class TestDeserializeCNF { + + // This object is serialized in cnf1.ser.txt with HALF_UP + // rounding mode, groupingsize = 3 and parseBigDecimal = true + private static final CompactNumberFormat COMPACT_FORMAT1 = new CompactNumberFormat("#,##0.###", + DecimalFormatSymbols.getInstance(Locale.US), + new String[]{"", "", "", "0K", "00K", "000K", "0M", "00M", "000M", "0B", "00B", "000B", "0T", "00T", "000T"}); + + // This object is serialized in cnf2.ser.txt with min integer digits = 20 + // and min fraction digits = 5 + private static final CompactNumberFormat COMPACT_FORMAT2 = new CompactNumberFormat("#,##0.###", + DecimalFormatSymbols.getInstance(Locale.JAPAN), + new String[]{"", "", "", "0", "0\u4e07", "00\u4e07", "000\u4e07", "0000\u4e07", "0\u5104", "00\u5104", "000\u5104", "0000\u5104", "0\u5146", "00\u5146", "000\u5146"}); + + private static final String FILE_COMPACT_FORMAT1 = "cnf1.ser.txt"; + private static final String FILE_COMPACT_FORMAT2 = "cnf2.ser.txt"; + + @BeforeTest + public void mutateInstances() { + COMPACT_FORMAT1.setRoundingMode(RoundingMode.HALF_UP); + COMPACT_FORMAT1.setGroupingSize(3); + COMPACT_FORMAT1.setParseBigDecimal(true); + + COMPACT_FORMAT2.setMinimumIntegerDigits(20); + COMPACT_FORMAT2.setMinimumFractionDigits(5); + } + + @Test + public void testDeserialization() throws IOException, ClassNotFoundException { + try (InputStream istream1 = HexDumpReader.getStreamFromHexDump(FILE_COMPACT_FORMAT1); + ObjectInputStream ois1 = new ObjectInputStream(istream1); + InputStream istream2 = HexDumpReader.getStreamFromHexDump(FILE_COMPACT_FORMAT2); + ObjectInputStream ois2 = new ObjectInputStream(istream2);) { + + CompactNumberFormat obj1 = (CompactNumberFormat) ois1.readObject(); + assertEquals(obj1, COMPACT_FORMAT1, "Deserialized instance is not" + + " equal to the instance serialized in " + FILE_COMPACT_FORMAT1); + + CompactNumberFormat obj2 = (CompactNumberFormat) ois2.readObject(); + assertEquals(obj2, COMPACT_FORMAT2, "Deserialized instance is not" + + " equal to the instance serialized in " + FILE_COMPACT_FORMAT2); + } + } + + // The objects are serialized using the serialize() method, the hex + // dump printed is copied to respective object files +// void serialize(CompactNumberFormat cnf) { +// ByteArrayOutputStream baos = new ByteArrayOutputStream(); +// try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { +// oos.writeObject(cnf); +// } catch (IOException ioe) { +// throw new RuntimeException(ioe); +// } +// byte[] ser = baos.toByteArray(); +// for (byte b : ser) { +// System.out.print("" + String.format("%02x", b)); +// } +// } + +} + diff --git a/test/jdk/java/text/Format/CompactNumberFormat/serialization/TestSerialization.java b/test/jdk/java/text/Format/CompactNumberFormat/serialization/TestSerialization.java new file mode 100644 index 00000000000..e7ec2939b75 --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/serialization/TestSerialization.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8177552 + * @modules jdk.localedata + * @summary Checks the serialization feature of CompactNumberFormat + * @run testng/othervm TestSerialization + */ + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.math.RoundingMode; +import java.text.CompactNumberFormat; +import java.text.NumberFormat; +import java.util.Locale; +import static org.testng.Assert.*; + +public class TestSerialization { + + private static final NumberFormat FORMAT_HI = NumberFormat.getCompactNumberInstance( + new Locale("hi"), NumberFormat.Style.SHORT); + private static final CompactNumberFormat FORMAT_EN_US = (CompactNumberFormat) NumberFormat + .getCompactNumberInstance(Locale.US, NumberFormat.Style.LONG); + private static final NumberFormat FORMAT_JA_JP = NumberFormat.getCompactNumberInstance( + Locale.JAPAN, NumberFormat.Style.SHORT); + private static final NumberFormat FORMAT_FR_FR = NumberFormat.getCompactNumberInstance( + Locale.FRANCE, NumberFormat.Style.LONG); + private static final NumberFormat FORMAT_DE_DE = NumberFormat.getCompactNumberInstance( + Locale.GERMANY, NumberFormat.Style.SHORT); + private static final NumberFormat FORMAT_KO_KR = NumberFormat.getCompactNumberInstance( + Locale.KOREA, NumberFormat.Style.SHORT); + + @BeforeTest + public void mutateInstances() { + FORMAT_HI.setMinimumFractionDigits(2); + FORMAT_HI.setMinimumIntegerDigits(5); + + FORMAT_EN_US.setRoundingMode(RoundingMode.HALF_UP); + FORMAT_EN_US.setGroupingSize(3); + FORMAT_EN_US.setParseBigDecimal(true); + + FORMAT_JA_JP.setMaximumFractionDigits(30); + FORMAT_JA_JP.setMaximumIntegerDigits(30); + + FORMAT_FR_FR.setParseIntegerOnly(true); + FORMAT_FR_FR.setGroupingUsed(true); + + // Setting minimum integer digits beyond the allowed range + FORMAT_DE_DE.setMinimumIntegerDigits(320); + + // Setting minimum fraction digits beyond the allowed range + FORMAT_KO_KR.setMinimumFractionDigits(350); + } + + @Test + public void testSerialization() throws IOException, ClassNotFoundException { + // Serialize + serialize("cdf.ser", FORMAT_HI, FORMAT_EN_US, FORMAT_JA_JP, FORMAT_FR_FR, FORMAT_DE_DE, FORMAT_KO_KR); + // Deserialize + deserialize("cdf.ser", FORMAT_HI, FORMAT_EN_US, FORMAT_JA_JP, FORMAT_FR_FR, FORMAT_DE_DE, FORMAT_KO_KR); + } + + private void serialize(String fileName, NumberFormat... formats) + throws IOException { + try (ObjectOutputStream os = new ObjectOutputStream( + new FileOutputStream(fileName))) { + for (NumberFormat fmt : formats) { + os.writeObject(fmt); + } + } + } + + private static void deserialize(String fileName, NumberFormat... formats) + throws IOException, ClassNotFoundException { + try (ObjectInputStream os = new ObjectInputStream( + new FileInputStream(fileName))) { + for (NumberFormat fmt : formats) { + NumberFormat obj = (NumberFormat) os.readObject(); + assertEquals(fmt, obj, "Serialized and deserialized" + + " objects do not match"); + + long number = 123456789789L; + String expected = fmt.format(number); + String actual = obj.format(number); + assertEquals(actual, expected, "Serialized and deserialized" + + " objects are expected to return same formatted" + + " output for number: " + number); + } + } + } +} diff --git a/test/jdk/java/text/Format/CompactNumberFormat/serialization/cnf1.ser.txt b/test/jdk/java/text/Format/CompactNumberFormat/serialization/cnf1.ser.txt new file mode 100644 index 00000000000..df48db99571 --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/serialization/cnf1.ser.txt @@ -0,0 +1,64 @@ +# +# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# Hex dump of a serialized CompactNumberFormat for TestDeserializeCNF. + +aced00057372001d6a6176612e746578742e436f6d706163744e756d626572466f726d +617462ed0c37b8207cf602000642000c67726f7570696e6753697a655a000f70617273 +65426967446563696d616c5b000f636f6d706163745061747465726e737400135b4c6a +6176612f6c616e672f537472696e673b4c000e646563696d616c5061747465726e7400 +124c6a6176612f6c616e672f537472696e673b4c000c726f756e64696e674d6f646574 +00184c6a6176612f6d6174682f526f756e64696e674d6f64653b4c000773796d626f6c +737400204c6a6176612f746578742f446563696d616c466f726d617453796d626f6c73 +3b787200166a6176612e746578742e4e756d626572466f726d6174dff6b3bf137d07e8 +03000b5a000c67726f7570696e67557365644200116d61784672616374696f6e446967 +6974734200106d6178496e74656765724469676974734900156d6178696d756d467261 +6374696f6e4469676974734900146d6178696d756d496e746567657244696769747342 +00116d696e4672616374696f6e4469676974734200106d696e496e7465676572446967 +6974734900156d696e696d756d4672616374696f6e4469676974734900146d696e696d +756d496e74656765724469676974735a00107061727365496e74656765724f6e6c7949 +001573657269616c56657273696f6e4f6e53747265616d787200106a6176612e746578 +742e466f726d6174fbd8bc12e90f1843020000787000007f0000000000000135000100 +000000000000010000000001780301757200135b4c6a6176612e6c616e672e53747269 +6e673badd256e7e91d7b4702000078700000000f74000071007e000a71007e000a7400 +02304b74000330304b7400043030304b740002304d74000330304d7400043030304d74 +0002304274000330304274000430303042740002305474000330305474000430303054 +740009232c2323302e2323237e7200166a6176612e6d6174682e526f756e64696e674d +6f646500000000000000001200007872000e6a6176612e6c616e672e456e756d000000 +0000000000120000787074000748414c465f55507372001e6a6176612e746578742e44 +6563696d616c466f726d617453796d626f6c73501d17990868939c0200114300106465 +63696d616c536570617261746f72430005646967697443000b6578706f6e656e746961 +6c43001167726f7570696e67536570617261746f724300096d696e75735369676e4300 +116d6f6e6574617279536570617261746f724300107061747465726e53657061726174 +6f724300077065724d696c6c43000770657263656e7449001573657269616c56657273 +696f6e4f6e53747265616d4300097a65726f44696769744c00034e614e71007e00024c +000e63757272656e637953796d626f6c71007e00024c00146578706f6e656e7469616c +536570617261746f7271007e00024c0008696e66696e69747971007e00024c0012696e +746c43757272656e637953796d626f6c71007e00024c00066c6f63616c657400124c6a +6176612f7574696c2f4c6f63616c653b7870002e00230045002c002d002e003b203000 +250000000300307400034e614e7074000145740003e2889e70737200106a6176612e75 +74696c2e4c6f63616c657ef811609c30f9ec03000649000868617368636f64654c0007 +636f756e74727971007e00024c000a657874656e73696f6e7371007e00024c00086c61 +6e677561676571007e00024c000673637269707471007e00024c000776617269616e74 +71007e00027870ffffffff740002555371007e000a740002656e71007e000a71007e00 +0a78 diff --git a/test/jdk/java/text/Format/CompactNumberFormat/serialization/cnf2.ser.txt b/test/jdk/java/text/Format/CompactNumberFormat/serialization/cnf2.ser.txt new file mode 100644 index 00000000000..1fa5ee42601 --- /dev/null +++ b/test/jdk/java/text/Format/CompactNumberFormat/serialization/cnf2.ser.txt @@ -0,0 +1,64 @@ +# +# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# Hex dump of a serialized CompactNumberFormat for TestDeserializeCNF. + +aced00057372001d6a6176612e746578742e436f6d706163744e756d626572466f726d +617462ed0c37b8207cf602000642000c67726f7570696e6753697a655a000f70617273 +65426967446563696d616c5b000f636f6d706163745061747465726e737400135b4c6a +6176612f6c616e672f537472696e673b4c000e646563696d616c5061747465726e7400 +124c6a6176612f6c616e672f537472696e673b4c000c726f756e64696e674d6f646574 +00184c6a6176612f6d6174682f526f756e64696e674d6f64653b4c000773796d626f6c +737400204c6a6176612f746578742f446563696d616c466f726d617453796d626f6c73 +3b787200166a6176612e746578742e4e756d626572466f726d6174dff6b3bf137d07e8 +03000b5a000c67726f7570696e67557365644200116d61784672616374696f6e446967 +6974734200106d6178496e74656765724469676974734900156d6178696d756d467261 +6374696f6e4469676974734900146d6178696d756d496e746567657244696769747342 +00116d696e4672616374696f6e4469676974734200106d696e496e7465676572446967 +6974734900156d696e696d756d4672616374696f6e4469676974734900146d696e696d +756d496e74656765724469676974735a00107061727365496e74656765724f6e6c7949 +001573657269616c56657273696f6e4f6e53747265616d787200106a6176612e746578 +742e466f726d6174fbd8bc12e90f1843020000787000057f0000000500000135051400 +000005000000140000000001780000757200135b4c6a6176612e6c616e672e53747269 +6e673badd256e7e91d7b4702000078700000000f74000071007e000a71007e000a7400 +013074000430e4b8877400053030e4b887740006303030e4b88774000730303030e4b8 +8774000430e584847400053030e58484740006303030e5848474000730303030e58484 +74000430e585867400053030e58586740006303030e58586740009232c2323302e2323 +237e7200166a6176612e6d6174682e526f756e64696e674d6f64650000000000000000 +1200007872000e6a6176612e6c616e672e456e756d0000000000000000120000787074 +000948414c465f4556454e7372001e6a6176612e746578742e446563696d616c466f72 +6d617453796d626f6c73501d17990868939c020011430010646563696d616c53657061 +7261746f72430005646967697443000b6578706f6e656e7469616c43001167726f7570 +696e67536570617261746f724300096d696e75735369676e4300116d6f6e6574617279 +536570617261746f724300107061747465726e536570617261746f724300077065724d +696c6c43000770657263656e7449001573657269616c56657273696f6e4f6e53747265 +616d4300097a65726f44696769744c00034e614e71007e00024c000e63757272656e63 +7953796d626f6c71007e00024c00146578706f6e656e7469616c536570617261746f72 +71007e00024c0008696e66696e69747971007e00024c0012696e746c43757272656e63 +7953796d626f6c71007e00024c00066c6f63616c657400124c6a6176612f7574696c2f +4c6f63616c653b7870002e00230045002c002d002e003b203000250000000300307400 +034e614e7074000145740003e2889e70737200106a6176612e7574696c2e4c6f63616c +657ef811609c30f9ec03000649000868617368636f64654c0007636f756e7472797100 +7e00024c000a657874656e73696f6e7371007e00024c00086c616e677561676571007e +00024c000673637269707471007e00024c000776617269616e7471007e00027870ffff +ffff7400024a5071007e000a7400026a6171007e000a71007e000a78 diff --git a/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTest.sh b/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTest.sh deleted file mode 100644 index a6ea0ba071c..00000000000 --- a/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTest.sh +++ /dev/null @@ -1,56 +0,0 @@ -# -# Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# @test -# @bug 4354216 -# @summary Test for the cause support when throwing a -# MissingResourceBundle. (This test exists under -# ResourceBundle/Control because bad resource bundle data can be -# shared with other test cases.) -# @build MissingResourceCauseTest -# @build NonResourceBundle PrivateConstructorRB AbstractRB BadStaticInitRB -# NoNoArgConstructorRB -# @run shell MissingResourceCauseTest.sh - -case "`uname`" in -Windows* | CYGWIN*) - exit 0; - ;; -*) - DEL=":"; - PS="/"; - ;; -esac - -# -# Create an unreadble properties file -# -UNREADABLE=${TESTCLASSPATH}${PS}UnreadableRB.properties -rm -f $UNREADABLE -echo "type=unreadable" >$UNREADABLE -chmod 000 $UNREADABLE - -${TESTJAVA}/bin/java ${TESTVMOPTS} -esa -cp ${TESTCLASSES}${DEL}${TESTSRC} MissingResourceCauseTest -STATUS=$? -chmod 666 $UNREADABLE -rm -f $UNREADABLE -exit $STATUS diff --git a/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java b/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java new file mode 100644 index 00000000000..c744c18a339 --- /dev/null +++ b/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 4354216 8213127 + * @summary Test for the cause support when throwing a + * MissingResourceBundle. (This test exists under + * ResourceBundle/Control because bad resource bundle data can be + * shared with other test cases.) + * @library /test/lib + * @build jdk.test.lib.JDKToolLauncher + * jdk.test.lib.Utils + * jdk.test.lib.process.ProcessTools + * MissingResourceCauseTest + * NonResourceBundle + * PrivateConstructorRB + * AbstractRB + * BadStaticInitRB + * NoNoArgConstructorRB + * @run main MissingResourceCauseTestRun + */ + +import java.io.File; +import java.io.FileWriter; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import jdk.test.lib.JDKToolLauncher; +import jdk.test.lib.Utils; +import jdk.test.lib.process.ProcessTools; + +public class MissingResourceCauseTestRun { + public static void main(String[] args) throws Throwable { + Path path = Paths.get("UnreadableRB.properties"); + Files.deleteIfExists(path); + try { + writeFile(path); + runCmd(); + } finally { + deleteFile(path); + } + } + + /** + * Create an unreadable properties file + */ + private static void writeFile(Path path) throws Throwable { + String str = "type=unreadable"; + Files.createFile(path); + try (FileWriter fw = new FileWriter(path.toString())) { + fw.write(str); + } + ProcessTools.executeCommand("chmod", "000", path.toString()) + .outputTo(System.out) + .errorTo(System.out) + .shouldHaveExitValue(0); + } + + private static void runCmd() throws Throwable { + // Class files are in Utils.TEST_CLASSES + // MalformedDataRB_en.properties is in Utils.TEST_SRC + // UnreadableRB.properties is in current directory + String cp = Utils.TEST_CLASSES + File.pathSeparator + Utils.TEST_SRC + + File.pathSeparator + "."; + JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("java"); + launcher.addToolArg("-esa") + .addToolArg("-cp") + .addToolArg(cp) + .addToolArg("MissingResourceCauseTest"); + + int exitCode = ProcessTools.executeCommand(launcher.getCommand()) + .getExitValue(); + if (exitCode != 0) { + throw new RuntimeException("Execution of the test failed. " + + "Unexpected exit code: " + exitCode); + } + } + + private static void deleteFile(Path path) throws Throwable { + if(path.toFile().exists()) { + ProcessTools.executeCommand("chmod", "666", path.toString()) + .outputTo(System.out) + .errorTo(System.out) + .shouldHaveExitValue(0); + Files.delete(path); + } + } +} diff --git a/test/jdk/jdk/jfr/event/metadata/TestLookForUntestedEvents.java b/test/jdk/jdk/jfr/event/metadata/TestLookForUntestedEvents.java index 6c550e4d457..2b3b9fb2b7b 100644 --- a/test/jdk/jdk/jfr/event/metadata/TestLookForUntestedEvents.java +++ b/test/jdk/jdk/jfr/event/metadata/TestLookForUntestedEvents.java @@ -24,7 +24,6 @@ */ package jdk.jfr.event.metadata; -import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.nio.file.Files; @@ -40,8 +39,8 @@ import java.util.stream.Stream; import jdk.jfr.EventType; import jdk.jfr.Experimental; import jdk.jfr.FlightRecorder; -import jdk.test.lib.jfr.EventNames; import jdk.test.lib.Utils; +import jdk.test.lib.jfr.EventNames; /** * @test Check for JFR events not covered by tests @@ -55,14 +54,6 @@ public class TestLookForUntestedEvents { private static final String MSG_SEPARATOR = "=========================="; private static Set jfrEventTypes = new HashSet<>(); - private static final Set knownEventsMissingFromEventNames = new HashSet<>( - Arrays.asList( - // The Z* events below should be marked as experimental; see: JDK-8213966 - "ZStatisticsSampler", "ZStatisticsCounter", - "ZPageAllocation", "ZThreadPhase" - ) - ); - private static final Set hardToTestEvents = new HashSet<>( Arrays.asList( "DataLoss", "IntFlag", "ReservedStackActivation", @@ -147,9 +138,6 @@ public class TestLookForUntestedEvents { } } - // Account for the events that are known to be missing from the EventNames.java - eventsFromEventNamesClass.addAll(knownEventsMissingFromEventNames); - if (!jfrEventTypes.equals(eventsFromEventNamesClass)) { String exceptionMsg = "Events declared in jdk.test.lib.jfr.EventNames differ " + "from events returned by FlightRecorder.getEventTypes()"; diff --git a/test/jdk/jdk/jfr/event/runtime/TestVMInfoEvent.java b/test/jdk/jdk/jfr/event/runtime/TestVMInfoEvent.java index 0ae1a7736d0..6915e010cbb 100644 --- a/test/jdk/jdk/jfr/event/runtime/TestVMInfoEvent.java +++ b/test/jdk/jdk/jfr/event/runtime/TestVMInfoEvent.java @@ -64,6 +64,8 @@ public class TestVMInfoEvent { String jvmArgs = Events.assertField(event, "jvmArguments").notNull().getValue(); String jvmFlags = Events.assertField(event, "jvmFlags").notNull().getValue(); + Long pid = Events.assertField(event, "pid").atLeast(0L).getValue(); + Asserts.assertEquals(pid, ProcessHandle.current().pid()); String eventArgs = (jvmFlags.trim() + " " + jvmArgs).trim(); String beanArgs = mbean.getInputArguments().stream().collect(Collectors.joining(" ")); Asserts.assertEquals(eventArgs, beanArgs, "Wrong inputArgs"); diff --git a/test/jdk/jdk/jfr/event/sampling/libTestNative.c b/test/jdk/jdk/jfr/event/sampling/libTestNative.c index 118e3e77b5f..f64f79fa7ba 100644 --- a/test/jdk/jdk/jfr/event/sampling/libTestNative.c +++ b/test/jdk/jdk/jfr/event/sampling/libTestNative.c @@ -30,7 +30,7 @@ #include #endif -JNIEXPORT void JNICALL Java_com_oracle_jfr_event_sampling_TestNative_longTime +JNIEXPORT void JNICALL Java_jdk_jfr_event_sampling_TestNative_longTime (JNIEnv *env, jclass jc) { #ifdef WINDOWS diff --git a/test/jdk/jdk/jfr/jmx/TestFlightRecorderMXBeanLeak.java b/test/jdk/jdk/jfr/jmx/TestFlightRecorderMXBeanLeak.java new file mode 100644 index 00000000000..067c72fe1ef --- /dev/null +++ b/test/jdk/jdk/jfr/jmx/TestFlightRecorderMXBeanLeak.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.jfr.jmx; + +import java.lang.management.ManagementFactory; +import java.net.URL; +import java.net.URLClassLoader; + +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanInfo; +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import jdk.jfr.Recording; +import jdk.jfr.consumer.RecordedClassLoader; +import jdk.jfr.consumer.RecordedEvent; +import jdk.management.jfr.FlightRecorderMXBean; +import jdk.test.lib.jfr.Events; + +/** + * @test + * @key jfr + * @summary Verifies that attributes in FlightRecorderMXBean can be inspected + * without causing a memory leak. + * @requires vm.hasJFR + * @library /test/lib /test/jdk + * @run main/othervm jdk.jfr.jmx.TestFlightRecorderMXBeanLeak + */ +public class TestFlightRecorderMXBeanLeak { + + private static final String CLASS_LOADER_NAME = "Test Leak"; + private static final String TEST_CLASS = "jdk.jfr.jmx.TestFlightRecorderMXBeanLeak$FlightRecorderMXBeanLoader"; + + public static void main(String[] args) throws Exception { + URL url = FlightRecorderMXBeanLoader.class.getProtectionDomain().getCodeSource().getLocation(); + URLClassLoader loader = new URLClassLoader(CLASS_LOADER_NAME, new URL[] { url }, null); + Class clazz = Class.forName(TEST_CLASS, true, loader); + clazz.newInstance(); + loader.close(); + clazz = null; + loader = null; + System.gc(); + System.gc(); + + try (Recording r = new Recording()) { + r.enable("jdk.ClassLoaderStatistics").with("period", "endChunk"); + r.start(); + r.stop(); + for (RecordedEvent e : Events.fromRecording(r)) { + RecordedClassLoader o = e.getValue("classLoader"); + if (o != null) { + System.out.println("Class loader: type=" + o.getType().getName() + " name=" + o.getName()); + if (CLASS_LOADER_NAME.equals(o.getName())) { + throw new Exception("Memory Leak. Class loader '" + CLASS_LOADER_NAME + "' should not be on the heap!"); + } + } + } + } + } + + public static class FlightRecorderMXBeanLoader { + public FlightRecorderMXBeanLoader() throws Exception { + ObjectName objectName = new ObjectName(FlightRecorderMXBean.MXBEAN_NAME); + MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer(); + MBeanInfo mBeanInfo = platformMBeanServer.getMBeanInfo(objectName); + System.out.println("Inspecting FlightRecorderMXBeann:"); + for (MBeanAttributeInfo attributeInfo : mBeanInfo.getAttributes()) { + Object value = platformMBeanServer.getAttribute(objectName, attributeInfo.getName()); + System.out.println(attributeInfo.getName() + " = " + value); + } + } + } +} diff --git a/test/jdk/jdk/jfr/cmd/ExecuteHelper.java b/test/jdk/jdk/jfr/tool/ExecuteHelper.java similarity index 88% rename from test/jdk/jdk/jfr/cmd/ExecuteHelper.java rename to test/jdk/jdk/jfr/tool/ExecuteHelper.java index dee5db70460..51347af5bd3 100644 --- a/test/jdk/jdk/jfr/cmd/ExecuteHelper.java +++ b/test/jdk/jdk/jfr/tool/ExecuteHelper.java @@ -23,16 +23,16 @@ * questions. */ -package jdk.jfr.cmd; +package jdk.jfr.tool; import java.nio.file.Path; -import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; import jdk.jfr.Configuration; import jdk.jfr.Event; import jdk.jfr.Recording; +import jdk.test.lib.JDKToolLauncher; import jdk.test.lib.Utils; import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.process.ProcessTools;; @@ -53,18 +53,6 @@ final class ExecuteHelper { double trickyDouble; } - public static OutputAnalyzer run(String... args) { - String[] array = new String[args.length + 1]; - System.arraycopy(args, 0, array, 1, args.length); - array[0] = "jdk.jfr.internal.cmd.Execute"; - try { - return ProcessTools.executeTestJava(array); - } catch (Exception e) { - String message = String.format("Caught exception while executing '%s'", Arrays.asList(array)); - throw new RuntimeException(message, e); - } - } - public static void emitCustomEvents() { // Custom events with potentially tricky values CustomEvent event1 = new CustomEvent(); @@ -137,4 +125,12 @@ final class ExecuteHelper { Matcher m = p.matcher("aaaaab"); m.matches(); } + + public static OutputAnalyzer jfr(String... args) throws Throwable { + JDKToolLauncher l = JDKToolLauncher.createUsingTestJDK("jfr"); + for (String arg : args) { + l.addToolArg(arg); + } + return ProcessTools.executeCommand(l.getCommand()); + } } diff --git a/test/jdk/jdk/jfr/cmd/TestReconstruct.java b/test/jdk/jdk/jfr/tool/TestAssemble.java similarity index 80% rename from test/jdk/jdk/jfr/cmd/TestReconstruct.java rename to test/jdk/jdk/jfr/tool/TestAssemble.java index dc4e4738b96..0f21cceecd5 100644 --- a/test/jdk/jdk/jfr/cmd/TestReconstruct.java +++ b/test/jdk/jdk/jfr/tool/TestAssemble.java @@ -23,7 +23,7 @@ * questions. */ -package jdk.jfr.cmd; +package jdk.jfr.tool; import java.io.FileWriter; import java.io.IOException; @@ -48,9 +48,9 @@ import jdk.test.lib.process.OutputAnalyzer; * @requires vm.hasJFR * @library /test/lib /test/jdk * @modules jdk.jfr/jdk.jfr.internal - * @run main/othervm jdk.jfr.cmd.TestReconstruct + * @run main/othervm jdk.jfr.tool.TestAssemble */ -public class TestReconstruct { +public class TestAssemble { @Name("Correlation") static class CorrelationEvent extends Event { @@ -59,7 +59,7 @@ public class TestReconstruct { private static int RECORDING_COUNT = 5; @SuppressWarnings("resource") - public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Throwable { // Create some disk recordings Recording[] recordings = new Recording[5]; for (int i = 0; i < RECORDING_COUNT; i++) { @@ -89,33 +89,32 @@ public class TestReconstruct { String destination = destinationPath.toAbsolutePath().toString(); // Test failure - OutputAnalyzer output = ExecuteHelper.run("reconstruct"); + OutputAnalyzer output = ExecuteHelper.jfr("assemble"); + output.shouldContain("too few arguments"); - output.shouldContain("Too few arguments"); + output = ExecuteHelper.jfr("assemble", directory); + output.shouldContain("too few arguments"); - output = ExecuteHelper.run("reconstruct", directory); - output.shouldContain("Too few arguments"); + output = ExecuteHelper.jfr("assemble", "not-a-directory", destination); + output.shouldContain("directory does not exist, not-a-directory"); - output = ExecuteHelper.run("reconstruct", "not-a-directory", destination); - output.shouldContain("Could not find disk repository at"); + output = ExecuteHelper.jfr("assemble", directory, "not-a-destination"); + output.shouldContain("filename must end with '.jfr'"); - output = ExecuteHelper.run("reconstruct", directory, "not-a-destination"); - output.shouldContain("Filename must end with .jfr"); - - output = ExecuteHelper.run("reconstruct", "--wrongOption", directory, destination); - output.shouldContain("Too many arguments"); + output = ExecuteHelper.jfr("assemble", "--wrongOption", directory, destination); + output.shouldContain("too many arguments"); FileWriter fw = new FileWriter(destination); fw.write('d'); fw.close(); - output = ExecuteHelper.run("reconstruct", directory, destination); + output = ExecuteHelper.jfr("assemble", directory, destination); output.shouldContain("already exists"); Files.delete(destinationPath); // test success - output = ExecuteHelper.run("reconstruct", directory, destination); + output = ExecuteHelper.jfr("assemble", directory, destination); System.out.println(output.getOutput()); - output.shouldContain("Reconstruction complete"); + output.shouldContain("Finished."); long reconstructedCount = countEventInRecording(destinationPath); Asserts.assertEquals(expectedCount, reconstructedCount); diff --git a/test/jdk/jdk/jfr/cmd/TestSplit.java b/test/jdk/jdk/jfr/tool/TestDisassemble.java similarity index 70% rename from test/jdk/jdk/jfr/cmd/TestSplit.java rename to test/jdk/jdk/jfr/tool/TestDisassemble.java index dbce3875314..29d28531a02 100644 --- a/test/jdk/jdk/jfr/cmd/TestSplit.java +++ b/test/jdk/jdk/jfr/tool/TestDisassemble.java @@ -23,7 +23,7 @@ * questions. */ -package jdk.jfr.cmd; +package jdk.jfr.tool; import java.io.IOException; import java.nio.file.Files; @@ -44,59 +44,63 @@ import jdk.test.lib.process.OutputAnalyzer; * @key jfr * @requires vm.hasJFR * @library /test/lib /test/jdk - * @run main/othervm jdk.jfr.cmd.TestSplit + * @run main/othervm jdk.jfr.tool.TestDisassemble */ -public class TestSplit { +public class TestDisassemble { - public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Throwable { SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); String dateText = formatter.format(new Date()); Path recordingFileA = Paths.get("many-chunks-A-" + dateText + ".jfr"); Path recordingFileB = Paths.get("many-chunks-B-" + dateText + ".jfr"); + Path recordingFileC = Paths.get("many-chunks-C-" + dateText + ".jfr"); makeRecordingWithChunks(6, recordingFileA); Files.copy(recordingFileA, recordingFileB); + Files.copy(recordingFileA, recordingFileC); String fileAText = recordingFileA.toAbsolutePath().toString(); String fileBText = recordingFileB.toAbsolutePath().toString(); + String fileCText = recordingFileC.toAbsolutePath().toString(); - OutputAnalyzer output = ExecuteHelper.run("split"); - output.shouldContain("Missing file"); + OutputAnalyzer output = ExecuteHelper.jfr("disassemble"); + output.shouldContain("missing file"); - output = ExecuteHelper.run("split", "--wrongOption1", "..wrongOption2", "..wrongOption3", fileAText); - output.shouldContain("Too many arguments"); + output = ExecuteHelper.jfr("disassemble", "--wrongOption", fileAText); + output.shouldContain("unknown option"); - output = ExecuteHelper.run("split", "--wrongOption", fileAText); - output.shouldContain("Unknown option"); + output = ExecuteHelper.jfr("disassemble", "--wrongOption", "1", fileAText); + output.shouldContain("unknown option"); - output = ExecuteHelper.run("split", "--wrongOption", "1", fileAText); - output.shouldContain("Unknown option"); + output = ExecuteHelper.jfr("disassemble", "--max-chunks", "-3", fileAText); + output.shouldContain("max chunks must be at least 1"); - output = ExecuteHelper.run("split", "--maxchunks", "-3", fileAText); - output.shouldContain("Must be at least one chunk per file"); - - output = ExecuteHelper.run("split", "--maxchunks", "1000", fileAText); - output.shouldContain("Number of chunks in recording"); + output = ExecuteHelper.jfr("disassemble", "--max-chunks", "1000", fileAText); + output.shouldContain("number of chunks in recording"); output.shouldContain("doesn't exceed max chunks"); - output = ExecuteHelper.run("split", fileAText); // maxchunks is 5 by + output = ExecuteHelper.jfr("disassemble", fileAText); // maxchunks is 5 by // default System.out.println(output.getOutput()); System.out.println(fileAText); verifyRecording(fileAText.substring(0, fileAText.length() - 4) + "_1.jfr"); verifyRecording(fileAText.substring(0, fileAText.length() - 4) + "_2.jfr"); - output = ExecuteHelper.run("split", "--maxchunks", "2", fileBText); + output = ExecuteHelper.jfr("disassemble", "--max-chunks", "2", fileBText); verifyRecording(fileBText.substring(0, fileBText.length() - 4) + "_1.jfr"); verifyRecording(fileBText.substring(0, fileBText.length() - 4) + "_2.jfr"); verifyRecording(fileBText.substring(0, fileBText.length() - 4) + "_3.jfr"); - output = ExecuteHelper.run("split", "--maxchunks", "2", fileBText); + output = ExecuteHelper.jfr("disassemble", "--max-chunks", "2", fileBText); output.shouldContain("file with that name already exist"); + + // sanity check + output = ExecuteHelper.jfr("disassemble", "--max-size", "10000", fileCText); + verifyRecording(fileCText.substring(0, fileCText.length() - 4) + "_01.jfr"); } private static void verifyRecording(String name) throws IOException { - System.out.println("split name " + name); + System.out.println("Disassembling: " + name); try (RecordingFile rf = new RecordingFile(Paths.get(name))) { rf.readEvent(); } diff --git a/test/jdk/jdk/jfr/cmd/TestHelp.java b/test/jdk/jdk/jfr/tool/TestHelp.java similarity index 70% rename from test/jdk/jdk/jfr/cmd/TestHelp.java rename to test/jdk/jdk/jfr/tool/TestHelp.java index c6aa2c75379..406a68cd74c 100644 --- a/test/jdk/jdk/jfr/cmd/TestHelp.java +++ b/test/jdk/jdk/jfr/tool/TestHelp.java @@ -23,7 +23,7 @@ * questions. */ -package jdk.jfr.cmd; +package jdk.jfr.tool; import jdk.test.lib.process.OutputAnalyzer; @@ -33,25 +33,24 @@ import jdk.test.lib.process.OutputAnalyzer; * @key jfr * @requires vm.hasJFR * @library /test/lib /test/jdk - * @run main/othervm jdk.jfr.cmd.TestHelp + * @run main/othervm jdk.jfr.tool.TestHelp */ public class TestHelp { - public static void main(String[] args) throws Exception { - OutputAnalyzer output = ExecuteHelper.run("help"); - output.shouldContain("Available commands are:"); + public static void main(String[] args) throws Throwable { + OutputAnalyzer output = ExecuteHelper.jfr("help"); output.shouldContain("print"); - output.shouldContain("reconstruct"); + output.shouldContain("assemble"); + output.shouldContain("disassemble"); + output.shouldContain("metadata"); output.shouldContain("summary"); output.shouldContain("help"); - output = ExecuteHelper.run("help", "help"); - output.shouldContain("Available commands are:"); + output = ExecuteHelper.jfr("help", "version"); + output.shouldContain("Display version of the jfr tool"); + output.shouldContain("jfr version"); - output = ExecuteHelper.run("help", "wrongcommand"); - output.shouldContain("Unknown command"); - - output = ExecuteHelper.run("help", "wrongcommand", "wrongarguments"); - output.shouldContain("Too many arguments"); + output = ExecuteHelper.jfr("help", "wrongcommand"); + output.shouldContain("unknown command 'wrongcommand'"); } } diff --git a/test/jdk/jdk/jfr/tool/TestMetadata.java b/test/jdk/jdk/jfr/tool/TestMetadata.java new file mode 100644 index 00000000000..45cc55324f4 --- /dev/null +++ b/test/jdk/jdk/jfr/tool/TestMetadata.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.jfr.tool; + +import java.nio.file.Path; + +import jdk.jfr.EventType; +import jdk.jfr.consumer.RecordingFile; +import jdk.test.lib.process.OutputAnalyzer; + +/** + * @test + * @summary Test jfr info + * @key jfr + * @requires vm.hasJFR + * @library /test/lib /test/jdk + * @run main/othervm jdk.jfr.tool.TestMetadata + */ +public class TestMetadata { + + public static void main(String[] args) throws Throwable { + Path f = ExecuteHelper.createProfilingRecording().toAbsolutePath(); + String file = f.toAbsolutePath().toString(); + + OutputAnalyzer output = ExecuteHelper.jfr("metadata"); + output.shouldContain("missing file"); + + output = ExecuteHelper.jfr("metadata", "--wrongOption", file); + output.shouldContain("unknown option --wrongOption"); + + output = ExecuteHelper.jfr("metadata", file); + try (RecordingFile rf = new RecordingFile(f)) { + for (EventType t : rf.readEventTypes()) { + String name = t.getName(); + name = name.substring(name.lastIndexOf(".") + 1); + output.shouldContain(name); + } + } + } +} diff --git a/test/jdk/jdk/jfr/cmd/TestPrint.java b/test/jdk/jdk/jfr/tool/TestPrint.java similarity index 72% rename from test/jdk/jdk/jfr/cmd/TestPrint.java rename to test/jdk/jdk/jfr/tool/TestPrint.java index b32269f6dfc..f6b01e71893 100644 --- a/test/jdk/jdk/jfr/cmd/TestPrint.java +++ b/test/jdk/jdk/jfr/tool/TestPrint.java @@ -23,7 +23,7 @@ * questions. */ -package jdk.jfr.cmd; +package jdk.jfr.tool; import java.io.FileWriter; import java.nio.file.Files; @@ -38,29 +38,24 @@ import jdk.test.lib.process.OutputAnalyzer; * @key jfr * @requires vm.hasJFR * @library /test/lib /test/jdk - * @run main/othervm jdk.jfr.cmd.TestPrint + * @run main/othervm jdk.jfr.tool.TestPrint */ public class TestPrint { - public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Throwable { - OutputAnalyzer output = ExecuteHelper.run("print"); - output.shouldContain("Missing file"); + OutputAnalyzer output = ExecuteHelper.jfr("print"); + output.shouldContain("missing file"); - output = ExecuteHelper.run("print", "missing.jfr"); - output.shouldContain("Could not find file "); - - output = ExecuteHelper.run("print", "missing.jfr", "option1", "option2"); - output.shouldContain("Too many arguments"); + output = ExecuteHelper.jfr("print", "missing.jfr"); + output.shouldContain("could not find file "); Path file = Utils.createTempFile("faked-print-file", ".jfr"); FileWriter fw = new FileWriter(file.toFile()); fw.write('d'); fw.close(); - output = ExecuteHelper.run("print", "--wrongOption", file.toAbsolutePath().toString()); - output.shouldContain("Unknown option"); + output = ExecuteHelper.jfr("print", "--wrongOption", file.toAbsolutePath().toString()); + output.shouldContain("unknown option"); Files.delete(file); - - // Also see TestPrintJSON, TestPrintXML and TestPrintDefault. } } diff --git a/test/jdk/jdk/jfr/cmd/TestPrintDefault.java b/test/jdk/jdk/jfr/tool/TestPrintDefault.java similarity index 89% rename from test/jdk/jdk/jfr/cmd/TestPrintDefault.java rename to test/jdk/jdk/jfr/tool/TestPrintDefault.java index 1e7b022b9e6..a03b76d2f91 100644 --- a/test/jdk/jdk/jfr/cmd/TestPrintDefault.java +++ b/test/jdk/jdk/jfr/tool/TestPrintDefault.java @@ -23,7 +23,7 @@ * questions. */ -package jdk.jfr.cmd; +package jdk.jfr.tool; import java.nio.file.Path; @@ -39,15 +39,15 @@ import jdk.test.lib.process.OutputAnalyzer; * @modules java.scripting * jdk.jfr * - * @run main/othervm jdk.jfr.cmd.TestPrintDefault + * @run main/othervm jdk.jfr.tool.TestPrintDefault */ public class TestPrintDefault { - public static void main(String... args) throws Exception { + public static void main(String... args) throws Throwable { Path recordingFile = ExecuteHelper.createProfilingRecording().toAbsolutePath(); - OutputAnalyzer output = ExecuteHelper.run("print", recordingFile.toString()); + OutputAnalyzer output = ExecuteHelper.jfr("print", recordingFile.toString()); output.shouldContain("JVMInformation"); } } diff --git a/test/jdk/jdk/jfr/cmd/TestPrintJSON.java b/test/jdk/jdk/jfr/tool/TestPrintJSON.java similarity index 73% rename from test/jdk/jdk/jfr/cmd/TestPrintJSON.java rename to test/jdk/jdk/jfr/tool/TestPrintJSON.java index 6cf356c3377..71337904c98 100644 --- a/test/jdk/jdk/jfr/cmd/TestPrintJSON.java +++ b/test/jdk/jdk/jfr/tool/TestPrintJSON.java @@ -23,13 +23,19 @@ * questions. */ -package jdk.jfr.cmd; +package jdk.jfr.tool; import java.nio.file.Path; +import java.time.OffsetDateTime; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; +import jdk.jfr.Timespan; +import jdk.jfr.Timestamp; import jdk.jfr.ValueDescriptor; import jdk.jfr.consumer.RecordedEvent; import jdk.jfr.consumer.RecordedObject; @@ -48,15 +54,15 @@ import jdk.test.lib.process.OutputAnalyzer; * @modules jdk.scripting.nashorn * jdk.jfr * - * @run main/othervm jdk.jfr.cmd.TestPrintJSON + * @run main/othervm jdk.jfr.tool.TestPrintJSON */ public class TestPrintJSON { - public static void main(String... args) throws Exception { + public static void main(String... args) throws Throwable { Path recordingFile = ExecuteHelper.createProfilingRecording().toAbsolutePath(); - OutputAnalyzer output = ExecuteHelper.run("print", "--json", recordingFile.toString()); + OutputAnalyzer output = ExecuteHelper.jfr("print", "--json", "--stack-depth", "999", recordingFile.toString()); String json = output.getStdout(); // Parse JSON using Nashorn @@ -66,22 +72,20 @@ public class TestPrintJSON { engine.eval(statement); JSObject o = (JSObject) engine.get("jsonObject"); JSObject recording = (JSObject) o.getMember("recording"); - JSObject events = (JSObject) recording.getMember("events"); + JSObject jsonEvents = (JSObject) recording.getMember("events"); + List events = RecordingFile.readAllEvents(recordingFile); + Collections.sort(events, (e1, e2) -> e1.getEndTime().compareTo(e2.getEndTime())); // Verify events are equal - try (RecordingFile rf = new RecordingFile(recordingFile)) { - for (Object jsonEvent : events.values()) { - RecordedEvent recordedEvent = rf.readEvent(); - double typeId = recordedEvent.getEventType().getId(); - String startTime = recordedEvent.getStartTime().toString(); - String duration = recordedEvent.getDuration().toString(); - Asserts.assertEquals(typeId, ((Number) ((JSObject) jsonEvent).getMember("typeId")).doubleValue()); - Asserts.assertEquals(startTime, ((JSObject) jsonEvent).getMember("startTime")); - Asserts.assertEquals(duration, ((JSObject) jsonEvent).getMember("duration")); - assertEquals(jsonEvent, recordedEvent); - } - Asserts.assertFalse(rf.hasMoreEvents(), "Incorrect number of events"); + Iterator it = events.iterator(); + + for (Object jsonEvent : jsonEvents.values()) { + RecordedEvent recordedEvent = it.next(); + String typeName = recordedEvent.getEventType().getName(); + Asserts.assertEquals(typeName, ((JSObject) jsonEvent).getMember("type").toString()); + assertEquals(jsonEvent, recordedEvent); } + Asserts.assertFalse(events.size() != jsonEvents.values().size(), "Incorrect number of events"); } private static void assertEquals(Object jsonObject, Object jfrObject) throws Exception { @@ -92,7 +96,17 @@ public class TestPrintJSON { Asserts.assertEquals(values.values().size(), recObject.getFields().size()); for (ValueDescriptor v : recObject.getFields()) { String name = v.getName(); - assertEquals(values.getMember(name), recObject.getValue(name)); + Object jsonValue = values.getMember(name); + Object expectedValue = recObject.getValue(name); + if (v.getAnnotation(Timestamp.class) != null) { + // Make instant of OffsetDateTime + jsonValue = OffsetDateTime.parse("" + jsonValue).toInstant().toString(); + expectedValue = recObject.getInstant(name); + } + if (v.getAnnotation(Timespan.class) != null) { + expectedValue = recObject.getDuration(name); + } + assertEquals(jsonValue, expectedValue); return; } } diff --git a/test/jdk/jdk/jfr/cmd/TestPrintXML.java b/test/jdk/jdk/jfr/tool/TestPrintXML.java similarity index 71% rename from test/jdk/jdk/jfr/cmd/TestPrintXML.java rename to test/jdk/jdk/jfr/tool/TestPrintXML.java index c389953b121..f84ee1372c4 100644 --- a/test/jdk/jdk/jfr/cmd/TestPrintXML.java +++ b/test/jdk/jdk/jfr/tool/TestPrintXML.java @@ -23,35 +23,42 @@ * questions. */ -package jdk.jfr.cmd; +package jdk.jfr.tool; +import java.io.File; import java.io.StringReader; import java.nio.file.Path; -import java.time.Duration; -import java.time.Instant; +import java.time.OffsetDateTime; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Stack; +import javax.xml.XMLConstants; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.DefaultHandler; + +import jdk.jfr.Timespan; +import jdk.jfr.Timestamp; import jdk.jfr.ValueDescriptor; import jdk.jfr.consumer.RecordedEvent; import jdk.jfr.consumer.RecordedObject; import jdk.jfr.consumer.RecordingFile; import jdk.test.lib.process.OutputAnalyzer; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.DefaultHandler; - /** * @test * @key jfr @@ -59,36 +66,49 @@ import org.xml.sax.helpers.DefaultHandler; * @requires vm.hasJFR * * @library /test/lib /test/jdk - * @modules java.scripting - * java.xml - * jdk.jfr + * @modules java.scripting java.xml jdk.jfr * - * @run main/othervm jdk.jfr.cmd.TestPrintXML + * @run main/othervm jdk.jfr.tool.TestPrintXML */ public class TestPrintXML { - public static void main(String... args) throws Exception { + public static void main(String... args) throws Throwable { Path recordingFile = ExecuteHelper.createProfilingRecording().toAbsolutePath(); - OutputAnalyzer output = ExecuteHelper.run("print", "--xml", recordingFile.toString()); + OutputAnalyzer output = ExecuteHelper.jfr("print", "--xml", "--stack-depth", "9999", recordingFile.toString()); + System.out.println(recordingFile); String xml = output.getStdout(); - System.out.println(xml); - // Parse XML string + + SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + Schema schema = schemaFactory.newSchema(new File(System.getProperty("test.src"), "jfr.xsd")); + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setSchema(schema); + factory.setNamespaceAware(true); + SAXParser sp = factory.newSAXParser(); XMLReader xr = sp.getXMLReader(); RecordingHandler handler = new RecordingHandler(); xr.setContentHandler(handler); + xr.setErrorHandler(handler); xr.parse(new InputSource(new StringReader(xml))); // Verify that all data was written correctly - Iterator it = RecordingFile.readAllEvents(recordingFile).iterator(); + List events = RecordingFile.readAllEvents(recordingFile); + Collections.sort(events, (e1, e2) -> e1.getEndTime().compareTo(e2.getEndTime())); + Iterator it = events.iterator(); for (XMLEvent xmlEvent : handler.events) { RecordedEvent re = it.next(); if (!compare(re, xmlEvent.values)) { + System.out.println("Expected:"); + System.out.println("----------------------"); System.out.println(re); - System.out.println(xmlEvent.values.toString()); + System.out.println(); + System.out.println("Was (XML)"); + System.out.println("----------------------"); + System.out.println(xmlEvent); + System.out.println(); throw new Exception("Event doesn't match"); } } @@ -109,7 +129,17 @@ public class TestPrintXML { } for (ValueDescriptor v : fields) { String name = v.getName(); - if (!compare(re.getValue(name), xmlMap.get(name))) { + Object xmlValue = xmlMap.get(name); + Object expectedValue = re.getValue(name); + if (v.getAnnotation(Timestamp.class) != null) { + // Make instant of OffsetDateTime + xmlValue = OffsetDateTime.parse("" + xmlValue).toInstant().toString(); + expectedValue = re.getInstant(name); + } + if (v.getAnnotation(Timespan.class) != null) { + expectedValue = re.getDuration(name); + } + if (!compare(expectedValue, xmlValue)) { return false; } } @@ -135,14 +165,10 @@ public class TestPrintXML { static class XMLEvent { String name; - Instant startTime; - Duration duration; - Map values = new HashMap<>(); + private Map values = new HashMap<>(); - XMLEvent(String name, Instant startTime, Duration duration) { + XMLEvent(String name) { this.name = name; - this.startTime = startTime; - this.duration = duration; } } @@ -155,15 +181,15 @@ public class TestPrintXML { @Override public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { elements.push(new SimpleEntry<>(attrs.getValue("name"), attrs.getValue("index"))); - switch (qName) { - case "null": - objects.pop(); + String nil = attrs.getValue("xsi:nil"); + if ("true".equals(nil)) { objects.push(null); - break; + return; + } + + switch (qName) { case "event": - Instant startTime = Instant.parse(attrs.getValue("startTime")); - Duration duration = Duration.parse(attrs.getValue("duration")); - objects.push(new XMLEvent(attrs.getValue("name"), startTime, duration)); + objects.push(new XMLEvent(attrs.getValue("type"))); break; case "struct": objects.push(new HashMap()); @@ -218,5 +244,17 @@ public class TestPrintXML { } } } + + public void warning(SAXParseException spe) throws SAXException { + throw new SAXException(spe); + } + + public void error(SAXParseException spe) throws SAXException { + throw new SAXException(spe); + } + + public void fatalError(SAXParseException spe) throws SAXException { + throw new SAXException(spe); + } } } diff --git a/test/jdk/jdk/jfr/cmd/TestSummary.java b/test/jdk/jdk/jfr/tool/TestSummary.java similarity index 82% rename from test/jdk/jdk/jfr/cmd/TestSummary.java rename to test/jdk/jdk/jfr/tool/TestSummary.java index 52a6a90fbbe..dcbc5a4da6f 100644 --- a/test/jdk/jdk/jfr/cmd/TestSummary.java +++ b/test/jdk/jdk/jfr/tool/TestSummary.java @@ -23,7 +23,7 @@ * questions. */ -package jdk.jfr.cmd; +package jdk.jfr.tool; import java.nio.file.Path; @@ -37,21 +37,21 @@ import jdk.test.lib.process.OutputAnalyzer; * @key jfr * @requires vm.hasJFR * @library /test/lib /test/jdk - * @run main/othervm jdk.jfr.cmd.TestSummary + * @run main/othervm jdk.jfr.tool.TestSummary */ public class TestSummary { - public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Throwable { Path f = ExecuteHelper.createProfilingRecording().toAbsolutePath(); String file = f.toAbsolutePath().toString(); - OutputAnalyzer output = ExecuteHelper.run("summary"); - output.shouldContain("Missing file"); + OutputAnalyzer output = ExecuteHelper.jfr("summary"); + output.shouldContain("missing file"); - output = ExecuteHelper.run("summary", "--wrongOption", file); - output.shouldContain("Too many arguments"); + output = ExecuteHelper.jfr("summary", "--wrongOption", file); + output.shouldContain("too many arguments"); - output = ExecuteHelper.run("summary", file); + output = ExecuteHelper.jfr("summary", file); try (RecordingFile rf = new RecordingFile(f)) { for (EventType t : rf.readEventTypes()) { output.shouldContain(t.getName()); diff --git a/test/jdk/jdk/jfr/tool/jfr.xsd b/test/jdk/jdk/jfr/tool/jfr.xsd new file mode 100644 index 00000000000..adf44493f86 --- /dev/null +++ b/test/jdk/jdk/jfr/tool/jfr.xsd @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/jdk/sun/nio/cs/TestIBMBugs.java b/test/jdk/sun/nio/cs/TestIBMBugs.java index 27683879499..ab03e6cd5ce 100644 --- a/test/jdk/sun/nio/cs/TestIBMBugs.java +++ b/test/jdk/sun/nio/cs/TestIBMBugs.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ /* @test - * @bug 6371437 6371422 6371416 6371619 5058184 6371431 6639450 6569191 6577466 + * @bug 6371437 6371422 6371416 6371619 5058184 6371431 6639450 6569191 6577466 8212794 * @summary Check if the problems reported in above bugs have been fixed * @modules jdk.charsets */ @@ -234,6 +234,22 @@ public class TestIBMBugs { } } + private static void bug8212794 () throws Exception { + Charset cs = Charset.forName("x-IBM964"); + byte[] ba = new byte[] {(byte)0x5c, (byte)0x90, (byte)0xa1, (byte)0xa1}; + char[] ca = new char[] {'\\', '\u0090', '\u3000'}; + ByteBuffer bb = ByteBuffer.wrap(ba); + CharBuffer cb = cs.decode(bb); + if(!Arrays.equals(ca, Arrays.copyOf(cb.array(), cb.limit()))) { + throw new Exception("IBM964 failed to decode"); + } + cb = CharBuffer.wrap(ca); + bb = cs.encode(cb); + if(!Arrays.equals(ba, Arrays.copyOf(bb.array(), bb.limit()))) { + throw new Exception("IBM964 failed to encode"); + } + } + public static void main (String[] args) throws Exception { bug6577466(); // need to be tested before any other IBM949C test case @@ -245,6 +261,7 @@ public class TestIBMBugs { bug6371431(); bug6569191(); bug8202329(); + bug8212794(); bug8213618(); } } diff --git a/test/jdk/sun/security/pkcs11/nss/src/nss-3.16-with-nspr-4.10.4.tar.gz b/test/jdk/sun/security/pkcs11/nss/src/nss-3.16-with-nspr-4.10.4.tar.gz deleted file mode 100644 index 63fa5feb510..00000000000 Binary files a/test/jdk/sun/security/pkcs11/nss/src/nss-3.16-with-nspr-4.10.4.tar.gz and /dev/null differ diff --git a/test/jdk/sun/security/pkcs11/nss/src/nss-3.16-with-nspr-4.10.4.tar.gz.sha256 b/test/jdk/sun/security/pkcs11/nss/src/nss-3.16-with-nspr-4.10.4.tar.gz.sha256 deleted file mode 100644 index e4802dc7dea..00000000000 --- a/test/jdk/sun/security/pkcs11/nss/src/nss-3.16-with-nspr-4.10.4.tar.gz.sha256 +++ /dev/null @@ -1 +0,0 @@ -9d23633683ab3cea14519a22a997bc7f5d8d9664b6342df492c194966184ce0d nss-3.16-with-nspr-4.10.4.tar.gz diff --git a/test/jdk/sun/security/tools/keytool/KeyToolTest.java b/test/jdk/sun/security/tools/keytool/KeyToolTest.java index 85a731d8e20..dca94d3bb08 100644 --- a/test/jdk/sun/security/tools/keytool/KeyToolTest.java +++ b/test/jdk/sun/security/tools/keytool/KeyToolTest.java @@ -1436,6 +1436,7 @@ public class KeyToolTest { testOK("", pre+"san3 -ext san=dns:me.org"); testOK("", pre+"san4 -ext san=ip:192.168.0.1"); testOK("", pre+"san5 -ext san=oid:1.2.3.4"); + testOK("", pre+"san6 -ext san=dns:1abc.com"); //begin with digit testOK("", pre+"san235 -ext san=uri:http://me.org,dns:me.org,oid:1.2.3.4"); ks = loadStore("x.jks", "changeit", "JKS"); diff --git a/test/jdk/sun/security/x509/GeneralName/DNSNameTest.java b/test/jdk/sun/security/x509/GeneralName/DNSNameTest.java new file mode 100644 index 00000000000..490c8f534dc --- /dev/null +++ b/test/jdk/sun/security/x509/GeneralName/DNSNameTest.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @summary DNSName parsing tests + * @bug 8213952 + * @modules java.base/sun.security.x509 + * @run testng DNSNameTest + */ + +import java.io.IOException; +import sun.security.x509.DNSName; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import static org.testng.Assert.*; + +public class DNSNameTest { + @DataProvider(name = "goodNames") + public Object[][] goodNames() { + Object[][] data = { + {"abc.com"}, + {"ABC.COM"}, + {"a12.com"}, + {"a1b2c3.com"}, + {"1abc.com"}, + {"123.com"}, + {"abc.com-"}, // end with hyphen + {"a-b-c.com"}, // hyphens + }; + return data; + } + + @DataProvider(name = "badNames") + public Object[][] badNames() { + Object[][] data = { + {" 1abc.com"}, // begin with space + {"1abc.com "}, // end with space + {"1a bc.com "}, // no space allowed + {"-abc.com"}, // begin with hyphen + {"a..b"}, // .. + {".a"}, // begin with . + {"a."}, // end with . + {""}, // empty + {" "}, // space only + }; + return data; + } + + @Test(dataProvider = "goodNames") + public void testGoodDNSName(String dnsNameString) { + try { + DNSName dn = new DNSName(dnsNameString); + } catch (IOException e) { + fail("Unexpected IOException"); + } + } + + @Test(dataProvider = "badNames") + public void testBadDNSName(String dnsNameString) { + try { + DNSName dn = new DNSName(dnsNameString); + fail("IOException expected"); + } catch (IOException e) { + if (!e.getMessage().contains("DNSName")) + fail("Unexpeceted message: " + e); + } + } +} diff --git a/test/jdk/sun/text/IntHashtable/Bug4170614Test.sh b/test/jdk/sun/text/IntHashtable/Bug4170614Test.sh deleted file mode 100644 index e70f4905831..00000000000 --- a/test/jdk/sun/text/IntHashtable/Bug4170614Test.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/sh - -# -# Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# @test -# @bug 4170614 -# @summary Test internal hashCode() functions -# - -set -x -if [ "${TESTSRC}" = "" ] -then - echo "TESTSRC not set. Test cannot execute. Failed." - exit 1 -fi -echo "TESTSRC=${TESTSRC}" -if [ "${TESTJAVA}" = "" ] -then - echo "TESTJAVA not set. Test cannot execute. Failed." - exit 1 -fi -echo "TESTJAVA=${TESTJAVA}" -if [ "${COMPILEJAVA}" = "" ]; then - COMPILEJAVA="${TESTJAVA}" -fi -echo "COMPILEJAVA=${COMPILEJAVA}" -if [ "${TESTCLASSES}" = "" ] -then - echo "TESTCLASSES not set. Test cannot execute. Failed." - exit 1 -fi -echo "TESTCLASSES=${TESTCLASSES}" - -goback=`pwd` - -cd ${TESTSRC} - -TEST_JAVABASE=${TESTCLASSES}/java.base -mkdir -p ${TEST_JAVABASE} -${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} \ - --patch-module java.base=patch-src \ - -d ${TEST_JAVABASE} patch-src/java/text/Bug4170614Test.java - -${TESTJAVA}/bin/java ${TESTVMOPTS} --patch-module java.base=${TEST_JAVABASE} java.text.Bug4170614Test - -result=$? - -cd ${goback} - -if [ $result -eq 0 ] -then - echo "Passed" -else - echo "Failed" -fi -exit $result - - - diff --git a/test/jdk/sun/text/IntHashtable/Bug4170614TestRun.java b/test/jdk/sun/text/IntHashtable/Bug4170614TestRun.java new file mode 100644 index 00000000000..b4d0ed1d170 --- /dev/null +++ b/test/jdk/sun/text/IntHashtable/Bug4170614TestRun.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 4170614 + * @summary Test internal hashCode() and equals() functions + * @library patch-src + * @build java.base/java.text.Bug4170614Test + * @run main java.base/java.text.Bug4170614Test + */ diff --git a/test/jdk/sun/text/IntHashtable/patch-src/java/text/Bug4170614Test.java b/test/jdk/sun/text/IntHashtable/patch-src/java.base/java/text/Bug4170614Test.java similarity index 96% rename from test/jdk/sun/text/IntHashtable/patch-src/java/text/Bug4170614Test.java rename to test/jdk/sun/text/IntHashtable/patch-src/java.base/java/text/Bug4170614Test.java index 97e08a1bdd4..c2e1b7613da 100644 --- a/test/jdk/sun/text/IntHashtable/patch-src/java/text/Bug4170614Test.java +++ b/test/jdk/sun/text/IntHashtable/patch-src/java.base/java/text/Bug4170614Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,8 +22,8 @@ */ /* - (this test doesn't have an at-test tag because it's run by a shell - script instead of directly by the test harness) + (this test doesn't have an at-test tag because it's run by Bug4170614TestRun.java + instead of directly by the test harness) */ /* @@ -72,8 +72,7 @@ import sun.text.IntHashtable; * actually causing anyone problems yet. But if these classes are * ever exposed in the API, their hashCode() methods need to work right. * PatternEntry will never be exposed in the API, but IntHashtable - * might be. This is a shell test to allow us to access classes that - * are declared package private. + * might be. * @author Richard Gillam */ public class Bug4170614Test { diff --git a/test/jdk/sun/tools/jps/TestJps.java b/test/jdk/sun/tools/jps/TestJps.java index aa5b1bbb9ed..e8dd339ffff 100644 --- a/test/jdk/sun/tools/jps/TestJps.java +++ b/test/jdk/sun/tools/jps/TestJps.java @@ -27,7 +27,7 @@ * @modules jdk.jartool/sun.tools.jar * @build LingeredAppForJps * @build LingeredApp - * @run main/othervm TestJps + * @run main/othervm/timeout=360 TestJps */ /* diff --git a/test/jdk/tools/jlink/JLinkTest.java b/test/jdk/tools/jlink/JLinkTest.java index 20af6ecc269..1baf70bb03c 100644 --- a/test/jdk/tools/jlink/JLinkTest.java +++ b/test/jdk/tools/jlink/JLinkTest.java @@ -44,6 +44,7 @@ import tests.JImageGenerator; * @summary Test image creation * @bug 8189777 * @bug 8194922 + * @bug 8206962 * @author Jean-Francois Denise * @requires (vm.compMode != "Xcomp" & os.maxMemory >= 2g) * @library ../lib @@ -344,6 +345,16 @@ public class JLinkTest { .option("--help") .call().assertSuccess(); } + + { + String imageDir = "bug8206962"; + JImageGenerator.getJLinkTask() + .modulePath(helper.defaultModulePath()) + .output(helper.createNewImageDir(imageDir)) + .addMods("java.base") + .option("--release-info=del") + .call().assertFailure("Error: No key specified for delete"); + } } private static void testCompress(Helper helper, String moduleName, String... userOptions) throws IOException { diff --git a/test/jdk/tools/launcher/HelpFlagsTest.java b/test/jdk/tools/launcher/HelpFlagsTest.java index b19042fde85..5d7ed9b7191 100644 --- a/test/jdk/tools/launcher/HelpFlagsTest.java +++ b/test/jdk/tools/launcher/HelpFlagsTest.java @@ -140,6 +140,7 @@ public class HelpFlagsTest extends TestHelper { new ToolHelpSpec("jdb", 1, 1, 1, 0, 1, 1, 0), // -?, -h, --help -help, Documents -help new ToolHelpSpec("jdeprscan", 1, 1, 1, 0, 0, 0, 1), // -?, -h, --help new ToolHelpSpec("jdeps", 1, 1, 1, 0, 1, 0, 2), // -?, -h, --help, -help accepted but not documented. + new ToolHelpSpec("jfr", 1, 1, 1, 0, 0, 0, 2), // -?, -h, --help new ToolHelpSpec("jhsdb", 0, 0, 0, 0, 0, 0, 0), // none, prints help message anyways. new ToolHelpSpec("jimage", 1, 1, 1, 0, 0, 0, 2), // -?, -h, --help new ToolHelpSpec("jinfo", 1, 1, 1, 0, 1, 1, 1), // -?, -h, --help -help, Documents -help @@ -224,6 +225,7 @@ public class HelpFlagsTest extends TestHelper { line.charAt(posAfter) != ',' && line.charAt(posAfter) != '[' && // jar line.charAt(posAfter) != ']' && // jarsigner + line.charAt(posAfter) != ')' && // jfr line.charAt(posAfter) != '|' && // jstatd line.charAt(posAfter) != ':' && // jps line.charAt(posAfter) != '"') { // keytool diff --git a/test/jdk/tools/launcher/VersionCheck.java b/test/jdk/tools/launcher/VersionCheck.java index 4bb2dc72d10..148ecee651e 100644 --- a/test/jdk/tools/launcher/VersionCheck.java +++ b/test/jdk/tools/launcher/VersionCheck.java @@ -88,6 +88,7 @@ public class VersionCheck extends TestHelper { "jcontrol", "jdeprscan", "jdeps", + "jfr", "jimage", "jinfo", "jlink", diff --git a/test/langtools/jdk/javadoc/doclet/lib/JavadocTester.java b/test/langtools/jdk/javadoc/doclet/lib/JavadocTester.java index 71a09d003e9..ec0b042c929 100644 --- a/test/langtools/jdk/javadoc/doclet/lib/JavadocTester.java +++ b/test/langtools/jdk/javadoc/doclet/lib/JavadocTester.java @@ -522,7 +522,9 @@ public abstract class JavadocTester { + stringToFind); } else { failed(path + ": following text " + (isFound ? "found:" : "not found:") + "\n" - + stringToFind); + + stringToFind + '\n' + + "found \n" + + fileString); } } } diff --git a/test/langtools/jdk/javadoc/doclet/testClassTree/TestClassTree.java b/test/langtools/jdk/javadoc/doclet/testClassTree/TestClassTree.java index 6cea03e8ac5..47be8c680ad 100644 --- a/test/langtools/jdk/javadoc/doclet/testClassTree/TestClassTree.java +++ b/test/langtools/jdk/javadoc/doclet/testClassTree/TestClassTree.java @@ -63,8 +63,7 @@ public class TestClassTree extends JavadocTester { + "
      \n" + "
    • java.lang.Object\n" + "
        \n" - + "
      • java.lang.Enum<E> (implements java.lang." - + "Comparable<T>, java.io.Serializable)\n" + + "
      • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.lang.constant.Constable, java.io.Serializable)\n" + "
          \n" + "
        • pkg.Coin
        • \n" diff --git a/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/pkg/DeprecatedClassByAnnotation.java b/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/pkg/DeprecatedClassByAnnotation.java index 6770d64c506..0ae8013f354 100644 --- a/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/pkg/DeprecatedClassByAnnotation.java +++ b/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/pkg/DeprecatedClassByAnnotation.java @@ -23,7 +23,7 @@ package pkg; -@Deprecated() +@Deprecated public class DeprecatedClassByAnnotation { @Deprecated(forRemoval=true) @@ -32,6 +32,6 @@ public class DeprecatedClassByAnnotation { @Deprecated(forRemoval=true) public DeprecatedClassByAnnotation() {} - @Deprecated() + @Deprecated public void method() {} } diff --git a/test/langtools/jdk/javadoc/doclet/testHtmlVersion/pkg2/DeprecatedClassByAnnotation.java b/test/langtools/jdk/javadoc/doclet/testHtmlVersion/pkg2/DeprecatedClassByAnnotation.java index b8500c1ab31..2b69845e8ad 100644 --- a/test/langtools/jdk/javadoc/doclet/testHtmlVersion/pkg2/DeprecatedClassByAnnotation.java +++ b/test/langtools/jdk/javadoc/doclet/testHtmlVersion/pkg2/DeprecatedClassByAnnotation.java @@ -23,15 +23,15 @@ package pkg2; -@Deprecated() +@Deprecated public class DeprecatedClassByAnnotation { - @Deprecated() + @Deprecated public int field; - @Deprecated() + @Deprecated public DeprecatedClassByAnnotation() {} - @Deprecated() + @Deprecated public void method() {} } diff --git a/test/langtools/jdk/javadoc/doclet/testSearch/pkg2/DeprecatedClassByAnnotation.java b/test/langtools/jdk/javadoc/doclet/testSearch/pkg2/DeprecatedClassByAnnotation.java index b8500c1ab31..2b69845e8ad 100644 --- a/test/langtools/jdk/javadoc/doclet/testSearch/pkg2/DeprecatedClassByAnnotation.java +++ b/test/langtools/jdk/javadoc/doclet/testSearch/pkg2/DeprecatedClassByAnnotation.java @@ -23,15 +23,15 @@ package pkg2; -@Deprecated() +@Deprecated public class DeprecatedClassByAnnotation { - @Deprecated() + @Deprecated public int field; - @Deprecated() + @Deprecated public DeprecatedClassByAnnotation() {} - @Deprecated() + @Deprecated public void method() {} } diff --git a/test/langtools/jdk/javadoc/doclet/testSeeTag/TestSeeTag.java b/test/langtools/jdk/javadoc/doclet/testSeeTag/TestSeeTag.java index 1e9df13cb51..9440d63e59f 100644 --- a/test/langtools/jdk/javadoc/doclet/testSeeTag/TestSeeTag.java +++ b/test/langtools/jdk/javadoc/doclet/testSeeTag/TestSeeTag.java @@ -95,7 +95,7 @@ public class TestSeeTag extends JavadocTester { checkOutput("badref/Test.html", true, "
          \n" + "
          See Also:
          \n" - + "
          Object[], \n" + + "
          Object, \n" + "Foo
          \n" + "
          "); } diff --git a/test/langtools/jdk/javadoc/doclet/testSerializedForm/SerializedForm.java b/test/langtools/jdk/javadoc/doclet/testSerializedForm/SerializedForm.java index cf0f7febd3a..f25fc680078 100644 --- a/test/langtools/jdk/javadoc/doclet/testSerializedForm/SerializedForm.java +++ b/test/langtools/jdk/javadoc/doclet/testSerializedForm/SerializedForm.java @@ -31,13 +31,15 @@ public class SerializedForm implements Serializable { /** * @serialField name String a test + * @serialField longs Long[] the longs * @see TestSerializedForm */ @Deprecated private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("i", int.class), new ObjectStreamField("count", Integer.TYPE), - new ObjectStreamField("name", String.class) + new ObjectStreamField("name", String.class), + new ObjectStreamField("longs", Long[].class) }; /** diff --git a/test/langtools/jdk/javadoc/doclet/testSerializedForm/TestSerializedForm.java b/test/langtools/jdk/javadoc/doclet/testSerializedForm/TestSerializedForm.java index 496eec4ed38..d6aa23a349f 100644 --- a/test/langtools/jdk/javadoc/doclet/testSerializedForm/TestSerializedForm.java +++ b/test/langtools/jdk/javadoc/doclet/testSerializedForm/TestSerializedForm.java @@ -84,6 +84,19 @@ public class TestSerializedForm extends JavadocTester { + "pkg1.ProtectedInnerClass.ProInnerClass extends java.lang.Object implements Serializable", "

          Class pkg1.PublicExcludeInnerClass.PubInnerClass extends java.lang.Object implements " + "Serializable

          "); + + checkOutput("serialized-form.html", true, + "

          Serialized Fields

          \n" + + "
            \n" + + "
          • \n" + + "

            longs

            \n" + + "
            Long[] longs
            \n" + + "
            the longs
            \n" + + "
          • \n" + + "
          • \n" + + "

            name

            \n" + + "
            java.lang.String name
            \n" + + "
            a test
            "); } @Test @@ -113,6 +126,19 @@ public class TestSerializedForm extends JavadocTester { "

            Class pkg1.PublicExcludeInnerClass.PubInnerClass " + "extends java.lang.Object implements Serializable

            "); + + checkOutput("serialized-form.html", true, + "

            Serialized Fields

            \n" + + "
              \n" + + "
            • \n" + + "

              longs

              \n" + + "
              Long[] longs
              \n" + + "
              the longs
              \n" + + "
            • \n" + + "
            • \n" + + "

              name

              \n" + + "
              java.lang.String name
              \n" + + "
              a test
              "); } @Test diff --git a/test/langtools/jdk/jshell/TypeNameTest.java b/test/langtools/jdk/jshell/TypeNameTest.java index 7d691eda8ee..6e6c270063e 100644 --- a/test/langtools/jdk/jshell/TypeNameTest.java +++ b/test/langtools/jdk/jshell/TypeNameTest.java @@ -192,7 +192,9 @@ public class TypeNameTest extends KullaTesting { assertType("arrayOf(99)[0]", "Integer"); assertEval(" Z choose(Z z1, Z z2) { return z1; }"); - assertType("choose(1, 1L);", "Number&Comparable>", "Object"); + assertType("choose(1, 1L);", + "Number&Comparable&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc", + "Object"); } public void testVariableTypeName() { diff --git a/test/langtools/tools/doclint/ReferenceTest.out b/test/langtools/tools/doclint/ReferenceTest.out index e9a9f04f5f1..9214737872c 100644 --- a/test/langtools/tools/doclint/ReferenceTest.out +++ b/test/langtools/tools/doclint/ReferenceTest.out @@ -43,24 +43,12 @@ ReferenceTest.java:64: error: type arguments not allowed here ReferenceTest.java:65: error: type arguments not allowed here * @see not.Found ^ -ReferenceTest.java:70: error: array type not allowed here - * {@link java.lang.String[]} - ^ -ReferenceTest.java:71: error: array type not allowed here - * {@link java.lang.String[]#equals} - ^ -ReferenceTest.java:72: error: array type not allowed here +ReferenceTest.java:72: error: reference not found * {@link not.Found[]} ^ -ReferenceTest.java:73: error: array type not allowed here - * @see java.lang.String[] - ^ -ReferenceTest.java:74: error: array type not allowed here - * @see java.lang.String[]#equals - ^ -ReferenceTest.java:75: error: array type not allowed here +ReferenceTest.java:75: error: reference not found * @see not.Found[] ^ -20 errors +16 errors 1 warning diff --git a/test/langtools/tools/javac/T8020997/CannotCompileRepeatedAnnoTest.java b/test/langtools/tools/javac/T8020997/CannotCompileRepeatedAnnoTest.java index 97e356b35c2..e8800f9af90 100644 --- a/test/langtools/tools/javac/T8020997/CannotCompileRepeatedAnnoTest.java +++ b/test/langtools/tools/javac/T8020997/CannotCompileRepeatedAnnoTest.java @@ -31,7 +31,7 @@ import java.lang.annotation.*; @Anno(req = true) -@Anno() +@Anno public class CannotCompileRepeatedAnnoTest { } diff --git a/test/langtools/tools/javac/T8187978/FilterOutCandidatesForDiagnosticsTest.out b/test/langtools/tools/javac/T8187978/FilterOutCandidatesForDiagnosticsTest.out index 39bf07234cb..c2f95754787 100644 --- a/test/langtools/tools/javac/T8187978/FilterOutCandidatesForDiagnosticsTest.out +++ b/test/langtools/tools/javac/T8187978/FilterOutCandidatesForDiagnosticsTest.out @@ -1,2 +1,2 @@ -FilterOutCandidatesForDiagnosticsTest.java:12:64: compiler.err.cant.apply.symbols: kindname.method, add, java.lang.String,{(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable>,java.lang.Object[],int), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable>), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable>))),(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(int,compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable>), (compiler.misc.arg.length.mismatch))} +FilterOutCandidatesForDiagnosticsTest.java:12:64: compiler.err.cant.apply.symbols: kindname.method, add, java.lang.String,{(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc,java.lang.Object[],int), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc))),(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(int,compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc), (compiler.misc.arg.length.mismatch))} 1 error diff --git a/test/langtools/tools/javac/annotations/6881115/T6881115.java b/test/langtools/tools/javac/annotations/6881115/T6881115.java index 0c917f15c64..f443398cb4d 100644 --- a/test/langtools/tools/javac/annotations/6881115/T6881115.java +++ b/test/langtools/tools/javac/annotations/6881115/T6881115.java @@ -12,7 +12,7 @@ import java.lang.annotation.ElementType; @Target({ElementType.TYPE, ElementType.TYPE_PARAMETER, ElementType.ANNOTATION_TYPE}) @interface A { B b() default @B(b2 = 1, b2 = 2); - B[] b_arr() default {@B(), @B(b2 = 1, b2 = 2)}; + B[] b_arr() default {@B, @B(b2 = 1, b2 = 2)}; } @interface B { @@ -21,6 +21,6 @@ import java.lang.annotation.ElementType; } @A(b = @B(b2 = 1, b2 = 2), - b_arr = {@B(), @B(b2 = 1, b2 = 2)}) + b_arr = {@B, @B(b2 = 1, b2 = 2)}) class T6881115<@A(b = @B(b2 = 1, b2 = 2), - b_arr = {@B(), @B(b2 = 1, b2 = 2)}) X> {} + b_arr = {@B, @B(b2 = 1, b2 = 2)}) X> {} diff --git a/test/langtools/tools/javac/annotations/6881115/T6881115.out b/test/langtools/tools/javac/annotations/6881115/T6881115.out index a924a311590..93ee8209ef0 100644 --- a/test/langtools/tools/javac/annotations/6881115/T6881115.out +++ b/test/langtools/tools/javac/annotations/6881115/T6881115.out @@ -1,16 +1,16 @@ T6881115.java:14:30: compiler.err.duplicate.annotation.member.value: b2, B T6881115.java:14:19: compiler.err.annotation.missing.default.value: B, b1 T6881115.java:15:26: compiler.err.annotation.missing.default.value.1: B, b1,b2 -T6881115.java:15:43: compiler.err.duplicate.annotation.member.value: b2, B -T6881115.java:15:32: compiler.err.annotation.missing.default.value: B, b1 +T6881115.java:15:41: compiler.err.duplicate.annotation.member.value: b2, B +T6881115.java:15:30: compiler.err.annotation.missing.default.value: B, b1 T6881115.java:23:19: compiler.err.duplicate.annotation.member.value: b2, B T6881115.java:23:8: compiler.err.annotation.missing.default.value: B, b1 T6881115.java:24:13: compiler.err.annotation.missing.default.value.1: B, b1,b2 -T6881115.java:24:30: compiler.err.duplicate.annotation.member.value: b2, B -T6881115.java:24:19: compiler.err.annotation.missing.default.value: B, b1 +T6881115.java:24:28: compiler.err.duplicate.annotation.member.value: b2, B +T6881115.java:24:17: compiler.err.annotation.missing.default.value: B, b1 T6881115.java:25:34: compiler.err.duplicate.annotation.member.value: b2, B T6881115.java:25:23: compiler.err.annotation.missing.default.value: B, b1 T6881115.java:26:28: compiler.err.annotation.missing.default.value.1: B, b1,b2 -T6881115.java:26:45: compiler.err.duplicate.annotation.member.value: b2, B -T6881115.java:26:34: compiler.err.annotation.missing.default.value: B, b1 +T6881115.java:26:43: compiler.err.duplicate.annotation.member.value: b2, B +T6881115.java:26:32: compiler.err.annotation.missing.default.value: B, b1 15 errors diff --git a/test/langtools/tools/javac/annotations/neg/Cycle3.java b/test/langtools/tools/javac/annotations/neg/Cycle3.java index ce065edcd84..7aff00a3d6d 100644 --- a/test/langtools/tools/javac/annotations/neg/Cycle3.java +++ b/test/langtools/tools/javac/annotations/neg/Cycle3.java @@ -14,10 +14,10 @@ import static java.lang.annotation.RetentionPolicy.*; @Retention(RUNTIME) @interface A { - A[] values() default { @A() }; + A[] values() default { @A }; } -@A() +@A class Main { public static void main(String[] args) { A a = Main.class.getAnnotation(A.class); diff --git a/test/langtools/tools/javac/annotations/pos/Primitives.java b/test/langtools/tools/javac/annotations/pos/Primitives.java index cfa91528463..01b7ef5e236 100644 --- a/test/langtools/tools/javac/annotations/pos/Primitives.java +++ b/test/langtools/tools/javac/annotations/pos/Primitives.java @@ -39,8 +39,8 @@ public class Primitives { Class[] value() default { void.class }; } - @A() - @B() + @A + @B static class T1 {} @A(int.class) diff --git a/test/langtools/tools/javac/annotations/repeatingAnnotations/BaseAnnoAsContainerAnno.java b/test/langtools/tools/javac/annotations/repeatingAnnotations/BaseAnnoAsContainerAnno.java index baf8b14363a..8f07e139c91 100644 --- a/test/langtools/tools/javac/annotations/repeatingAnnotations/BaseAnnoAsContainerAnno.java +++ b/test/langtools/tools/javac/annotations/repeatingAnnotations/BaseAnnoAsContainerAnno.java @@ -13,6 +13,6 @@ import java.lang.annotation.Repeatable; Foo[] value() default {}; } -@Foo() @Foo() +@Foo @Foo public class BaseAnnoAsContainerAnno {} diff --git a/test/langtools/tools/javac/annotations/repeatingAnnotations/MissingContainer.java b/test/langtools/tools/javac/annotations/repeatingAnnotations/MissingContainer.java index aff6a151d1c..c689631ca31 100644 --- a/test/langtools/tools/javac/annotations/repeatingAnnotations/MissingContainer.java +++ b/test/langtools/tools/javac/annotations/repeatingAnnotations/MissingContainer.java @@ -8,7 +8,7 @@ import java.lang.annotation.Repeatable; -@Repeatable() +@Repeatable @interface Foo {} @interface FooContainer { diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/api/AnnotatedArrayOrder.java b/test/langtools/tools/javac/annotations/typeAnnotations/api/AnnotatedArrayOrder.java index 0bb6eee57a1..c17db8acd64 100644 --- a/test/langtools/tools/javac/annotations/typeAnnotations/api/AnnotatedArrayOrder.java +++ b/test/langtools/tools/javac/annotations/typeAnnotations/api/AnnotatedArrayOrder.java @@ -107,30 +107,30 @@ public class AnnotatedArrayOrder { // visited code @A String @C [] @B [] field; static { - // Shouldn't find @A(), as it is field annotation - expectedLocations.put("@B()", 1); - expectedLocations.put("@C()", 2); + // Shouldn't find @A, as it is field annotation + expectedLocations.put("@B", 1); + expectedLocations.put("@C", 2); } List<@D String @F [] @E []> typearg; static { - expectedLocations.put("@D()", 0); - expectedLocations.put("@E()", 1); - expectedLocations.put("@F()", 2); + expectedLocations.put("@D", 0); + expectedLocations.put("@E", 1); + expectedLocations.put("@F", 2); } void varargSimple(@G String @H ... vararg1) { } static { - // Shouldn't find @G(), as it is a parameter annotation - expectedLocations.put("@H()", 1); + // Shouldn't find @G, as it is a parameter annotation + expectedLocations.put("@H", 1); } void varargLong(@I String @L [] @K [] @J ... vararg2) { } static { - // Shouldn't find @I(), as it is a parameter annotation - expectedLocations.put("@J()", 1); - expectedLocations.put("@K()", 2); - expectedLocations.put("@L()", 3); + // Shouldn't find @I, as it is a parameter annotation + expectedLocations.put("@J", 1); + expectedLocations.put("@K", 2); + expectedLocations.put("@L", 3); } @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/api/ArrayCreationTree.java b/test/langtools/tools/javac/annotations/typeAnnotations/api/ArrayCreationTree.java index 2073a679437..01115971054 100644 --- a/test/langtools/tools/javac/annotations/typeAnnotations/api/ArrayCreationTree.java +++ b/test/langtools/tools/javac/annotations/typeAnnotations/api/ArrayCreationTree.java @@ -84,11 +84,11 @@ public class ArrayCreationTree { foundAnnotations++; int expected = -1; - if (annotation.equals("@A()")) + if (annotation.equals("@A")) expected = 0; - else if (annotation.equals("@B()")) + else if (annotation.equals("@B")) expected = 1; - else if (annotation.equals("@C()")) + else if (annotation.equals("@C")) expected = 2; else throw new AssertionError("found an unexpected annotation: " + annotation); diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/api/ArrayPositionConsistency.java b/test/langtools/tools/javac/annotations/typeAnnotations/api/ArrayPositionConsistency.java index cad4a726477..c2f8ca59c9a 100644 --- a/test/langtools/tools/javac/annotations/typeAnnotations/api/ArrayPositionConsistency.java +++ b/test/langtools/tools/javac/annotations/typeAnnotations/api/ArrayPositionConsistency.java @@ -79,11 +79,11 @@ public class ArrayPositionConsistency { foundAnnotations++; int expected = -1; - if (annotation.equals("@A()")) + if (annotation.equals("@A")) expected = 0; - else if (annotation.equals("@B()")) + else if (annotation.equals("@B")) expected = 1; - else if (annotation.equals("@C()")) + else if (annotation.equals("@C")) expected = 2; else throw new AssertionError("found an unexpected annotation: " + annotation); diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/failures/AnnotatedMethodSelectorTest.java b/test/langtools/tools/javac/annotations/typeAnnotations/failures/AnnotatedMethodSelectorTest.java index eb81d337e6c..ed575245243 100644 --- a/test/langtools/tools/javac/annotations/typeAnnotations/failures/AnnotatedMethodSelectorTest.java +++ b/test/langtools/tools/javac/annotations/typeAnnotations/failures/AnnotatedMethodSelectorTest.java @@ -9,6 +9,6 @@ class AnnotatedMethodSelectorTest { @interface A {} static public void main(String... args) { - java.util.@A() Arrays.stream(args); + java.util.@A Arrays.stream(args); } } diff --git a/test/langtools/tools/javac/boxing/T6348760.java b/test/langtools/tools/javac/boxing/T6348760.java index 51ed64a8a05..98b580fdb90 100644 --- a/test/langtools/tools/javac/boxing/T6348760.java +++ b/test/langtools/tools/javac/boxing/T6348760.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ * @bug 6348760 * @summary crash: java.lang.AssertionError at com.sun.tools.javac.comp.Lower.abstractLval(Lower.java:1853) * @author Peter von der Ah\u00e9 - * @run main/othervm -Xfuture T6348760 + * @run main/othervm T6348760 */ public class T6348760 { diff --git a/test/langtools/tools/javac/diags/examples/AnnoNotApplicable.java b/test/langtools/tools/javac/diags/examples/AnnoNotApplicable.java index 97ff27a199c..deaab313493 100644 --- a/test/langtools/tools/javac/diags/examples/AnnoNotApplicable.java +++ b/test/langtools/tools/javac/diags/examples/AnnoNotApplicable.java @@ -29,5 +29,5 @@ import java.lang.annotation.*; @interface Anno { } -@Anno() +@Anno class AnnoNotApplicable { } diff --git a/test/langtools/tools/javac/diags/examples/EnumNoSubclassing.java b/test/langtools/tools/javac/diags/examples/EnumNoSubclassing.java index 904000fa423..e823e04f7ae 100644 --- a/test/langtools/tools/javac/diags/examples/EnumNoSubclassing.java +++ b/test/langtools/tools/javac/diags/examples/EnumNoSubclassing.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,5 +22,7 @@ */ // key: compiler.err.enum.no.subclassing +// key: compiler.note.unchecked.filename +// key: compiler.note.unchecked.recompile class EnumNoSubclassing extends Enum { } diff --git a/test/langtools/tools/javac/enum/FauxEnum1.out b/test/langtools/tools/javac/enum/FauxEnum1.out index 64bf94f7747..ff1e8fa7315 100644 --- a/test/langtools/tools/javac/enum/FauxEnum1.out +++ b/test/langtools/tools/javac/enum/FauxEnum1.out @@ -1,2 +1,4 @@ FauxEnum1.java:10:8: compiler.err.enum.no.subclassing +- compiler.note.unchecked.filename: FauxEnum1.java +- compiler.note.unchecked.recompile 1 error diff --git a/test/langtools/tools/javac/generics/inference/6240565/T6240565.java b/test/langtools/tools/javac/generics/inference/6240565/T6240565.java index e17571b4681..3f7e224e764 100644 --- a/test/langtools/tools/javac/generics/inference/6240565/T6240565.java +++ b/test/langtools/tools/javac/generics/inference/6240565/T6240565.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ * @bug 6240565 * @summary Unboxing, arrays, and type variables doesn't work * @compile T6240565.java - * @run main/othervm -Xfuture T6240565 + * @run main/othervm T6240565 */ public class T6240565 { diff --git a/test/langtools/tools/javac/generics/inference/8176534/TestUncheckedCalls.java b/test/langtools/tools/javac/generics/inference/8176534/TestUncheckedCalls.java index 07672ac6a95..803d3c112d6 100644 --- a/test/langtools/tools/javac/generics/inference/8176534/TestUncheckedCalls.java +++ b/test/langtools/tools/javac/generics/inference/8176534/TestUncheckedCalls.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -221,7 +221,7 @@ public class TestUncheckedCalls extends ComboInstance { return Stream.of(decls) .filter(d -> d.hasKind(DeclKind.NONE)) .flatMap(d -> Stream.of(d.returnKind(), d.argumentsKind(), d.typeVarsKind())) - .noneMatch(tk -> tk.ordinal() != 0); + .noneMatch((Enum> tk) -> tk.ordinal() != 0); } boolean tvarFilter() { diff --git a/test/langtools/tools/javac/generics/inference/EagerReturnTypeResolution/EagerReturnTypeResolutionTestb.out b/test/langtools/tools/javac/generics/inference/EagerReturnTypeResolution/EagerReturnTypeResolutionTestb.out index 99b460844d6..2bf50df3343 100644 --- a/test/langtools/tools/javac/generics/inference/EagerReturnTypeResolution/EagerReturnTypeResolutionTestb.out +++ b/test/langtools/tools/javac/generics/inference/EagerReturnTypeResolution/EagerReturnTypeResolutionTestb.out @@ -4,10 +4,10 @@ EagerReturnTypeResolutionTestb.java:44:29: compiler.err.prob.found.req: (compile EagerReturnTypeResolutionTestb.java:45:26: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I, EagerReturnTypeResolutionTestb.I,java.lang.Object) EagerReturnTypeResolutionTestb.java:74:15: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.I,EagerReturnTypeResolutionTestb.I) EagerReturnTypeResolutionTestb.java:75:15: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.upper.bounds: T, EagerReturnTypeResolutionTestb.I,EagerReturnTypeResolutionTestb.I,java.lang.Object) -EagerReturnTypeResolutionTestb.java:77:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I, EagerReturnTypeResolutionTestb.I>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I>>, EagerReturnTypeResolutionTestb.I,java.lang.Object)) +EagerReturnTypeResolutionTestb.java:77:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I, EagerReturnTypeResolutionTestb.I&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>, EagerReturnTypeResolutionTestb.I,java.lang.Object)) EagerReturnTypeResolutionTestb.java:78:21: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.I,EagerReturnTypeResolutionTestb.I) EagerReturnTypeResolutionTestb.java:79:21: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.upper.bounds: T, EagerReturnTypeResolutionTestb.I,EagerReturnTypeResolutionTestb.I,java.lang.Object) -EagerReturnTypeResolutionTestb.java:81:30: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I>>, EagerReturnTypeResolutionTestb.I,java.lang.Object) +EagerReturnTypeResolutionTestb.java:81:30: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>, EagerReturnTypeResolutionTestb.I,java.lang.Object) EagerReturnTypeResolutionTestb.java:82:24: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.I,EagerReturnTypeResolutionTestb.I) EagerReturnTypeResolutionTestb.java:83:24: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.upper.bounds: T, EagerReturnTypeResolutionTestb.I,EagerReturnTypeResolutionTestb.I,java.lang.Object) EagerReturnTypeResolutionTestb.java:85:15: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.I,EagerReturnTypeResolutionTestb.I) @@ -17,10 +17,10 @@ EagerReturnTypeResolutionTestb.java:89:30: compiler.err.prob.found.req: (compile EagerReturnTypeResolutionTestb.java:90:24: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.I,EagerReturnTypeResolutionTestb.I) EagerReturnTypeResolutionTestb.java:91:15: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.J,EagerReturnTypeResolutionTestb.J) EagerReturnTypeResolutionTestb.java:92:15: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.upper.bounds: T, EagerReturnTypeResolutionTestb.J,EagerReturnTypeResolutionTestb.J,java.lang.Object) -EagerReturnTypeResolutionTestb.java:94:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I, EagerReturnTypeResolutionTestb.J>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.J>>, EagerReturnTypeResolutionTestb.I,java.lang.Object)) +EagerReturnTypeResolutionTestb.java:94:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I, EagerReturnTypeResolutionTestb.J&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.J&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>, EagerReturnTypeResolutionTestb.I,java.lang.Object)) EagerReturnTypeResolutionTestb.java:95:21: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.J,EagerReturnTypeResolutionTestb.J) EagerReturnTypeResolutionTestb.java:96:21: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.upper.bounds: T, EagerReturnTypeResolutionTestb.J,EagerReturnTypeResolutionTestb.J,java.lang.Object) -EagerReturnTypeResolutionTestb.java:98:30: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.J>>, EagerReturnTypeResolutionTestb.I,java.lang.Object) +EagerReturnTypeResolutionTestb.java:98:30: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.J&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>, EagerReturnTypeResolutionTestb.I,java.lang.Object) EagerReturnTypeResolutionTestb.java:99:24: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.J,EagerReturnTypeResolutionTestb.J) EagerReturnTypeResolutionTestb.java:100:24: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List,java.util.List, java.util.List>,java.util.List>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.upper.bounds: T, EagerReturnTypeResolutionTestb.J,EagerReturnTypeResolutionTestb.J,java.lang.Object) EagerReturnTypeResolutionTestb.java:102:15: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J) @@ -28,10 +28,10 @@ EagerReturnTypeResolutionTestb.java:103:21: compiler.err.cant.apply.symbol: kind EagerReturnTypeResolutionTestb.java:104:24: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J) EagerReturnTypeResolutionTestb.java:105:15: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J) EagerReturnTypeResolutionTestb.java:106:15: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List,java.util.List, java.util.List>,java.util.List, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.upper.bounds: T, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J,java.lang.Object) -EagerReturnTypeResolutionTestb.java:108:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I, EagerReturnTypeResolutionTestb.I>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I>>, EagerReturnTypeResolutionTestb.I,java.lang.Object)) +EagerReturnTypeResolutionTestb.java:108:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I, EagerReturnTypeResolutionTestb.I&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>, EagerReturnTypeResolutionTestb.I,java.lang.Object)) EagerReturnTypeResolutionTestb.java:109:21: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J) EagerReturnTypeResolutionTestb.java:110:21: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List,java.util.List, java.util.List>,java.util.List, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.upper.bounds: T, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J,java.lang.Object) -EagerReturnTypeResolutionTestb.java:112:30: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I>>, EagerReturnTypeResolutionTestb.I,java.lang.Object) +EagerReturnTypeResolutionTestb.java:112:30: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>, EagerReturnTypeResolutionTestb.I,java.lang.Object) EagerReturnTypeResolutionTestb.java:113:24: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List,java.util.List, java.util.List>,java.util.List, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.eq.bounds: T, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J) EagerReturnTypeResolutionTestb.java:114:24: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List,java.util.List, java.util.List>,java.util.List, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.incompatible.upper.bounds: T, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J,java.lang.Object) EagerReturnTypeResolutionTestb.java:174:9: compiler.err.cant.apply.symbol: kindname.method, takeLong, long, java.lang.Double, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Double, java.lang.Long,java.lang.Object)) diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/trace/ControlFlowGraphState.java b/test/langtools/tools/javac/lambda/T8213703/InvalidReceiverTypeTest.java similarity index 53% rename from src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/trace/ControlFlowGraphState.java rename to test/langtools/tools/javac/lambda/T8213703/InvalidReceiverTypeTest.java index 75dca5d9e93..a153d948ea2 100644 --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.microbenchmarks/src/org/graalvm/compiler/microbenchmarks/lir/trace/ControlFlowGraphState.java +++ b/test/langtools/tools/javac/lambda/T8213703/InvalidReceiverTypeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,37 +21,37 @@ * questions. */ - -package org.graalvm.compiler.microbenchmarks.lir.trace; - -import org.openjdk.jmh.annotations.Level; -import org.openjdk.jmh.annotations.Setup; - -import org.graalvm.compiler.lir.LIR; -import org.graalvm.compiler.microbenchmarks.lir.GraalCompilerState; -import org.graalvm.compiler.nodes.cfg.ControlFlowGraph; - -/** - * State class for working with {@link ControlFlowGraph} and {@link LIR}. +/* + * @test + * @bug 8213703 + * @summary LambdaConversionException: Invalid receiver type not a subtype of implementation type interface */ -public abstract class ControlFlowGraphState extends GraalCompilerState { - public ControlFlowGraph cfg; +import java.util.Arrays; +import java.util.List; - @Setup(Level.Trial) - public void beforeBenchmark() { - // setup graph - initializeMethod(); - prepareRequest(); - emitFrontEnd(); - generateLIR(); - // compute cfg - this.cfg = (ControlFlowGraph) getLIR().getControlFlowGraph(); +public class InvalidReceiverTypeTest { + + static abstract class A {} + + interface B { + boolean g(); } - @Override - public LIR getLIR() { - return super.getLIR(); + static class C extends A implements B { + public boolean g() { + return true; + } } + static class D { + public long f(List xs) { + return xs.stream().filter(B::g).count(); + } + } + + public static void main(String[] args) { + long count = new D().f(Arrays.asList(new C())); + System.err.println(count); + } } diff --git a/test/langtools/tools/javac/lvti/harness/NonDenotableTest.java b/test/langtools/tools/javac/lvti/harness/NonDenotableTest.java index 4e922fd80bf..e1f69f3c87f 100644 --- a/test/langtools/tools/javac/lvti/harness/NonDenotableTest.java +++ b/test/langtools/tools/javac/lvti/harness/NonDenotableTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -123,8 +123,6 @@ class NonDenotableTest { @InferredType(SEL_INT_ENUM_SEL) var c = s; for (@InferredType(SEL_INT_ENUM_SEL) var s2 = s ; ;) { break; } - for (@InferredType(SEL_INT_ENUM_SEL) var s2 : arrayOf(s)) { break; } - for (@InferredType(SEL_INT_ENUM_SEL) var s2 : listOf(s)) { break; } } List extString() { return null; } diff --git a/test/langtools/tools/javac/scope/6225935/T6225935.java b/test/langtools/tools/javac/scope/6225935/T6225935.java index bd2233cb4ae..4e6e5272c53 100644 --- a/test/langtools/tools/javac/scope/6225935/T6225935.java +++ b/test/langtools/tools/javac/scope/6225935/T6225935.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ * @summary "import static" accessibility rules for symbols different for no reason * @author Peter von der Ah\u00e9 * @compile a/Private.java a/Named.java a/Star.java T6225935.java - * @run main/othervm -Xfuture T6225935 + * @run main/othervm T6225935 */ import static a.Named.x; diff --git a/test/langtools/tools/javac/tree/TypeAnnotationsPretty.java b/test/langtools/tools/javac/tree/TypeAnnotationsPretty.java index 24db9114512..46216c4f0cd 100644 --- a/test/langtools/tools/javac/tree/TypeAnnotationsPretty.java +++ b/test/langtools/tools/javac/tree/TypeAnnotationsPretty.java @@ -60,26 +60,26 @@ public class TypeAnnotationsPretty { public static void main(String... args) throws Exception { TypeAnnotationsPretty tap = new TypeAnnotationsPretty(); - tap.runField("@TA()\nObject cls = null"); - tap.runField("@TA()\nObject cls = new @TA() Object()"); + tap.runField("@TA\nObject cls = null"); + tap.runField("@TA\nObject cls = new @TA Object()"); - tap.runField("@TA()\nList<@TB() Object> cls = null"); - tap.runField("@TA()\nList<@TB() Object> cls = new @TA() LinkedList<@TB() Object>()"); + tap.runField("@TA\nList<@TB Object> cls = null"); + tap.runField("@TA\nList<@TB Object> cls = new @TA LinkedList<@TB Object>()"); tap.runField("Class[] cls = null"); - tap.runField("@TA()\nClass[] cls = null"); - tap.runField("Class @TA() [] cls = null"); - tap.runField("@TA()\nClass @TB() [] cls = null"); + tap.runField("@TA\nClass[] cls = null"); + tap.runField("Class @TA [] cls = null"); + tap.runField("@TA\nClass @TB [] cls = null"); tap.runField("Class[] cls = new Class[]{Object.class}"); - tap.runField("@TA()\nClass[] cls = new @TA() Class[]{Object.class}"); - tap.runField("Class @TB() [] cls = new Class @TB() []{Object.class}"); - tap.runField("@TA()\nClass @TB() [] cls = new @TA() Class @TB() []{Object.class}"); - tap.runField("@TA()\nClass @TB() [] @TC() [] cls = new @TA() Class @TB() [10] @TC() []"); - tap.runField("Class @TB() [] @TC() [] cls = new Class @TB() [10] @TC() []"); - tap.runField("@TA()\nClass @TB() [] @TC() [] @TD() [] cls = new @TA() Class @TB() [10] @TC() [] @TD() []"); + tap.runField("@TA\nClass[] cls = new @TA Class[]{Object.class}"); + tap.runField("Class @TB [] cls = new Class @TB []{Object.class}"); + tap.runField("@TA\nClass @TB [] cls = new @TA Class @TB []{Object.class}"); + tap.runField("@TA\nClass @TB [] @TC [] cls = new @TA Class @TB [10] @TC []"); + tap.runField("Class @TB [] @TC [] cls = new Class @TB [10] @TC []"); + tap.runField("@TA\nClass @TB [] @TC [] @TD [] cls = new @TA Class @TB [10] @TC [] @TD []"); - tap.runMethod("\n@TA()\nObject test(@TB()\nList<@TC() String> p) {\n" + + tap.runMethod("\n@TA\nObject test(@TB\nList<@TC String> p) {\n" + " return null;\n" + "}"); diff --git a/test/langtools/tools/javac/varargs/6806876/T6806876.out b/test/langtools/tools/javac/varargs/6806876/T6806876.out index 7932d7a1c5b..81dafce574c 100644 --- a/test/langtools/tools/javac/varargs/6806876/T6806876.out +++ b/test/langtools/tools/javac/varargs/6806876/T6806876.out @@ -1,4 +1,4 @@ -T6806876.java:11:32: compiler.warn.unchecked.generic.array.creation: java.lang.Number&java.lang.Comparable>[] +T6806876.java:11:32: compiler.warn.unchecked.generic.array.creation: java.lang.Number&java.lang.Comparable&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc[] T6806876.java:14:19: compiler.warn.unchecked.varargs.non.reifiable.type: T - compiler.err.warnings.and.werror 1 error diff --git a/test/lib/sun/hotspot/gc/GC.java b/test/lib/sun/hotspot/gc/GC.java index bfc872097a4..552c7fa9cc2 100644 --- a/test/lib/sun/hotspot/gc/GC.java +++ b/test/lib/sun/hotspot/gc/GC.java @@ -38,7 +38,8 @@ public enum GC { ConcMarkSweep(3), G1(4), Epsilon(5), - Z(6); + Z(6), + Shenandoah(7); private static final WhiteBox WB = WhiteBox.getWhiteBox();