Pulled from http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01477.html

Upstream-Status: Backport

Signed-off-by: Saul Wold <sgw@linux.intel.com>

    gcc/
    * expr.c (expand_expr_real_1): Only use BLKmode for volatile
    accesses which are not naturally aligned.

Index: gcc-4.6.0/gcc/expr.c
===================================================================
--- gcc-4.6.0.orig/gcc/expr.c	2011-06-01 15:28:55.000000000 -0700
+++ gcc-4.6.0/gcc/expr.c	2011-06-01 15:41:17.154848182 -0700
@@ -9178,8 +9178,11 @@
 		&& 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
