[Bug c++/19263] [3.4/4.0 regression]: wrong-code: explicit inicialization of v8qi miscompiled

2005-01-12 Thread pinskia at gcc dot gnu dot org

--- Additional Comments From pinskia at gcc dot gnu dot org  2005-01-12 
19:16 ---
Patch here: .

-- 
   What|Removed |Added

   Keywords||patch


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19263


[Bug c++/19263] [3.4/4.0 regression]: wrong-code: explicit inicialization of v8qi miscompiled

2005-01-12 Thread jakub at gcc dot gnu dot org

--- Additional Comments From jakub at gcc dot gnu dot org  2005-01-12 18:30 
---
Tested to also test static initializers:
typedef signed char v8qi __attribute__ ((vector_size (8)));

extern "C" void abort (void);

static unsigned char S[16];

struct A
{
  int i;
  v8qi j, k;
  int l;
};

void
foo (unsigned char v)
{
  A a = { 1, { v, v, v, v, v, v, v, v },
  { v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1 }, 3 };
  v8qi *s = (v8qi *) &S[0];
  *s = a.j;
  s[1] = a.k;
}

void
bar (unsigned char v)
{
  v8qi val8 = { v, v, v, v, v, v, v, v };
  v8qi *s = (v8qi *) &S[0];
  *s = val8;
}

int n = 5, cnt;

int
num (void)
{
  ++cnt;
  return n;
}

void
baz (void)
{
  static A a = { 0, { num (), num (), num (), num (), 6, 6, 6, 6 },
 { 7, 7, 7, 7, 8, 8, 8, 8 }, 0 };
  v8qi *s = (v8qi *) &S[0];
  *s = a.j;
  s[1] = a.k;
}

int
main ()
{
  int i;
  foo (1);
  for (i = 0; i < 8; ++i)
if (S[i] != 1)
  abort ();
  for (; i < 16; ++i)
if (S[i] != 2)
  abort ();
  bar (3);
  for (i = 0; i < 8; ++i)
if (S[i] != 3)
  abort ();
  baz ();
  if (cnt != 4)
abort ();
  for (i = 0; i < 16; ++i)
if (S[i] != 5 + (i / 4))
  abort ();
  return 0;
}

Works with G++ 3.2.x, fails with 3.4.x and mainline, even with:
--- typeck2.c.jj2005-01-12 18:34:32.0 +0100
+++ typeck2.c   2005-01-12 19:19:28.602047217 +0100
@@ -348,8 +348,9 @@ split_nonconstant_init_1 (tree dest, tre
 case VECTOR_TYPE:
   if (!initializer_constant_valid_p (init, type))
{
+ tree cons = copy_node (init);
  CONSTRUCTOR_ELTS (init) = NULL;
- code = build (MODIFY_EXPR, type, dest, init);
+ code = build (MODIFY_EXPR, type, dest, cons);
  code = build_stmt (EXPR_STMT, code);
  pcode = &TREE_CHAIN (code);
}

patch.

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19263


[Bug c++/19263] [3.4/4.0 regression]: wrong-code: explicit inicialization of v8qi miscompiled

2005-01-12 Thread jakub at gcc dot gnu dot org

--- Additional Comments From jakub at gcc dot gnu dot org  2005-01-12 18:00 
---
This seems to be because of the CONSTRUCTOR_ELTS (init) = NULL;
added in http://gcc.gnu.org/ml/gcc-patches/2004-01/msg00832.html
by Richard.
If I remove it, the testcase works, as well as this bigger one below.
Wiping the initializers of the vector can't be right, so either that line
can be just deleted, or we want to create zero vector and then initialize
it field by field with the original values.
typedef signed char v8qi __attribute__ ((vector_size (8)));

extern "C" void abort (void);

static unsigned char S[16];

struct A
{
  int i;
  v8qi j, k;
  int l;
};

void
foo (unsigned char v)
{
  A a = { 1, { v, v, v, v, v, v, v, v },
 { v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1 }, 3 };
  v8qi *s = (v8qi *) & S[0];
  *s = a.j;
  s[1] = a.k;
}

void
bar (unsigned char v)
{
  v8qi val8 = { v, v, v, v, v, v, v, v };
  v8qi *s = (v8qi *) & S[0];
  *s = val8;
}

int
main ()
{
  int i;
  foo (1);
  for (i = 0; i < 8; ++i)
if (S[i] != 1)
  abort ();
  for (; i < 16; ++i)
if (S[i] != 2)
  abort ();
  bar (3);
  for (i = 0; i < 8; ++i)
if (S[i] != 3)
  abort ();
  return 0;
}



-- 
   What|Removed |Added

 CC||rth at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19263


[Bug c++/19263] [3.4/4.0 regression]: wrong-code: explicit inicialization of v8qi miscompiled

2005-01-12 Thread jakub at gcc dot gnu dot org

--- Additional Comments From jakub at gcc dot gnu dot org  2005-01-12 17:30 
---
Yeah, with PR c++/15172, http://gcc.gnu.org/ml/gcc-patches/2004-11/msg1.html


-- 
   What|Removed |Added

 CC||mark at codesourcery dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19263


[Bug c++/19263] [3.4/4.0 regression]: wrong-code: explicit inicialization of v8qi miscompiled

2005-01-05 Thread pinskia at gcc dot gnu dot org

--- Additional Comments From pinskia at gcc dot gnu dot org  2005-01-05 
14:57 ---
Using Phil's regression hunter, I found the failure was caused between 20041026 
and 20041103.

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19263


[Bug c++/19263] [3.4/4.0 regression]: wrong-code: explicit inicialization of v8qi miscompiled

2005-01-05 Thread pinskia at gcc dot gnu dot org

--- Additional Comments From pinskia at gcc dot gnu dot org  2005-01-05 
14:48 ---
Confirmed.
Here is the reduced testcase without any x86 builtins usage:
typedef signed char v8qi __attribute__ ((vector_size(8)));

extern "C" void abort(void);

static unsigned char S[8];

void do_subs(unsigned char v)
{
v8qi  val8 = {v,v,v,v,v,v,v,v};
v8qi* s = (v8qi*)&S[0];

*s = val8;
}


int main()
{
int i;
do_subs(0x1);
for (i=0;i<8;++i)
if (S[i] != 0x01)
abort();
return 0;
}

-- 
   What|Removed |Added

 Status|UNCONFIRMED |NEW
 Ever Confirmed||1
   Keywords||wrong-code
  Known to fail||4.0.0
  Known to work||3.4.0
   Last reconfirmed|-00-00 00:00:00 |2005-01-05 14:48:26
   date||
Summary|[g++-3.4.3 regression]: |[3.4/4.0 regression]: wrong-
   |wrong-code: explicit|code: explicit
   |inicialization of v8qi  |inicialization of v8qi
   |miscompiled |miscompiled
   Target Milestone|--- |3.4.4


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19263