aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2004-07-11 04:11:36 -0700
committerRichard Henderson <rth@gcc.gnu.org>2004-07-11 04:11:36 -0700
commit7e7d1b4b3f489aa357f5ba5979712bd2420ffd50 (patch)
tree1944207e0dcb55583dec29eca431076b6c360928 /gcc
parent370b733b3c102b9cb5d1f22bf3198cd362fa8f34 (diff)
downloadgcc-7e7d1b4b3f489aa357f5ba5979712bd2420ffd50.zip
gcc-7e7d1b4b3f489aa357f5ba5979712bd2420ffd50.tar.gz
gcc-7e7d1b4b3f489aa357f5ba5979712bd2420ffd50.tar.bz2
expr.c (store_expr): Don't fiddle subreg promotion for types with precision smaller than the mode.
* expr.c (store_expr): Don't fiddle subreg promotion for types with precision smaller than the mode. From-SVN: r84501
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/expr.c5
2 files changed, 9 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b6d3bdf..295dba3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-07-11 Richard Henderson <rth@redhat.com>
+
+ * expr.c (store_expr): Don't fiddle subreg promotion for types
+ with precision smaller than the mode.
+
2004-07-11 Joseph S. Myers <jsm@polyomino.org.uk>
* tree.h (all_types_permanent): Remove.
diff --git a/gcc/expr.c b/gcc/expr.c
index 6806f1f..f9c6548 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -4144,7 +4144,10 @@ store_expr (tree exp, rtx target, int want_value)
more than just converting modes. */
if ((want_value & 1) == 0
&& INTEGRAL_TYPE_P (TREE_TYPE (exp))
- && TREE_TYPE (TREE_TYPE (exp)) == 0)
+ && TREE_TYPE (TREE_TYPE (exp)) == 0
+ && (!lang_hooks.reduce_bit_field_operations
+ || (GET_MODE_PRECISION (GET_MODE (target))
+ == TYPE_PRECISION (TREE_TYPE (exp)))))
{
if (TYPE_UNSIGNED (TREE_TYPE (exp))
!= SUBREG_PROMOTED_UNSIGNED_P (target))