mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 19:14:38 +02:00
6894779: Loop Predication for Loop Optimizer in C2
Loop predication implementation Reviewed-by: never, kvn
This commit is contained in:
parent
96612c6e23
commit
815db4fcba
13 changed files with 838 additions and 30 deletions
|
@ -278,6 +278,11 @@ void Parse::do_tableswitch() {
|
|||
if (len < 1) {
|
||||
// If this is a backward branch, add safepoint
|
||||
maybe_add_safepoint(default_dest);
|
||||
if (should_add_predicate(default_dest)){
|
||||
_sp += 1; // set original stack for use by uncommon_trap
|
||||
add_predicate();
|
||||
_sp -= 1;
|
||||
}
|
||||
merge(default_dest);
|
||||
return;
|
||||
}
|
||||
|
@ -324,6 +329,11 @@ void Parse::do_lookupswitch() {
|
|||
|
||||
if (len < 1) { // If this is a backward branch, add safepoint
|
||||
maybe_add_safepoint(default_dest);
|
||||
if (should_add_predicate(default_dest)){
|
||||
_sp += 1; // set original stack for use by uncommon_trap
|
||||
add_predicate();
|
||||
_sp -= 1;
|
||||
}
|
||||
merge(default_dest);
|
||||
return;
|
||||
}
|
||||
|
@ -731,6 +741,9 @@ void Parse::do_jsr() {
|
|||
push(_gvn.makecon(ret_addr));
|
||||
|
||||
// Flow to the jsr.
|
||||
if (should_add_predicate(jsr_bci)){
|
||||
add_predicate();
|
||||
}
|
||||
merge(jsr_bci);
|
||||
}
|
||||
|
||||
|
@ -881,7 +894,7 @@ bool Parse::seems_never_taken(float prob) {
|
|||
|
||||
//-------------------------------repush_if_args--------------------------------
|
||||
// Push arguments of an "if" bytecode back onto the stack by adjusting _sp.
|
||||
inline void Parse::repush_if_args() {
|
||||
inline int Parse::repush_if_args() {
|
||||
#ifndef PRODUCT
|
||||
if (PrintOpto && WizardMode) {
|
||||
tty->print("defending against excessive implicit null exceptions on %s @%d in ",
|
||||
|
@ -895,6 +908,7 @@ inline void Parse::repush_if_args() {
|
|||
assert(argument(0) != NULL, "must exist");
|
||||
assert(bc_depth == 1 || argument(1) != NULL, "two must exist");
|
||||
_sp += bc_depth;
|
||||
return bc_depth;
|
||||
}
|
||||
|
||||
//----------------------------------do_ifnull----------------------------------
|
||||
|
@ -954,8 +968,14 @@ void Parse::do_ifnull(BoolTest::mask btest, Node *c) {
|
|||
// Update method data
|
||||
profile_taken_branch(target_bci);
|
||||
adjust_map_after_if(btest, c, prob, branch_block, next_block);
|
||||
if (!stopped())
|
||||
if (!stopped()) {
|
||||
if (should_add_predicate(target_bci)){ // add a predicate if it branches to a loop
|
||||
int nargs = repush_if_args(); // set original stack for uncommon_trap
|
||||
add_predicate();
|
||||
_sp -= nargs;
|
||||
}
|
||||
merge(target_bci);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1076,8 +1096,14 @@ void Parse::do_if(BoolTest::mask btest, Node* c) {
|
|||
// Update method data
|
||||
profile_taken_branch(target_bci);
|
||||
adjust_map_after_if(taken_btest, c, prob, branch_block, next_block);
|
||||
if (!stopped())
|
||||
if (!stopped()) {
|
||||
if (should_add_predicate(target_bci)){ // add a predicate if it branches to a loop
|
||||
int nargs = repush_if_args(); // set original stack for the uncommon_trap
|
||||
add_predicate();
|
||||
_sp -= nargs;
|
||||
}
|
||||
merge(target_bci);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2080,6 +2106,10 @@ void Parse::do_one_bytecode() {
|
|||
// Update method data
|
||||
profile_taken_branch(target_bci);
|
||||
|
||||
// Add loop predicate if it goes to a loop
|
||||
if (should_add_predicate(target_bci)){
|
||||
add_predicate();
|
||||
}
|
||||
// Merge the current control into the target basic block
|
||||
merge(target_bci);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue