src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp
author mikael
Mon, 29 Jul 2019 09:59:04 -0700
changeset 57584 9d82a35b6ff7
parent 55605 91050b1e0fe8
parent 57582 a79a819a8218
child 57904 4f38fcd65577
permissions -rw-r--r--
Merge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     1
/*
53223
df6cbf676c70 8215708: ZGC: Add missing LoadBarrierNode::size_of()
pliden
parents: 52711
diff changeset
     2
 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     4
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     7
 * published by the Free Software Foundation.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     8
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    13
 * accompanied this code).
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    14
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    18
 *
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    21
 * questions.
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    22
 */
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    23
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    24
#ifndef SHARE_GC_Z_C2_ZBARRIERSETC2_HPP
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    25
#define SHARE_GC_Z_C2_ZBARRIERSETC2_HPP
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    26
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    27
#include "gc/shared/c2/barrierSetC2.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    28
#include "memory/allocation.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    29
#include "opto/node.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    30
#include "utilities/growableArray.hpp"
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    31
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    32
class ZCompareAndSwapPNode : public CompareAndSwapPNode {
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    33
public:
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    34
    ZCompareAndSwapPNode(Node* c, Node *mem, Node *adr, Node *val, Node *ex, MemNode::MemOrd mem_ord) : CompareAndSwapPNode(c, mem, adr, val, ex, mem_ord) { }
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    35
    virtual int Opcode() const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    36
};
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    37
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    38
class ZWeakCompareAndSwapPNode : public WeakCompareAndSwapPNode {
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    39
public:
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    40
    ZWeakCompareAndSwapPNode(Node* c, Node *mem, Node *adr, Node *val, Node *ex, MemNode::MemOrd mem_ord) : WeakCompareAndSwapPNode(c, mem, adr, val, ex, mem_ord) { }
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    41
    virtual int Opcode() const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    42
};
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    43
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    44
class ZCompareAndExchangePNode : public CompareAndExchangePNode {
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    45
public:
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    46
    ZCompareAndExchangePNode(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) { }
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    47
    virtual int Opcode() const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    48
};
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    49
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    50
class ZGetAndSetPNode : public GetAndSetPNode {
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    51
public:
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    52
    ZGetAndSetPNode(Node* c, Node *mem, Node *adr, Node *val, const TypePtr* at, const Type* t) : GetAndSetPNode(c, mem, adr, val, at, t) { }
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    53
    virtual int Opcode() const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    54
};
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    55
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    56
class LoadBarrierNode : public MultiNode {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    57
private:
53439
4b42f828e0c3 8217257: ZGC: Minor cleanup of ZBarrierSetC2
pliden
parents: 53223
diff changeset
    58
  bool _weak;               // On strong or weak oop reference
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    59
  static bool is_dominator(PhaseIdealLoop* phase, bool linear_only, Node *d, Node *n);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    60
  void push_dominated_barriers(PhaseIterGVN* igvn) const;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    61
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    62
public:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    63
  enum {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    64
    Control,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    65
    Memory,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    66
    Oop,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    67
    Address,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    68
    Number_of_Outputs = Address,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    69
    Similar,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    70
    Number_of_Inputs
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    71
  };
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    72
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    73
  LoadBarrierNode(Compile* C,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    74
                  Node* c,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    75
                  Node* mem,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    76
                  Node* val,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    77
                  Node* adr,
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
    78
                  bool weak);
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    79
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    80
  virtual int Opcode() const;
53223
df6cbf676c70 8215708: ZGC: Add missing LoadBarrierNode::size_of()
pliden
parents: 52711
diff changeset
    81
  virtual uint size_of() const;
54327
a4d19817609c 8157372: C2: Node::cmp() should return bool
jcbeyler
parents: 53439
diff changeset
    82
  virtual bool cmp(const Node& n) const;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    83
  virtual const Type *bottom_type() const;
53223
df6cbf676c70 8215708: ZGC: Add missing LoadBarrierNode::size_of()
pliden
parents: 52711
diff changeset
    84
  virtual const TypePtr* adr_type() const;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    85
  virtual const Type *Value(PhaseGVN *phase) const;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    86
  virtual Node *Identity(PhaseGVN *phase);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    87
  virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
53223
df6cbf676c70 8215708: ZGC: Add missing LoadBarrierNode::size_of()
pliden
parents: 52711
diff changeset
    88
  virtual uint match_edge(uint idx) const;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    89
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    90
  LoadBarrierNode* has_dominating_barrier(PhaseIdealLoop* phase,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    91
                                          bool linear_only,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    92
                                          bool look_for_similar);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    93
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    94
  void fix_similar_in_uses(PhaseIterGVN* igvn);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    95
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    96
  bool has_true_uses() const;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    97
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    98
  bool can_be_eliminated() const {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
    99
    return !in(Similar)->is_top();
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   100
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   101
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   102
  bool is_weak() const {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   103
    return _weak;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   104
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   105
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   106
55563
d56b192c73e9 8225642: ZGC: Crash due to bad oops being spilled to stack in load barriers
eosterlund
parents: 55536
diff changeset
   107
class LoadBarrierSlowRegNode : public TypeNode {
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   108
private:
55563
d56b192c73e9 8225642: ZGC: Crash due to bad oops being spilled to stack in load barriers
eosterlund
parents: 55536
diff changeset
   109
  bool _is_weak;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   110
public:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   111
  LoadBarrierSlowRegNode(Node *c,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   112
                         Node *adr,
55563
d56b192c73e9 8225642: ZGC: Crash due to bad oops being spilled to stack in load barriers
eosterlund
parents: 55536
diff changeset
   113
                         Node *src,
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   114
                         const TypePtr* t,
55563
d56b192c73e9 8225642: ZGC: Crash due to bad oops being spilled to stack in load barriers
eosterlund
parents: 55536
diff changeset
   115
                         bool weak) :
d56b192c73e9 8225642: ZGC: Crash due to bad oops being spilled to stack in load barriers
eosterlund
parents: 55536
diff changeset
   116
      TypeNode(t, 3), _is_weak(weak) {
d56b192c73e9 8225642: ZGC: Crash due to bad oops being spilled to stack in load barriers
eosterlund
parents: 55536
diff changeset
   117
    init_req(1, adr);
d56b192c73e9 8225642: ZGC: Crash due to bad oops being spilled to stack in load barriers
eosterlund
parents: 55536
diff changeset
   118
    init_req(2, src);
51485
0c7040d1d1ca 8208601: Introduce native oop barriers in C2 for OopHandle
eosterlund
parents: 50875
diff changeset
   119
    init_class_id(Class_LoadBarrierSlowReg);
0c7040d1d1ca 8208601: Introduce native oop barriers in C2 for OopHandle
eosterlund
parents: 50875
diff changeset
   120
  }
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   121
55563
d56b192c73e9 8225642: ZGC: Crash due to bad oops being spilled to stack in load barriers
eosterlund
parents: 55536
diff changeset
   122
  virtual uint size_of() const {
d56b192c73e9 8225642: ZGC: Crash due to bad oops being spilled to stack in load barriers
eosterlund
parents: 55536
diff changeset
   123
    return sizeof(*this);
d56b192c73e9 8225642: ZGC: Crash due to bad oops being spilled to stack in load barriers
eosterlund
parents: 55536
diff changeset
   124
  }
d56b192c73e9 8225642: ZGC: Crash due to bad oops being spilled to stack in load barriers
eosterlund
parents: 55536
diff changeset
   125
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   126
  virtual const char * name() {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   127
    return "LoadBarrierSlowRegNode";
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   128
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   129
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   130
  virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   131
    return NULL;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   132
  }
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   133
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   134
  virtual int Opcode() const;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   135
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   136
  bool is_weak() { return _is_weak; }
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   137
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   138
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   139
class ZBarrierSetC2State : public ResourceObj {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   140
private:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   141
  // List of load barrier nodes which need to be expanded before matching
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   142
  GrowableArray<LoadBarrierNode*>* _load_barrier_nodes;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   143
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   144
public:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   145
  ZBarrierSetC2State(Arena* comp_arena);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   146
  int load_barrier_count() const;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   147
  void add_load_barrier_node(LoadBarrierNode* n);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   148
  void remove_load_barrier_node(LoadBarrierNode* n);
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   149
  LoadBarrierNode* load_barrier_node(int idx) const;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   150
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   151
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   152
class ZBarrierSetC2 : public BarrierSetC2 {
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   153
private:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   154
  ZBarrierSetC2State* state() const;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   155
  void expand_loadbarrier_node(PhaseMacroExpand* phase, LoadBarrierNode* barrier) const;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   156
52426
38bf0c9c4e64 8213384: Move G1/C2 barrier verification into G1BarrierSetC2
rkennke
parents: 52424
diff changeset
   157
#ifdef ASSERT
38bf0c9c4e64 8213384: Move G1/C2 barrier verification into G1BarrierSetC2
rkennke
parents: 52424
diff changeset
   158
  void verify_gc_barriers(bool post_parse) const;
38bf0c9c4e64 8213384: Move G1/C2 barrier verification into G1BarrierSetC2
rkennke
parents: 52424
diff changeset
   159
#endif
38bf0c9c4e64 8213384: Move G1/C2 barrier verification into G1BarrierSetC2
rkennke
parents: 52424
diff changeset
   160
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   161
protected:
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   162
  virtual Node* load_at_resolved(C2Access& access, const Type* val_type) const;
52424
e3d79743f57d 8212243: More gc interface tweaks for arraycopy
roland
parents: 52224
diff changeset
   163
  virtual Node* atomic_cmpxchg_val_at_resolved(C2AtomicParseAccess& access,
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   164
                                               Node* expected_val,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   165
                                               Node* new_val,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   166
                                               const Type* val_type) const;
52424
e3d79743f57d 8212243: More gc interface tweaks for arraycopy
roland
parents: 52224
diff changeset
   167
  virtual Node* atomic_cmpxchg_bool_at_resolved(C2AtomicParseAccess& access,
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   168
                                                Node* expected_val,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   169
                                                Node* new_val,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   170
                                                const Type* value_type) const;
52424
e3d79743f57d 8212243: More gc interface tweaks for arraycopy
roland
parents: 52224
diff changeset
   171
  virtual Node* atomic_xchg_at_resolved(C2AtomicParseAccess& access,
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   172
                                        Node* new_val,
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   173
                                        const Type* val_type) const;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   174
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   175
public:
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   176
  virtual void* create_barrier_state(Arena* comp_arena) const;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   177
51485
0c7040d1d1ca 8208601: Introduce native oop barriers in C2 for OopHandle
eosterlund
parents: 50875
diff changeset
   178
  virtual bool has_load_barriers() const { return true; }
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   179
  virtual bool is_gc_barrier_node(Node* node) const;
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   180
  virtual Node* step_over_gc_barrier(Node* c) const;
55536
8313c42345d5 8226287: Make process_users_of_allocation handle gc barriers
neliasso
parents: 55307
diff changeset
   181
  virtual Node* step_over_gc_barrier_ctrl(Node* c) const;
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   182
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   183
  virtual void register_potential_barrier_node(Node* node) const;
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   184
  virtual void unregister_potential_barrier_node(Node* node) const;
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   185
  virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const { }
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   186
  virtual void enqueue_useful_gc_barrier(PhaseIterGVN* igvn, Node* node) const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   187
  virtual void eliminate_useless_gc_barriers(Unique_Node_List &useful, Compile* C) const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   188
52036
5d6d636cefff 8211776: 8210887 broke arraycopy optimization when ZGC is enabled
roland
parents: 51984
diff changeset
   189
  virtual bool array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   190
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   191
  virtual bool expand_barriers(Compile* C, PhaseIterGVN& igvn) const;
52471
04d7e790aa2e 8213489: GC/C2 abstraction for Compile::final_graph_reshaping()
rkennke
parents: 52426
diff changeset
   192
  virtual bool final_graph_reshaping(Compile* compile, Node* n, uint opcode) const;
52627
e7d8ea5bfc8f 8213746: GC/C2 abstraction for C2 matcher
rkennke
parents: 52568
diff changeset
   193
  virtual bool matcher_find_shared_visit(Matcher* matcher, Matcher::MStack& mstack, Node* n, uint opcode, bool& mem_op, int& mem_addr_idx) const;
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   194
  virtual bool matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   195
  virtual bool needs_anti_dependence_check(const Node* node) const;
52627
e7d8ea5bfc8f 8213746: GC/C2 abstraction for C2 matcher
rkennke
parents: 52568
diff changeset
   196
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   197
#ifdef ASSERT
52426
38bf0c9c4e64 8213384: Move G1/C2 barrier verification into G1BarrierSetC2
rkennke
parents: 52424
diff changeset
   198
  virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   199
#endif
52568
40474b7105f4 8213615: GC/C2 abstraction for escape analysis
rkennke
parents: 52471
diff changeset
   200
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   201
  // Load barrier insertion and expansion external
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   202
  virtual void barrier_insertion_phase(Compile* C, PhaseIterGVN &igvn) const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   203
  virtual bool optimize_loops(PhaseIdealLoop* phase, LoopOptsMode mode, VectorSet& visited, Node_Stack& nstack, Node_List& worklist) const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   204
  virtual bool is_gc_specific_loop_opts_pass(LoopOptsMode mode) const { return (mode == LoopOptsZBarrierInsertion); }
57582
a79a819a8218 8227407: ZGC: C2 loads and load barriers can get separated by safepoints
eosterlund
parents: 55601
diff changeset
   205
  virtual bool strip_mined_loops_expanded(LoopOptsMode mode) const { return mode == LoopOptsZBarrierInsertion; }
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   206
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   207
private:
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   208
  // Load barrier insertion and expansion internal
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   209
  void insert_barriers_on_unsafe(PhaseIdealLoop* phase) const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   210
  void clean_catch_blocks(PhaseIdealLoop* phase) const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   211
  void insert_load_barriers(PhaseIdealLoop* phase) const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   212
  LoadNode* insert_one_loadbarrier(PhaseIdealLoop* phase, LoadNode* load, Node* ctrl) const;
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 54327
diff changeset
   213
  void insert_one_loadbarrier_inner(PhaseIdealLoop* phase, LoadNode* load, Node* ctrl, VectorSet visited) const;
50525
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   214
};
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   215
767cdb97f103 8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
pliden
parents:
diff changeset
   216
#endif // SHARE_GC_Z_C2_ZBARRIERSETC2_HPP