OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc1/] [gcc/] [testsuite/] [gcc.c-torture/] [execute/] [pr28982a.c] - Diff between revs 297 and 338

Only display areas with differences | Details | Blame | View Log

Rev 297 Rev 338
/* PR rtl-optimization/28982.  Function foo() does the equivalent of:
/* PR rtl-optimization/28982.  Function foo() does the equivalent of:
 
 
     float tmp_results[NVARS];
     float tmp_results[NVARS];
     for (int i = 0; i < NVARS; i++)
     for (int i = 0; i < NVARS; i++)
       {
       {
         int inc = incs[i];
         int inc = incs[i];
         float *ptr = ptrs[i], result = 0;
         float *ptr = ptrs[i], result = 0;
         for (int j = 0; j < n; j++)
         for (int j = 0; j < n; j++)
           result += *ptr, ptr += inc;
           result += *ptr, ptr += inc;
         tmp_results[i] = result;
         tmp_results[i] = result;
       }
       }
     memcpy (results, tmp_results, sizeof (results));
     memcpy (results, tmp_results, sizeof (results));
 
 
   but without the outermost loop.  The idea is to create high register
   but without the outermost loop.  The idea is to create high register
   pressure and ensure that some INC and PTR variables are spilled.
   pressure and ensure that some INC and PTR variables are spilled.
 
 
   On ARM targets, sequences like "result += *ptr, ptr += inc" can
   On ARM targets, sequences like "result += *ptr, ptr += inc" can
   usually be implemented using (mem (post_modify ...)), and we do
   usually be implemented using (mem (post_modify ...)), and we do
   indeed create such MEMs before reload for this testcase.  However,
   indeed create such MEMs before reload for this testcase.  However,
   (post_modify ...) is not a valid address for coprocessor loads, so
   (post_modify ...) is not a valid address for coprocessor loads, so
   for -mfloat-abi=softfp, reload reloads the POST_MODIFY into a base
   for -mfloat-abi=softfp, reload reloads the POST_MODIFY into a base
   register.  GCC did not deal correctly with cases where the base and
   register.  GCC did not deal correctly with cases where the base and
   index of the POST_MODIFY are themselves reloaded.  */
   index of the POST_MODIFY are themselves reloaded.  */
#define NITER 4
#define NITER 4
#define NVARS 20
#define NVARS 20
#define MULTI(X) \
#define MULTI(X) \
  X( 0), X( 1), X( 2), X( 3), X( 4), X( 5), X( 6), X( 7), X( 8), X( 9), \
  X( 0), X( 1), X( 2), X( 3), X( 4), X( 5), X( 6), X( 7), X( 8), X( 9), \
  X(10), X(11), X(12), X(13), X(14), X(15), X(16), X(17), X(18), X(19)
  X(10), X(11), X(12), X(13), X(14), X(15), X(16), X(17), X(18), X(19)
 
 
#define DECLAREI(INDEX) inc##INDEX = incs[INDEX]
#define DECLAREI(INDEX) inc##INDEX = incs[INDEX]
#define DECLAREF(INDEX) *ptr##INDEX = ptrs[INDEX], result##INDEX = 0
#define DECLAREF(INDEX) *ptr##INDEX = ptrs[INDEX], result##INDEX = 0
#define LOOP(INDEX) result##INDEX += *ptr##INDEX, ptr##INDEX += inc##INDEX
#define LOOP(INDEX) result##INDEX += *ptr##INDEX, ptr##INDEX += inc##INDEX
#define COPYOUT(INDEX) results[INDEX] = result##INDEX
#define COPYOUT(INDEX) results[INDEX] = result##INDEX
 
 
float *ptrs[NVARS];
float *ptrs[NVARS];
float results[NVARS];
float results[NVARS];
int incs[NVARS];
int incs[NVARS];
 
 
void __attribute__((noinline))
void __attribute__((noinline))
foo (int n)
foo (int n)
{
{
  int MULTI (DECLAREI);
  int MULTI (DECLAREI);
  float MULTI (DECLAREF);
  float MULTI (DECLAREF);
  while (n--)
  while (n--)
    MULTI (LOOP);
    MULTI (LOOP);
  MULTI (COPYOUT);
  MULTI (COPYOUT);
}
}
 
 
float input[NITER * NVARS];
float input[NITER * NVARS];
 
 
int
int
main (void)
main (void)
{
{
  int i;
  int i;
 
 
  for (i = 0; i < NVARS; i++)
  for (i = 0; i < NVARS; i++)
    ptrs[i] = input + i, incs[i] = i;
    ptrs[i] = input + i, incs[i] = i;
  for (i = 0; i < NITER * NVARS; i++)
  for (i = 0; i < NITER * NVARS; i++)
    input[i] = i;
    input[i] = i;
  foo (NITER);
  foo (NITER);
  for (i = 0; i < NVARS; i++)
  for (i = 0; i < NVARS; i++)
    if (results[i] != i * NITER * (NITER + 1) / 2)
    if (results[i] != i * NITER * (NITER + 1) / 2)
      return 1;
      return 1;
  return 0;
  return 0;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.