Mercurial > hg > truffle
comparison src/share/vm/opto/memnode.hpp @ 13045:94a83e0f9ce1
8017065: C2 allows safepoint checks to leak into G1 pre-barriers
Summary: Make all raw loads strictly respect control dependencies, make sure RCE doesn't move raw loads, add verification of G1 pre-barriers.
Reviewed-by: kvn, roland
author | iveresov |
---|---|
date | Tue, 05 Nov 2013 01:57:18 -0800 |
parents | 6f3fd5150b67 |
children | de6a9e811145 da862781b584 |
comparison
equal
deleted
inserted
replaced
13044:a905d33ce13a | 13045:94a83e0f9ce1 |
---|---|
202 static bool is_immutable_value(Node* adr); | 202 static bool is_immutable_value(Node* adr); |
203 #endif | 203 #endif |
204 protected: | 204 protected: |
205 const Type* load_array_final_field(const TypeKlassPtr *tkls, | 205 const Type* load_array_final_field(const TypeKlassPtr *tkls, |
206 ciKlass* klass) const; | 206 ciKlass* klass) const; |
207 // depends_only_on_test is almost always true, and needs to be almost always | |
208 // true to enable key hoisting & commoning optimizations. However, for the | |
209 // special case of RawPtr loads from TLS top & end, and other loads performed by | |
210 // GC barriers, the control edge carries the dependence preventing hoisting past | |
211 // a Safepoint instead of the memory edge. (An unfortunate consequence of having | |
212 // Safepoints not set Raw Memory; itself an unfortunate consequence of having Nodes | |
213 // which produce results (new raw memory state) inside of loops preventing all | |
214 // manner of other optimizations). Basically, it's ugly but so is the alternative. | |
215 // See comment in macro.cpp, around line 125 expand_allocate_common(). | |
216 virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM; } | |
217 | |
207 }; | 218 }; |
208 | 219 |
209 //------------------------------LoadBNode-------------------------------------- | 220 //------------------------------LoadBNode-------------------------------------- |
210 // Load a byte (8bits signed) from memory | 221 // Load a byte (8bits signed) from memory |
211 class LoadBNode : public LoadNode { | 222 class LoadBNode : public LoadNode { |
368 : LoadNode(c,mem,adr,at,t) {} | 379 : LoadNode(c,mem,adr,at,t) {} |
369 virtual int Opcode() const; | 380 virtual int Opcode() const; |
370 virtual uint ideal_reg() const { return Op_RegP; } | 381 virtual uint ideal_reg() const { return Op_RegP; } |
371 virtual int store_Opcode() const { return Op_StoreP; } | 382 virtual int store_Opcode() const { return Op_StoreP; } |
372 virtual BasicType memory_type() const { return T_ADDRESS; } | 383 virtual BasicType memory_type() const { return T_ADDRESS; } |
373 // depends_only_on_test is almost always true, and needs to be almost always | |
374 // true to enable key hoisting & commoning optimizations. However, for the | |
375 // special case of RawPtr loads from TLS top & end, the control edge carries | |
376 // the dependence preventing hoisting past a Safepoint instead of the memory | |
377 // edge. (An unfortunate consequence of having Safepoints not set Raw | |
378 // Memory; itself an unfortunate consequence of having Nodes which produce | |
379 // results (new raw memory state) inside of loops preventing all manner of | |
380 // other optimizations). Basically, it's ugly but so is the alternative. | |
381 // See comment in macro.cpp, around line 125 expand_allocate_common(). | |
382 virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM; } | |
383 }; | 384 }; |
384 | 385 |
385 | 386 |
386 //------------------------------LoadNNode-------------------------------------- | 387 //------------------------------LoadNNode-------------------------------------- |
387 // Load a narrow oop from memory (either object or array) | 388 // Load a narrow oop from memory (either object or array) |
391 : LoadNode(c,mem,adr,at,t) {} | 392 : LoadNode(c,mem,adr,at,t) {} |
392 virtual int Opcode() const; | 393 virtual int Opcode() const; |
393 virtual uint ideal_reg() const { return Op_RegN; } | 394 virtual uint ideal_reg() const { return Op_RegN; } |
394 virtual int store_Opcode() const { return Op_StoreN; } | 395 virtual int store_Opcode() const { return Op_StoreN; } |
395 virtual BasicType memory_type() const { return T_NARROWOOP; } | 396 virtual BasicType memory_type() const { return T_NARROWOOP; } |
396 // depends_only_on_test is almost always true, and needs to be almost always | |
397 // true to enable key hoisting & commoning optimizations. However, for the | |
398 // special case of RawPtr loads from TLS top & end, the control edge carries | |
399 // the dependence preventing hoisting past a Safepoint instead of the memory | |
400 // edge. (An unfortunate consequence of having Safepoints not set Raw | |
401 // Memory; itself an unfortunate consequence of having Nodes which produce | |
402 // results (new raw memory state) inside of loops preventing all manner of | |
403 // other optimizations). Basically, it's ugly but so is the alternative. | |
404 // See comment in macro.cpp, around line 125 expand_allocate_common(). | |
405 virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM; } | |
406 }; | 397 }; |
407 | 398 |
408 //------------------------------LoadKlassNode---------------------------------- | 399 //------------------------------LoadKlassNode---------------------------------- |
409 // Load a Klass from an object | 400 // Load a Klass from an object |
410 class LoadKlassNode : public LoadPNode { | 401 class LoadKlassNode : public LoadPNode { |