diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 70eb9875500493370d838dd05021b66bae21a733..7d2a74292df9d192a177f3d0390f95dcc0bb9c8a 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 0ec818d7fbd26f5d23d1d8c98d450bd0710bbdbb..31d8becdac759ad26fa5b3f6b39e99609c9a82fe 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.  */