/// CHECK-START: int Main.div() licm (before) /// CHECK-DAG: Div loop:{{B\d+}}
/// CHECK-START: int Main.div() licm (after) /// CHECK-NOT: Div loop:{{B\d+}}
/// CHECK-START: int Main.div() licm (after) /// CHECK-DAG: Div loop:none
publicstaticint div() { int result = 0; for (int i = 0; i < 10; ++i) {
result += staticField / 42;
} return result;
}
/// CHECK-START: int Main.innerDiv() licm (before) /// CHECK-DAG: Div loop:{{B\d+}}
/// CHECK-START: int Main.innerDiv() licm (after) /// CHECK-NOT: Div loop:{{B\d+}}
/// CHECK-START: int Main.innerDiv() licm (after) /// CHECK-DAG: Div loop:none
publicstaticint innerDiv() { int result = 0; for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j) {
result += staticField / 42;
}
} return result;
}
/// CHECK-START: int Main.innerMul() licm (before) /// CHECK-DAG: Mul loop:B4
/// CHECK-START: int Main.innerMul() licm (after) /// CHECK-DAG: Mul loop:B2
publicstaticint innerMul() { int result = 0; for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j) { // The operation has been hoisted out of the inner loop. // Note that we depend on the compiler's block numbering to // check if it has been moved.
result += staticField * i;
}
} return result;
}
/// CHECK-START: int Main.divByA(int, int) licm (before) /// CHECK-DAG: Div loop:{{B\d+}}
/// CHECK-START: int Main.divByA(int, int) licm (after) /// CHECK-DAG: Div loop:{{B\d+}}
publicstaticint divByA(int a, int b) { int result = 0; while (b < 5) { // a might be null, so we can't hoist the operation.
result += staticField / a;
b++;
} return result;
}
publicstaticint clinitCheck() { int i = 0; int sum = 0; do {
sum += ValueHolder.getValue();
i++;
} while (i < 10); return sum;
}
/// CHECK-START: int Main.divAndIntrinsic(int[]) licm (before) /// CHECK-DAG: Div loop:{{B\d+}}
/// CHECK-START: int Main.divAndIntrinsic(int[]) licm (after) /// CHECK-NOT: Div loop:{{B\d+}}
/// CHECK-START: int Main.divAndIntrinsic(int[]) licm (after) /// CHECK-DAG: Div loop:none
publicstaticint divAndIntrinsic(int[] array) { int result = 0; for (int i = 0; i < array.length; i++) { // An intrinsic call, unlike a general method call, cannot modify the field value. // As a result, the invariant division on the field can be moved out of the loop.
result += (staticField / 42) + Math.abs(array[i]);
} return result;
}
/// CHECK-START: int Main.invariantBoundIntrinsic(int) licm (before) /// CHECK-DAG: Abs loop:{{B\d+}}
/// CHECK-START: int Main.invariantBoundIntrinsic(int) licm (after) /// CHECK-NOT: Abs loop:{{B\d+}}
/// CHECK-START: int Main.invariantBoundIntrinsic(int) licm (after) /// CHECK-DAG: Abs loop:none
publicstaticint invariantBoundIntrinsic(int x) { int result = 0; // The intrinsic call to abs used as loop bound is invariant. // As a result, the call itself can be moved out of the loop header. for (int i = 0; i < Math.abs(x); i++) {
result += i;
} return result;
}
/// CHECK-START: int Main.invariantBodyIntrinsic(int, int) licm (before) /// CHECK-DAG: Max loop:{{B\d+}}
/// CHECK-START: int Main.invariantBodyIntrinsic(int, int) licm (after) /// CHECK-NOT: Max loop:{{B\d+}}
/// CHECK-START: int Main.invariantBodyIntrinsic(int, int) licm (after) /// CHECK-DAG: Max loop:none
publicstaticint invariantBodyIntrinsic(int x, int y) { int result = 0; for (int i = 0; i < 10; i++) { // The intrinsic call to max used inside the loop is invariant. // As a result, the call itself can be moved out of the loop body.
result += Math.max(x, y);
} return result;
}
// // All operations up to the null check can be hoisted out of the // loop. The null check itself sees the induction in its environment. // /// CHECK-START: int Main.doWhile(int) licm (before) /// CHECK-DAG: <<Add:i\d+>> Add loop:<<Loop:B\d+>> outer_loop:none /// CHECK-DAG: LoadClass loop:<<Loop>> outer_loop:none /// CHECK-DAG: <<Get:l\d+>> StaticFieldGet loop:<<Loop>> outer_loop:none /// CHECK-DAG: NullCheck [<<Get>>] env:[[<<Add>>,<<Get>>,{{i\d+}}]] loop:<<Loop>> outer_loop:none /// CHECK-DAG: ArrayLength loop:<<Loop>> outer_loop:none /// CHECK-DAG: BoundsCheck loop:<<Loop>> outer_loop:none /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none // /// CHECK-START: int Main.doWhile(int) licm (after) /// CHECK-NOT: LoadClass loop:{{B\d+}} /// CHECK-NOT: StaticFieldGet loop:{{B\d+}} // /// CHECK-START: int Main.doWhile(int) licm (after) /// CHECK-DAG: LoadClass loop:none /// CHECK-DAG: <<Get:l\d+>> StaticFieldGet loop:none /// CHECK-DAG: <<Add:i\d+>> Add loop:<<Loop:B\d+>> outer_loop:none /// CHECK-DAG: NullCheck [<<Get>>] env:[[<<Add>>,<<Get>>,{{i\d+}}]] loop:<<Loop>> outer_loop:none /// CHECK-DAG: ArrayLength loop:<<Loop>> outer_loop:none /// CHECK-DAG: BoundsCheck loop:<<Loop>> outer_loop:none /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none publicstaticint doWhile(int k) { int i = k; do {
i += 2;
} while (staticArray[i] == 0); return i;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.