/* 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 -mthumb -O3 --save-temps" } */
#include <stdlib.h>
#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 } } */
