comparison src/share/vm/opto/loopTransform.cpp @ 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 60a32bb8ff99
children de6a9e811145 da862781b584
comparison
equal deleted inserted replaced
13044:a905d33ce13a 13045:94a83e0f9ce1
1962 assert(iff->is_If(), ""); 1962 assert(iff->is_If(), "");
1963 ProjNode* dp = ((IfNode*)iff)->proj_out(1-flip); 1963 ProjNode* dp = ((IfNode*)iff)->proj_out(1-flip);
1964 // Find loads off the surviving projection; remove their control edge 1964 // Find loads off the surviving projection; remove their control edge
1965 for (DUIterator_Fast imax, i = dp->fast_outs(imax); i < imax; i++) { 1965 for (DUIterator_Fast imax, i = dp->fast_outs(imax); i < imax; i++) {
1966 Node* cd = dp->fast_out(i); // Control-dependent node 1966 Node* cd = dp->fast_out(i); // Control-dependent node
1967 if( cd->is_Load() ) { // Loads can now float around in the loop 1967 if (cd->is_Load() && cd->depends_only_on_test()) { // Loads can now float around in the loop
1968 // Allow the load to float around in the loop, or before it 1968 // Allow the load to float around in the loop, or before it
1969 // but NOT before the pre-loop. 1969 // but NOT before the pre-loop.
1970 _igvn.replace_input_of(cd, 0, ctrl); // ctrl, not NULL 1970 _igvn.replace_input_of(cd, 0, ctrl); // ctrl, not NULL
1971 --i; 1971 --i;
1972 --imax; 1972 --imax;