< prev index next >
src/hotspot/share/gc/g1/c2/g1BarrierSetC2.cpp
Print this page
rev 52560 : 8213615: GC/C2 abstraction for escape analysis
*** 29,38 ****
--- 29,39 ----
#include "gc/g1/g1CardTable.hpp"
#include "gc/g1/g1ThreadLocalData.hpp"
#include "gc/g1/heapRegion.hpp"
#include "opto/arraycopynode.hpp"
#include "opto/compile.hpp"
+ #include "opto/escape.hpp"
#include "opto/graphKit.hpp"
#include "opto/idealKit.hpp"
#include "opto/macro.hpp"
#include "opto/rootnode.hpp"
#include "opto/type.hpp"
*** 838,842 ****
--- 839,872 ----
}
}
}
}
#endif
+
+ bool G1BarrierSetC2::escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const {
+ if (opcode == Op_StoreP) {
+ Node* adr = n->in(MemNode::Address);
+ const Type* adr_type = gvn->type(adr);
+ // Pointer stores in G1 barriers looks like unsafe access.
+ // Ignore such stores to be able scalar replace non-escaping
+ // allocations.
+ if (adr_type->isa_rawptr() && adr->is_AddP()) {
+ Node* base = conn_graph->get_addp_base(adr);
+ if (base->Opcode() == Op_LoadP &&
+ base->in(MemNode::Address)->is_AddP()) {
+ adr = base->in(MemNode::Address);
+ Node* tls = conn_graph->get_addp_base(adr);
+ if (tls->Opcode() == Op_ThreadLocal) {
+ int offs = (int) gvn->find_intptr_t_con(adr->in(AddPNode::Offset), Type::OffsetBot);
+ const int buf_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset());
+ if (offs == buf_offset) {
+ return true; // G1 pre barrier previous oop value store.
+ }
+ if (offs == in_bytes(G1ThreadLocalData::dirty_card_queue_buffer_offset())) {
+ return true; // G1 post barrier card address store.
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
< prev index next >