diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 711a231eed6bc82d1404174e77694791dc141f2f..11314a1f7f0a95c6d178944d93e30f674426efde 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+Thu Jul 11 11:31:12 2002  J"orn Rennecke <joern.rennecke@superh.com>
+
+	* rtl.h (gen_rtx_CONST_VECTOR): Declare.
+	* gengenrtl.c (special_rtx): Check for CONST_VECTOR.
+	* emit-rtl.c (gen_rtx_CONST_VECTOR): New function.
+	(gen_const_vector_0): Use it.
+
 2002-07-11  John David Anglin  <dave@hiauly1.hia.nrc.ca>
 
 	* pa.md (adddi3): For 32-bit targets, force constants to a register
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 0ee4f117f352f888c20f46db77d8b4033beb4143..eedea4a4e4a8d9b700e7c39b86b1ebbb82ef59dc 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -5188,10 +5188,26 @@ gen_const_vector_0 (mode)
   for (i = 0; i < units; ++i)
     RTVEC_ELT (v, i) = CONST0_RTX (inner);
 
-  tem = gen_rtx_CONST_VECTOR (mode, v);
+  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_raw_CONST_VECTOR (mode, v);
+  return CONST0_RTX (mode);
+}
+
 /* Create some permanent unique rtl objects shared between all functions.
    LINE_NUMBERS is nonzero if line numbers are to be generated.  */
 
diff --git a/gcc/gengenrtl.c b/gcc/gengenrtl.c
index 31e5910f2377e4efb36a4d64d654c86e5fb3b1e1..126be8ead28cbe6f592540cc69bd00c020b15894 100644
--- a/gcc/gengenrtl.c
+++ b/gcc/gengenrtl.c
@@ -149,7 +149,8 @@ special_rtx (idx)
   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, "MEM") == 0
+	  || strcmp (defs[idx].enumname, "CONST_VECTOR") == 0);
 }
 
 /* Return nonzero if the RTL code given by index IDX is one that we should
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 0fba875aa031f16db23a3d0686ae9e87f5d6465c..31032b6e2177f2b2ad49105ae45abe827bf993c9 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1712,6 +1712,7 @@ extern GTY(()) rtx return_address_pointer_rtx;
    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));