src/hotspot/share/gc/shared/c2/modRefBarrierSetC2.cpp
author kbarrett
Fri, 15 Jun 2018 16:53:58 -0400
changeset 50599 ecc2af326b5f
parent 50180 ffa644980dff
child 50728 9375184cec98
permissions -rw-r--r--
8204939: Change Access nomenclature: root to native Summary: Rename RootAccess => NativeAccess, IN_ROOT => IN_NATIVE, and related cleanups. Reviewed-by: pliden, stefank, coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50180
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
     1
/*
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
     4
 *
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
     7
 * published by the Free Software Foundation.
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
     8
 *
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    13
 * accompanied this code).
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    14
 *
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    18
 *
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    21
 * questions.
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    22
 *
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    23
 */
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    24
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    25
#include "precompiled.hpp"
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    26
#include "opto/arraycopynode.hpp"
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    27
#include "opto/graphKit.hpp"
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    28
#include "opto/idealKit.hpp"
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    29
#include "opto/narrowptrnode.hpp"
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    30
#include "gc/shared/c2/modRefBarrierSetC2.hpp"
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    31
#include "utilities/macros.hpp"
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    32
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    33
Node* ModRefBarrierSetC2::store_at_resolved(C2Access& access, C2AccessValue& val) const {
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    34
  DecoratorSet decorators = access.decorators();
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    35
  GraphKit* kit = access.kit();
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    36
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    37
  const TypePtr* adr_type = access.addr().type();
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    38
  Node* adr = access.addr().node();
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    39
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    40
  bool on_array = (decorators & IN_HEAP_ARRAY) != 0;
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    41
  bool anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
50599
ecc2af326b5f 8204939: Change Access nomenclature: root to native
kbarrett
parents: 50180
diff changeset
    42
  bool in_heap = (decorators & IN_HEAP) != 0;
50180
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    43
  bool use_precise = on_array || anonymous;
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    44
50599
ecc2af326b5f 8204939: Change Access nomenclature: root to native
kbarrett
parents: 50180
diff changeset
    45
  if (!access.is_oop() || (!in_heap && !anonymous)) {
50180
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    46
    return BarrierSetC2::store_at_resolved(access, val);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    47
  }
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    48
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    49
  uint adr_idx = kit->C->get_alias_index(adr_type);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    50
  assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" );
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    51
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    52
  pre_barrier(kit, true /* do_load */, kit->control(), access.base(), adr, adr_idx, val.node(),
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    53
              static_cast<const TypeOopPtr*>(val.type()), NULL /* pre_val */, access.type());
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    54
  Node* store = BarrierSetC2::store_at_resolved(access, val);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    55
  post_barrier(kit, kit->control(), access.raw_access(), access.base(), adr, adr_idx, val.node(),
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    56
               access.type(), use_precise);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    57
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    58
  return store;
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    59
}
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    60
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    61
Node* ModRefBarrierSetC2::atomic_cmpxchg_val_at_resolved(C2AtomicAccess& access, Node* expected_val,
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    62
                                                         Node* new_val, const Type* value_type) const {
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    63
  GraphKit* kit = access.kit();
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    64
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    65
  if (!access.is_oop()) {
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    66
    return BarrierSetC2::atomic_cmpxchg_val_at_resolved(access, expected_val, new_val, value_type);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    67
  }
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    68
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    69
  pre_barrier(kit, false /* do_load */,
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    70
              kit->control(), NULL, NULL, max_juint, NULL, NULL,
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    71
              expected_val /* pre_val */, T_OBJECT);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    72
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    73
  Node* result = BarrierSetC2::atomic_cmpxchg_val_at_resolved(access, expected_val, new_val, value_type);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    74
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    75
  post_barrier(kit, kit->control(), access.raw_access(), access.base(),
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    76
               access.addr().node(), access.alias_idx(), new_val, T_OBJECT, true);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    77
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    78
  return result;
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    79
}
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    80
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    81
Node* ModRefBarrierSetC2::atomic_cmpxchg_bool_at_resolved(C2AtomicAccess& access, Node* expected_val,
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    82
                                                          Node* new_val, const Type* value_type) const {
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    83
  GraphKit* kit = access.kit();
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    84
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    85
  if (!access.is_oop()) {
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    86
    return BarrierSetC2::atomic_cmpxchg_bool_at_resolved(access, expected_val, new_val, value_type);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    87
  }
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    88
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    89
  pre_barrier(kit, false /* do_load */,
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    90
              kit->control(), NULL, NULL, max_juint, NULL, NULL,
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    91
              expected_val /* pre_val */, T_OBJECT);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    92
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    93
  Node* load_store = BarrierSetC2::atomic_cmpxchg_bool_at_resolved(access, expected_val, new_val, value_type);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    94
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    95
  // Emit the post barrier only when the actual store happened. This makes sense
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    96
  // to check only for LS_cmp_* that can fail to set the value.
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    97
  // LS_cmp_exchange does not produce any branches by default, so there is no
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    98
  // boolean result to piggyback on. TODO: When we merge CompareAndSwap with
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
    99
  // CompareAndExchange and move branches here, it would make sense to conditionalize
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   100
  // post_barriers for LS_cmp_exchange as well.
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   101
  //
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   102
  // CAS success path is marked more likely since we anticipate this is a performance
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   103
  // critical path, while CAS failure path can use the penalty for going through unlikely
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   104
  // path as backoff. Which is still better than doing a store barrier there.
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   105
  IdealKit ideal(kit);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   106
  ideal.if_then(load_store, BoolTest::ne, ideal.ConI(0), PROB_STATIC_FREQUENT); {
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   107
    kit->sync_kit(ideal);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   108
    post_barrier(kit, ideal.ctrl(), access.raw_access(), access.base(),
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   109
                 access.addr().node(), access.alias_idx(), new_val, T_OBJECT, true);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   110
    ideal.sync_kit(kit);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   111
  } ideal.end_if();
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   112
  kit->final_sync(ideal);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   113
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   114
  return load_store;
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   115
}
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   116
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   117
Node* ModRefBarrierSetC2::atomic_xchg_at_resolved(C2AtomicAccess& access, Node* new_val, const Type* value_type) const {
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   118
  GraphKit* kit = access.kit();
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   119
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   120
  Node* result = BarrierSetC2::atomic_xchg_at_resolved(access, new_val, value_type);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   121
  if (!access.is_oop()) {
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   122
    return result;
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   123
  }
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   124
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   125
  // Don't need to load pre_val. The old value is returned by load_store.
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   126
  // The pre_barrier can execute after the xchg as long as no safepoint
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   127
  // gets inserted between them.
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   128
  pre_barrier(kit, false /* do_load */,
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   129
              kit->control(), NULL, NULL, max_juint, NULL, NULL,
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   130
              result /* pre_val */, T_OBJECT);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   131
  post_barrier(kit, kit->control(), access.raw_access(), access.base(), access.addr().node(),
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   132
               access.alias_idx(), new_val, T_OBJECT, true);
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   133
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   134
  return result;
ffa644980dff 8202377: Modularize C2 GC barriers
eosterlund
parents:
diff changeset
   135
}