PR middle-end/23290
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Sep 2005 13:49:56 +0000 (13:49 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Sep 2005 13:49:56 +0000 (13:49 +0000)
* stor-layout.c (compute_record_mode): For records with a single
field, actually check the field's mode size against the type size.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@104171 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/stor-layout.c

index 70eb987..7d2a742 100644 (file)
@@ -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
index 0ec818d..31d8bec 100644 (file)
@@ -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.  */