This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
RFA: Alternate patch to avoid multiple zero vectos (Was: Re: AltiVec support toasted in HEAD)
- From: Joern Rennecke <joern dot rennecke at superh dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: gcc at gcc dot gnu dot org, Aldy Hernandez <aldyh at redhat dot com>, Daniel Egger <degger at fhm dot edu>, gcc-patches at gcc dot gnu dot org
- Date: Wed, 10 Jul 2002 21:40:11 +0100
- Subject: RFA: Alternate patch to avoid multiple zero vectos (Was: Re: AltiVec support toasted in HEAD)
- Organization: SuperH UK Ltd.
- References: <3D274E50.B18C0D97@superh.com> <20020710083513.A11967@redhat.com>
Thanks for your patch reviews; I've checked in the ones you approved.
Richard Henderson wrote:
>
> On Sat, Jul 06, 2002 at 09:08:48PM +0100, Joern Rennecke wrote:
> > Who is responsible for using const_tiny_rtx, gen_rtx_CONST_VECTOR,
> > or the caller of gen_rtx_CONST_VECTOR ?
>
> As with GEN_INT, aka gen_rtx_CONST_INT, gen_rtx_CONST_VECTOR
> should be doing the canonicalization.
>
> r~
Implemented in the attached patch.
--
--------------------------
SuperH
2430 Aztec West / Almondsbury / BRISTOL / BS32 4AQ
T:+44 1454 462330
Wed Jul 10 21:32:20 2002 J"orn Rennecke <joern.rennecke@superh.com>
* rtl.h (gen_rtx_CONST_VECTOR): Declare.
* gengenrtl.c (special_rtx): Check for CONST_VECTOR.
(gen_rtx_CONST_VECTOR): New function.
(gen_const_vector_0): Use it.
Index: rtl.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/rtl.h,v
retrieving revision 1.363
diff -p -r1.363 rtl.h
*** rtl.h 21 Jun 2002 02:09:11 -0000 1.363
--- rtl.h 10 Jul 2002 20:32:16 -0000
*************** extern GTY(()) rtx return_address_pointe
*** 1712,1717 ****
--- 1712,1718 ----
should also modify gen_rtx to use the special function. */
extern rtx gen_rtx_CONST_INT PARAMS ((enum machine_mode, HOST_WIDE_INT));
+ extern rtx gen_rtx_CONST_VECTOR PARAMS ((enum machine_mode, rtvec));
extern rtx gen_raw_REG PARAMS ((enum machine_mode, int));
extern rtx gen_rtx_REG PARAMS ((enum machine_mode, unsigned));
extern rtx gen_rtx_SUBREG PARAMS ((enum machine_mode, rtx, int));
Index: gengenrtl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gengenrtl.c,v
retrieving revision 1.56
diff -p -r1.56 gengenrtl.c
*** gengenrtl.c 31 May 2002 11:43:18 -0000 1.56
--- gengenrtl.c 10 Jul 2002 20:32:16 -0000
*************** special_rtx (idx)
*** 149,155 ****
return (strcmp (defs[idx].enumname, "CONST_INT") == 0
|| strcmp (defs[idx].enumname, "REG") == 0
|| strcmp (defs[idx].enumname, "SUBREG") == 0
! || strcmp (defs[idx].enumname, "MEM") == 0);
}
/* Return nonzero if the RTL code given by index IDX is one that we should
--- 149,156 ----
return (strcmp (defs[idx].enumname, "CONST_INT") == 0
|| strcmp (defs[idx].enumname, "REG") == 0
|| strcmp (defs[idx].enumname, "SUBREG") == 0
! || strcmp (defs[idx].enumname, "MEM") == 0
! || strcmp (defs[idx].enumname, "CONST_VECTOR") == 0);
}
/* Return nonzero if the RTL code given by index IDX is one that we should
Index: emit-rtl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/emit-rtl.c,v
retrieving revision 1.283
diff -p -r1.283 emit-rtl.c
*** emit-rtl.c 3 Jul 2002 09:49:45 -0000 1.283
--- emit-rtl.c 10 Jul 2002 20:32:16 -0000
*************** gen_const_vector_0 (mode)
*** 5188,5195 ****
for (i = 0; i < units; ++i)
RTVEC_ELT (v, i) = CONST0_RTX (inner);
! tem = gen_rtx_CONST_VECTOR (mode, v);
return tem;
}
/* Create some permanent unique rtl objects shared between all functions.
--- 5188,5211 ----
for (i = 0; i < units; ++i)
RTVEC_ELT (v, i) = CONST0_RTX (inner);
! tem = gen_rtx_raw_CONST_VECTOR (mode, v);
return tem;
+ }
+
+ /* Generate a vector like gen_rtx_raw_CONST_VEC, but use the zero vector when
+ all elements are zero. */
+ rtx
+ gen_rtx_CONST_VECTOR (mode, v)
+ enum machine_mode mode;
+ rtvec v;
+ {
+ rtx inner_zero = CONST0_RTX (GET_MODE_INNER (mode));
+ int i;
+
+ for (i = GET_MODE_NUNITS (mode) - 1; i >= 0; i--)
+ if (RTVEC_ELT (v, i) != inner_zero)
+ return gen_rtx_CONST_VECTOR (mode, v);
+ return CONST0_RTX (mode);
}
/* Create some permanent unique rtl objects shared between all functions.