8029446: assert(_cfg.get_block_for_node(proj) == borig) failed: incorrect block for kill projections

Wed, 08 Jan 2014 12:05:19 +0100

author
adlertz
date
Wed, 08 Jan 2014 12:05:19 +0100
changeset 6216
df8573b1a44c
parent 6215
69dc1be43fce
child 6217
849eb7bfceac

8029446: assert(_cfg.get_block_for_node(proj) == borig) failed: incorrect block for kill projections
Summary: Added loadConP0 projection node to block in case of re-materialization of the loadConP0. x86_64 only.
Reviewed-by: kvn

src/share/vm/opto/chaitin.cpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/vm/opto/chaitin.cpp	Wed Jan 08 09:49:31 2014 +0100
     1.2 +++ b/src/share/vm/opto/chaitin.cpp	Wed Jan 08 12:05:19 2014 +0100
     1.3 @@ -1682,9 +1682,21 @@
     1.4        // (where top() node is placed).
     1.5        base->init_req(0, _cfg.get_root_node());
     1.6        Block *startb = _cfg.get_block_for_node(C->top());
     1.7 -      startb->insert_node(base, startb->find_node(C->top()));
     1.8 +      uint node_pos = startb->find_node(C->top());
     1.9 +      startb->insert_node(base, node_pos);
    1.10        _cfg.map_node_to_block(base, startb);
    1.11        assert(_lrg_map.live_range_id(base) == 0, "should not have LRG yet");
    1.12 +
    1.13 +      // The loadConP0 might have projection nodes depending on architecture
    1.14 +      // Add the projection nodes to the CFG
    1.15 +      for (DUIterator_Fast imax, i = base->fast_outs(imax); i < imax; i++) {
    1.16 +        Node* use = base->fast_out(i);
    1.17 +        if (use->is_MachProj()) {
    1.18 +          startb->insert_node(use, ++node_pos);
    1.19 +          _cfg.map_node_to_block(use, startb);
    1.20 +          new_lrg(use, maxlrg++);
    1.21 +        }
    1.22 +      }
    1.23      }
    1.24      if (_lrg_map.live_range_id(base) == 0) {
    1.25        new_lrg(base, maxlrg++);

mercurial