From 1d5fa6b42508d546fe875bb6809e645523f01e70 Mon Sep 17 00:00:00 2001
From: "J\"orn Rennecke" <joern.rennecke@superh.com>
Date: Tue, 23 Jul 2002 19:57:42 +0000
Subject: [PATCH] simplify-rtx.x (simplify_subreg): When constructing a
 CONST_VECTOR from individual subregs...

	* simplify-rtx.x (simplify_subreg): When constructing a CONST_VECTOR
	from individual subregs, check that each subreg has been generated
	sucessfully.

From-SVN: r55686
---
 gcc/ChangeLog      | 6 ++++++
 gcc/simplify-rtx.c | 9 ++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 90bf680648c9..36d45caec217 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Tue Jul 23 20:56:03 2002  J"orn Rennecke <joern.rennecke@superh.com>
+
+	* simplify-rtx.x (simplify_subreg): When constructing a CONST_VECTOR
+	from individual subregs, check that each subreg has been generated
+	sucessfully.
+
 2002-07-23  Neil Booth  <neil@daikokuya.co.uk>
 
 	* genautomata.c (VLA_HWINT_SHORTEN, VLA_HWINT_LAST): Remove.
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index c69084f70277..d07de68d223f 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -2367,10 +2367,17 @@ simplify_subreg (outermode, op, innermode, byte)
 	  int subsize = GET_MODE_UNIT_SIZE (outermode);
 	  int i, elts = GET_MODE_NUNITS (outermode);
 	  rtvec v = rtvec_alloc (elts);
+	  rtx elt;
 
 	  for (i = 0; i < elts; i++, byte += subsize)
 	    {
-	      RTVEC_ELT (v, i) = simplify_subreg (submode, op, innermode, byte);
+	      /* This might fail, e.g. if taking a subreg from a SYMBOL_REF.  */
+	      /* ??? It would be nice if we could actually make such subregs
+		 on targets that allow such relocations.  */
+	      elt = simplify_subreg (submode, op, innermode, byte);
+	      if (! elt)
+		return NULL_RTX;
+	      RTVEC_ELT (v, i) = elt;
 	    }
 	  return gen_rtx_CONST_VECTOR (outermode, v);
 	}
-- 
GitLab