comparison src/share/vm/opto/library_call.cpp @ 900:9987d9d5eb0e

6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot Summary: developed a reexecute logic for the interpreter to reexecute the bytecode when deopt happens Reviewed-by: kvn, never, jrose, twisti
author cfang
date Fri, 31 Jul 2009 17:12:33 -0700
parents 1cef5ec3ca56
children fc2281ddce3c
comparison
equal deleted inserted replaced
899:55cb84cd1247 900:9987d9d5eb0e
3220 uncommon_trap(Deoptimization::Reason_intrinsic, 3220 uncommon_trap(Deoptimization::Reason_intrinsic,
3221 Deoptimization::Action_maybe_recompile); 3221 Deoptimization::Action_maybe_recompile);
3222 } 3222 }
3223 3223
3224 if (!stopped()) { 3224 if (!stopped()) {
3225 // How many elements will we copy from the original? 3225 Node *newcopy;
3226 // The answer is MinI(orig_length - start, length). 3226 //set the original stack and the reexecute bit for the interpreter to reexecute
3227 Node* orig_tail = _gvn.transform( new(C, 3) SubINode(orig_length, start) ); 3227 //the bytecode that invokes Arrays.copyOf if deoptimization happens
3228 Node* moved = generate_min_max(vmIntrinsics::_min, orig_tail, length); 3228 { PreserveReexecuteState preexecs(this);
3229 3229 _sp += nargs;
3230 const bool raw_mem_only = true; 3230 jvms()->set_should_reexecute(true);
3231 Node* newcopy = new_array(klass_node, length, nargs, raw_mem_only); 3231
3232 3232 // How many elements will we copy from the original?
3233 // Generate a direct call to the right arraycopy function(s). 3233 // The answer is MinI(orig_length - start, length).
3234 // We know the copy is disjoint but we might not know if the 3234 Node* orig_tail = _gvn.transform( new(C, 3) SubINode(orig_length, start) );
3235 // oop stores need checking. 3235 Node* moved = generate_min_max(vmIntrinsics::_min, orig_tail, length);
3236 // Extreme case: Arrays.copyOf((Integer[])x, 10, String[].class). 3236
3237 // This will fail a store-check if x contains any non-nulls. 3237 const bool raw_mem_only = true;
3238 bool disjoint_bases = true; 3238 newcopy = new_array(klass_node, length, 0, raw_mem_only);
3239 bool length_never_negative = true; 3239
3240 generate_arraycopy(TypeAryPtr::OOPS, T_OBJECT, 3240 // Generate a direct call to the right arraycopy function(s).
3241 original, start, newcopy, intcon(0), moved, 3241 // We know the copy is disjoint but we might not know if the
3242 disjoint_bases, length_never_negative); 3242 // oop stores need checking.
3243 // Extreme case: Arrays.copyOf((Integer[])x, 10, String[].class).
3244 // This will fail a store-check if x contains any non-nulls.
3245 bool disjoint_bases = true;
3246 bool length_never_negative = true;
3247 generate_arraycopy(TypeAryPtr::OOPS, T_OBJECT,
3248 original, start, newcopy, intcon(0), moved,
3249 disjoint_bases, length_never_negative);
3250 } //original reexecute and sp are set back here
3243 3251
3244 push(newcopy); 3252 push(newcopy);
3245 } 3253 }
3246 3254
3247 C->set_has_split_ifs(true); // Has chance for split-if optimization 3255 C->set_has_split_ifs(true); // Has chance for split-if optimization
4022 4030
4023 const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM; 4031 const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM;
4024 int raw_adr_idx = Compile::AliasIdxRaw; 4032 int raw_adr_idx = Compile::AliasIdxRaw;
4025 const bool raw_mem_only = true; 4033 const bool raw_mem_only = true;
4026 4034
4027 Node* array_ctl = generate_array_guard(obj_klass, (RegionNode*)NULL); 4035 //set the original stack and the reexecute bit for the interpreter to reexecute
4028 if (array_ctl != NULL) { 4036 //the bytecode that invokes Object.clone if deoptimization happens
4029 // It's an array. 4037 { PreserveReexecuteState preexecs(this);
4030 PreserveJVMState pjvms(this); 4038 _sp += nargs;
4031 set_control(array_ctl); 4039 jvms()->set_should_reexecute(true);
4032 Node* obj_length = load_array_length(obj); 4040
4033 Node* obj_size = NULL; 4041 Node* array_ctl = generate_array_guard(obj_klass, (RegionNode*)NULL);
4034 Node* alloc_obj = new_array(obj_klass, obj_length, nargs, 4042 if (array_ctl != NULL) {
4035 raw_mem_only, &obj_size); 4043 // It's an array.
4036 4044 PreserveJVMState pjvms(this);
4037 if (!use_ReduceInitialCardMarks()) { 4045 set_control(array_ctl);
4038 // If it is an oop array, it requires very special treatment, 4046 Node* obj_length = load_array_length(obj);
4039 // because card marking is required on each card of the array. 4047 Node* obj_size = NULL;
4040 Node* is_obja = generate_objArray_guard(obj_klass, (RegionNode*)NULL); 4048 Node* alloc_obj = new_array(obj_klass, obj_length, 0,
4041 if (is_obja != NULL) { 4049 raw_mem_only, &obj_size);
4042 PreserveJVMState pjvms2(this); 4050
4043 set_control(is_obja); 4051 if (!use_ReduceInitialCardMarks()) {
4044 // Generate a direct call to the right arraycopy function(s). 4052 // If it is an oop array, it requires very special treatment,
4045 bool disjoint_bases = true; 4053 // because card marking is required on each card of the array.
4046 bool length_never_negative = true; 4054 Node* is_obja = generate_objArray_guard(obj_klass, (RegionNode*)NULL);
4047 generate_arraycopy(TypeAryPtr::OOPS, T_OBJECT, 4055 if (is_obja != NULL) {
4048 obj, intcon(0), alloc_obj, intcon(0), 4056 PreserveJVMState pjvms2(this);
4049 obj_length, 4057 set_control(is_obja);
4050 disjoint_bases, length_never_negative); 4058 // Generate a direct call to the right arraycopy function(s).
4051 result_reg->init_req(_objArray_path, control()); 4059 bool disjoint_bases = true;
4052 result_val->init_req(_objArray_path, alloc_obj); 4060 bool length_never_negative = true;
4053 result_i_o ->set_req(_objArray_path, i_o()); 4061 generate_arraycopy(TypeAryPtr::OOPS, T_OBJECT,
4054 result_mem ->set_req(_objArray_path, reset_memory()); 4062 obj, intcon(0), alloc_obj, intcon(0),
4063 obj_length,
4064 disjoint_bases, length_never_negative);
4065 result_reg->init_req(_objArray_path, control());
4066 result_val->init_req(_objArray_path, alloc_obj);
4067 result_i_o ->set_req(_objArray_path, i_o());
4068 result_mem ->set_req(_objArray_path, reset_memory());
4069 }
4055 } 4070 }
4056 } 4071 // We can dispense with card marks if we know the allocation
4057 // We can dispense with card marks if we know the allocation 4072 // comes out of eden (TLAB)... In fact, ReduceInitialCardMarks
4058 // comes out of eden (TLAB)... In fact, ReduceInitialCardMarks 4073 // causes the non-eden paths to simulate a fresh allocation,
4059 // causes the non-eden paths to simulate a fresh allocation, 4074 // insofar that no further card marks are required to initialize
4060 // insofar that no further card marks are required to initialize 4075 // the object.
4061 // the object. 4076
4062 4077 // Otherwise, there are no card marks to worry about.
4063 // Otherwise, there are no card marks to worry about. 4078
4064 4079 if (!stopped()) {
4080 copy_to_clone(obj, alloc_obj, obj_size, true, false);
4081
4082 // Present the results of the copy.
4083 result_reg->init_req(_array_path, control());
4084 result_val->init_req(_array_path, alloc_obj);
4085 result_i_o ->set_req(_array_path, i_o());
4086 result_mem ->set_req(_array_path, reset_memory());
4087 }
4088 }
4089
4090 // We only go to the instance fast case code if we pass a number of guards.
4091 // The paths which do not pass are accumulated in the slow_region.
4092 RegionNode* slow_region = new (C, 1) RegionNode(1);
4093 record_for_igvn(slow_region);
4065 if (!stopped()) { 4094 if (!stopped()) {
4066 copy_to_clone(obj, alloc_obj, obj_size, true, false); 4095 // It's an instance (we did array above). Make the slow-path tests.
4067 4096 // If this is a virtual call, we generate a funny guard. We grab
4068 // Present the results of the copy. 4097 // the vtable entry corresponding to clone() from the target object.
4069 result_reg->init_req(_array_path, control()); 4098 // If the target method which we are calling happens to be the
4070 result_val->init_req(_array_path, alloc_obj); 4099 // Object clone() method, we pass the guard. We do not need this
4071 result_i_o ->set_req(_array_path, i_o()); 4100 // guard for non-virtual calls; the caller is known to be the native
4072 result_mem ->set_req(_array_path, reset_memory()); 4101 // Object clone().
4073 } 4102 if (is_virtual) {
4074 } 4103 generate_virtual_guard(obj_klass, slow_region);
4075 4104 }
4076 // We only go to the instance fast case code if we pass a number of guards. 4105
4077 // The paths which do not pass are accumulated in the slow_region. 4106 // The object must be cloneable and must not have a finalizer.
4078 RegionNode* slow_region = new (C, 1) RegionNode(1); 4107 // Both of these conditions may be checked in a single test.
4079 record_for_igvn(slow_region); 4108 // We could optimize the cloneable test further, but we don't care.
4080 if (!stopped()) { 4109 generate_access_flags_guard(obj_klass,
4081 // It's an instance (we did array above). Make the slow-path tests. 4110 // Test both conditions:
4082 // If this is a virtual call, we generate a funny guard. We grab 4111 JVM_ACC_IS_CLONEABLE | JVM_ACC_HAS_FINALIZER,
4083 // the vtable entry corresponding to clone() from the target object. 4112 // Must be cloneable but not finalizer:
4084 // If the target method which we are calling happens to be the 4113 JVM_ACC_IS_CLONEABLE,
4085 // Object clone() method, we pass the guard. We do not need this 4114 slow_region);
4086 // guard for non-virtual calls; the caller is known to be the native 4115 }
4087 // Object clone(). 4116
4088 if (is_virtual) { 4117 if (!stopped()) {
4089 generate_virtual_guard(obj_klass, slow_region); 4118 // It's an instance, and it passed the slow-path tests.
4090 } 4119 PreserveJVMState pjvms(this);
4091 4120 Node* obj_size = NULL;
4092 // The object must be cloneable and must not have a finalizer. 4121 Node* alloc_obj = new_instance(obj_klass, NULL, raw_mem_only, &obj_size);
4093 // Both of these conditions may be checked in a single test. 4122
4094 // We could optimize the cloneable test further, but we don't care. 4123 copy_to_clone(obj, alloc_obj, obj_size, false, !use_ReduceInitialCardMarks());
4095 generate_access_flags_guard(obj_klass, 4124
4096 // Test both conditions: 4125 // Present the results of the slow call.
4097 JVM_ACC_IS_CLONEABLE | JVM_ACC_HAS_FINALIZER, 4126 result_reg->init_req(_instance_path, control());
4098 // Must be cloneable but not finalizer: 4127 result_val->init_req(_instance_path, alloc_obj);
4099 JVM_ACC_IS_CLONEABLE, 4128 result_i_o ->set_req(_instance_path, i_o());
4100 slow_region); 4129 result_mem ->set_req(_instance_path, reset_memory());
4101 } 4130 }
4102 4131
4103 if (!stopped()) { 4132 // Generate code for the slow case. We make a call to clone().
4104 // It's an instance, and it passed the slow-path tests. 4133 set_control(_gvn.transform(slow_region));
4105 PreserveJVMState pjvms(this); 4134 if (!stopped()) {
4106 Node* obj_size = NULL; 4135 PreserveJVMState pjvms(this);
4107 Node* alloc_obj = new_instance(obj_klass, NULL, raw_mem_only, &obj_size); 4136 CallJavaNode* slow_call = generate_method_call(vmIntrinsics::_clone, is_virtual);
4108 4137 Node* slow_result = set_results_for_java_call(slow_call);
4109 copy_to_clone(obj, alloc_obj, obj_size, false, !use_ReduceInitialCardMarks()); 4138 // this->control() comes from set_results_for_java_call
4110 4139 result_reg->init_req(_slow_path, control());
4111 // Present the results of the slow call. 4140 result_val->init_req(_slow_path, slow_result);
4112 result_reg->init_req(_instance_path, control()); 4141 result_i_o ->set_req(_slow_path, i_o());
4113 result_val->init_req(_instance_path, alloc_obj); 4142 result_mem ->set_req(_slow_path, reset_memory());
4114 result_i_o ->set_req(_instance_path, i_o()); 4143 }
4115 result_mem ->set_req(_instance_path, reset_memory()); 4144 } //original reexecute and sp are set back here
4116 }
4117
4118 // Generate code for the slow case. We make a call to clone().
4119 set_control(_gvn.transform(slow_region));
4120 if (!stopped()) {
4121 PreserveJVMState pjvms(this);
4122 CallJavaNode* slow_call = generate_method_call(vmIntrinsics::_clone, is_virtual);
4123 Node* slow_result = set_results_for_java_call(slow_call);
4124 // this->control() comes from set_results_for_java_call
4125 result_reg->init_req(_slow_path, control());
4126 result_val->init_req(_slow_path, slow_result);
4127 result_i_o ->set_req(_slow_path, i_o());
4128 result_mem ->set_req(_slow_path, reset_memory());
4129 }
4130 4145
4131 // Return the combined state. 4146 // Return the combined state.
4132 set_control( _gvn.transform(result_reg) ); 4147 set_control( _gvn.transform(result_reg) );
4133 set_i_o( _gvn.transform(result_i_o) ); 4148 set_i_o( _gvn.transform(result_i_o) );
4134 set_all_memory( _gvn.transform(result_mem) ); 4149 set_all_memory( _gvn.transform(result_mem) );