annotate src/share/vm/opto/memnode.hpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents 4311f23817fd
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1367
diff changeset
2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1367
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1367
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1367
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // Portions of code courtesy of Clifford Click
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 class MultiNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 class PhaseCCP;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 class PhaseTransform;
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 //------------------------------MemNode----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // Load or Store, possibly throwing a NULL pointer exception
a61af66fc99e Initial load
duke
parents:
diff changeset
33 class MemNode : public Node {
a61af66fc99e Initial load
duke
parents:
diff changeset
34 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
35 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
36 const TypePtr* _adr_type; // What kind of memory is being addressed?
a61af66fc99e Initial load
duke
parents:
diff changeset
37 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
38 virtual uint size_of() const; // Size is bigger (ASSERT only)
a61af66fc99e Initial load
duke
parents:
diff changeset
39 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
40 enum { Control, // When is it safe to do this load?
a61af66fc99e Initial load
duke
parents:
diff changeset
41 Memory, // Chunk of memory is being loaded from
a61af66fc99e Initial load
duke
parents:
diff changeset
42 Address, // Actually address, derived from base
a61af66fc99e Initial load
duke
parents:
diff changeset
43 ValueIn, // Value to store
a61af66fc99e Initial load
duke
parents:
diff changeset
44 OopStore // Preceeding oop store, only in StoreCM
a61af66fc99e Initial load
duke
parents:
diff changeset
45 };
a61af66fc99e Initial load
duke
parents:
diff changeset
46 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
47 MemNode( Node *c0, Node *c1, Node *c2, const TypePtr* at )
a61af66fc99e Initial load
duke
parents:
diff changeset
48 : Node(c0,c1,c2 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
49 init_class_id(Class_Mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
50 debug_only(_adr_type=at; adr_type();)
a61af66fc99e Initial load
duke
parents:
diff changeset
51 }
a61af66fc99e Initial load
duke
parents:
diff changeset
52 MemNode( Node *c0, Node *c1, Node *c2, const TypePtr* at, Node *c3 )
a61af66fc99e Initial load
duke
parents:
diff changeset
53 : Node(c0,c1,c2,c3) {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 init_class_id(Class_Mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
55 debug_only(_adr_type=at; adr_type();)
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57 MemNode( Node *c0, Node *c1, Node *c2, const TypePtr* at, Node *c3, Node *c4)
a61af66fc99e Initial load
duke
parents:
diff changeset
58 : Node(c0,c1,c2,c3,c4) {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 init_class_id(Class_Mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 debug_only(_adr_type=at; adr_type();)
a61af66fc99e Initial load
duke
parents:
diff changeset
61 }
a61af66fc99e Initial load
duke
parents:
diff changeset
62
33
3288958bf319 6667580: Optimize CmpP for allocations
kvn
parents: 29
diff changeset
63 public:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // Helpers for the optimizer. Documented in memnode.cpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
65 static bool detect_ptr_independence(Node* p1, AllocateNode* a1,
a61af66fc99e Initial load
duke
parents:
diff changeset
66 Node* p2, AllocateNode* a2,
a61af66fc99e Initial load
duke
parents:
diff changeset
67 PhaseTransform* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
68 static bool adr_phi_is_loop_invariant(Node* adr_phi, Node* cast);
a61af66fc99e Initial load
duke
parents:
diff changeset
69
74
2a9af0b9cb1c 6674600: (Escape Analysis) Optimize memory graph for instance's fields
kvn
parents: 64
diff changeset
70 static Node *optimize_simple_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase);
2a9af0b9cb1c 6674600: (Escape Analysis) Optimize memory graph for instance's fields
kvn
parents: 64
diff changeset
71 static Node *optimize_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // This one should probably be a phase-specific function:
85
f3b3fe64f59f 6692301: Side effect in NumberFormat tests with -server -Xcomp
kvn
parents: 74
diff changeset
73 static bool all_controls_dominate(Node* dom, Node* sub);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
74
163
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 122
diff changeset
75 // Find any cast-away of null-ness and keep its control.
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 122
diff changeset
76 static Node *Ideal_common_DU_postCCP( PhaseCCP *ccp, Node* n, Node* adr );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
77 virtual Node *Ideal_DU_postCCP( PhaseCCP *ccp );
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 virtual const class TypePtr *adr_type() const; // returns bottom_type of address
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // Shared code for Ideal methods:
a61af66fc99e Initial load
duke
parents:
diff changeset
82 Node *Ideal_common(PhaseGVN *phase, bool can_reshape); // Return -1 for short-circuit NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // Helper function for adr_type() implementations.
a61af66fc99e Initial load
duke
parents:
diff changeset
85 static const TypePtr* calculate_adr_type(const Type* t, const TypePtr* cross_check = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // Raw access function, to allow copying of adr_type efficiently in
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // product builds and retain the debug info for debug builds.
a61af66fc99e Initial load
duke
parents:
diff changeset
89 const TypePtr *raw_adr_type() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
90 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
91 return _adr_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
92 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
93 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // Map a load or store opcode to its corresponding store opcode.
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // (Return -1 if unknown.)
a61af66fc99e Initial load
duke
parents:
diff changeset
99 virtual int store_Opcode() const { return -1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // What is the type of the value in memory? (T_VOID mean "unspecified".)
a61af66fc99e Initial load
duke
parents:
diff changeset
102 virtual BasicType memory_type() const = 0;
29
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 17
diff changeset
103 virtual int memory_size() const {
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 17
diff changeset
104 #ifdef ASSERT
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 17
diff changeset
105 return type2aelembytes(memory_type(), true);
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 17
diff changeset
106 #else
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 17
diff changeset
107 return type2aelembytes(memory_type());
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 17
diff changeset
108 #endif
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 17
diff changeset
109 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // Search through memory states which precede this node (load or store).
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Look for an exact match for the address, with no intervening
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // aliased stores.
a61af66fc99e Initial load
duke
parents:
diff changeset
114 Node* find_previous_store(PhaseTransform* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Can this node (load or store) accurately see a stored value in
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // the given memory state? (The state may or may not be in(Memory).)
a61af66fc99e Initial load
duke
parents:
diff changeset
118 Node* can_see_stored_value(Node* st, PhaseTransform* phase) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
121 static void dump_adr_type(const Node* mem, const TypePtr* adr_type, outputStream *st);
a61af66fc99e Initial load
duke
parents:
diff changeset
122 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
124 };
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 //------------------------------LoadNode---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Load value; requires Memory and Address
a61af66fc99e Initial load
duke
parents:
diff changeset
128 class LoadNode : public MemNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
130 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
132 const Type* const _type; // What kind of value is loaded?
a61af66fc99e Initial load
duke
parents:
diff changeset
133 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 LoadNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *rt )
a61af66fc99e Initial load
duke
parents:
diff changeset
136 : MemNode(c,mem,adr,at), _type(rt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
137 init_class_id(Class_Load);
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // Polymorphic factory method:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
141 static Node* make( PhaseGVN& gvn, Node *c, Node *mem, Node *adr,
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
142 const TypePtr* at, const Type *rt, BasicType bt );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 virtual uint hash() const; // Check the type
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Handle algebraic identities here. If we have an identity, return the Node
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // we are equivalent to. We look for Load of a Store.
a61af66fc99e Initial load
duke
parents:
diff changeset
148 virtual Node *Identity( PhaseTransform *phase );
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // If the load is from Field memory and the pointer is non-null, we can
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // zero out the control input.
a61af66fc99e Initial load
duke
parents:
diff changeset
152 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
153
163
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 122
diff changeset
154 // Split instance field load through Phi.
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 122
diff changeset
155 Node* split_through_phi(PhaseGVN *phase);
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 122
diff changeset
156
17
ff5961f4c095 6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents: 0
diff changeset
157 // Recover original value from boxed values
ff5961f4c095 6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents: 0
diff changeset
158 Node *eliminate_autobox(PhaseGVN *phase);
ff5961f4c095 6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents: 0
diff changeset
159
0
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // Compute a new Type for this node. Basically we just do the pre-check,
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // then call the virtual add() to set the type.
a61af66fc99e Initial load
duke
parents:
diff changeset
162 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
163
164
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
164 // Common methods for LoadKlass and LoadNKlass nodes.
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
165 const Type *klass_value_common( PhaseTransform *phase ) const;
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
166 Node *klass_identity_common( PhaseTransform *phase );
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
167
0
a61af66fc99e Initial load
duke
parents:
diff changeset
168 virtual uint ideal_reg() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 virtual const Type *bottom_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // Following method is copied from TypeNode:
a61af66fc99e Initial load
duke
parents:
diff changeset
171 void set_type(const Type* t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
172 assert(t != NULL, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
173 debug_only(uint check_hash = (VerifyHashTableKeys && _hash_lock) ? hash() : NO_HASH);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 *(const Type**)&_type = t; // cast away const-ness
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // If this node is in the hash table, make sure it doesn't need a rehash.
a61af66fc99e Initial load
duke
parents:
diff changeset
176 assert(check_hash == NO_HASH || check_hash == hash(), "type change must preserve hash code");
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 const Type* type() const { assert(_type != NULL, "sanity"); return _type; };
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // Do not match memory edge
a61af66fc99e Initial load
duke
parents:
diff changeset
181 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // Map a load opcode to its corresponding store opcode.
a61af66fc99e Initial load
duke
parents:
diff changeset
184 virtual int store_Opcode() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
185
64
b8f5ba577b02 6673473: (Escape Analysis) Add the instance's field information to PhiNode
kvn
parents: 33
diff changeset
186 // Check if the load's memory input is a Phi node with the same control.
b8f5ba577b02 6673473: (Escape Analysis) Add the instance's field information to PhiNode
kvn
parents: 33
diff changeset
187 bool is_instance_field_load_with_local_phi(Node* ctrl);
b8f5ba577b02 6673473: (Escape Analysis) Add the instance's field information to PhiNode
kvn
parents: 33
diff changeset
188
0
a61af66fc99e Initial load
duke
parents:
diff changeset
189 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
190 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
191 #endif
1609
4311f23817fd 6959430: Make sure raw loads have control edge
kvn
parents: 1552
diff changeset
192 #ifdef ASSERT
4311f23817fd 6959430: Make sure raw loads have control edge
kvn
parents: 1552
diff changeset
193 // Helper function to allow a raw load without control edge for some cases
4311f23817fd 6959430: Make sure raw loads have control edge
kvn
parents: 1552
diff changeset
194 static bool is_immutable_value(Node* adr);
4311f23817fd 6959430: Make sure raw loads have control edge
kvn
parents: 1552
diff changeset
195 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
196 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
197 const Type* load_array_final_field(const TypeKlassPtr *tkls,
a61af66fc99e Initial load
duke
parents:
diff changeset
198 ciKlass* klass) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
199 };
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 //------------------------------LoadBNode--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // Load a byte (8bits signed) from memory
a61af66fc99e Initial load
duke
parents:
diff changeset
203 class LoadBNode : public LoadNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
204 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
205 LoadBNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE )
a61af66fc99e Initial load
duke
parents:
diff changeset
206 : LoadNode(c,mem,adr,at,ti) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
207 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
208 virtual uint ideal_reg() const { return Op_RegI; }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 virtual int store_Opcode() const { return Op_StoreB; }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 virtual BasicType memory_type() const { return T_BYTE; }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 };
a61af66fc99e Initial load
duke
parents:
diff changeset
213
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
214 //------------------------------LoadUBNode-------------------------------------
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
215 // Load a unsigned byte (8bits unsigned) from memory
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
216 class LoadUBNode : public LoadNode {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
217 public:
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
218 LoadUBNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt* ti = TypeInt::UBYTE )
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
219 : LoadNode(c, mem, adr, at, ti) {}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
220 virtual int Opcode() const;
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
221 virtual uint ideal_reg() const { return Op_RegI; }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
222 virtual Node* Ideal(PhaseGVN *phase, bool can_reshape);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
223 virtual int store_Opcode() const { return Op_StoreB; }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
224 virtual BasicType memory_type() const { return T_BYTE; }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
225 };
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
226
558
3b5ac9e7e6ea 6796746: rename LoadC (char) opcode class to LoadUS (unsigned short)
twisti
parents: 420
diff changeset
227 //------------------------------LoadUSNode-------------------------------------
3b5ac9e7e6ea 6796746: rename LoadC (char) opcode class to LoadUS (unsigned short)
twisti
parents: 420
diff changeset
228 // Load an unsigned short/char (16bits unsigned) from memory
3b5ac9e7e6ea 6796746: rename LoadC (char) opcode class to LoadUS (unsigned short)
twisti
parents: 420
diff changeset
229 class LoadUSNode : public LoadNode {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
230 public:
558
3b5ac9e7e6ea 6796746: rename LoadC (char) opcode class to LoadUS (unsigned short)
twisti
parents: 420
diff changeset
231 LoadUSNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR )
0
a61af66fc99e Initial load
duke
parents:
diff changeset
232 : LoadNode(c,mem,adr,at,ti) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
233 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
234 virtual uint ideal_reg() const { return Op_RegI; }
a61af66fc99e Initial load
duke
parents:
diff changeset
235 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 virtual int store_Opcode() const { return Op_StoreC; }
a61af66fc99e Initial load
duke
parents:
diff changeset
237 virtual BasicType memory_type() const { return T_CHAR; }
a61af66fc99e Initial load
duke
parents:
diff changeset
238 };
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 //------------------------------LoadINode--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // Load an integer from memory
a61af66fc99e Initial load
duke
parents:
diff changeset
242 class LoadINode : public LoadNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
244 LoadINode( Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT )
a61af66fc99e Initial load
duke
parents:
diff changeset
245 : LoadNode(c,mem,adr,at,ti) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
246 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 virtual uint ideal_reg() const { return Op_RegI; }
a61af66fc99e Initial load
duke
parents:
diff changeset
248 virtual int store_Opcode() const { return Op_StoreI; }
a61af66fc99e Initial load
duke
parents:
diff changeset
249 virtual BasicType memory_type() const { return T_INT; }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 };
a61af66fc99e Initial load
duke
parents:
diff changeset
251
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
252 //------------------------------LoadUI2LNode-----------------------------------
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
253 // Load an unsigned integer into long from memory
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
254 class LoadUI2LNode : public LoadNode {
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
255 public:
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
256 LoadUI2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeLong* t = TypeLong::UINT)
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
257 : LoadNode(c, mem, adr, at, t) {}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
258 virtual int Opcode() const;
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
259 virtual uint ideal_reg() const { return Op_RegL; }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
260 virtual int store_Opcode() const { return Op_StoreL; }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
261 virtual BasicType memory_type() const { return T_LONG; }
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
262 };
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 605
diff changeset
263
0
a61af66fc99e Initial load
duke
parents:
diff changeset
264 //------------------------------LoadRangeNode----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // Load an array length from the array
a61af66fc99e Initial load
duke
parents:
diff changeset
266 class LoadRangeNode : public LoadINode {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
268 LoadRangeNode( Node *c, Node *mem, Node *adr, const TypeInt *ti = TypeInt::POS )
a61af66fc99e Initial load
duke
parents:
diff changeset
269 : LoadINode(c,mem,adr,TypeAryPtr::RANGE,ti) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
270 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
271 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 virtual Node *Identity( PhaseTransform *phase );
366
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 253
diff changeset
273 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
274 };
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 //------------------------------LoadLNode--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // Load a long from memory
a61af66fc99e Initial load
duke
parents:
diff changeset
278 class LoadLNode : public LoadNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 virtual uint hash() const { return LoadNode::hash() + _require_atomic_access; }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 virtual uint cmp( const Node &n ) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 return _require_atomic_access == ((LoadLNode&)n)._require_atomic_access
a61af66fc99e Initial load
duke
parents:
diff changeset
282 && LoadNode::cmp(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284 virtual uint size_of() const { return sizeof(*this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
285 const bool _require_atomic_access; // is piecewise load forbidden?
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
288 LoadLNode( Node *c, Node *mem, Node *adr, const TypePtr* at,
a61af66fc99e Initial load
duke
parents:
diff changeset
289 const TypeLong *tl = TypeLong::LONG,
a61af66fc99e Initial load
duke
parents:
diff changeset
290 bool require_atomic_access = false )
a61af66fc99e Initial load
duke
parents:
diff changeset
291 : LoadNode(c,mem,adr,at,tl)
a61af66fc99e Initial load
duke
parents:
diff changeset
292 , _require_atomic_access(require_atomic_access)
a61af66fc99e Initial load
duke
parents:
diff changeset
293 {}
a61af66fc99e Initial load
duke
parents:
diff changeset
294 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 virtual uint ideal_reg() const { return Op_RegL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
296 virtual int store_Opcode() const { return Op_StoreL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
297 virtual BasicType memory_type() const { return T_LONG; }
a61af66fc99e Initial load
duke
parents:
diff changeset
298 bool require_atomic_access() { return _require_atomic_access; }
a61af66fc99e Initial load
duke
parents:
diff changeset
299 static LoadLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
301 virtual void dump_spec(outputStream *st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 LoadNode::dump_spec(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
303 if (_require_atomic_access) st->print(" Atomic!");
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
306 };
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 //------------------------------LoadL_unalignedNode----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // Load a long from unaligned memory
a61af66fc99e Initial load
duke
parents:
diff changeset
310 class LoadL_unalignedNode : public LoadLNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
312 LoadL_unalignedNode( Node *c, Node *mem, Node *adr, const TypePtr* at )
a61af66fc99e Initial load
duke
parents:
diff changeset
313 : LoadLNode(c,mem,adr,at) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
314 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 };
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 //------------------------------LoadFNode--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Load a float (64 bits) from memory
a61af66fc99e Initial load
duke
parents:
diff changeset
319 class LoadFNode : public LoadNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
321 LoadFNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t = Type::FLOAT )
a61af66fc99e Initial load
duke
parents:
diff changeset
322 : LoadNode(c,mem,adr,at,t) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
323 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 virtual uint ideal_reg() const { return Op_RegF; }
a61af66fc99e Initial load
duke
parents:
diff changeset
325 virtual int store_Opcode() const { return Op_StoreF; }
a61af66fc99e Initial load
duke
parents:
diff changeset
326 virtual BasicType memory_type() const { return T_FLOAT; }
a61af66fc99e Initial load
duke
parents:
diff changeset
327 };
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 //------------------------------LoadDNode--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // Load a double (64 bits) from memory
a61af66fc99e Initial load
duke
parents:
diff changeset
331 class LoadDNode : public LoadNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
332 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
333 LoadDNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t = Type::DOUBLE )
a61af66fc99e Initial load
duke
parents:
diff changeset
334 : LoadNode(c,mem,adr,at,t) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
335 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
336 virtual uint ideal_reg() const { return Op_RegD; }
a61af66fc99e Initial load
duke
parents:
diff changeset
337 virtual int store_Opcode() const { return Op_StoreD; }
a61af66fc99e Initial load
duke
parents:
diff changeset
338 virtual BasicType memory_type() const { return T_DOUBLE; }
a61af66fc99e Initial load
duke
parents:
diff changeset
339 };
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 //------------------------------LoadD_unalignedNode----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // Load a double from unaligned memory
a61af66fc99e Initial load
duke
parents:
diff changeset
343 class LoadD_unalignedNode : public LoadDNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
345 LoadD_unalignedNode( Node *c, Node *mem, Node *adr, const TypePtr* at )
a61af66fc99e Initial load
duke
parents:
diff changeset
346 : LoadDNode(c,mem,adr,at) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
347 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
348 };
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 //------------------------------LoadPNode--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // Load a pointer from memory (either object or array)
a61af66fc99e Initial load
duke
parents:
diff changeset
352 class LoadPNode : public LoadNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
354 LoadPNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypePtr* t )
a61af66fc99e Initial load
duke
parents:
diff changeset
355 : LoadNode(c,mem,adr,at,t) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
356 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 virtual uint ideal_reg() const { return Op_RegP; }
a61af66fc99e Initial load
duke
parents:
diff changeset
358 virtual int store_Opcode() const { return Op_StoreP; }
a61af66fc99e Initial load
duke
parents:
diff changeset
359 virtual BasicType memory_type() const { return T_ADDRESS; }
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // depends_only_on_test is almost always true, and needs to be almost always
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // true to enable key hoisting & commoning optimizations. However, for the
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // special case of RawPtr loads from TLS top & end, the control edge carries
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // the dependence preventing hoisting past a Safepoint instead of the memory
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // edge. (An unfortunate consequence of having Safepoints not set Raw
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // Memory; itself an unfortunate consequence of having Nodes which produce
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // results (new raw memory state) inside of loops preventing all manner of
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // other optimizations). Basically, it's ugly but so is the alternative.
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // See comment in macro.cpp, around line 125 expand_allocate_common().
a61af66fc99e Initial load
duke
parents:
diff changeset
369 virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM; }
a61af66fc99e Initial load
duke
parents:
diff changeset
370 };
a61af66fc99e Initial load
duke
parents:
diff changeset
371
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
372
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
373 //------------------------------LoadNNode--------------------------------------
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
374 // Load a narrow oop from memory (either object or array)
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
375 class LoadNNode : public LoadNode {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
376 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
377 LoadNNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const Type* t )
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
378 : LoadNode(c,mem,adr,at,t) {}
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
379 virtual int Opcode() const;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
380 virtual uint ideal_reg() const { return Op_RegN; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
381 virtual int store_Opcode() const { return Op_StoreN; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
382 virtual BasicType memory_type() const { return T_NARROWOOP; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
383 // depends_only_on_test is almost always true, and needs to be almost always
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
384 // true to enable key hoisting & commoning optimizations. However, for the
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
385 // special case of RawPtr loads from TLS top & end, the control edge carries
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
386 // the dependence preventing hoisting past a Safepoint instead of the memory
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
387 // edge. (An unfortunate consequence of having Safepoints not set Raw
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
388 // Memory; itself an unfortunate consequence of having Nodes which produce
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
389 // results (new raw memory state) inside of loops preventing all manner of
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
390 // other optimizations). Basically, it's ugly but so is the alternative.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
391 // See comment in macro.cpp, around line 125 expand_allocate_common().
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
392 virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
393 };
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
394
0
a61af66fc99e Initial load
duke
parents:
diff changeset
395 //------------------------------LoadKlassNode----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // Load a Klass from an object
a61af66fc99e Initial load
duke
parents:
diff changeset
397 class LoadKlassNode : public LoadPNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
398 public:
164
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
399 LoadKlassNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeKlassPtr *tk )
0
a61af66fc99e Initial load
duke
parents:
diff changeset
400 : LoadPNode(c,mem,adr,at,tk) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
401 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
402 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
403 virtual Node *Identity( PhaseTransform *phase );
a61af66fc99e Initial load
duke
parents:
diff changeset
404 virtual bool depends_only_on_test() const { return true; }
164
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
405
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
406 // Polymorphic factory method:
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
407 static Node* make( PhaseGVN& gvn, Node *mem, Node *adr, const TypePtr* at,
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
408 const TypeKlassPtr *tk = TypeKlassPtr::OBJECT );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
409 };
a61af66fc99e Initial load
duke
parents:
diff changeset
410
164
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
411 //------------------------------LoadNKlassNode---------------------------------
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
412 // Load a narrow Klass from an object.
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
413 class LoadNKlassNode : public LoadNNode {
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
414 public:
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
415 LoadNKlassNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeNarrowOop *tk )
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
416 : LoadNNode(c,mem,adr,at,tk) {}
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
417 virtual int Opcode() const;
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
418 virtual uint ideal_reg() const { return Op_RegN; }
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
419 virtual int store_Opcode() const { return Op_StoreN; }
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
420 virtual BasicType memory_type() const { return T_NARROWOOP; }
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
421
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
422 virtual const Type *Value( PhaseTransform *phase ) const;
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
423 virtual Node *Identity( PhaseTransform *phase );
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
424 virtual bool depends_only_on_test() const { return true; }
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
425 };
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
426
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 163
diff changeset
427
0
a61af66fc99e Initial load
duke
parents:
diff changeset
428 //------------------------------LoadSNode--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // Load a short (16bits signed) from memory
a61af66fc99e Initial load
duke
parents:
diff changeset
430 class LoadSNode : public LoadNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
431 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
432 LoadSNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT )
a61af66fc99e Initial load
duke
parents:
diff changeset
433 : LoadNode(c,mem,adr,at,ti) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
434 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
435 virtual uint ideal_reg() const { return Op_RegI; }
a61af66fc99e Initial load
duke
parents:
diff changeset
436 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
437 virtual int store_Opcode() const { return Op_StoreC; }
a61af66fc99e Initial load
duke
parents:
diff changeset
438 virtual BasicType memory_type() const { return T_SHORT; }
a61af66fc99e Initial load
duke
parents:
diff changeset
439 };
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 //------------------------------StoreNode--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // Store value; requires Store, Address and Value
a61af66fc99e Initial load
duke
parents:
diff changeset
443 class StoreNode : public MemNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
444 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
445 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
446 virtual bool depends_only_on_test() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
447
a61af66fc99e Initial load
duke
parents:
diff changeset
448 Node *Ideal_masked_input (PhaseGVN *phase, uint mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
449 Node *Ideal_sign_extended_input(PhaseGVN *phase, int num_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
452 StoreNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val )
a61af66fc99e Initial load
duke
parents:
diff changeset
453 : MemNode(c,mem,adr,at,val) {
a61af66fc99e Initial load
duke
parents:
diff changeset
454 init_class_id(Class_Store);
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456 StoreNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, Node *oop_store )
a61af66fc99e Initial load
duke
parents:
diff changeset
457 : MemNode(c,mem,adr,at,val,oop_store) {
a61af66fc99e Initial load
duke
parents:
diff changeset
458 init_class_id(Class_Store);
a61af66fc99e Initial load
duke
parents:
diff changeset
459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // Polymorphic factory method:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
462 static StoreNode* make( PhaseGVN& gvn, Node *c, Node *mem, Node *adr,
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
463 const TypePtr* at, Node *val, BasicType bt );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 virtual uint hash() const; // Check the type
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // If the store is to Field memory and the pointer is non-null, we can
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // zero out the control input.
a61af66fc99e Initial load
duke
parents:
diff changeset
469 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // Compute a new Type for this node. Basically we just do the pre-check,
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // then call the virtual add() to set the type.
a61af66fc99e Initial load
duke
parents:
diff changeset
473 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // Check for identity function on memory (Load then Store at same address)
a61af66fc99e Initial load
duke
parents:
diff changeset
476 virtual Node *Identity( PhaseTransform *phase );
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // Do not match memory edge
a61af66fc99e Initial load
duke
parents:
diff changeset
479 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481 virtual const Type *bottom_type() const; // returns Type::MEMORY
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // Map a store opcode to its corresponding own opcode, trivially.
a61af66fc99e Initial load
duke
parents:
diff changeset
484 virtual int store_Opcode() const { return Opcode(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // have all possible loads of the value stored been optimized away?
a61af66fc99e Initial load
duke
parents:
diff changeset
487 bool value_never_loaded(PhaseTransform *phase) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
488 };
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 //------------------------------StoreBNode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // Store byte to memory
a61af66fc99e Initial load
duke
parents:
diff changeset
492 class StoreBNode : public StoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
493 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
494 StoreBNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
495 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
496 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
497 virtual BasicType memory_type() const { return T_BYTE; }
a61af66fc99e Initial load
duke
parents:
diff changeset
498 };
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 //------------------------------StoreCNode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // Store char/short to memory
a61af66fc99e Initial load
duke
parents:
diff changeset
502 class StoreCNode : public StoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
504 StoreCNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
505 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
506 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
507 virtual BasicType memory_type() const { return T_CHAR; }
a61af66fc99e Initial load
duke
parents:
diff changeset
508 };
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510 //------------------------------StoreINode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // Store int to memory
a61af66fc99e Initial load
duke
parents:
diff changeset
512 class StoreINode : public StoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
513 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
514 StoreINode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
515 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
516 virtual BasicType memory_type() const { return T_INT; }
a61af66fc99e Initial load
duke
parents:
diff changeset
517 };
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 //------------------------------StoreLNode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // Store long to memory
a61af66fc99e Initial load
duke
parents:
diff changeset
521 class StoreLNode : public StoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 virtual uint hash() const { return StoreNode::hash() + _require_atomic_access; }
a61af66fc99e Initial load
duke
parents:
diff changeset
523 virtual uint cmp( const Node &n ) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
524 return _require_atomic_access == ((StoreLNode&)n)._require_atomic_access
a61af66fc99e Initial load
duke
parents:
diff changeset
525 && StoreNode::cmp(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
527 virtual uint size_of() const { return sizeof(*this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
528 const bool _require_atomic_access; // is piecewise store forbidden?
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
531 StoreLNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val,
a61af66fc99e Initial load
duke
parents:
diff changeset
532 bool require_atomic_access = false )
a61af66fc99e Initial load
duke
parents:
diff changeset
533 : StoreNode(c,mem,adr,at,val)
a61af66fc99e Initial load
duke
parents:
diff changeset
534 , _require_atomic_access(require_atomic_access)
a61af66fc99e Initial load
duke
parents:
diff changeset
535 {}
a61af66fc99e Initial load
duke
parents:
diff changeset
536 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
537 virtual BasicType memory_type() const { return T_LONG; }
a61af66fc99e Initial load
duke
parents:
diff changeset
538 bool require_atomic_access() { return _require_atomic_access; }
a61af66fc99e Initial load
duke
parents:
diff changeset
539 static StoreLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val);
a61af66fc99e Initial load
duke
parents:
diff changeset
540 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
541 virtual void dump_spec(outputStream *st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
542 StoreNode::dump_spec(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
543 if (_require_atomic_access) st->print(" Atomic!");
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
546 };
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 //------------------------------StoreFNode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // Store float to memory
a61af66fc99e Initial load
duke
parents:
diff changeset
550 class StoreFNode : public StoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
551 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
552 StoreFNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
553 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
554 virtual BasicType memory_type() const { return T_FLOAT; }
a61af66fc99e Initial load
duke
parents:
diff changeset
555 };
a61af66fc99e Initial load
duke
parents:
diff changeset
556
a61af66fc99e Initial load
duke
parents:
diff changeset
557 //------------------------------StoreDNode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // Store double to memory
a61af66fc99e Initial load
duke
parents:
diff changeset
559 class StoreDNode : public StoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
560 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
561 StoreDNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
562 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
563 virtual BasicType memory_type() const { return T_DOUBLE; }
a61af66fc99e Initial load
duke
parents:
diff changeset
564 };
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 //------------------------------StorePNode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // Store pointer to memory
a61af66fc99e Initial load
duke
parents:
diff changeset
568 class StorePNode : public StoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
569 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
570 StorePNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
571 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
572 virtual BasicType memory_type() const { return T_ADDRESS; }
a61af66fc99e Initial load
duke
parents:
diff changeset
573 };
a61af66fc99e Initial load
duke
parents:
diff changeset
574
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
575 //------------------------------StoreNNode-------------------------------------
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
576 // Store narrow oop to memory
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
577 class StoreNNode : public StoreNode {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
578 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
579 StoreNNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {}
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
580 virtual int Opcode() const;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
581 virtual BasicType memory_type() const { return T_NARROWOOP; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
582 };
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
583
0
a61af66fc99e Initial load
duke
parents:
diff changeset
584 //------------------------------StoreCMNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // Store card-mark byte to memory for CM
a61af66fc99e Initial load
duke
parents:
diff changeset
586 // The last StoreCM before a SafePoint must be preserved and occur after its "oop" store
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // Preceeding equivalent StoreCMs may be eliminated.
a61af66fc99e Initial load
duke
parents:
diff changeset
588 class StoreCMNode : public StoreNode {
985
685e959d09ea 6877254: Server vm crashes with no branches off of store slice" when run with CMS and UseSuperWord(default)
cfang
parents: 681
diff changeset
589 private:
1198
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
590 virtual uint hash() const { return StoreNode::hash() + _oop_alias_idx; }
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
591 virtual uint cmp( const Node &n ) const {
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
592 return _oop_alias_idx == ((StoreCMNode&)n)._oop_alias_idx
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
593 && StoreNode::cmp(n);
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
594 }
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
595 virtual uint size_of() const { return sizeof(*this); }
985
685e959d09ea 6877254: Server vm crashes with no branches off of store slice" when run with CMS and UseSuperWord(default)
cfang
parents: 681
diff changeset
596 int _oop_alias_idx; // The alias_idx of OopStore
1198
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
597
0
a61af66fc99e Initial load
duke
parents:
diff changeset
598 public:
1198
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
599 StoreCMNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, Node *oop_store, int oop_alias_idx ) :
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
600 StoreNode(c,mem,adr,at,val,oop_store),
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
601 _oop_alias_idx(oop_alias_idx) {
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
602 assert(_oop_alias_idx >= Compile::AliasIdxRaw ||
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
603 _oop_alias_idx == Compile::AliasIdxBot && Compile::current()->AliasLevel() == 0,
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
604 "bad oop alias idx");
8d9bfe6a446b 6920346: G1: "must avoid base_memory and AliasIdxTop"
never
parents: 1100
diff changeset
605 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
606 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 virtual Node *Identity( PhaseTransform *phase );
985
685e959d09ea 6877254: Server vm crashes with no branches off of store slice" when run with CMS and UseSuperWord(default)
cfang
parents: 681
diff changeset
608 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
609 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
610 virtual BasicType memory_type() const { return T_VOID; } // unspecific
985
685e959d09ea 6877254: Server vm crashes with no branches off of store slice" when run with CMS and UseSuperWord(default)
cfang
parents: 681
diff changeset
611 int oop_alias_idx() const { return _oop_alias_idx; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
612 };
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 //------------------------------LoadPLockedNode---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // Load-locked a pointer from memory (either object or array).
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // On Sparc & Intel this is implemented as a normal pointer load.
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // On PowerPC and friends it's a real load-locked.
a61af66fc99e Initial load
duke
parents:
diff changeset
618 class LoadPLockedNode : public LoadPNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
619 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
620 LoadPLockedNode( Node *c, Node *mem, Node *adr )
a61af66fc99e Initial load
duke
parents:
diff changeset
621 : LoadPNode(c,mem,adr,TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
622 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
623 virtual int store_Opcode() const { return Op_StorePConditional; }
a61af66fc99e Initial load
duke
parents:
diff changeset
624 virtual bool depends_only_on_test() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
625 };
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 //------------------------------LoadLLockedNode---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // Load-locked a pointer from memory (either object or array).
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // On Sparc & Intel this is implemented as a normal long load.
a61af66fc99e Initial load
duke
parents:
diff changeset
630 class LoadLLockedNode : public LoadLNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
631 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
632 LoadLLockedNode( Node *c, Node *mem, Node *adr )
a61af66fc99e Initial load
duke
parents:
diff changeset
633 : LoadLNode(c,mem,adr,TypeRawPtr::BOTTOM, TypeLong::LONG) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
634 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
635 virtual int store_Opcode() const { return Op_StoreLConditional; }
a61af66fc99e Initial load
duke
parents:
diff changeset
636 };
a61af66fc99e Initial load
duke
parents:
diff changeset
637
a61af66fc99e Initial load
duke
parents:
diff changeset
638 //------------------------------SCMemProjNode---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // This class defines a projection of the memory state of a store conditional node.
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // These nodes return a value, but also update memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
641 class SCMemProjNode : public ProjNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
642 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
643 enum {SCMEMPROJCON = (uint)-2};
a61af66fc99e Initial load
duke
parents:
diff changeset
644 SCMemProjNode( Node *src) : ProjNode( src, SCMEMPROJCON) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
645 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
646 virtual bool is_CFG() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
647 virtual const Type *bottom_type() const {return Type::MEMORY;}
a61af66fc99e Initial load
duke
parents:
diff changeset
648 virtual const TypePtr *adr_type() const { return in(0)->in(MemNode::Memory)->adr_type();}
a61af66fc99e Initial load
duke
parents:
diff changeset
649 virtual uint ideal_reg() const { return 0;} // memory projections don't have a register
a61af66fc99e Initial load
duke
parents:
diff changeset
650 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
651 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
652 virtual void dump_spec(outputStream *st) const {};
a61af66fc99e Initial load
duke
parents:
diff changeset
653 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
654 };
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656 //------------------------------LoadStoreNode---------------------------
253
b0fe4deeb9fb 6726999: nsk/stress/jck12a/jck12a010 assert(n != null,"Bad immediate dominator info.")
kvn
parents: 196
diff changeset
657 // Note: is_Mem() method returns 'true' for this class.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
658 class LoadStoreNode : public Node {
a61af66fc99e Initial load
duke
parents:
diff changeset
659 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
660 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
661 ExpectedIn = MemNode::ValueIn+1 // One more input than MemNode
a61af66fc99e Initial load
duke
parents:
diff changeset
662 };
a61af66fc99e Initial load
duke
parents:
diff changeset
663 LoadStoreNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex);
a61af66fc99e Initial load
duke
parents:
diff changeset
664 virtual bool depends_only_on_test() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
665 virtual const Type *bottom_type() const { return TypeInt::BOOL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
666 virtual uint ideal_reg() const { return Op_RegI; }
a61af66fc99e Initial load
duke
parents:
diff changeset
667 virtual uint match_edge(uint idx) const { return idx == MemNode::Address || idx == MemNode::ValueIn; }
a61af66fc99e Initial load
duke
parents:
diff changeset
668 };
a61af66fc99e Initial load
duke
parents:
diff changeset
669
a61af66fc99e Initial load
duke
parents:
diff changeset
670 //------------------------------StorePConditionalNode---------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
671 // Conditionally store pointer to memory, if no change since prior
a61af66fc99e Initial load
duke
parents:
diff changeset
672 // load-locked. Sets flags for success or failure of the store.
a61af66fc99e Initial load
duke
parents:
diff changeset
673 class StorePConditionalNode : public LoadStoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
674 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
675 StorePConditionalNode( Node *c, Node *mem, Node *adr, Node *val, Node *ll ) : LoadStoreNode(c, mem, adr, val, ll) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
676 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
677 // Produces flags
a61af66fc99e Initial load
duke
parents:
diff changeset
678 virtual uint ideal_reg() const { return Op_RegFlags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
679 };
a61af66fc99e Initial load
duke
parents:
diff changeset
680
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
681 //------------------------------StoreIConditionalNode---------------------------
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
682 // Conditionally store int to memory, if no change since prior
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
683 // load-locked. Sets flags for success or failure of the store.
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
684 class StoreIConditionalNode : public LoadStoreNode {
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
685 public:
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
686 StoreIConditionalNode( Node *c, Node *mem, Node *adr, Node *val, Node *ii ) : LoadStoreNode(c, mem, adr, val, ii) { }
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
687 virtual int Opcode() const;
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
688 // Produces flags
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
689 virtual uint ideal_reg() const { return Op_RegFlags; }
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
690 };
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
691
0
a61af66fc99e Initial load
duke
parents:
diff changeset
692 //------------------------------StoreLConditionalNode---------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
693 // Conditionally store long to memory, if no change since prior
a61af66fc99e Initial load
duke
parents:
diff changeset
694 // load-locked. Sets flags for success or failure of the store.
a61af66fc99e Initial load
duke
parents:
diff changeset
695 class StoreLConditionalNode : public LoadStoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
696 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
697 StoreLConditionalNode( Node *c, Node *mem, Node *adr, Node *val, Node *ll ) : LoadStoreNode(c, mem, adr, val, ll) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
698 virtual int Opcode() const;
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
699 // Produces flags
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
700 virtual uint ideal_reg() const { return Op_RegFlags; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
701 };
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 //------------------------------CompareAndSwapLNode---------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
705 class CompareAndSwapLNode : public LoadStoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
707 CompareAndSwapLNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreNode(c, mem, adr, val, ex) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
708 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
709 };
a61af66fc99e Initial load
duke
parents:
diff changeset
710
a61af66fc99e Initial load
duke
parents:
diff changeset
711
a61af66fc99e Initial load
duke
parents:
diff changeset
712 //------------------------------CompareAndSwapINode---------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
713 class CompareAndSwapINode : public LoadStoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
714 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
715 CompareAndSwapINode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreNode(c, mem, adr, val, ex) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
716 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
717 };
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 //------------------------------CompareAndSwapPNode---------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
721 class CompareAndSwapPNode : public LoadStoreNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
722 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
723 CompareAndSwapPNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreNode(c, mem, adr, val, ex) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
724 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
725 };
a61af66fc99e Initial load
duke
parents:
diff changeset
726
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
727 //------------------------------CompareAndSwapNNode---------------------------
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
728 class CompareAndSwapNNode : public LoadStoreNode {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
729 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
730 CompareAndSwapNNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreNode(c, mem, adr, val, ex) { }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
731 virtual int Opcode() const;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
732 };
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
733
0
a61af66fc99e Initial load
duke
parents:
diff changeset
734 //------------------------------ClearArray-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
735 class ClearArrayNode: public Node {
a61af66fc99e Initial load
duke
parents:
diff changeset
736 public:
1100
f96a1a986f7b 6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents: 986
diff changeset
737 ClearArrayNode( Node *ctrl, Node *arymem, Node *word_cnt, Node *base )
f96a1a986f7b 6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents: 986
diff changeset
738 : Node(ctrl,arymem,word_cnt,base) {
f96a1a986f7b 6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents: 986
diff changeset
739 init_class_id(Class_ClearArray);
f96a1a986f7b 6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents: 986
diff changeset
740 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
741 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
742 virtual const Type *bottom_type() const { return Type::MEMORY; }
a61af66fc99e Initial load
duke
parents:
diff changeset
743 // ClearArray modifies array elements, and so affects only the
a61af66fc99e Initial load
duke
parents:
diff changeset
744 // array memory addressed by the bottom_type of its base address.
a61af66fc99e Initial load
duke
parents:
diff changeset
745 virtual const class TypePtr *adr_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
746 virtual Node *Identity( PhaseTransform *phase );
a61af66fc99e Initial load
duke
parents:
diff changeset
747 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
748 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
749
a61af66fc99e Initial load
duke
parents:
diff changeset
750 // Clear the given area of an object or array.
a61af66fc99e Initial load
duke
parents:
diff changeset
751 // The start offset must always be aligned mod BytesPerInt.
a61af66fc99e Initial load
duke
parents:
diff changeset
752 // The end offset must always be aligned mod BytesPerLong.
a61af66fc99e Initial load
duke
parents:
diff changeset
753 // Return the new memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
754 static Node* clear_memory(Node* control, Node* mem, Node* dest,
a61af66fc99e Initial load
duke
parents:
diff changeset
755 intptr_t start_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
756 intptr_t end_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
757 PhaseGVN* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
758 static Node* clear_memory(Node* control, Node* mem, Node* dest,
a61af66fc99e Initial load
duke
parents:
diff changeset
759 intptr_t start_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
760 Node* end_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
761 PhaseGVN* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
762 static Node* clear_memory(Node* control, Node* mem, Node* dest,
a61af66fc99e Initial load
duke
parents:
diff changeset
763 Node* start_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
764 Node* end_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
765 PhaseGVN* phase);
1100
f96a1a986f7b 6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents: 986
diff changeset
766 // Return allocation input memory edge if it is different instance
f96a1a986f7b 6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents: 986
diff changeset
767 // or itself if it is the one we are looking for.
f96a1a986f7b 6895383: JCK test throws NPE for method compiled with Escape Analysis
kvn
parents: 986
diff changeset
768 static bool step_through(Node** np, uint instance_id, PhaseTransform* phase);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
769 };
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771 //------------------------------StrComp-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
772 class StrCompNode: public Node {
a61af66fc99e Initial load
duke
parents:
diff changeset
773 public:
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
774 StrCompNode(Node* control, Node* char_array_mem,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
775 Node* s1, Node* c1,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
776 Node* s2, Node* c2): Node(control, char_array_mem,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
777 s1, c1,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
778 s2, c2) {};
0
a61af66fc99e Initial load
duke
parents:
diff changeset
779 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 virtual bool depends_only_on_test() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
781 virtual const Type* bottom_type() const { return TypeInt::INT; }
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
782 virtual const TypePtr* adr_type() const { return TypeAryPtr::CHARS; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
783 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 virtual uint ideal_reg() const { return Op_RegI; }
a61af66fc99e Initial load
duke
parents:
diff changeset
785 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
786 };
a61af66fc99e Initial load
duke
parents:
diff changeset
787
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
788 //------------------------------StrEquals-------------------------------------
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
789 class StrEqualsNode: public Node {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
790 public:
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
791 StrEqualsNode(Node* control, Node* char_array_mem,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
792 Node* s1, Node* s2, Node* c): Node(control, char_array_mem,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
793 s1, s2, c) {};
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
794 virtual int Opcode() const;
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
795 virtual bool depends_only_on_test() const { return false; }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
796 virtual const Type* bottom_type() const { return TypeInt::BOOL; }
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
797 virtual const TypePtr* adr_type() const { return TypeAryPtr::CHARS; }
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
798 virtual uint match_edge(uint idx) const;
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
799 virtual uint ideal_reg() const { return Op_RegI; }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
800 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
801 };
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
802
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
803 //------------------------------StrIndexOf-------------------------------------
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
804 class StrIndexOfNode: public Node {
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
805 public:
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
806 StrIndexOfNode(Node* control, Node* char_array_mem,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
807 Node* s1, Node* c1,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
808 Node* s2, Node* c2): Node(control, char_array_mem,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
809 s1, c1,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
810 s2, c2) {};
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
811 virtual int Opcode() const;
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
812 virtual bool depends_only_on_test() const { return false; }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
813 virtual const Type* bottom_type() const { return TypeInt::INT; }
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
814 virtual const TypePtr* adr_type() const { return TypeAryPtr::CHARS; }
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
815 virtual uint match_edge(uint idx) const;
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
816 virtual uint ideal_reg() const { return Op_RegI; }
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
817 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
818 };
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 628
diff changeset
819
169
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 164
diff changeset
820 //------------------------------AryEq---------------------------------------
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 164
diff changeset
821 class AryEqNode: public Node {
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 164
diff changeset
822 public:
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
823 AryEqNode(Node* control, Node* char_array_mem,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
824 Node* s1, Node* s2): Node(control, char_array_mem, s1, s2) {};
169
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 164
diff changeset
825 virtual int Opcode() const;
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 164
diff changeset
826 virtual bool depends_only_on_test() const { return false; }
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 164
diff changeset
827 virtual const Type* bottom_type() const { return TypeInt::BOOL; }
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 164
diff changeset
828 virtual const TypePtr* adr_type() const { return TypeAryPtr::CHARS; }
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 985
diff changeset
829 virtual uint match_edge(uint idx) const;
169
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 164
diff changeset
830 virtual uint ideal_reg() const { return Op_RegI; }
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 164
diff changeset
831 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 164
diff changeset
832 };
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 164
diff changeset
833
0
a61af66fc99e Initial load
duke
parents:
diff changeset
834 //------------------------------MemBar-----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
835 // There are different flavors of Memory Barriers to match the Java Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // Model. Monitor-enter and volatile-load act as Aquires: no following ref
a61af66fc99e Initial load
duke
parents:
diff changeset
837 // can be moved to before them. We insert a MemBar-Acquire after a FastLock or
a61af66fc99e Initial load
duke
parents:
diff changeset
838 // volatile-load. Monitor-exit and volatile-store act as Release: no
605
98cb887364d3 6810672: Comment typos
twisti
parents: 558
diff changeset
839 // preceding ref can be moved to after them. We insert a MemBar-Release
0
a61af66fc99e Initial load
duke
parents:
diff changeset
840 // before a FastUnlock or volatile-store. All volatiles need to be
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // serialized, so we follow all volatile-stores with a MemBar-Volatile to
605
98cb887364d3 6810672: Comment typos
twisti
parents: 558
diff changeset
842 // separate it from any following volatile-load.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
843 class MemBarNode: public MultiNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
844 virtual uint hash() const ; // { return NO_HASH; }
a61af66fc99e Initial load
duke
parents:
diff changeset
845 virtual uint cmp( const Node &n ) const ; // Always fail, except on self
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847 virtual uint size_of() const { return sizeof(*this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
848 // Memory type this node is serializing. Usually either rawptr or bottom.
a61af66fc99e Initial load
duke
parents:
diff changeset
849 const TypePtr* _adr_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
852 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
853 Precedent = TypeFunc::Parms // optional edge to force precedence
a61af66fc99e Initial load
duke
parents:
diff changeset
854 };
a61af66fc99e Initial load
duke
parents:
diff changeset
855 MemBarNode(Compile* C, int alias_idx, Node* precedent);
a61af66fc99e Initial load
duke
parents:
diff changeset
856 virtual int Opcode() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
857 virtual const class TypePtr *adr_type() const { return _adr_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
858 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
859 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
860 virtual uint match_edge(uint idx) const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
861 virtual const Type *bottom_type() const { return TypeTuple::MEMBAR; }
a61af66fc99e Initial load
duke
parents:
diff changeset
862 virtual Node *match( const ProjNode *proj, const Matcher *m );
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // Factory method. Builds a wide or narrow membar.
a61af66fc99e Initial load
duke
parents:
diff changeset
864 // Optional 'precedent' becomes an extra edge if not null.
a61af66fc99e Initial load
duke
parents:
diff changeset
865 static MemBarNode* make(Compile* C, int opcode,
a61af66fc99e Initial load
duke
parents:
diff changeset
866 int alias_idx = Compile::AliasIdxBot,
a61af66fc99e Initial load
duke
parents:
diff changeset
867 Node* precedent = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
868 };
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 // "Acquire" - no following ref can move before (but earlier refs can
a61af66fc99e Initial load
duke
parents:
diff changeset
871 // follow, like an early Load stalled in cache). Requires multi-cpu
a61af66fc99e Initial load
duke
parents:
diff changeset
872 // visibility. Inserted after a volatile load or FastLock.
a61af66fc99e Initial load
duke
parents:
diff changeset
873 class MemBarAcquireNode: public MemBarNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
874 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
875 MemBarAcquireNode(Compile* C, int alias_idx, Node* precedent)
a61af66fc99e Initial load
duke
parents:
diff changeset
876 : MemBarNode(C, alias_idx, precedent) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
877 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
878 };
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // "Release" - no earlier ref can move after (but later refs can move
a61af66fc99e Initial load
duke
parents:
diff changeset
881 // up, like a speculative pipelined cache-hitting Load). Requires
a61af66fc99e Initial load
duke
parents:
diff changeset
882 // multi-cpu visibility. Inserted before a volatile store or FastUnLock.
a61af66fc99e Initial load
duke
parents:
diff changeset
883 class MemBarReleaseNode: public MemBarNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
884 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
885 MemBarReleaseNode(Compile* C, int alias_idx, Node* precedent)
a61af66fc99e Initial load
duke
parents:
diff changeset
886 : MemBarNode(C, alias_idx, precedent) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
887 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
888 };
a61af66fc99e Initial load
duke
parents:
diff changeset
889
a61af66fc99e Initial load
duke
parents:
diff changeset
890 // Ordering between a volatile store and a following volatile load.
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // Requires multi-CPU visibility?
a61af66fc99e Initial load
duke
parents:
diff changeset
892 class MemBarVolatileNode: public MemBarNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
893 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
894 MemBarVolatileNode(Compile* C, int alias_idx, Node* precedent)
a61af66fc99e Initial load
duke
parents:
diff changeset
895 : MemBarNode(C, alias_idx, precedent) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
896 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
897 };
a61af66fc99e Initial load
duke
parents:
diff changeset
898
a61af66fc99e Initial load
duke
parents:
diff changeset
899 // Ordering within the same CPU. Used to order unsafe memory references
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // inside the compiler when we lack alias info. Not needed "outside" the
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // compiler because the CPU does all the ordering for us.
a61af66fc99e Initial load
duke
parents:
diff changeset
902 class MemBarCPUOrderNode: public MemBarNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
904 MemBarCPUOrderNode(Compile* C, int alias_idx, Node* precedent)
a61af66fc99e Initial load
duke
parents:
diff changeset
905 : MemBarNode(C, alias_idx, precedent) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
906 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
907 virtual uint ideal_reg() const { return 0; } // not matched in the AD file
a61af66fc99e Initial load
duke
parents:
diff changeset
908 };
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // Isolation of object setup after an AllocateNode and before next safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
911 // (See comment in memnode.cpp near InitializeNode::InitializeNode for semantics.)
a61af66fc99e Initial load
duke
parents:
diff changeset
912 class InitializeNode: public MemBarNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
913 friend class AllocateNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
914
a61af66fc99e Initial load
duke
parents:
diff changeset
915 bool _is_complete;
a61af66fc99e Initial load
duke
parents:
diff changeset
916
a61af66fc99e Initial load
duke
parents:
diff changeset
917 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
918 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
919 Control = TypeFunc::Control,
a61af66fc99e Initial load
duke
parents:
diff changeset
920 Memory = TypeFunc::Memory, // MergeMem for states affected by this op
a61af66fc99e Initial load
duke
parents:
diff changeset
921 RawAddress = TypeFunc::Parms+0, // the newly-allocated raw address
a61af66fc99e Initial load
duke
parents:
diff changeset
922 RawStores = TypeFunc::Parms+1 // zero or more stores (or TOP)
a61af66fc99e Initial load
duke
parents:
diff changeset
923 };
a61af66fc99e Initial load
duke
parents:
diff changeset
924
a61af66fc99e Initial load
duke
parents:
diff changeset
925 InitializeNode(Compile* C, int adr_type, Node* rawoop);
a61af66fc99e Initial load
duke
parents:
diff changeset
926 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
927 virtual uint size_of() const { return sizeof(*this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
928 virtual uint ideal_reg() const { return 0; } // not matched in the AD file
a61af66fc99e Initial load
duke
parents:
diff changeset
929 virtual const RegMask &in_RegMask(uint) const; // mask for RawAddress
a61af66fc99e Initial load
duke
parents:
diff changeset
930
a61af66fc99e Initial load
duke
parents:
diff changeset
931 // Manage incoming memory edges via a MergeMem on in(Memory):
a61af66fc99e Initial load
duke
parents:
diff changeset
932 Node* memory(uint alias_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
933
a61af66fc99e Initial load
duke
parents:
diff changeset
934 // The raw memory edge coming directly from the Allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
935 // The contents of this memory are *always* all-zero-bits.
a61af66fc99e Initial load
duke
parents:
diff changeset
936 Node* zero_memory() { return memory(Compile::AliasIdxRaw); }
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938 // Return the corresponding allocation for this initialization (or null if none).
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // (Note: Both InitializeNode::allocation and AllocateNode::initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
940 // are defined in graphKit.cpp, which sets up the bidirectional relation.)
a61af66fc99e Initial load
duke
parents:
diff changeset
941 AllocateNode* allocation();
a61af66fc99e Initial load
duke
parents:
diff changeset
942
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // Anything other than zeroing in this init?
a61af66fc99e Initial load
duke
parents:
diff changeset
944 bool is_non_zero();
a61af66fc99e Initial load
duke
parents:
diff changeset
945
a61af66fc99e Initial load
duke
parents:
diff changeset
946 // An InitializeNode must completed before macro expansion is done.
a61af66fc99e Initial load
duke
parents:
diff changeset
947 // Completion requires that the AllocateNode must be followed by
a61af66fc99e Initial load
duke
parents:
diff changeset
948 // initialization of the new memory to zero, then to any initializers.
a61af66fc99e Initial load
duke
parents:
diff changeset
949 bool is_complete() { return _is_complete; }
a61af66fc99e Initial load
duke
parents:
diff changeset
950
a61af66fc99e Initial load
duke
parents:
diff changeset
951 // Mark complete. (Must not yet be complete.)
a61af66fc99e Initial load
duke
parents:
diff changeset
952 void set_complete(PhaseGVN* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
953
a61af66fc99e Initial load
duke
parents:
diff changeset
954 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
955 // ensure all non-degenerate stores are ordered and non-overlapping
a61af66fc99e Initial load
duke
parents:
diff changeset
956 bool stores_are_sane(PhaseTransform* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
957 #endif //ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
958
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // See if this store can be captured; return offset where it initializes.
a61af66fc99e Initial load
duke
parents:
diff changeset
960 // Return 0 if the store cannot be moved (any sort of problem).
a61af66fc99e Initial load
duke
parents:
diff changeset
961 intptr_t can_capture_store(StoreNode* st, PhaseTransform* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
962
a61af66fc99e Initial load
duke
parents:
diff changeset
963 // Capture another store; reformat it to write my internal raw memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
964 // Return the captured copy, else NULL if there is some sort of problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
965 Node* capture_store(StoreNode* st, intptr_t start, PhaseTransform* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // Find captured store which corresponds to the range [start..start+size).
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // Return my own memory projection (meaning the initial zero bits)
a61af66fc99e Initial load
duke
parents:
diff changeset
969 // if there is no such store. Return NULL if there is a problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
970 Node* find_captured_store(intptr_t start, int size_in_bytes, PhaseTransform* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
971
a61af66fc99e Initial load
duke
parents:
diff changeset
972 // Called when the associated AllocateNode is expanded into CFG.
a61af66fc99e Initial load
duke
parents:
diff changeset
973 Node* complete_stores(Node* rawctl, Node* rawmem, Node* rawptr,
a61af66fc99e Initial load
duke
parents:
diff changeset
974 intptr_t header_size, Node* size_in_bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
975 PhaseGVN* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
976
a61af66fc99e Initial load
duke
parents:
diff changeset
977 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
978 void remove_extra_zeroes();
a61af66fc99e Initial load
duke
parents:
diff changeset
979
a61af66fc99e Initial load
duke
parents:
diff changeset
980 // Find out where a captured store should be placed (or already is placed).
a61af66fc99e Initial load
duke
parents:
diff changeset
981 int captured_store_insertion_point(intptr_t start, int size_in_bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
982 PhaseTransform* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 static intptr_t get_store_offset(Node* st, PhaseTransform* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
985
a61af66fc99e Initial load
duke
parents:
diff changeset
986 Node* make_raw_address(intptr_t offset, PhaseTransform* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
987
a61af66fc99e Initial load
duke
parents:
diff changeset
988 bool detect_init_independence(Node* n, bool st_is_pinned, int& count);
a61af66fc99e Initial load
duke
parents:
diff changeset
989
a61af66fc99e Initial load
duke
parents:
diff changeset
990 void coalesce_subword_stores(intptr_t header_size, Node* size_in_bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
991 PhaseGVN* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
992
a61af66fc99e Initial load
duke
parents:
diff changeset
993 intptr_t find_next_fullword_store(uint i, PhaseGVN* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
994 };
a61af66fc99e Initial load
duke
parents:
diff changeset
995
a61af66fc99e Initial load
duke
parents:
diff changeset
996 //------------------------------MergeMem---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
997 // (See comment in memnode.cpp near MergeMemNode::MergeMemNode for semantics.)
a61af66fc99e Initial load
duke
parents:
diff changeset
998 class MergeMemNode: public Node {
a61af66fc99e Initial load
duke
parents:
diff changeset
999 virtual uint hash() const ; // { return NO_HASH; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 virtual uint cmp( const Node &n ) const ; // Always fail, except on self
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 friend class MergeMemStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 MergeMemNode(Node* def); // clients use MergeMemNode::make
a61af66fc99e Initial load
duke
parents:
diff changeset
1003
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 // If the input is a whole memory state, clone it with all its slices intact.
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 // Otherwise, make a new memory state with just that base memory input.
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 // In either case, the result is a newly created MergeMem.
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 static MergeMemNode* make(Compile* C, Node* base_memory);
a61af66fc99e Initial load
duke
parents:
diff changeset
1009
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 virtual Node *Identity( PhaseTransform *phase );
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 virtual uint ideal_reg() const { return NotAMachineReg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 virtual uint match_edge(uint idx) const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 virtual const RegMask &out_RegMask() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 virtual const Type *bottom_type() const { return Type::MEMORY; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 virtual const TypePtr *adr_type() const { return TypePtr::BOTTOM; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 // sparse accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 // Fetch the previously stored "set_memory_at", or else the base memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 // (Caller should clone it if it is a phi-nest.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 Node* memory_at(uint alias_idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 // set the memory, regardless of its previous value
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 void set_memory_at(uint alias_idx, Node* n);
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 // the "base" is the memory that provides the non-finite support
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 Node* base_memory() const { return in(Compile::AliasIdxBot); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 // warning: setting the base can implicitly set any of the other slices too
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 void set_base_memory(Node* def);
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // sentinel value which denotes a copy of the base memory:
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 Node* empty_memory() const { return in(Compile::AliasIdxTop); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 static Node* make_empty_memory(); // where the sentinel comes from
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 bool is_empty_memory(Node* n) const { assert((n == empty_memory()) == n->is_top(), "sanity"); return n->is_top(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 // hook for the iterator, to perform any necessary setup
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 void iteration_setup(const MergeMemNode* other = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 // push sentinels until I am at least as long as the other (semantic no-op)
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 void grow_to_match(const MergeMemNode* other);
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 bool verify_sparse() const PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 class MergeMemStream : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 MergeMemNode* _mm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 const MergeMemNode* _mm2; // optional second guy, contributes non-empty iterations
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 Node* _mm_base; // loop-invariant base memory of _mm
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 int _idx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 int _cnt;
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 Node* _mem;
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 Node* _mem2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 int _cnt2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1052
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 void init(MergeMemNode* mm, const MergeMemNode* mm2 = NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 // subsume_node will break sparseness at times, whenever a memory slice
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // folds down to a copy of the base ("fat") memory. In such a case,
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 // the raw edge will update to base, although it should be top.
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 // This iterator will recognize either top or base_memory as an
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 // "empty" slice. See is_empty, is_empty2, and next below.
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 // The sparseness property is repaired in MergeMemNode::Ideal.
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 // As long as access to a MergeMem goes through this iterator
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 // or the memory_at accessor, flaws in the sparseness will
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 // never be observed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // Also, iteration_setup repairs sparseness.
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 assert(mm->verify_sparse(), "please, no dups of base");
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 assert(mm2==NULL || mm2->verify_sparse(), "please, no dups of base");
a61af66fc99e Initial load
duke
parents:
diff changeset
1068
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 _mm = mm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 _mm_base = mm->base_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 _mm2 = mm2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 _cnt = mm->req();
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 _idx = Compile::AliasIdxBot-1; // start at the base memory
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 _mem = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 _mem2 = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1077
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 Node* check_memory() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 if (at_base_memory())
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 return _mm->base_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 else if ((uint)_idx < _mm->req() && !_mm->in(_idx)->is_top())
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 return _mm->memory_at(_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 return _mm_base;
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 Node* check_memory2() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 return at_base_memory()? _mm2->base_memory(): _mm2->memory_at(_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1091
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 static bool match_memory(Node* mem, const MergeMemNode* mm, int idx) PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 void assert_synch() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 assert(!_mem || _idx >= _cnt || match_memory(_mem, _mm, _idx),
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 "no side-effects except through the stream");
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1097
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1099
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 // expected usages:
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 // for (MergeMemStream mms(mem->is_MergeMem()); next_non_empty(); ) { ... }
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 // for (MergeMemStream mms(mem1, mem2); next_non_empty2(); ) { ... }
a61af66fc99e Initial load
duke
parents:
diff changeset
1103
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 // iterate over one merge
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 MergeMemStream(MergeMemNode* mm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 mm->iteration_setup();
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 init(mm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 debug_only(_cnt2 = 999);
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 // iterate in parallel over two merges
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 // only iterates through non-empty elements of mm2
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 MergeMemStream(MergeMemNode* mm, const MergeMemNode* mm2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 assert(mm2, "second argument must be a MergeMem also");
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 ((MergeMemNode*)mm2)->iteration_setup(); // update hidden state
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 mm->iteration_setup(mm2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 init(mm, mm2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 _cnt2 = mm2->req();
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 ~MergeMemStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 assert_synch();
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1124
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 MergeMemNode* all_memory() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 return _mm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 Node* base_memory() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 assert(_mm_base == _mm->base_memory(), "no update to base memory, please");
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 return _mm_base;
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 const MergeMemNode* all_memory2() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 assert(_mm2 != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 return _mm2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 bool at_base_memory() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 return _idx == Compile::AliasIdxBot;
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 int alias_idx() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 assert(_mem, "must call next 1st");
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 return _idx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1143
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 const TypePtr* adr_type() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 return Compile::current()->get_adr_type(alias_idx());
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1147
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 const TypePtr* adr_type(Compile* C) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 return C->get_adr_type(alias_idx());
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 bool is_empty() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 assert(_mem, "must call next 1st");
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 assert(_mem->is_top() == (_mem==_mm->empty_memory()), "correct sentinel");
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 return _mem->is_top();
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 bool is_empty2() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 assert(_mem2, "must call next 1st");
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 assert(_mem2->is_top() == (_mem2==_mm2->empty_memory()), "correct sentinel");
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 return _mem2->is_top();
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 Node* memory() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 assert(!is_empty(), "must not be empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 assert_synch();
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 return _mem;
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 // get the current memory, regardless of empty or non-empty status
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 Node* force_memory() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 assert(!is_empty() || !at_base_memory(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 // Use _mm_base to defend against updates to _mem->base_memory().
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 Node *mem = _mem->is_top() ? _mm_base : _mem;
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 assert(mem == check_memory(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 return mem;
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 Node* memory2() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 assert(_mem2 == check_memory2(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 return _mem2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 void set_memory(Node* mem) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 if (at_base_memory()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // Note that this does not change the invariant _mm_base.
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 _mm->set_base_memory(mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 _mm->set_memory_at(_idx, mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 _mem = mem;
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 assert_synch();
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1188
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 // Recover from a side effect to the MergeMemNode.
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 void set_memory() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 _mem = _mm->in(_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1193
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 bool next() { return next(false); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 bool next2() { return next(true); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1196
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 bool next_non_empty() { return next_non_empty(false); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 bool next_non_empty2() { return next_non_empty(true); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 // next_non_empty2 can yield states where is_empty() is true
a61af66fc99e Initial load
duke
parents:
diff changeset
1200
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // find the next item, which might be empty
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 bool next(bool have_mm2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 assert((_mm2 != NULL) == have_mm2, "use other next");
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 assert_synch();
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 if (++_idx < _cnt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 // Note: This iterator allows _mm to be non-sparse.
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 // It behaves the same whether _mem is top or base_memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 _mem = _mm->in(_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 if (have_mm2)
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 _mem2 = _mm2->in((_idx < _cnt2) ? _idx : Compile::AliasIdxTop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1216
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 // find the next non-empty item
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 bool next_non_empty(bool have_mm2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 while (next(have_mm2)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 if (!is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 // make sure _mem2 is filled in sensibly
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 if (have_mm2 && _mem2->is_top()) _mem2 = _mm2->base_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 } else if (have_mm2 && !is_empty2()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 return true; // is_empty() == true
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1231
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 //------------------------------Prefetch---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1233
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 // Non-faulting prefetch load. Prefetch for many reads.
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 class PrefetchReadNode : public Node {
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 PrefetchReadNode(Node *abio, Node *adr) : Node(0,abio,adr) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 virtual uint ideal_reg() const { return NotAMachineReg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 virtual uint match_edge(uint idx) const { return idx==2; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 virtual const Type *bottom_type() const { return Type::ABIO; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1243
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // Non-faulting prefetch load. Prefetch for many reads & many writes.
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 class PrefetchWriteNode : public Node {
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 PrefetchWriteNode(Node *abio, Node *adr) : Node(0,abio,adr) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 virtual uint ideal_reg() const { return NotAMachineReg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 virtual uint match_edge(uint idx) const { return idx==2; }
1367
9e321dcfa5b7 6940726: Use BIS instruction for allocation prefetch on Sparc
kvn
parents: 1198
diff changeset
1251 virtual const Type *bottom_type() const { return ( AllocatePrefetchStyle == 3 ) ? Type::MEMORY : Type::ABIO; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 };