< prev index next >

src/hotspot/cpu/s390/c1_LIRGenerator_s390.cpp

Print this page
rev 47588 : 8190285: s390: Some java boolean checks are not correct
Reviewed-by:

*** 275,285 **** if (use_length && needs_range_check) { length.set_instruction(x->length()); length.load_item(); } ! if (needs_store_check) { value.load_item(); } else { value.load_for_store(x->elt_type()); } --- 275,285 ---- if (use_length && needs_range_check) { length.set_instruction(x->length()); length.load_item(); } ! if (needs_store_check || x->check_boolean()) { value.load_item(); } else { value.load_for_store(x->elt_type()); }
*** 325,339 **** if (obj_store) { // Needs GC write barriers. pre_barrier(LIR_OprFact::address(array_addr), LIR_OprFact::illegalOpr /* pre_val */, true /* do_load */, false /* patch */, NULL); ! __ move(value.result(), array_addr, null_check_info); ! // Seems to be a precise. post_barrier(LIR_OprFact::address(array_addr), value.result()); - } else { - __ move(value.result(), array_addr, null_check_info); } } void LIRGenerator::do_MonitorEnter(MonitorEnter* x) { assert(x->is_pinned(),""); --- 325,342 ---- if (obj_store) { // Needs GC write barriers. pre_barrier(LIR_OprFact::address(array_addr), LIR_OprFact::illegalOpr /* pre_val */, true /* do_load */, false /* patch */, NULL); ! } ! ! LIR_Opr result = maybe_mask_boolean(x, array.result(), value.result(), null_check_info); ! __ move(result, array_addr, null_check_info); ! ! if (obj_store) { ! // Precise card mark post_barrier(LIR_OprFact::address(array_addr), value.result()); } } void LIRGenerator::do_MonitorEnter(MonitorEnter* x) { assert(x->is_pinned(),"");
< prev index next >