Mercurial > hg > truffle
comparison src/share/vm/opto/parse3.cpp @ 7194:beebba0acc11
7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
Reviewed-by: kvn, jrose
author | twisti |
---|---|
date | Mon, 26 Nov 2012 17:25:11 -0800 |
parents | b9a9ed0f8eeb |
children | 2d6c433b1f38 |
comparison
equal
deleted
inserted
replaced
7193:ee32440febeb | 7194:beebba0acc11 |
---|---|
114 | 114 |
115 // Generate code for the object pointer. | 115 // Generate code for the object pointer. |
116 Node* obj; | 116 Node* obj; |
117 if (is_field) { | 117 if (is_field) { |
118 int obj_depth = is_get ? 0 : field->type()->size(); | 118 int obj_depth = is_get ? 0 : field->type()->size(); |
119 obj = do_null_check(peek(obj_depth), T_OBJECT); | 119 obj = null_check(peek(obj_depth)); |
120 // Compile-time detect of null-exception? | 120 // Compile-time detect of null-exception? |
121 if (stopped()) return; | 121 if (stopped()) return; |
122 | 122 |
123 #ifdef ASSERT | 123 #ifdef ASSERT |
124 const TypeInstPtr *tjp = TypeInstPtr::make(TypePtr::NotNull, iter().get_declared_field_holder()); | 124 const TypeInstPtr *tjp = TypeInstPtr::make(TypePtr::NotNull, iter().get_declared_field_holder()); |
125 assert(_gvn.type(obj)->higher_equal(tjp), "cast_up is no longer needed"); | 125 assert(_gvn.type(obj)->higher_equal(tjp), "cast_up is no longer needed"); |
126 #endif | 126 #endif |
127 | 127 |
128 if (is_get) { | 128 if (is_get) { |
129 --_sp; // pop receiver before getting | 129 (void) pop(); // pop receiver before getting |
130 do_get_xxx(obj, field, is_field); | 130 do_get_xxx(obj, field, is_field); |
131 } else { | 131 } else { |
132 do_put_xxx(obj, field, is_field); | 132 do_put_xxx(obj, field, is_field); |
133 --_sp; // pop receiver after putting | 133 (void) pop(); // pop receiver after putting |
134 } | 134 } |
135 } else { | 135 } else { |
136 const TypeInstPtr* tip = TypeInstPtr::make(field_holder->java_mirror()); | 136 const TypeInstPtr* tip = TypeInstPtr::make(field_holder->java_mirror()); |
137 obj = _gvn.makecon(tip); | 137 obj = _gvn.makecon(tip); |
138 if (is_get) { | 138 if (is_get) { |
228 C->log()->elem("assert_null reason='field' klass='%d'", | 228 C->log()->elem("assert_null reason='field' klass='%d'", |
229 C->log()->identify(field->type())); | 229 C->log()->identify(field->type())); |
230 } | 230 } |
231 // If there is going to be a trap, put it at the next bytecode: | 231 // If there is going to be a trap, put it at the next bytecode: |
232 set_bci(iter().next_bci()); | 232 set_bci(iter().next_bci()); |
233 do_null_assert(peek(), T_OBJECT); | 233 null_assert(peek()); |
234 set_bci(iter().cur_bci()); // put it back | 234 set_bci(iter().cur_bci()); // put it back |
235 } | 235 } |
236 | 236 |
237 // If reference is volatile, prevent following memory ops from | 237 // If reference is volatile, prevent following memory ops from |
238 // floating up past the volatile read. Also prevents commoning | 238 // floating up past the volatile read. Also prevents commoning |
461 // to reexecute the multianewarray bytecode if deoptimization happens. | 461 // to reexecute the multianewarray bytecode if deoptimization happens. |
462 // Do it unconditionally even for one dimension multianewarray. | 462 // Do it unconditionally even for one dimension multianewarray. |
463 // Note: the reexecute bit will be set in GraphKit::add_safepoint_edges() | 463 // Note: the reexecute bit will be set in GraphKit::add_safepoint_edges() |
464 // when AllocateArray node for newarray is created. | 464 // when AllocateArray node for newarray is created. |
465 { PreserveReexecuteState preexecs(this); | 465 { PreserveReexecuteState preexecs(this); |
466 _sp += ndimensions; | 466 inc_sp(ndimensions); |
467 // Pass 0 as nargs since uncommon trap code does not need to restore stack. | 467 // Pass 0 as nargs since uncommon trap code does not need to restore stack. |
468 obj = expand_multianewarray(array_klass, &length[0], ndimensions, 0); | 468 obj = expand_multianewarray(array_klass, &length[0], ndimensions, 0); |
469 } //original reexecute and sp are set back here | 469 } //original reexecute and sp are set back here |
470 push(obj); | 470 push(obj); |
471 return; | 471 return; |
490 length[3], length[4]); | 490 length[3], length[4]); |
491 } else { | 491 } else { |
492 // Create a java array for dimension sizes | 492 // Create a java array for dimension sizes |
493 Node* dims = NULL; | 493 Node* dims = NULL; |
494 { PreserveReexecuteState preexecs(this); | 494 { PreserveReexecuteState preexecs(this); |
495 _sp += ndimensions; | 495 inc_sp(ndimensions); |
496 Node* dims_array_klass = makecon(TypeKlassPtr::make(ciArrayKlass::make(ciType::make(T_INT)))); | 496 Node* dims_array_klass = makecon(TypeKlassPtr::make(ciArrayKlass::make(ciType::make(T_INT)))); |
497 dims = new_array(dims_array_klass, intcon(ndimensions), 0); | 497 dims = new_array(dims_array_klass, intcon(ndimensions), 0); |
498 | 498 |
499 // Fill-in it with values | 499 // Fill-in it with values |
500 for (j = 0; j < ndimensions; j++) { | 500 for (j = 0; j < ndimensions; j++) { |