mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-09 18:08:31 +00:00
8065618: C2 RA incorrectly removes kill projections
Don't remove KILL projections if their "defining" nodes have SCMemProj projection (memory side effects). Reviewed-by: iveresov
This commit is contained in:
parent
585ca822b8
commit
f36e847523
@ -527,6 +527,22 @@ bool PhaseChaitin::remove_node_if_not_used(Block* b, uint location, Node* n, uin
|
||||
Node* def = n->in(0);
|
||||
if (!n->is_Proj() ||
|
||||
(_lrg_map.live_range_id(def) && !liveout->member(_lrg_map.live_range_id(def)))) {
|
||||
if (n->is_MachProj()) {
|
||||
// Don't remove KILL projections if their "defining" nodes have
|
||||
// memory effects (have SCMemProj projection node) -
|
||||
// they are not dead even when their result is not used.
|
||||
// For example, compareAndSwapL (and other CAS) and EncodeISOArray nodes.
|
||||
// The method add_input_to_liveout() keeps such nodes alive (put them on liveout list)
|
||||
// when it sees SCMemProj node in a block. Unfortunately SCMemProj node could be placed
|
||||
// in block in such order that KILL MachProj nodes are processed first.
|
||||
uint cnt = def->outcnt();
|
||||
for (uint i = 0; i < cnt; i++) {
|
||||
Node* proj = def->raw_out(i);
|
||||
if (proj->Opcode() == Op_SCMemProj) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
b->remove_node(location);
|
||||
LRG& lrg = lrgs(lid);
|
||||
if (lrg._def == n) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user