/* { dg-add-options vect_early_break } */
/* { dg-require-effective-target vect_early_break_hw } */
/* { dg-require-effective-target vect_int } */

/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */

#include <limits.h>
#include <assert.h>

#include "tree-vect.h"

#  define BITSIZEOF_INT 32
#  define BITSIZEOF_LONG 64
#  define BITSIZEOF_LONG_LONG 64

#define MAKE_FUNS(suffix, type)						\
__attribute__((noinline)) \
int my_ffs##suffix(type x) {						\
    int i;								\
    if (x == 0)								\
	 return 0; 							\
    for (i = 0; i < CHAR_BIT * sizeof (type); i++)			\
	if (x & ((type) 1  << i))					\
	    break;							\
    return i + 1;							\
}

MAKE_FUNS (, unsigned);

extern void abort (void);
extern void exit (int);

#define NUMS32					\
  {                                             \
    0x00000000UL,                               \
    0x00000001UL,                               \
    0x80000000UL,                               \
    0x00000002UL,                               \
    0x40000000UL,                               \
    0x00010000UL,                               \
    0x00008000UL,                               \
    0xa5a5a5a5UL,                               \
    0x5a5a5a5aUL,                               \
    0xcafe0000UL,                               \
    0x00cafe00UL,                               \
    0x0000cafeUL,                               \
    0xffffffffUL                                \
  }


unsigned int ints[] = NUMS32;

#define N(table) (sizeof (table) / sizeof (table[0]))

int
main (void)
{
  int i;

  check_vect ();

#pragma GCC novector
  for (i = 0; i < N(ints); i++)
    {
      if (__builtin_ffs (ints[i]) != my_ffs (ints[i]))
	abort ();
    }

  exit (0);
}

