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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [testsuite/] [gcc.dg/] [vmx/] [gcc-bug-i.c] - Diff between revs 154 and 816

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

Rev 154 Rev 816
#include "harness.h"
#include "harness.h"
 
 
/* This problem occurs if a function is inlined.  When its local
/* This problem occurs if a function is inlined.  When its local
   variables get allocated space on the caller's (the function to
   variables get allocated space on the caller's (the function to
   which it is inlined) stack frame, they don't get 16-byte alignment
   which it is inlined) stack frame, they don't get 16-byte alignment
   even if they need it.  Here's an example with a union (that's the
   even if they need it.  Here's an example with a union (that's the
   first case I uncovered, but it's probably a general occurrence on
   first case I uncovered, but it's probably a general occurrence on
   inlining).  */
   inlining).  */
 
 
#define N 10
#define N 10
/* adjust N = size of buffer to try to get bad alignment for inlined union */
/* adjust N = size of buffer to try to get bad alignment for inlined union */
 
 
#define DO_INLINE __attribute__ ((always_inline))
#define DO_INLINE __attribute__ ((always_inline))
#define DONT_INLINE __attribute__ ((noinline))
#define DONT_INLINE __attribute__ ((noinline))
 
 
static DO_INLINE int inline_me(vector signed short data)
static DO_INLINE int inline_me(vector signed short data)
{
{
  union {vector signed short v; signed short s[8];} u;
  union {vector signed short v; signed short s[8];} u;
  u.v = data;
  u.v = data;
  return u.s[7];
  return u.s[7];
}
}
 
 
static DONT_INLINE int foo(vector signed short data)
static DONT_INLINE int foo(vector signed short data)
{
{
  int c, buffer[N], i;
  int c, buffer[N], i;
  c = inline_me(data);
  c = inline_me(data);
  for (i=0; i<N; i++) {
  for (i=0; i<N; i++) {
    if (i == 0)
    if (i == 0)
      buffer[i] = c;
      buffer[i] = c;
    else
    else
      buffer[i] = buffer[i-1] + c*i;
      buffer[i] = buffer[i-1] + c*i;
  }
  }
  return buffer[N-1];
  return buffer[N-1];
}
}
 
 
static void test()
static void test()
{
{
  check(foo((vector signed short)
  check(foo((vector signed short)
            ((vector unsigned char){1,2,3,4,5,6,7,8,
            ((vector unsigned char){1,2,3,4,5,6,7,8,
                                   9,10,11,12,13,14,15,16})) == 0x2b4e0,
                                   9,10,11,12,13,14,15,16})) == 0x2b4e0,
        "foo");
        "foo");
}
}
 
 

powered by: WebSVN 2.1.0

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