/* Check that GCC generates Armv8.1-M low over head loop instructions for some simple loops. */ /* { dg-do run } */ /* { dg-require-effective-target arm_v8_1_lob_ok } */ /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ /* { dg-options "-march=armv8.1-m.main -O3 --save-temps" } */ #include #include "lob.h" int a[N]; int b[N]; int c[N]; int foo (int a, int b) { return a + b; } void __attribute__((noinline)) loop1 (int *a, int *b, int *c) { for (int i = 0; i < N; i++) { a[i] = i; b[i] = i * 2; c[i] = a[i] + b[i]; } } void __attribute__((noinline)) loop2 (int *a, int *b, int *c) { int i = 0; while (i < N) { a[i] = i - 2; b[i] = i * 5; c[i] = a[i] + b[i]; i++; } } void __attribute__((noinline)) loop3 (int *a, int *b, int *c) { int i = 0; do { a[i] = i - 4; b[i] = i * 3; c[i] = a[i] + b[i]; i++; } while (i < N); } void check (int *a, int *b, int *c) { for (int i = 0; i < N; i++) { NO_LOB; if (c[i] != a[i] + b[i]) abort (); } } int main (void) { reset_data (a, b, c); loop1 (a, b ,c); check (a, b ,c); reset_data (a, b, c); loop2 (a, b ,c); check (a, b ,c); reset_data (a, b, c); loop3 (a, b ,c); check (a, b ,c); return 0; } /* { dg-final { scan-assembler-times {dls\s\S*,\s\S*} 3 } } */ /* { dg-final { scan-assembler-times {le\slr,\s\S*} 3 } } */