Skip to content

Commit 8ab7d3b

Browse files
author
Quan Anh Mai
committed
8374078: C2_MacroAssembler::verify_int_in_range has incorrect early return condition
Reviewed-by: kvn, dlong
1 parent fe5911c commit 8ab7d3b

File tree

2 files changed

+25
-36
lines changed

2 files changed

+25
-36
lines changed

src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2547,26 +2547,22 @@ void C2_MacroAssembler::verify_int_in_range(uint idx, const TypeInt* t, Register
25472547
if (t == TypeInt::INT) {
25482548
return;
25492549
}
2550+
25502551
BLOCK_COMMENT("verify_int_in_range {");
25512552
Label L_success, L_failure;
25522553

25532554
jint lo = t->_lo;
25542555
jint hi = t->_hi;
25552556

2556-
if (lo != min_jint && hi != max_jint) {
2557+
if (lo != min_jint) {
25572558
subsw(rtmp, rval, lo);
25582559
br(Assembler::LT, L_failure);
2560+
}
2561+
if (hi != max_jint) {
25592562
subsw(rtmp, rval, hi);
2560-
br(Assembler::LE, L_success);
2561-
} else if (lo != min_jint) {
2562-
subsw(rtmp, rval, lo);
2563-
br(Assembler::GE, L_success);
2564-
} else if (hi != max_jint) {
2565-
subsw(rtmp, rval, hi);
2566-
br(Assembler::LE, L_success);
2567-
} else {
2568-
ShouldNotReachHere();
2563+
br(Assembler::GT, L_failure);
25692564
}
2565+
b(L_success);
25702566

25712567
bind(L_failure);
25722568
movw(c_rarg0, idx);
@@ -2590,26 +2586,22 @@ void C2_MacroAssembler::verify_long_in_range(uint idx, const TypeLong* t, Regist
25902586
if (t == TypeLong::LONG) {
25912587
return;
25922588
}
2589+
25932590
BLOCK_COMMENT("verify_long_in_range {");
25942591
Label L_success, L_failure;
25952592

25962593
jlong lo = t->_lo;
25972594
jlong hi = t->_hi;
25982595

2599-
if (lo != min_jlong && hi != max_jlong) {
2596+
if (lo != min_jlong) {
26002597
subs(rtmp, rval, lo);
26012598
br(Assembler::LT, L_failure);
2599+
}
2600+
if (hi != max_jlong) {
26022601
subs(rtmp, rval, hi);
2603-
br(Assembler::LE, L_success);
2604-
} else if (lo != min_jlong) {
2605-
subs(rtmp, rval, lo);
2606-
br(Assembler::GE, L_success);
2607-
} else if (hi != max_jlong) {
2608-
subs(rtmp, rval, hi);
2609-
br(Assembler::LE, L_success);
2610-
} else {
2611-
ShouldNotReachHere();
2602+
br(Assembler::GT, L_failure);
26122603
}
2604+
b(L_success);
26132605

26142606
bind(L_failure);
26152607
movw(c_rarg0, idx);

src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -617,17 +617,16 @@ void C2_MacroAssembler::verify_int_in_range(uint idx, const TypeInt* t, Register
617617
BLOCK_COMMENT("CastII {");
618618
Label fail;
619619
Label succeed;
620-
if (hi == max_jint) {
620+
621+
if (lo != min_jint) {
621622
cmpl(val, lo);
622-
jccb(Assembler::greaterEqual, succeed);
623-
} else {
624-
if (lo != min_jint) {
625-
cmpl(val, lo);
626-
jccb(Assembler::less, fail);
627-
}
623+
jccb(Assembler::less, fail);
624+
}
625+
if (hi != max_jint) {
628626
cmpl(val, hi);
629-
jccb(Assembler::lessEqual, succeed);
627+
jccb(Assembler::greater, fail);
630628
}
629+
jmpb(succeed);
631630

632631
bind(fail);
633632
movl(c_rarg0, idx);
@@ -666,17 +665,15 @@ void C2_MacroAssembler::verify_long_in_range(uint idx, const TypeLong* t, Regist
666665
}
667666
};
668667

669-
if (hi == max_jlong) {
668+
if (lo != min_jlong) {
670669
cmp_val(lo);
671-
jccb(Assembler::greaterEqual, succeed);
672-
} else {
673-
if (lo != min_jlong) {
674-
cmp_val(lo);
675-
jccb(Assembler::less, fail);
676-
}
670+
jccb(Assembler::less, fail);
671+
}
672+
if (hi != max_jlong) {
677673
cmp_val(hi);
678-
jccb(Assembler::lessEqual, succeed);
674+
jccb(Assembler::greater, fail);
679675
}
676+
jmpb(succeed);
680677

681678
bind(fail);
682679
movl(c_rarg0, idx);

0 commit comments

Comments
 (0)