This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch: vector constants


This corrects a bug in vector constant handling. Since rtx_const_un is
a union, the veclo and vechi fields formerly overlapped; stores into
them clobbered each other. (Note, this increases the size of
struct rtx_const considerably, but I don't believe that's a problem; not
very many of these are allocated.)

Index: varasm.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/varasm.c,v
retrieving revision 1.303
diff -u -d -b -w -r1.303 varasm.c
--- varasm.c 21 Aug 2002 02:41:44 -0000 1.303
+++ varasm.c 4 Sep 2002 17:42:30 -0000
@@ -2167,8 +2167,10 @@
} GTY ((tag ("0"))) di;

/* The max vector size we have is 8 wide. This should be enough. */
- HOST_WIDE_INT veclo[16];
- HOST_WIDE_INT vechi[16];
+ struct rtx_const_vec {
+ HOST_WIDE_INT veclo;
+ HOST_WIDE_INT vechi;
+ } GTY ((tag ("2"))) vec[16];
} GTY ((desc ("%1.kind >= RTX_INT"), descbits ("1"))) un;
};

@@ -2980,13 +2982,13 @@
elt = CONST_VECTOR_ELT (x, i);
if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
{
- value->un.veclo[i] = (HOST_WIDE_INT) INTVAL (elt);
- value->un.vechi[i] = 0;
+ value->un.vec[i].veclo = (HOST_WIDE_INT) INTVAL (elt);
+ value->un.vec[i].vechi = 0;
}
else if (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
{
- value->un.veclo[i] = (HOST_WIDE_INT) CONST_DOUBLE_LOW (elt);
- value->un.vechi[i] = (HOST_WIDE_INT) CONST_DOUBLE_HIGH (elt);
+ value->un.vec[i].veclo = (HOST_WIDE_INT) CONST_DOUBLE_LOW (elt);
+ value->un.vec[i].vechi = (HOST_WIDE_INT) CONST_DOUBLE_HIGH (elt);
}
else
abort ();


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]