expr.c (expand_expr_real_1): Only use BLKmode for volatile accesses which are not...
authorJulian Brown <julian@codesourcery.com>
Wed, 23 Mar 2011 11:57:28 +0000 (11:57 +0000)
committerJulian Brown <jules@gcc.gnu.org>
Wed, 23 Mar 2011 11:57:28 +0000 (11:57 +0000)
* expr.c (expand_expr_real_1): Only use BLKmode for volatile
accesses which are not naturally aligned.

From-SVN: r171347

gcc/ChangeLog
gcc/expr.c

index fb754ab629ba5be80078d9900d5abcfb649cbb1a..bf0467272965d277b562d03a6f04264d2ad9b529 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 572f0f4eb6025262937d132a9cba1841e47feb6e..4db1c776ba41c1ef32147ae17eaebc43b67bd9b5 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