Mercurial > hg > truffle
comparison src/share/vm/opto/compile.cpp @ 13046:613e6a6fc328
Merge
author | iveresov |
---|---|
date | Tue, 05 Nov 2013 02:29:41 -0800 |
parents | e428d5e768e3 94a83e0f9ce1 |
children | 183bd5c00828 da862781b584 |
comparison
equal
deleted
inserted
replaced
13043:e428d5e768e3 | 13046:613e6a6fc328 |
---|---|
846 xtty->tail("ideal"); | 846 xtty->tail("ideal"); |
847 } | 847 } |
848 } | 848 } |
849 #endif | 849 #endif |
850 | 850 |
851 NOT_PRODUCT( verify_barriers(); ) | |
851 // Now that we know the size of all the monitors we can add a fixed slot | 852 // Now that we know the size of all the monitors we can add a fixed slot |
852 // for the original deopt pc. | 853 // for the original deopt pc. |
853 | 854 |
854 _orig_pc_slot = fixed_slots(); | 855 _orig_pc_slot = fixed_slots(); |
855 int next_slot = _orig_pc_slot + (sizeof(address) / VMRegImpl::stack_slot_size); | 856 int next_slot = _orig_pc_slot + (sizeof(address) / VMRegImpl::stack_slot_size); |
3371 } | 3372 } |
3372 assert(dead_nodes == 0, "using nodes must be reachable from root"); | 3373 assert(dead_nodes == 0, "using nodes must be reachable from root"); |
3373 } | 3374 } |
3374 } | 3375 } |
3375 } | 3376 } |
3377 | |
3378 // Verify GC barriers consistency | |
3379 // Currently supported: | |
3380 // - G1 pre-barriers (see GraphKit::g1_write_barrier_pre()) | |
3381 void Compile::verify_barriers() { | |
3382 if (UseG1GC) { | |
3383 // Verify G1 pre-barriers | |
3384 const int marking_offset = in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_active()); | |
3385 | |
3386 ResourceArea *area = Thread::current()->resource_area(); | |
3387 Unique_Node_List visited(area); | |
3388 Node_List worklist(area); | |
3389 // We're going to walk control flow backwards starting from the Root | |
3390 worklist.push(_root); | |
3391 while (worklist.size() > 0) { | |
3392 Node* x = worklist.pop(); | |
3393 if (x == NULL || x == top()) continue; | |
3394 if (visited.member(x)) { | |
3395 continue; | |
3396 } else { | |
3397 visited.push(x); | |
3398 } | |
3399 | |
3400 if (x->is_Region()) { | |
3401 for (uint i = 1; i < x->req(); i++) { | |
3402 worklist.push(x->in(i)); | |
3403 } | |
3404 } else { | |
3405 worklist.push(x->in(0)); | |
3406 // We are looking for the pattern: | |
3407 // /->ThreadLocal | |
3408 // If->Bool->CmpI->LoadB->AddP->ConL(marking_offset) | |
3409 // \->ConI(0) | |
3410 // We want to verify that the If and the LoadB have the same control | |
3411 // See GraphKit::g1_write_barrier_pre() | |
3412 if (x->is_If()) { | |
3413 IfNode *iff = x->as_If(); | |
3414 if (iff->in(1)->is_Bool() && iff->in(1)->in(1)->is_Cmp()) { | |
3415 CmpNode *cmp = iff->in(1)->in(1)->as_Cmp(); | |
3416 if (cmp->Opcode() == Op_CmpI && cmp->in(2)->is_Con() && cmp->in(2)->bottom_type()->is_int()->get_con() == 0 | |
3417 && cmp->in(1)->is_Load()) { | |
3418 LoadNode* load = cmp->in(1)->as_Load(); | |
3419 if (load->Opcode() == Op_LoadB && load->in(2)->is_AddP() && load->in(2)->in(2)->Opcode() == Op_ThreadLocal | |
3420 && load->in(2)->in(3)->is_Con() | |
3421 && load->in(2)->in(3)->bottom_type()->is_intptr_t()->get_con() == marking_offset) { | |
3422 | |
3423 Node* if_ctrl = iff->in(0); | |
3424 Node* load_ctrl = load->in(0); | |
3425 | |
3426 if (if_ctrl != load_ctrl) { | |
3427 // Skip possible CProj->NeverBranch in infinite loops | |
3428 if ((if_ctrl->is_Proj() && if_ctrl->Opcode() == Op_CProj) | |
3429 && (if_ctrl->in(0)->is_MultiBranch() && if_ctrl->in(0)->Opcode() == Op_NeverBranch)) { | |
3430 if_ctrl = if_ctrl->in(0)->in(0); | |
3431 } | |
3432 } | |
3433 assert(load_ctrl != NULL && if_ctrl == load_ctrl, "controls must match"); | |
3434 } | |
3435 } | |
3436 } | |
3437 } | |
3438 } | |
3439 } | |
3440 } | |
3441 } | |
3442 | |
3376 #endif | 3443 #endif |
3377 | 3444 |
3378 // The Compile object keeps track of failure reasons separately from the ciEnv. | 3445 // The Compile object keeps track of failure reasons separately from the ciEnv. |
3379 // This is required because there is not quite a 1-1 relation between the | 3446 // This is required because there is not quite a 1-1 relation between the |
3380 // ciEnv and its compilation task and the Compile object. Note that one | 3447 // ciEnv and its compilation task and the Compile object. Note that one |