diff --git a/make/common/Modules.gmk b/make/common/Modules.gmk
index 2f05e39da82..0eb0fb2ddc1 100644
--- a/make/common/Modules.gmk
+++ b/make/common/Modules.gmk
@@ -62,12 +62,10 @@ endif
 # Filter out jvmci specific modules if jvmci is disabled
 ifeq ($(INCLUDE_JVMCI), false)
   MODULES_FILTER += jdk.internal.vm.ci
+  MODULES_FILTER += jdk.internal.vm.compiler
+  MODULES_FILTER += jdk.internal.vm.compiler.management
 endif
 
-# Filter out Graal specific modules
-MODULES_FILTER += jdk.internal.vm.compiler
-MODULES_FILTER += jdk.internal.vm.compiler.management
-
 # jpackage is only on windows, macosx, and linux
 ifeq ($(call isTargetOs, windows macosx linux), false)
   MODULES_FILTER += jdk.jpackage
diff --git a/make/conf/module-loader-map.conf b/make/conf/module-loader-map.conf
index b096c238898..c86ebf954c0 100644
--- a/make/conf/module-loader-map.conf
+++ b/make/conf/module-loader-map.conf
@@ -61,6 +61,8 @@ BOOT_MODULES= \
 # should carefully be considered if it should be upgradeable or not.
 UPGRADEABLE_PLATFORM_MODULES= \
     java.compiler \
+    jdk.internal.vm.compiler \
+    jdk.internal.vm.compiler.management \
     #
 
 PLATFORM_MODULES= \
diff --git a/src/jdk.internal.vm.ci/share/classes/module-info.java b/src/jdk.internal.vm.ci/share/classes/module-info.java
index cae83e49a51..25504fe7400 100644
--- a/src/jdk.internal.vm.ci/share/classes/module-info.java
+++ b/src/jdk.internal.vm.ci/share/classes/module-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
  * 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,12 +27,6 @@ module jdk.internal.vm.ci {
     exports jdk.vm.ci.services to
         jdk.internal.vm.compiler,
         jdk.internal.vm.compiler.management;
-    exports jdk.vm.ci.runtime to
-        jdk.internal.vm.compiler,
-        jdk.internal.vm.compiler.management;
-    exports jdk.vm.ci.meta to jdk.internal.vm.compiler;
-    exports jdk.vm.ci.code to jdk.internal.vm.compiler;
-    exports jdk.vm.ci.hotspot to jdk.internal.vm.compiler;
 
     uses jdk.vm.ci.services.JVMCIServiceLocator;
     uses jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory;
diff --git a/src/jdk.internal.vm.compiler.management/share/classes/module-info.java b/src/jdk.internal.vm.compiler.management/share/classes/module-info.java
index 4461f7969ed..88a5d933fca 100644
--- a/src/jdk.internal.vm.compiler.management/share/classes/module-info.java
+++ b/src/jdk.internal.vm.compiler.management/share/classes/module-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
  * 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,18 @@
  */
 
 /**
- * Registers Graal Compiler specific management interfaces for the JVM.
+ * Registers JVMCI compiler specific management interfaces for the JVM.
+ *
+ * This is an empty and upgradeable module that is a placeholder for an
+ * external implementation of a JVMCI compiler. It must be upgradeable so
+ * that it can be replaced when jlinking a new JDK image without failing
+ * the hash check for the qualified exports in jdk.internal.vm.ci's
+ * module descriptor.
  *
  * @moduleGraph
  * @since 10
  */
 module jdk.internal.vm.compiler.management {
-    requires java.management;
-    requires jdk.management;
     requires jdk.internal.vm.ci;
-    requires jdk.internal.vm.compiler;
 }
 
diff --git a/src/jdk.internal.vm.compiler/share/classes/module-info.java b/src/jdk.internal.vm.compiler/share/classes/module-info.java
index 62f9382f155..7284f2f225d 100644
--- a/src/jdk.internal.vm.compiler/share/classes/module-info.java
+++ b/src/jdk.internal.vm.compiler/share/classes/module-info.java
@@ -23,35 +23,19 @@
  * questions.
  */
 
+/**
+  * JVMCI compiler implementation for the JVM.
+  *
+  * This is an empty and upgradeable module that is a placeholder for an
+  * external implementation of a JVMCI compiler. It must be upgradeable so
+  * that it can be replaced when jlinking a new JDK image without failing
+  * the hash check for the qualified exports in jdk.internal.vm.ci's
+  * module descriptor.
+  *
+  * @moduleGraph
+  * @since 9
+  */
+
 module jdk.internal.vm.compiler {
-    requires java.instrument;
-    requires java.management;
     requires jdk.internal.vm.ci;
-    requires jdk.management;
-    requires jdk.unsupported;   // sun.misc.Unsafe is used
-
-    uses org.graalvm.compiler.code.DisassemblerProvider;
-    uses org.graalvm.compiler.core.match.MatchStatementSet;
-    uses org.graalvm.compiler.debug.DebugHandlersFactory;
-    uses org.graalvm.compiler.debug.TTYStreamProvider;
-    uses org.graalvm.compiler.hotspot.CompilerConfigurationFactory;
-    uses org.graalvm.compiler.hotspot.HotSpotBackendFactory;
-    uses org.graalvm.compiler.hotspot.HotSpotCodeCacheListener;
-    uses org.graalvm.compiler.hotspot.HotSpotGraalManagementRegistration;
-    uses org.graalvm.compiler.nodes.graphbuilderconf.GeneratedPluginFactory;
-    uses org.graalvm.compiler.phases.common.jmx.HotSpotMBeanOperationProvider;
-    uses org.graalvm.compiler.serviceprovider.JMXService;
-
-    exports jdk.internal.vm.compiler.collections        to jdk.internal.vm.compiler.management;
-    exports org.graalvm.compiler.core.common            to
-        jdk.internal.vm.compiler.management;
-    exports org.graalvm.compiler.debug                  to
-        jdk.internal.vm.compiler.management;
-    exports org.graalvm.compiler.hotspot                to
-        jdk.internal.vm.compiler.management;
-    exports org.graalvm.compiler.options                to
-        jdk.internal.vm.compiler.management;
-    exports org.graalvm.compiler.phases.common.jmx      to jdk.internal.vm.compiler.management;
-    exports org.graalvm.compiler.serviceprovider        to
-        jdk.internal.vm.compiler.management;
 }
diff --git a/test/hotspot/jtreg/compiler/jvmci/compilerToVM/IsCompilableTest.java b/test/hotspot/jtreg/compiler/jvmci/compilerToVM/IsCompilableTest.java
index 84afa3adbb7..9e1aceb2731 100644
--- a/test/hotspot/jtreg/compiler/jvmci/compilerToVM/IsCompilableTest.java
+++ b/test/hotspot/jtreg/compiler/jvmci/compilerToVM/IsCompilableTest.java
@@ -24,7 +24,7 @@
 /**
  * @test
  * @bug 8136421
- * @requires vm.jvmci & vm.compMode == "Xmixed"
+ * @requires vm.graal.enabled & vm.compMode == "Xmixed"
  * @library /test/lib /
  * @library ../common/patches
  * @modules jdk.internal.vm.compiler
diff --git a/test/jdk/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java b/test/jdk/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java
index 99ee210205a..fa026314908 100644
--- a/test/jdk/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java
+++ b/test/jdk/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java
@@ -286,7 +286,11 @@ public class FieldSetAccessibleTest {
          * Filter deployment modules
          */
         static Set<String> systemModules() {
-            Set<String> mods = Set.of("javafx.deploy", "jdk.deploy", "jdk.plugin", "jdk.javaws");
+            Set<String> mods = Set.of("javafx.deploy", "jdk.deploy", "jdk.plugin", "jdk.javaws",
+                // All JVMCI packages other than jdk.vm.ci.services are dynamically
+                // exported to jdk.internal.vm.compiler
+                "jdk.internal.vm.compiler"
+            );
             return ModuleFinder.ofSystem().findAll().stream()
                                .map(mref -> mref.descriptor().name())
                                .filter(mn -> !mods.contains(mn))
diff --git a/test/jdk/jdk/modules/etc/UpgradeableModules.java b/test/jdk/jdk/modules/etc/UpgradeableModules.java
index 194a8d6172e..59ff5aa6b23 100644
--- a/test/jdk/jdk/modules/etc/UpgradeableModules.java
+++ b/test/jdk/jdk/modules/etc/UpgradeableModules.java
@@ -43,7 +43,10 @@ import java.util.stream.Collectors;
 
 public class UpgradeableModules {
     private static final List<String> UPGRADEABLE_MODULES =
-        List.of("java.compiler");
+        List.of("java.compiler",
+                "jdk.internal.vm.compiler",
+                "jdk.internal.vm.compiler.management");
+
 
     public static void main(String... args) {
         Set<String> hashedModules = hashedModules();
diff --git a/test/jdk/tools/jimage/VerifyJimage.java b/test/jdk/tools/jimage/VerifyJimage.java
index 3b0aaeb4670..963ff57d0d6 100644
--- a/test/jdk/tools/jimage/VerifyJimage.java
+++ b/test/jdk/tools/jimage/VerifyJimage.java
@@ -196,7 +196,11 @@ public class VerifyJimage {
     }
 
     private static Set<String> EXCLUDED_MODULES =
-        Set.of("javafx.deploy", "jdk.deploy", "jdk.plugin", "jdk.javaws");
+        Set.of("javafx.deploy", "jdk.deploy", "jdk.plugin", "jdk.javaws",
+            // All JVMCI packages other than jdk.vm.ci.services are dynamically
+            // exported to jdk.internal.vm.compiler
+            "jdk.internal.vm.compiler"
+        );
 
     private boolean accept(String entry) {
         int index = entry.indexOf('/', 1);