376 return st; |
376 return st; |
377 } |
377 } |
378 |
378 |
379 // Card mark store. Must be ordered so that it will come after the store of |
379 // Card mark store. Must be ordered so that it will come after the store of |
380 // the oop. |
380 // the oop. |
381 Node* IdealKit::storeCM(Node* ctl, Node* adr, Node *val, Node* oop_store, |
381 Node* IdealKit::storeCM(Node* ctl, Node* adr, Node *val, Node* oop_store, int oop_adr_idx, |
382 BasicType bt, |
382 BasicType bt, |
383 int adr_idx) { |
383 int adr_idx) { |
384 assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" ); |
384 assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" ); |
385 const TypePtr* adr_type = NULL; |
385 const TypePtr* adr_type = NULL; |
386 debug_only(adr_type = C->get_adr_type(adr_idx)); |
386 debug_only(adr_type = C->get_adr_type(adr_idx)); |
387 Node *mem = memory(adr_idx); |
387 Node *mem = memory(adr_idx); |
388 |
388 |
389 // Add required edge to oop_store, optimizer does not support precedence edges. |
389 // Add required edge to oop_store, optimizer does not support precedence edges. |
390 // Convert required edge to precedence edge before allocation. |
390 // Convert required edge to precedence edge before allocation. |
391 Node* st = new (C, 5) StoreCMNode(ctl, mem, adr, adr_type, val, oop_store); |
391 Node* st = new (C, 5) StoreCMNode(ctl, mem, adr, adr_type, val, oop_store, oop_adr_idx); |
392 |
392 |
393 st = transform(st); |
393 st = transform(st); |
394 set_memory(st, adr_idx); |
394 set_memory(st, adr_idx); |
395 |
395 |
396 return st; |
396 return st; |