OSDN Git Service

* expr.c (expand_expr_real_1): Only use BLKmode for volatile
authorjules <jules@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 Mar 2011 11:57:28 +0000 (11:57 +0000)
committerjules <jules@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 Mar 2011 11:57:28 +0000 (11:57 +0000)
accesses which are not naturally aligned.

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

gcc/ChangeLog
gcc/expr.c

index fb754ab..bf04672 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-23  Julian Brown  <julian@codesourcery.com>
+
+       * expr.c (expand_expr_real_1): Only use BLKmode for volatile
+       accesses which are not naturally aligned.
+
 2011-03-23  Richard Sandiford  <richard.sandiford@linaro.org>
 
        PR target/47553
index 572f0f4..4db1c77 100644 (file)
@@ -9147,8 +9147,11 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
                && modifier != EXPAND_CONST_ADDRESS
                && modifier != EXPAND_INITIALIZER)
            /* If the field is volatile, we always want an aligned
-              access.  */
-           || (volatilep && flag_strict_volatile_bitfields > 0)
+              access.  Only do this if the access is not already naturally
+              aligned, otherwise "normal" (non-bitfield) volatile fields
+              become non-addressable.  */
+           || (volatilep && flag_strict_volatile_bitfields > 0
+               && (bitpos % GET_MODE_ALIGNMENT (mode) != 0))
            /* If the field isn't aligned enough to fetch as a memref,
               fetch it as a bit field.  */
            || (mode1 != BLKmode