equal
deleted
inserted
replaced
32 // soak up spots in the inputs even though we only use early Control |
32 // soak up spots in the inputs even though we only use early Control |
33 // and Memory slots. (So far.) |
33 // and Memory slots. (So far.) |
34 const uint IdealKit::first_var = TypeFunc::Parms + 1; |
34 const uint IdealKit::first_var = TypeFunc::Parms + 1; |
35 |
35 |
36 //----------------------------IdealKit----------------------------------------- |
36 //----------------------------IdealKit----------------------------------------- |
37 IdealKit::IdealKit(PhaseGVN &gvn, Node* control, Node* mem, bool delay_all_transforms) : |
37 IdealKit::IdealKit(PhaseGVN &gvn, Node* control, Node* mem, bool delay_all_transforms, bool has_declarations) : |
38 _gvn(gvn), C(gvn.C) { |
38 _gvn(gvn), C(gvn.C) { |
39 _initial_ctrl = control; |
39 _initial_ctrl = control; |
40 _initial_memory = mem; |
40 _initial_memory = mem; |
41 _delay_all_transforms = delay_all_transforms; |
41 _delay_all_transforms = delay_all_transforms; |
42 _var_ct = 0; |
42 _var_ct = 0; |
45 assert(mem == NULL || mem->Opcode() == Op_MergeMem, "memory must be pre-split"); |
45 assert(mem == NULL || mem->Opcode() == Op_MergeMem, "memory must be pre-split"); |
46 int init_size = 5; |
46 int init_size = 5; |
47 _pending_cvstates = new (C->node_arena()) GrowableArray<Node*>(C->node_arena(), init_size, 0, 0); |
47 _pending_cvstates = new (C->node_arena()) GrowableArray<Node*>(C->node_arena(), init_size, 0, 0); |
48 _delay_transform = new (C->node_arena()) GrowableArray<Node*>(C->node_arena(), init_size, 0, 0); |
48 _delay_transform = new (C->node_arena()) GrowableArray<Node*>(C->node_arena(), init_size, 0, 0); |
49 DEBUG_ONLY(_state = new (C->node_arena()) GrowableArray<int>(C->node_arena(), init_size, 0, 0)); |
49 DEBUG_ONLY(_state = new (C->node_arena()) GrowableArray<int>(C->node_arena(), init_size, 0, 0)); |
|
50 if (!has_declarations) { |
|
51 declarations_done(); |
|
52 } |
50 } |
53 } |
51 |
54 |
52 //-------------------------------if_then------------------------------------- |
55 //-------------------------------if_then------------------------------------- |
53 // Create: if(left relop right) |
56 // Create: if(left relop right) |
54 // / \ |
57 // / \ |
95 } |
98 } |
96 |
99 |
97 //-------------------------------end_if------------------------------------- |
100 //-------------------------------end_if------------------------------------- |
98 // Merge the "then" and "else" cvstates. |
101 // Merge the "then" and "else" cvstates. |
99 // |
102 // |
100 // The if_then() pushed the current state for later use |
103 // The if_then() pushed a copy of the current state for later use |
101 // as the initial state for a future "else" clause. The |
104 // as the initial state for a future "else" clause. The |
102 // current state then became the initial state for the |
105 // current state then became the initial state for the |
103 // then clause. If an "else" clause was encountered, it will |
106 // then clause. If an "else" clause was encountered, it will |
104 // pop the top state and use it for it's initial state. |
107 // pop the top state and use it for it's initial state. |
105 // It will also push the current state (the state at the end of |
108 // It will also push the current state (the state at the end of |
256 const BasicType bt = n->bottom_type()->basic_type(); |
259 const BasicType bt = n->bottom_type()->basic_type(); |
257 const Type* ct = Type::get_const_basic_type(bt); |
260 const Type* ct = Type::get_const_basic_type(bt); |
258 return delay_transform(PhiNode::make(reg, n, ct)); |
261 return delay_transform(PhiNode::make(reg, n, ct)); |
259 } |
262 } |
260 |
263 |
261 //-----------------------------declares_done----------------------------------- |
264 //-----------------------------declarations_done------------------------------- |
262 void IdealKit::declares_done() { |
265 void IdealKit::declarations_done() { |
263 _cvstate = new_cvstate(); // initialize current cvstate |
266 _cvstate = new_cvstate(); // initialize current cvstate |
264 set_ctrl(_initial_ctrl); // initialize control in current cvstate |
267 set_ctrl(_initial_ctrl); // initialize control in current cvstate |
265 set_all_memory(_initial_memory);// initialize memory in current cvstate |
268 set_all_memory(_initial_memory);// initialize memory in current cvstate |
266 DEBUG_ONLY(_state->push(BlockS)); |
269 DEBUG_ONLY(_state->push(BlockS)); |
267 } |
270 } |
275 } |
278 } |
276 } |
279 } |
277 |
280 |
278 //-----------------------------delay_transform----------------------------------- |
281 //-----------------------------delay_transform----------------------------------- |
279 Node* IdealKit::delay_transform(Node* n) { |
282 Node* IdealKit::delay_transform(Node* n) { |
280 gvn().set_type(n, n->bottom_type()); |
283 if (!gvn().is_IterGVN() || !gvn().is_IterGVN()->delay_transform()) { |
|
284 gvn().set_type(n, n->bottom_type()); |
|
285 } |
281 _delay_transform->push(n); |
286 _delay_transform->push(n); |
282 return n; |
287 return n; |
283 } |
288 } |
284 |
289 |
285 //-----------------------------new_cvstate----------------------------------- |
290 //-----------------------------new_cvstate----------------------------------- |
319 } |
324 } |
320 |
325 |
321 Node* IdealKit::memory(uint alias_idx) { |
326 Node* IdealKit::memory(uint alias_idx) { |
322 MergeMemNode* mem = merged_memory(); |
327 MergeMemNode* mem = merged_memory(); |
323 Node* p = mem->memory_at(alias_idx); |
328 Node* p = mem->memory_at(alias_idx); |
324 _gvn.set_type(p, Type::MEMORY); // must be mapped |
329 if (!gvn().is_IterGVN() || !gvn().is_IterGVN()->delay_transform()) { |
|
330 _gvn.set_type(p, Type::MEMORY); // must be mapped |
|
331 } |
325 return p; |
332 return p; |
326 } |
333 } |
327 |
334 |
328 void IdealKit::set_memory(Node* mem, uint alias_idx) { |
335 void IdealKit::set_memory(Node* mem, uint alias_idx) { |
329 merged_memory()->set_memory_at(alias_idx, mem); |
336 merged_memory()->set_memory_at(alias_idx, mem); |
460 |
467 |
461 // We only handle taking in RawMem and modifying RawMem |
468 // We only handle taking in RawMem and modifying RawMem |
462 const TypePtr* adr_type = TypeRawPtr::BOTTOM; |
469 const TypePtr* adr_type = TypeRawPtr::BOTTOM; |
463 uint adr_idx = C->get_alias_index(adr_type); |
470 uint adr_idx = C->get_alias_index(adr_type); |
464 |
471 |
465 // Clone initial memory |
|
466 MergeMemNode* cloned_mem = MergeMemNode::make(C, merged_memory()); |
|
467 |
|
468 // Slow-path leaf call |
472 // Slow-path leaf call |
469 int size = slow_call_type->domain()->cnt(); |
473 int size = slow_call_type->domain()->cnt(); |
470 CallNode *call = (CallNode*)new (C, size) CallLeafNode( slow_call_type, slow_call, leaf_name, adr_type); |
474 CallNode *call = (CallNode*)new (C, size) CallLeafNode( slow_call_type, slow_call, leaf_name, adr_type); |
471 |
475 |
472 // Set fixed predefined input arguments |
476 // Set fixed predefined input arguments |
487 |
491 |
488 // Slow leaf call has no side-effects, sets few values |
492 // Slow leaf call has no side-effects, sets few values |
489 |
493 |
490 set_ctrl(transform( new (C, 1) ProjNode(call,TypeFunc::Control) )); |
494 set_ctrl(transform( new (C, 1) ProjNode(call,TypeFunc::Control) )); |
491 |
495 |
492 // Set the incoming clone of memory as current memory |
|
493 set_all_memory(cloned_mem); |
|
494 |
|
495 // Make memory for the call |
496 // Make memory for the call |
496 Node* mem = _gvn.transform( new (C, 1) ProjNode(call, TypeFunc::Memory) ); |
497 Node* mem = _gvn.transform( new (C, 1) ProjNode(call, TypeFunc::Memory) ); |
497 |
498 |
498 // Set the RawPtr memory state only. |
499 // Set the RawPtr memory state only. |
499 set_memory(mem, adr_idx); |
500 set_memory(mem, adr_idx); |