publicclass Main { // Based on Linpack.matgen // Load-store elimination did not work when a function had SIMD code. // In the test below loop B is vectorized. // Check that a redundant ArrayGet is eliminated in loop A.
// Check LSE works when a function has SIMD code. // /// CHECK-START: double Main.$noinline$test02(double[], int) load_store_elimination (before) /// CHECK: BoundsCheck loop:none /// CHECK-NEXT: ArrayGet /// CHECK-NEXT: Mul /// CHECK-NEXT: ArraySet /// CHECK-NEXT: ArrayGet /// CHECK-NEXT: BelowOrEqual // /// CHECK: ArrayGet loop:none /// CHECK-IF: hasIsaFeature("avx2") and isIsa("x86_64") // In case of avx2 we must generate a HX86Clear just before return /// CHECK-NEXT: X86Clear /// CHECK-FI: /// CHECK-NEXT: Return
// Check LSE works when a function has SIMD code. // /// CHECK-START: double Main.$noinline$test03(int) load_store_elimination (before) /// CHECK: ArrayGet loop:none /// CHECK-IF: hasIsaFeature("avx2") and isIsa("x86_64") // In case of avx2 we must generate a HX86Clear just before return /// CHECK-NEXT: X86Clear /// CHECK-FI: /// CHECK-NEXT: Return
/// CHECK-START-ARM64: double[] Main.$noinline$test04(int) load_store_elimination (after) /// CHECK-IF: not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true') // // In NEON case there is a post-loop which prevents the store to be removed. /// CHECK: VecStore // /// CHECK-FI: // /// CHECK: VecAdd /// CHECK: VecStore /// CHECK: Add /// CHECK: Goto loop:{{B\d+}} //
/// CHECK-IF: not (hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true') // /// CHECK-NOT: VecStore // /// CHECK-FI: // // TODO: reenable LSE for graphs with Predicated SIMD. staticdouble[] $noinline$test04(int n) { double a[] = newdouble[n]; double b[] = newdouble[n];
// The following loop is vectorized. for (int i = 0; i < n; ++i) {
a[i] = 1;
b[i] = a[i] + a[i]; // VecLoad should be removed by LSE.
}
double r = a[0] + 1.0; // ArrayGet:a[0] is eliminated and default 0.0 is used. // The following loop is vectorized. for (int i = 0; i < n; ++i) {
b[i] = a[i]; // VecLoad:a[i] is not eliminated.
b[i] += a[i] + r; // VecLoad:a[i] and VecLoad:b[i] are eliminated.
}
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.