8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp
authortschatzl
Fri, 26 May 2017 13:46:49 +0200
changeset 46502 116a09d8f142
parent 46501 6b4919b83092
child 46503 760f8f589de3
8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp Reviewed-by: ehelin, coleenp, dholmes
hotspot/src/share/vm/c1/c1_Compiler.cpp
hotspot/src/share/vm/c1/c1_Optimizer.cpp
hotspot/src/share/vm/c1/c1_ValueMap.cpp
hotspot/src/share/vm/c1/c1_ValueSet.hpp
hotspot/src/share/vm/c1/c1_ValueSet.inline.hpp
hotspot/src/share/vm/classfile/classFileParser.cpp
hotspot/src/share/vm/gc/cms/concurrentMarkSweepGeneration.inline.hpp
hotspot/src/share/vm/gc/g1/g1ConcurrentMark.inline.hpp
hotspot/src/share/vm/gc/parallel/parMarkBitMap.cpp
hotspot/src/share/vm/gc/parallel/parMarkBitMap.hpp
hotspot/src/share/vm/gc/parallel/parMarkBitMap.inline.hpp
hotspot/src/share/vm/gc/parallel/parallelScavengeHeap.inline.hpp
hotspot/src/share/vm/gc/parallel/pcTasks.cpp
hotspot/src/share/vm/gc/parallel/psCompactionManager.cpp
hotspot/src/share/vm/gc/parallel/psCompactionManager.inline.hpp
hotspot/src/share/vm/gc/parallel/psMarkSweepDecorator.cpp
hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp
hotspot/src/share/vm/gc/parallel/psParallelCompact.hpp
hotspot/src/share/vm/gc/parallel/psParallelCompact.inline.hpp
hotspot/src/share/vm/gc/parallel/psPromotionManager.inline.hpp
hotspot/src/share/vm/oops/generateOopMap.cpp
hotspot/src/share/vm/oops/generateOopMap.hpp
hotspot/src/share/vm/oops/instanceKlass.hpp
hotspot/test/native/gc/parallel/test_psParallelCompact.cpp
--- a/hotspot/src/share/vm/c1/c1_Compiler.cpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/c1/c1_Compiler.cpp	Fri May 26 13:46:49 2017 +0200
@@ -40,6 +40,7 @@
 #include "runtime/arguments.hpp"
 #include "runtime/interfaceSupport.hpp"
 #include "runtime/sharedRuntime.hpp"
+#include "utilities/bitMap.inline.hpp"
 
 
 Compiler::Compiler() : AbstractCompiler(compiler_c1) {
--- a/hotspot/src/share/vm/c1/c1_Optimizer.cpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/c1/c1_Optimizer.cpp	Fri May 26 13:46:49 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -26,7 +26,7 @@
 #include "c1/c1_Canonicalizer.hpp"
 #include "c1/c1_Optimizer.hpp"
 #include "c1/c1_ValueMap.hpp"
-#include "c1/c1_ValueSet.hpp"
+#include "c1/c1_ValueSet.inline.hpp"
 #include "c1/c1_ValueStack.hpp"
 #include "memory/resourceArea.hpp"
 #include "utilities/bitMap.inline.hpp"
--- a/hotspot/src/share/vm/c1/c1_ValueMap.cpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/c1/c1_ValueMap.cpp	Fri May 26 13:46:49 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -26,8 +26,8 @@
 #include "c1/c1_Canonicalizer.hpp"
 #include "c1/c1_IR.hpp"
 #include "c1/c1_ValueMap.hpp"
+#include "c1/c1_ValueSet.inline.hpp"
 #include "c1/c1_ValueStack.hpp"
-#include "utilities/bitMap.inline.hpp"
 
 #ifndef PRODUCT
 
--- a/hotspot/src/share/vm/c1/c1_ValueSet.hpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/c1/c1_ValueSet.hpp	Fri May 26 13:46:49 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -27,7 +27,7 @@
 
 #include "c1/c1_Instruction.hpp"
 #include "memory/allocation.hpp"
-#include "utilities/bitMap.inline.hpp"
+#include "utilities/bitMap.hpp"
 
 // A ValueSet is a simple abstraction on top of a BitMap representing
 // a set of Instructions. Currently it assumes that the number of
@@ -52,52 +52,4 @@
   bool equals  (ValueSet* other);
 };
 
-inline ValueSet::ValueSet() : _map(Instruction::number_of_instructions()) {
-}
-
-
-inline ValueSet* ValueSet::copy() {
-  ValueSet* res = new ValueSet();
-  res->_map.set_from(_map);
-  return res;
-}
-
-
-inline bool ValueSet::contains(Value x) {
-  return _map.at(x->id());
-}
-
-
-inline void ValueSet::put(Value x) {
-  _map.set_bit(x->id());
-}
-
-
-inline void ValueSet::remove(Value x) {
-  _map.clear_bit(x->id());
-}
-
-
-inline bool ValueSet::set_intersect(ValueSet* other) {
-  return _map.set_intersection_with_result(other->_map);
-}
-
-
-inline void ValueSet::set_union(ValueSet* other) {
-  _map.set_union(other->_map);
-}
-
-
-inline void ValueSet::clear() {
-  _map.clear();
-}
-
-inline void ValueSet::set_from(ValueSet* other) {
-  _map.set_from(other->_map);
-}
-
-inline bool ValueSet::equals(ValueSet* other) {
-  return _map.is_same(other->_map);
-}
-
 #endif // SHARE_VM_C1_C1_VALUESET_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/c1/c1_ValueSet.inline.hpp	Fri May 26 13:46:49 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_C1_C1_VALUESET_INLINE_HPP
+#define SHARE_VM_C1_C1_VALUESET_INLINE_HPP
+
+#include "c1/c1_Instruction.hpp"
+#include "c1/c1_ValueSet.hpp"
+#include "utilities/bitMap.inline.hpp"
+
+inline ValueSet::ValueSet() : _map(Instruction::number_of_instructions()) {
+}
+
+inline ValueSet* ValueSet::copy() {
+  ValueSet* res = new ValueSet();
+  res->_map.set_from(_map);
+  return res;
+}
+
+inline bool ValueSet::contains(Value x) {
+  return _map.at(x->id());
+}
+
+inline void ValueSet::put(Value x) {
+  _map.set_bit(x->id());
+}
+
+inline void ValueSet::remove(Value x) {
+  _map.clear_bit(x->id());
+}
+
+inline bool ValueSet::set_intersect(ValueSet* other) {
+  return _map.set_intersection_with_result(other->_map);
+}
+
+inline void ValueSet::set_union(ValueSet* other) {
+  _map.set_union(other->_map);
+}
+
+inline void ValueSet::clear() {
+  _map.clear();
+}
+
+inline void ValueSet::set_from(ValueSet* other) {
+  _map.set_from(other->_map);
+}
+
+inline bool ValueSet::equals(ValueSet* other) {
+  return _map.is_same(other->_map);
+}
+
+#endif // SHARE_VM_C1_C1_VALUESET_INLINE_HPP
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp	Fri May 26 13:46:49 2017 +0200
@@ -64,6 +64,7 @@
 #include "services/classLoadingService.hpp"
 #include "services/threadService.hpp"
 #include "trace/traceMacros.hpp"
+#include "utilities/bitMap.inline.hpp"
 #include "utilities/exceptions.hpp"
 #include "utilities/globalDefinitions.hpp"
 #include "utilities/growableArray.hpp"
--- a/hotspot/src/share/vm/gc/cms/concurrentMarkSweepGeneration.inline.hpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/cms/concurrentMarkSweepGeneration.inline.hpp	Fri May 26 13:46:49 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -32,6 +32,7 @@
 #include "gc/cms/parNewGeneration.hpp"
 #include "gc/shared/gcUtil.hpp"
 #include "gc/shared/genCollectedHeap.hpp"
+#include "utilities/bitMap.inline.hpp"
 
 inline void CMSBitMap::clear_all() {
   assert_locked();
--- a/hotspot/src/share/vm/gc/g1/g1ConcurrentMark.inline.hpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/g1/g1ConcurrentMark.inline.hpp	Fri May 26 13:46:49 2017 +0200
@@ -30,6 +30,7 @@
 #include "gc/g1/g1ConcurrentMarkObjArrayProcessor.inline.hpp"
 #include "gc/g1/suspendibleThreadSet.hpp"
 #include "gc/shared/taskqueue.inline.hpp"
+#include "utilities/bitMap.inline.hpp"
 
 inline bool G1ConcurrentMark::par_mark(oop obj) {
   return _nextMarkBitMap->parMark((HeapWord*)obj);
--- a/hotspot/src/share/vm/gc/parallel/parMarkBitMap.cpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/parallel/parMarkBitMap.cpp	Fri May 26 13:46:49 2017 +0200
@@ -23,7 +23,7 @@
  */
 
 #include "precompiled.hpp"
-#include "gc/parallel/parMarkBitMap.hpp"
+#include "gc/parallel/parMarkBitMap.inline.hpp"
 #include "gc/parallel/psCompactionManager.inline.hpp"
 #include "gc/parallel/psParallelCompact.inline.hpp"
 #include "oops/oop.inline.hpp"
--- a/hotspot/src/share/vm/gc/parallel/parMarkBitMap.hpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/parallel/parMarkBitMap.hpp	Fri May 26 13:46:49 2017 +0200
@@ -188,219 +188,4 @@
   size_t          _reserved_byte_size;
 };
 
-inline ParMarkBitMap::ParMarkBitMap():
-  _beg_bits(), _end_bits(), _region_start(NULL), _region_size(0), _virtual_space(NULL), _reserved_byte_size(0)
-{ }
-
-inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end)
-{
-  _beg_bits.clear_range(beg, end);
-  _end_bits.clear_range(beg, end);
-}
-
-inline ParMarkBitMap::idx_t
-ParMarkBitMap::bits_required(size_t words)
-{
-  // Need two bits (one begin bit, one end bit) for each unit of 'object
-  // granularity' in the heap.
-  return words_to_bits(words * 2);
-}
-
-inline ParMarkBitMap::idx_t
-ParMarkBitMap::bits_required(MemRegion covered_region)
-{
-  return bits_required(covered_region.word_size());
-}
-
-inline HeapWord*
-ParMarkBitMap::region_start() const
-{
-  return _region_start;
-}
-
-inline HeapWord*
-ParMarkBitMap::region_end() const
-{
-  return region_start() + region_size();
-}
-
-inline size_t
-ParMarkBitMap::region_size() const
-{
-  return _region_size;
-}
-
-inline size_t
-ParMarkBitMap::size() const
-{
-  return _beg_bits.size();
-}
-
-inline bool ParMarkBitMap::is_obj_beg(idx_t bit) const
-{
-  return _beg_bits.at(bit);
-}
-
-inline bool ParMarkBitMap::is_obj_end(idx_t bit) const
-{
-  return _end_bits.at(bit);
-}
-
-inline bool ParMarkBitMap::is_marked(idx_t bit) const
-{
-  return is_obj_beg(bit);
-}
-
-inline bool ParMarkBitMap::is_marked(HeapWord* addr) const
-{
-  return is_marked(addr_to_bit(addr));
-}
-
-inline bool ParMarkBitMap::is_marked(oop obj) const
-{
-  return is_marked((HeapWord*)obj);
-}
-
-inline bool ParMarkBitMap::is_unmarked(idx_t bit) const
-{
-  return !is_marked(bit);
-}
-
-inline bool ParMarkBitMap::is_unmarked(HeapWord* addr) const
-{
-  return !is_marked(addr);
-}
-
-inline bool ParMarkBitMap::is_unmarked(oop obj) const
-{
-  return !is_marked(obj);
-}
-
-inline size_t
-ParMarkBitMap::bits_to_words(idx_t bits)
-{
-  return bits << obj_granularity_shift();
-}
-
-inline ParMarkBitMap::idx_t
-ParMarkBitMap::words_to_bits(size_t words)
-{
-  return words >> obj_granularity_shift();
-}
-
-inline size_t ParMarkBitMap::obj_size(idx_t beg_bit, idx_t end_bit) const
-{
-  DEBUG_ONLY(verify_bit(beg_bit);)
-  DEBUG_ONLY(verify_bit(end_bit);)
-  return bits_to_words(end_bit - beg_bit + 1);
-}
-
-inline size_t
-ParMarkBitMap::obj_size(HeapWord* beg_addr, HeapWord* end_addr) const
-{
-  DEBUG_ONLY(verify_addr(beg_addr);)
-  DEBUG_ONLY(verify_addr(end_addr);)
-  return pointer_delta(end_addr, beg_addr) + obj_granularity();
-}
-
-inline size_t ParMarkBitMap::obj_size(idx_t beg_bit) const
-{
-  const idx_t end_bit = _end_bits.get_next_one_offset(beg_bit, size());
-  assert(is_marked(beg_bit), "obj not marked");
-  assert(end_bit < size(), "end bit missing");
-  return obj_size(beg_bit, end_bit);
-}
-
-inline size_t ParMarkBitMap::obj_size(HeapWord* addr) const
-{
-  return obj_size(addr_to_bit(addr));
-}
-
-inline ParMarkBitMap::IterationStatus
-ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
-                       HeapWord* range_beg,
-                       HeapWord* range_end) const
-{
-  return iterate(live_closure, addr_to_bit(range_beg), addr_to_bit(range_end));
-}
-
-inline ParMarkBitMap::IterationStatus
-ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
-                       ParMarkBitMapClosure* dead_closure,
-                       HeapWord* range_beg,
-                       HeapWord* range_end,
-                       HeapWord* dead_range_end) const
-{
-  return iterate(live_closure, dead_closure,
-                 addr_to_bit(range_beg), addr_to_bit(range_end),
-                 addr_to_bit(dead_range_end));
-}
-
-inline bool
-ParMarkBitMap::mark_obj(oop obj, int size)
-{
-  return mark_obj((HeapWord*)obj, (size_t)size);
-}
-
-inline BitMap::idx_t
-ParMarkBitMap::addr_to_bit(HeapWord* addr) const
-{
-  DEBUG_ONLY(verify_addr(addr);)
-  return words_to_bits(pointer_delta(addr, region_start()));
-}
-
-inline HeapWord*
-ParMarkBitMap::bit_to_addr(idx_t bit) const
-{
-  DEBUG_ONLY(verify_bit(bit);)
-  return region_start() + bits_to_words(bit);
-}
-
-inline ParMarkBitMap::idx_t
-ParMarkBitMap::find_obj_beg(idx_t beg, idx_t end) const
-{
-  return _beg_bits.get_next_one_offset_aligned_right(beg, end);
-}
-
-inline ParMarkBitMap::idx_t
-ParMarkBitMap::find_obj_end(idx_t beg, idx_t end) const
-{
-  return _end_bits.get_next_one_offset_aligned_right(beg, end);
-}
-
-inline HeapWord*
-ParMarkBitMap::find_obj_beg(HeapWord* beg, HeapWord* end) const
-{
-  const idx_t beg_bit = addr_to_bit(beg);
-  const idx_t end_bit = addr_to_bit(end);
-  const idx_t search_end = BitMap::word_align_up(end_bit);
-  const idx_t res_bit = MIN2(find_obj_beg(beg_bit, search_end), end_bit);
-  return bit_to_addr(res_bit);
-}
-
-inline HeapWord*
-ParMarkBitMap::find_obj_end(HeapWord* beg, HeapWord* end) const
-{
-  const idx_t beg_bit = addr_to_bit(beg);
-  const idx_t end_bit = addr_to_bit(end);
-  const idx_t search_end = BitMap::word_align_up(end_bit);
-  const idx_t res_bit = MIN2(find_obj_end(beg_bit, search_end), end_bit);
-  return bit_to_addr(res_bit);
-}
-
-#ifdef  ASSERT
-inline void ParMarkBitMap::verify_bit(idx_t bit) const {
-  // Allow one past the last valid bit; useful for loop bounds.
-  assert(bit <= _beg_bits.size(), "bit out of range");
-}
-
-inline void ParMarkBitMap::verify_addr(HeapWord* addr) const {
-  // Allow one past the last valid address; useful for loop bounds.
-  assert(addr >= region_start(),
-         "addr too small, addr: " PTR_FORMAT " region start: " PTR_FORMAT, p2i(addr), p2i(region_start()));
-  assert(addr <= region_end(),
-         "addr too big, addr: " PTR_FORMAT " region end: " PTR_FORMAT, p2i(addr), p2i(region_end()));
-}
-#endif  // #ifdef ASSERT
-
 #endif // SHARE_VM_GC_PARALLEL_PARMARKBITMAP_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc/parallel/parMarkBitMap.inline.hpp	Fri May 26 13:46:49 2017 +0200
@@ -0,0 +1,198 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_GC_PARALLEL_PARMARKBITMAP_INLINE_HPP
+#define SHARE_VM_GC_PARALLEL_PARMARKBITMAP_INLINE_HPP
+
+#include "gc/parallel/parMarkBitMap.hpp"
+#include "utilities/bitMap.inline.hpp"
+
+inline ParMarkBitMap::ParMarkBitMap():
+  _beg_bits(), _end_bits(), _region_start(NULL), _region_size(0), _virtual_space(NULL), _reserved_byte_size(0)
+{ }
+
+inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end) {
+  _beg_bits.clear_range(beg, end);
+  _end_bits.clear_range(beg, end);
+}
+
+inline ParMarkBitMap::idx_t ParMarkBitMap::bits_required(size_t words) {
+  // Need two bits (one begin bit, one end bit) for each unit of 'object
+  // granularity' in the heap.
+  return words_to_bits(words * 2);
+}
+
+inline ParMarkBitMap::idx_t ParMarkBitMap::bits_required(MemRegion covered_region) {
+  return bits_required(covered_region.word_size());
+}
+
+inline HeapWord* ParMarkBitMap::region_start() const {
+  return _region_start;
+}
+
+inline HeapWord* ParMarkBitMap::region_end() const {
+  return region_start() + region_size();
+}
+
+inline size_t ParMarkBitMap::region_size() const {
+  return _region_size;
+}
+
+inline size_t ParMarkBitMap::size() const {
+  return _beg_bits.size();
+}
+
+inline bool ParMarkBitMap::is_obj_beg(idx_t bit) const {
+  return _beg_bits.at(bit);
+}
+
+inline bool ParMarkBitMap::is_obj_end(idx_t bit) const {
+  return _end_bits.at(bit);
+}
+
+inline bool ParMarkBitMap::is_marked(idx_t bit) const {
+  return is_obj_beg(bit);
+}
+
+inline bool ParMarkBitMap::is_marked(HeapWord* addr) const {
+  return is_marked(addr_to_bit(addr));
+}
+
+inline bool ParMarkBitMap::is_marked(oop obj) const {
+  return is_marked((HeapWord*)obj);
+}
+
+inline bool ParMarkBitMap::is_unmarked(idx_t bit) const {
+  return !is_marked(bit);
+}
+
+inline bool ParMarkBitMap::is_unmarked(HeapWord* addr) const {
+  return !is_marked(addr);
+}
+
+inline bool ParMarkBitMap::is_unmarked(oop obj) const {
+  return !is_marked(obj);
+}
+
+inline size_t ParMarkBitMap::bits_to_words(idx_t bits) {
+  return bits << obj_granularity_shift();
+}
+
+inline ParMarkBitMap::idx_t ParMarkBitMap::words_to_bits(size_t words) {
+  return words >> obj_granularity_shift();
+}
+
+inline size_t ParMarkBitMap::obj_size(idx_t beg_bit, idx_t end_bit) const {
+  DEBUG_ONLY(verify_bit(beg_bit);)
+  DEBUG_ONLY(verify_bit(end_bit);)
+  return bits_to_words(end_bit - beg_bit + 1);
+}
+
+inline size_t ParMarkBitMap::obj_size(HeapWord* beg_addr, HeapWord* end_addr) const {
+  DEBUG_ONLY(verify_addr(beg_addr);)
+  DEBUG_ONLY(verify_addr(end_addr);)
+  return pointer_delta(end_addr, beg_addr) + obj_granularity();
+}
+
+inline size_t ParMarkBitMap::obj_size(idx_t beg_bit) const {
+  const idx_t end_bit = _end_bits.get_next_one_offset(beg_bit, size());
+  assert(is_marked(beg_bit), "obj not marked");
+  assert(end_bit < size(), "end bit missing");
+  return obj_size(beg_bit, end_bit);
+}
+
+inline size_t ParMarkBitMap::obj_size(HeapWord* addr) const {
+  return obj_size(addr_to_bit(addr));
+}
+
+inline ParMarkBitMap::IterationStatus ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
+                                                             HeapWord* range_beg,
+                                                             HeapWord* range_end) const {
+  return iterate(live_closure, addr_to_bit(range_beg), addr_to_bit(range_end));
+}
+
+inline ParMarkBitMap::IterationStatus ParMarkBitMap::iterate(ParMarkBitMapClosure* live_closure,
+                                                             ParMarkBitMapClosure* dead_closure,
+                                                             HeapWord* range_beg,
+                                                             HeapWord* range_end,
+                                                             HeapWord* dead_range_end) const {
+  return iterate(live_closure, dead_closure,
+                 addr_to_bit(range_beg), addr_to_bit(range_end),
+                 addr_to_bit(dead_range_end));
+}
+
+inline bool ParMarkBitMap::mark_obj(oop obj, int size) {
+  return mark_obj((HeapWord*)obj, (size_t)size);
+}
+
+inline BitMap::idx_t ParMarkBitMap::addr_to_bit(HeapWord* addr) const {
+  DEBUG_ONLY(verify_addr(addr);)
+  return words_to_bits(pointer_delta(addr, region_start()));
+}
+
+inline HeapWord* ParMarkBitMap::bit_to_addr(idx_t bit) const {
+  DEBUG_ONLY(verify_bit(bit);)
+  return region_start() + bits_to_words(bit);
+}
+
+inline ParMarkBitMap::idx_t ParMarkBitMap::find_obj_beg(idx_t beg, idx_t end) const {
+  return _beg_bits.get_next_one_offset_aligned_right(beg, end);
+}
+
+inline ParMarkBitMap::idx_t ParMarkBitMap::find_obj_end(idx_t beg, idx_t end) const {
+  return _end_bits.get_next_one_offset_aligned_right(beg, end);
+}
+
+inline HeapWord* ParMarkBitMap::find_obj_beg(HeapWord* beg, HeapWord* end) const {
+  const idx_t beg_bit = addr_to_bit(beg);
+  const idx_t end_bit = addr_to_bit(end);
+  const idx_t search_end = BitMap::word_align_up(end_bit);
+  const idx_t res_bit = MIN2(find_obj_beg(beg_bit, search_end), end_bit);
+  return bit_to_addr(res_bit);
+}
+
+inline HeapWord* ParMarkBitMap::find_obj_end(HeapWord* beg, HeapWord* end) const {
+  const idx_t beg_bit = addr_to_bit(beg);
+  const idx_t end_bit = addr_to_bit(end);
+  const idx_t search_end = BitMap::word_align_up(end_bit);
+  const idx_t res_bit = MIN2(find_obj_end(beg_bit, search_end), end_bit);
+  return bit_to_addr(res_bit);
+}
+
+#ifdef  ASSERT
+inline void ParMarkBitMap::verify_bit(idx_t bit) const {
+  // Allow one past the last valid bit; useful for loop bounds.
+  assert(bit <= _beg_bits.size(), "bit out of range");
+}
+
+inline void ParMarkBitMap::verify_addr(HeapWord* addr) const {
+  // Allow one past the last valid address; useful for loop bounds.
+  assert(addr >= region_start(),
+         "addr too small, addr: " PTR_FORMAT " region start: " PTR_FORMAT, p2i(addr), p2i(region_start()));
+  assert(addr <= region_end(),
+         "addr too big, addr: " PTR_FORMAT " region end: " PTR_FORMAT, p2i(addr), p2i(region_end()));
+}
+#endif  // #ifdef ASSERT
+
+#endif /* SHARE_VM_GC_PARALLEL_PARMARKBITMAP_INLINE_HPP */
--- a/hotspot/src/share/vm/gc/parallel/parallelScavengeHeap.inline.hpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/parallel/parallelScavengeHeap.inline.hpp	Fri May 26 13:46:49 2017 +0200
@@ -27,7 +27,7 @@
 
 #include "gc/parallel/parallelScavengeHeap.hpp"
 #include "gc/parallel/psMarkSweep.hpp"
-#include "gc/parallel/psParallelCompact.hpp"
+#include "gc/parallel/psParallelCompact.inline.hpp"
 #include "gc/parallel/psScavenge.hpp"
 
 inline size_t ParallelScavengeHeap::total_invocations() {
--- a/hotspot/src/share/vm/gc/parallel/pcTasks.cpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/parallel/pcTasks.cpp	Fri May 26 13:46:49 2017 +0200
@@ -29,7 +29,7 @@
 #include "gc/parallel/parallelScavengeHeap.hpp"
 #include "gc/parallel/pcTasks.hpp"
 #include "gc/parallel/psCompactionManager.inline.hpp"
-#include "gc/parallel/psParallelCompact.hpp"
+#include "gc/parallel/psParallelCompact.inline.hpp"
 #include "gc/shared/collectedHeap.hpp"
 #include "gc/shared/gcTimer.hpp"
 #include "gc/shared/gcTraceTime.inline.hpp"
--- a/hotspot/src/share/vm/gc/parallel/psCompactionManager.cpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/parallel/psCompactionManager.cpp	Fri May 26 13:46:49 2017 +0200
@@ -26,7 +26,7 @@
 #include "classfile/systemDictionary.hpp"
 #include "gc/parallel/gcTaskManager.hpp"
 #include "gc/parallel/objectStartArray.hpp"
-#include "gc/parallel/parMarkBitMap.hpp"
+#include "gc/parallel/parMarkBitMap.inline.hpp"
 #include "gc/parallel/parallelScavengeHeap.hpp"
 #include "gc/parallel/psCompactionManager.inline.hpp"
 #include "gc/parallel/psOldGen.hpp"
--- a/hotspot/src/share/vm/gc/parallel/psCompactionManager.inline.hpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/parallel/psCompactionManager.inline.hpp	Fri May 26 13:46:49 2017 +0200
@@ -25,6 +25,7 @@
 #ifndef SHARE_VM_GC_PARALLEL_PSCOMPACTIONMANAGER_INLINE_HPP
 #define SHARE_VM_GC_PARALLEL_PSCOMPACTIONMANAGER_INLINE_HPP
 
+#include "gc/parallel/parMarkBitMap.hpp"
 #include "gc/parallel/psCompactionManager.hpp"
 #include "gc/parallel/psParallelCompact.inline.hpp"
 #include "gc/shared/taskqueue.inline.hpp"
--- a/hotspot/src/share/vm/gc/parallel/psMarkSweepDecorator.cpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/parallel/psMarkSweepDecorator.cpp	Fri May 26 13:46:49 2017 +0200
@@ -26,8 +26,10 @@
 #include "classfile/systemDictionary.hpp"
 #include "gc/parallel/objectStartArray.hpp"
 #include "gc/parallel/parallelScavengeHeap.hpp"
+#include "gc/parallel/parMarkBitMap.inline.hpp"
 #include "gc/parallel/psMarkSweep.hpp"
 #include "gc/parallel/psMarkSweepDecorator.hpp"
+#include "gc/parallel/psParallelCompact.inline.hpp"
 #include "gc/serial/markSweep.inline.hpp"
 #include "gc/shared/spaceDecorator.hpp"
 #include "oops/oop.inline.hpp"
--- a/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp	Fri May 26 13:46:49 2017 +0200
@@ -30,6 +30,7 @@
 #include "code/codeCache.hpp"
 #include "gc/parallel/gcTaskManager.hpp"
 #include "gc/parallel/parallelScavengeHeap.inline.hpp"
+#include "gc/parallel/parMarkBitMap.inline.hpp"
 #include "gc/parallel/pcTasks.hpp"
 #include "gc/parallel/psAdaptiveSizePolicy.hpp"
 #include "gc/parallel/psCompactionManager.inline.hpp"
@@ -3155,6 +3156,14 @@
   return ParMarkBitMap::incomplete;
 }
 
+FillClosure::FillClosure(ParCompactionManager* cm, PSParallelCompact::SpaceId space_id) :
+  ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm),
+  _start_array(PSParallelCompact::start_array(space_id))
+{
+  assert(space_id == PSParallelCompact::old_space_id,
+         "cannot use FillClosure in the young gen");
+}
+
 ParMarkBitMapClosure::IterationStatus
 FillClosure::do_addr(HeapWord* addr, size_t size) {
   CollectedHeap::fill_with_objects(addr, size);
--- a/hotspot/src/share/vm/gc/parallel/psParallelCompact.hpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/parallel/psParallelCompact.hpp	Fri May 26 13:46:49 2017 +0200
@@ -1253,73 +1253,6 @@
 #endif  // #ifdef ASSERT
 };
 
-inline bool PSParallelCompact::is_marked(oop obj) {
-  return mark_bitmap()->is_marked(obj);
-}
-
-inline double PSParallelCompact::normal_distribution(double density) {
-  assert(_dwl_initialized, "uninitialized");
-  const double squared_term = (density - _dwl_mean) / _dwl_std_dev;
-  return _dwl_first_term * exp(-0.5 * squared_term * squared_term);
-}
-
-inline bool
-PSParallelCompact::dead_space_crosses_boundary(const RegionData* region,
-                                               idx_t bit)
-{
-  assert(bit > 0, "cannot call this for the first bit/region");
-  assert(_summary_data.region_to_addr(region) == _mark_bitmap.bit_to_addr(bit),
-         "sanity check");
-
-  // Dead space crosses the boundary if (1) a partial object does not extend
-  // onto the region, (2) an object does not start at the beginning of the
-  // region, and (3) an object does not end at the end of the prior region.
-  return region->partial_obj_size() == 0 &&
-    !_mark_bitmap.is_obj_beg(bit) &&
-    !_mark_bitmap.is_obj_end(bit - 1);
-}
-
-inline bool
-PSParallelCompact::is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr) {
-  return p >= beg_addr && p < end_addr;
-}
-
-inline bool
-PSParallelCompact::is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr) {
-  return is_in((HeapWord*)p, beg_addr, end_addr);
-}
-
-inline MutableSpace* PSParallelCompact::space(SpaceId id) {
-  assert(id < last_space_id, "id out of range");
-  return _space_info[id].space();
-}
-
-inline HeapWord* PSParallelCompact::new_top(SpaceId id) {
-  assert(id < last_space_id, "id out of range");
-  return _space_info[id].new_top();
-}
-
-inline HeapWord* PSParallelCompact::dense_prefix(SpaceId id) {
-  assert(id < last_space_id, "id out of range");
-  return _space_info[id].dense_prefix();
-}
-
-inline ObjectStartArray* PSParallelCompact::start_array(SpaceId id) {
-  assert(id < last_space_id, "id out of range");
-  return _space_info[id].start_array();
-}
-
-#ifdef ASSERT
-inline void
-PSParallelCompact::check_new_location(HeapWord* old_addr, HeapWord* new_addr)
-{
-  assert(old_addr >= new_addr || space_id(old_addr) != space_id(new_addr),
-         "must move left or to a different space");
-  assert(is_object_aligned((intptr_t)old_addr) && is_object_aligned((intptr_t)new_addr),
-         "checking alignment");
-}
-#endif // ASSERT
-
 class MoveAndUpdateClosure: public ParMarkBitMapClosure {
  public:
   inline MoveAndUpdateClosure(ParMarkBitMap* bitmap, ParCompactionManager* cm,
@@ -1389,13 +1322,7 @@
 
 class FillClosure: public ParMarkBitMapClosure {
  public:
-  FillClosure(ParCompactionManager* cm, PSParallelCompact::SpaceId space_id) :
-    ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm),
-    _start_array(PSParallelCompact::start_array(space_id))
-  {
-    assert(space_id == PSParallelCompact::old_space_id,
-           "cannot use FillClosure in the young gen");
-  }
+  FillClosure(ParCompactionManager* cm, PSParallelCompact::SpaceId space_id);
 
   virtual IterationStatus do_addr(HeapWord* addr, size_t size);
 
--- a/hotspot/src/share/vm/gc/parallel/psParallelCompact.inline.hpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/parallel/psParallelCompact.inline.hpp	Fri May 26 13:46:49 2017 +0200
@@ -26,11 +26,73 @@
 #define SHARE_VM_GC_PARALLEL_PSPARALLELCOMPACT_INLINE_HPP
 
 #include "gc/parallel/parallelScavengeHeap.hpp"
+#include "gc/parallel/parMarkBitMap.inline.hpp"
 #include "gc/parallel/psParallelCompact.hpp"
 #include "gc/shared/collectedHeap.hpp"
 #include "oops/klass.hpp"
 #include "oops/oop.inline.hpp"
 
+inline bool PSParallelCompact::is_marked(oop obj) {
+  return mark_bitmap()->is_marked(obj);
+}
+
+inline double PSParallelCompact::normal_distribution(double density) {
+  assert(_dwl_initialized, "uninitialized");
+  const double squared_term = (density - _dwl_mean) / _dwl_std_dev;
+  return _dwl_first_term * exp(-0.5 * squared_term * squared_term);
+}
+
+inline bool PSParallelCompact::dead_space_crosses_boundary(const RegionData* region,
+                                                           idx_t bit) {
+  assert(bit > 0, "cannot call this for the first bit/region");
+  assert(_summary_data.region_to_addr(region) == _mark_bitmap.bit_to_addr(bit),
+         "sanity check");
+
+  // Dead space crosses the boundary if (1) a partial object does not extend
+  // onto the region, (2) an object does not start at the beginning of the
+  // region, and (3) an object does not end at the end of the prior region.
+  return region->partial_obj_size() == 0 &&
+    !_mark_bitmap.is_obj_beg(bit) &&
+    !_mark_bitmap.is_obj_end(bit - 1);
+}
+
+inline bool PSParallelCompact::is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr) {
+  return p >= beg_addr && p < end_addr;
+}
+
+inline bool PSParallelCompact::is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr) {
+  return is_in((HeapWord*)p, beg_addr, end_addr);
+}
+
+inline MutableSpace* PSParallelCompact::space(SpaceId id) {
+  assert(id < last_space_id, "id out of range");
+  return _space_info[id].space();
+}
+
+inline HeapWord* PSParallelCompact::new_top(SpaceId id) {
+  assert(id < last_space_id, "id out of range");
+  return _space_info[id].new_top();
+}
+
+inline HeapWord* PSParallelCompact::dense_prefix(SpaceId id) {
+  assert(id < last_space_id, "id out of range");
+  return _space_info[id].dense_prefix();
+}
+
+inline ObjectStartArray* PSParallelCompact::start_array(SpaceId id) {
+  assert(id < last_space_id, "id out of range");
+  return _space_info[id].start_array();
+}
+
+#ifdef ASSERT
+inline void PSParallelCompact::check_new_location(HeapWord* old_addr, HeapWord* new_addr) {
+  assert(old_addr >= new_addr || space_id(old_addr) != space_id(new_addr),
+         "must move left or to a different space");
+  assert(is_object_aligned((intptr_t)old_addr) && is_object_aligned((intptr_t)new_addr),
+         "checking alignment");
+}
+#endif // ASSERT
+
 inline bool PSParallelCompact::mark_obj(oop obj) {
   const int obj_size = obj->size();
   if (mark_bitmap()->mark_obj(obj, obj_size)) {
--- a/hotspot/src/share/vm/gc/parallel/psPromotionManager.inline.hpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/gc/parallel/psPromotionManager.inline.hpp	Fri May 26 13:46:49 2017 +0200
@@ -26,6 +26,7 @@
 #define SHARE_VM_GC_PARALLEL_PSPROMOTIONMANAGER_INLINE_HPP
 
 #include "gc/parallel/parallelScavengeHeap.hpp"
+#include "gc/parallel/parMarkBitMap.inline.hpp"
 #include "gc/parallel/psOldGen.hpp"
 #include "gc/parallel/psPromotionLAB.inline.hpp"
 #include "gc/parallel/psPromotionManager.hpp"
--- a/hotspot/src/share/vm/oops/generateOopMap.cpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/oops/generateOopMap.cpp	Fri May 26 13:46:49 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -34,7 +34,6 @@
 #include "runtime/timerTrace.hpp"
 #include "utilities/bitMap.inline.hpp"
 #include "utilities/ostream.hpp"
-#include "prims/methodHandles.hpp"
 
 //
 //
@@ -437,6 +436,10 @@
   }
 }
 
+void GenerateOopMap::set_bbmark_bit(int bci) {
+  _bb_hdr_bits.at_put(bci, true);
+}
+
 void GenerateOopMap::reachable_basicblock(GenerateOopMap *c, int bci, int *data) {
   assert(bci>= 0 && bci < c->method()->code_size(), "index out of bounds");
   BasicBlock* bb = c->get_basic_block_at(bci);
--- a/hotspot/src/share/vm/oops/generateOopMap.hpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/oops/generateOopMap.hpp	Fri May 26 13:46:49 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -31,6 +31,7 @@
 #include "oops/method.hpp"
 #include "oops/oopsHierarchy.hpp"
 #include "runtime/signature.hpp"
+#include "utilities/bitMap.hpp"
 
 // Forward definition
 class GenerateOopMap;
@@ -360,12 +361,7 @@
   }
   int           gc_points                   () const                          { return _gc_points; }
   int           bb_count                    () const                          { return _bb_count; }
-  void          set_bbmark_bit              (int bci) {
-    _bb_hdr_bits.at_put(bci, true);
-  }
-  void          clear_bbmark_bit            (int bci) {
-    _bb_hdr_bits.at_put(bci, false);
-  }
+  void          set_bbmark_bit              (int bci);
   BasicBlock *  get_basic_block_at          (int bci) const;
   BasicBlock *  get_basic_block_containing  (int bci) const;
   void          interp_bb                   (BasicBlock *bb);
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp	Fri May 26 13:46:49 2017 +0200
@@ -40,7 +40,6 @@
 #include "runtime/os.hpp"
 #include "trace/traceMacros.hpp"
 #include "utilities/accessFlags.hpp"
-#include "utilities/bitMap.inline.hpp"
 #include "utilities/macros.hpp"
 
 // An InstanceKlass is the VM level representation of a Java class.
--- a/hotspot/test/native/gc/parallel/test_psParallelCompact.cpp	Thu May 25 20:55:20 2017 -0400
+++ b/hotspot/test/native/gc/parallel/test_psParallelCompact.cpp	Fri May 26 13:46:49 2017 +0200
@@ -22,6 +22,7 @@
  */
 
 #include "precompiled.hpp"
+#include "gc/parallel/parMarkBitMap.inline.hpp"
 #include "gc/parallel/psParallelCompact.hpp"
 #include "gc/parallel/psCompactionManager.inline.hpp"
 #include "unittest.hpp"