#define vector __attribute__((vector_size(16) )) struct struct1 { union { float a[3]...

#define vector __attribute__((vector_size(16) ))
struct struct1  {
  union { float a[3]; }    vmx;
  struct struct2   {
    struct2(const struct2& r) {}
  } w;
} __attribute__((aligned(16)));
struct struct3  {
  vector float vmx;
  operator const struct1& () const{
    return *reinterpret_cast<const struct1*>(this);
  }
};
struct3 func3( struct3 V1);
struct3 func2( void );
void func1( )  {
  struct1 vVec = func2() ;
  func3 ( (struct3&)vVec );
}

From-SVN: r139820
This commit is contained in:
Andrew Pinski 2008-08-31 02:40:13 +00:00 committed by Andrew Pinski
parent 617c394a03
commit 6aebac53f3
5 changed files with 44 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2008-08-30 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR middle-end/36444
* expmed.c (extract_bit_field_1): Check the mode size to make
sure the vector modes have the same size.
2008-08-29 Michael Meissner <gnu@the-meissners.org>
* dojump.c (top level): Include basic-block.h to declare

View File

@ -1204,7 +1204,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
for (; new_mode != VOIDmode ; new_mode = GET_MODE_WIDER_MODE (new_mode))
if (GET_MODE_NUNITS (new_mode) == nunits
&& GET_MODE_INNER (new_mode) == tmode
&& GET_MODE_SIZE (new_mode) == GET_MODE_SIZE (GET_MODE (op0))
&& targetm.vector_mode_supported_p (new_mode))
break;
if (new_mode != VOIDmode)

View File

@ -1,3 +1,9 @@
2008-08-30 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR middle-end/36444
* g++.dg/torture/pr36444.C: New testcase.
* gcc.c-torture/compile/vector-4.c: New testcase.
2008-08-30 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/36895

View File

@ -0,0 +1,21 @@
/* { dg-do compile } */
#define vector __attribute__((vector_size(16) ))
struct struct1 {
union {} vmx;
struct struct2 {
struct2(const struct2& r) {}
} w;
} __attribute__((aligned(16)));
struct struct3 {
vector float vmx;
operator const struct1& () const{
return *reinterpret_cast<const struct1*>(this);
}
};
struct3 func3( struct3 V1);
struct3 func2( void );
void func1( ) {
struct1 vVec = func2() ;
func3 ( (struct3&)vVec );
}

View File

@ -0,0 +1,10 @@
/* Make sure that vector of size 8 of signed char works. This used to crash with AVX on x86
as we would produce try to extract the chars inside the vector mode using the vector mode of V8SI
which was wrong. */
__attribute__ ((vector_size (8))) signed char v4, v5, v6;
void
two (void)
{
v4 = v5 + v6;
}