From f439f9a536087071b4593eb0dda40eb5cc592c1c Mon Sep 17 00:00:00 2001
From: "J\"orn Rennecke" <joern.rennecke@st.com>
Date: Mon, 12 Sep 2005 13:49:56 +0000
Subject: [PATCH] re PR middle-end/23290 (Layout changed for structure with
 single complex field)

	PR middle-end/23290
	* stor-layout.c (compute_record_mode): For records with a single
	field, actually check the field's mode size against the type size.

From-SVN: r104171
---
 gcc/ChangeLog     | 4 ++++
 gcc/stor-layout.c | 7 ++++---
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 70eb98755004..7d2a74292df9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
 2005-09-12  J"orn Rennecke <joern.rennecke@st.com>
 
+	PR middle-end/23290
+	* stor-layout.c (compute_record_mode): For records with a single
+	field, actually check the field's mode size against the type size.
+
 	* sh.h (HARD_REGNO_MODE_OK): Allow V4SFmode in general purpose
 	registers for TARGET_SHMEDIA.
 	(enum reg_class, REG_CLASS_NAMES, REG_CLASS_CONTENTS): Rename
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index 0ec818d7fbd2..31d8becdac75 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -1367,14 +1367,15 @@ compute_record_mode (tree type)
 #endif /* MEMBER_TYPE_FORCES_BLK  */
     }
 
-  TYPE_MODE (type) = mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1);
-
   /* If we only have one real field; use its mode if that mode's size
      matches the type's size.  This only applies to RECORD_TYPE.  This
      does not apply to unions.  */
   if (TREE_CODE (type) == RECORD_TYPE && mode != VOIDmode
-      && GET_MODE_SIZE (mode) == GET_MODE_SIZE (TYPE_MODE (type)))
+      && host_integerp (TYPE_SIZE (type), 1)
+      && GET_MODE_BITSIZE (mode) == TREE_INT_CST_LOW (TYPE_SIZE (type)))
     TYPE_MODE (type) = mode;
+  else
+    TYPE_MODE (type) = mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1);
 
   /* If structure's known alignment is less than what the scalar
      mode would need, and it matters, then stick with BLKmode.  */
-- 
GitLab