1274 CallNode* call = ctrl->is_Proj() ? ctrl->in(0)->as_CallJava() : ctrl->as_CallJava(); |
1274 CallNode* call = ctrl->is_Proj() ? ctrl->in(0)->as_CallJava() : ctrl->as_CallJava(); |
1275 if (call->entry_point() == OptoRuntime::rethrow_stub()) { |
1275 if (call->entry_point() == OptoRuntime::rethrow_stub()) { |
1276 // The rethrow call may have too many projections to be |
1276 // The rethrow call may have too many projections to be |
1277 // properly handled here. Given there's no reason for a |
1277 // properly handled here. Given there's no reason for a |
1278 // barrier to depend on the call, move it above the call |
1278 // barrier to depend on the call, move it above the call |
1279 if (phase->get_ctrl(val) == ctrl) { |
1279 stack.push(lrb, 0); |
1280 assert(val->Opcode() == Op_DecodeN, "unexpected node"); |
1280 do { |
1281 assert(phase->is_dominator(phase->get_ctrl(val->in(1)), call->in(0)), "Load is too low"); |
1281 Node* n = stack.node(); |
1282 phase->set_ctrl(val, call->in(0)); |
1282 uint idx = stack.index(); |
1283 } |
1283 if (idx < n->req()) { |
1284 phase->set_ctrl(lrb, call->in(0)); |
1284 Node* in = n->in(idx); |
|
1285 stack.set_index(idx+1); |
|
1286 if (in != NULL) { |
|
1287 if (phase->has_ctrl(in)) { |
|
1288 if (phase->is_dominator(call, phase->get_ctrl(in))) { |
|
1289 #ifdef ASSERT |
|
1290 for (uint i = 0; i < stack.size(); i++) { |
|
1291 assert(stack.node_at(i) != in, "node shouldn't have been seen yet"); |
|
1292 } |
|
1293 #endif |
|
1294 stack.push(in, 0); |
|
1295 } |
|
1296 } else { |
|
1297 assert(phase->is_dominator(in, call->in(0)), "no dependency on the call"); |
|
1298 } |
|
1299 } |
|
1300 } else { |
|
1301 phase->set_ctrl(n, call->in(0)); |
|
1302 stack.pop(); |
|
1303 } |
|
1304 } while(stack.size() > 0); |
1285 continue; |
1305 continue; |
1286 } |
1306 } |
1287 CallProjections projs; |
1307 CallProjections projs; |
1288 call->extract_projections(&projs, false, false); |
1308 call->extract_projections(&projs, false, false); |
1289 |
1309 |