/* This failed on s390x due to bug in loop.c.
   loop.c failed to remove a REG_EQUAL note when
   hoisting an insn from a loop body.  */

/* { dg-options "-O3 -fPIC" } */
/* { dg-do run { target fpic } } */

typedef __SIZE_TYPE__ size_t;
int memcmp(const void *s1, const void *s2, size_t n);

typedef struct
{
  char name[30];
  int a;
} LOCAL;

int global = 0;
int sy = 1;
int subroutine_offset;

LOCAL local = { "local", 0 };
LOCAL keywords = { "keywords", 1 };
int local_table = 0;
int keywords_table = 0;

void __attribute__((noinline)) bar (char *p_buffer)
{
  p_buffer[255] = 1;
}

int __attribute__((noinline)) foo (char *p_str1)
{
  global = 1;
  return 1;
}

int __attribute__((noinline)) loop_next (int *p_table, char *p_table_head)
{
  static int loop_next = 0;

  if (loop_next == 1)
    return 1;

  loop_next = 1;
  return 0;
}

int
main ()
{
  char buffer[256];
  int ende = 0;
  int index;
  int local_base = 2;

  keywords.a = 1;
  for (sy = 0;; sy++)
    {
      for (index = 1;;)
	{
	  bar (buffer);
	  if (buffer[sy] != 0)
	    {
	      ende = 1;
	      break;
	    };
	  if (foo (buffer))
	    {
	      keywords.a += index - 1;
	      break;
	    }
	  index++;
	}
      if (ende)
	break;
    }

  subroutine_offset = 0;

  for (;;)
    {
      if (loop_next (&keywords_table, (char*)&keywords))
	break;

      if ((!memcmp (keywords.name, "+++", 3)))
	local_base = 100;
      else
	local_base = 0;

      if ((!memcmp (keywords.name, "+++", 3)))
	subroutine_offset += local_table;

      for (;;)
	{
	  if (loop_next (&local_table, (char*)&local))
	    break;;
	  if ((local.a == 0))
	    continue;;
	  foo (local.name);
	}
    }
  return 0;
}
