RFR (L): 7153771: array bound check elimination for c1
Christian Thalinger
christian.thalinger at oracle.com
Tue Mar 19 11:46:57 PDT 2013
On Mar 19, 2013, at 2:19 AM, Roland Westrelin <roland.westrelin at oracle.com> wrote:
> Hi Chris,
>
> Thanks for reviewing this.
>
> Here is a new webrev:
> http://cr.openjdk.java.net/~roland/7153771/webrev.04/
>
>> src/share/vm/c1/c1_Compilation.hpp:
>>
>> + bool is_optimistic() const {
>> + return !TieredCompilation &&
>>
>> Do you know why optimistic RCE doesn't work with tiered?
>
> It's not that it doesn't work. Rather it probably doesn't make much sense. We probably want to get as quickly as possible to a c2 compiled method and having a recompilation with c1 caused by an invalid predicate would delay the c2 code without much benefit.
That makes sense.
>
>> src/share/vm/c1/c1_Instruction.cpp:
>>
>> + case aeq: assert(false, "Above equal cannot be negated");
>> + case beq: assert(false, "Below equal cannot be negated");
>>
>> They can be negated but I guess we don't need it?
>
> They can't be negated with available condition values.
>
>> src/share/vm/c1/c1_InstructionPrinter.cpp:
>>
>> + case If::aeq: return "aeq";
>> + case If::beq: return "beq";
>>
>> Graal uses this notation for unsigned compares:
>>
>> AE("|>=|"),
>> BE("|<=|"),
>>
>> Can we use these too for the sake of limited human parsing abilities?
>
> Ok.
>
>> src/share/vm/c1/c1_IR.cpp:
>>
>> + virtual void block_do(BlockBegin *block) {
>> +
>> + Instruction *cur = block;
>> + while (cur) {
>> + assert(cur->block() == block, "Block begin is not correct");
>> + cur = cur->next();
>> + }
>> + }
>>
>> Just a nit but a for loop would be nicer here.
>
> Ok, I'll make the change.
>
>>
>> src/share/vm/oops/methodData.cpp:
>>
>> int MethodData::bytecode_cell_count(Bytecodes::Code code) {
>> +#if defined(COMPILER1) && !defined(COMPILER2)
>> + return no_profile_data;
>> +#endif
>> switch (code) {
>>
>> Aren't some compilers warning about unreached code?
>
> Are you suggesting the rest of the method be enclosed in a #else?
Yes.
>
>> src/share/vm/c1/c1_RangeCheckElimination.cpp:
>>
>> Could we factor some code in RangeCheckEliminator::insert_deoptimization? E.g.
>>
>> 697 Constant *constant = new Constant(new IntConstant(upper));
>> 698 NOT_PRODUCT(constant->set_printable_bci(ai->printable_bci()));
>> 699 insert_position = insert_position->insert_after(constant);
>> 700 ArithmeticOp *ao = new ArithmeticOp(Bytecodes::_iadd, constant, upper_instr, false, NULL);
>> 701 insert_position = insert_position->insert_after_same_bci(ao);
>> 702 // Compare for geq array.length
>> 703 RangeCheckPredicate *deoptimize = new RangeCheckPredicate(ao, Instruction::geq, true, length_instr, state->copy());
>> 704 NOT_PRODUCT(deoptimize->set_printable_bci(ai->printable_bci()));
>> 705 insert_position = insert_position->insert_after_same_bci(deoptimize);
>>
>> And perhaps some other code.
>
> Ok. I've reworked insert_deoptimization.
Much better! Thank you.
>
>>
>> RangeCheckEliminator::process_access_indexed:
>>
>> 824 TRACE_RANGE_CHECK_ELIMINATION(
>> 825 tty->fill_to(block->dominator_depth()*2);
>> 826 tty->print_cr("Lower instruction %d not loop invariant!", lower_instr->id()));
>>
>> The indenting is wrong here and very hard to read. Can we change all occurrences to:
>>
>> 824 TRACE_RANGE_CHECK_ELIMINATION(
>> 825 tty->fill_to(block->dominator_depth()*2);
>> 826 tty->print_cr("Lower instruction %d not loop invariant!", lower_instr->id());
>> );
>
> Ok.
Thank you. Looks good.
-- Chris
>
> Roland.
>
More information about the hotspot-compiler-dev
mailing list