Pulled from http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01477.html Upstream-Status: Backport Signed-off-by: Saul Wold 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