--- gcc/expmed.c	2013-07-13 08:19:00.000000000 +0200
+++ gcc/expmed.c	2013-07-13 20:32:03.000000000 +0200
@@ -425,11 +425,9 @@
 {
   unsigned HOST_WIDE_INT modesize = GET_MODE_BITSIZE (fieldmode);
 
-  /* -fstrict-volatile-bitfields must be enabled and we must have a
-     volatile MEM.  */
+  /* We must have a volatile MEM.  */
   if (!MEM_P (op0)
-      || !MEM_VOLATILE_P (op0)
-      || flag_strict_volatile_bitfields <= 0)
+      || !MEM_VOLATILE_P (op0))
     return false;
 
   /* Non-integral modes likely only happen with packed structures.
@@ -442,13 +440,18 @@
   if (bitsize > modesize || modesize > BITS_PER_WORD)
     return false;
 
+  if (warn_portable_volatility)
+    warning_at (input_location, OPT_Wportable_volatility,
+		"the code to accesses this volatile member is dependent on whether -fstrict-volatile-bitfields is used;"
+		" accessing device registers may depend on this option however it contradicts the C11/C++11 memory model");
+
   /* Check for cases of unaligned fields that must be split.  */
   if (bitnum % BITS_PER_UNIT + bitsize > modesize
       || (STRICT_ALIGNMENT
 	  && bitnum % GET_MODE_ALIGNMENT (fieldmode) + bitsize > modesize))
     return false;
 
-  return true;
+  return flag_strict_volatile_bitfields > 0;
 }
 
 /* Return true if OP is a memory and if a bitfield of size BITSIZE at
--- gcc/c-family/c.opt	2013-05-28 21:55:10.000000000 +0200
+++ gcc/c-family/c.opt	2013-07-13 11:02:38.000000000 +0200
@@ -629,6 +629,10 @@
 C ObjC Var(warn_pointer_to_int_cast) Init(1) Warning
 Warn when a pointer is cast to an integer of a different size
 
+Wportable-volatility
+C ObjC C++ ObjC++ Var(warn_portable_volatility) Warning
+Warn about code for which separate incompatible definitions exist even within gcc
+
 Wpragmas
 C ObjC C++ ObjC++ Var(warn_pragmas) Init(1) Warning
 Warn about misuses of pragmas
--- gcc/doc/invoke.texi	2013-07-13 08:19:28.000000000 +0200
+++ gcc/doc/invoke.texi	2013-07-13 17:57:10.000000000 +0200
@@ -258,7 +258,7 @@
 -Wno-multichar  -Wnonnull  -Wno-overflow @gol
 -Woverlength-strings  -Wpacked  -Wpacked-bitfield-compat  -Wpadded @gol
 -Wparentheses  -Wpedantic-ms-format -Wno-pedantic-ms-format @gol
--Wpointer-arith  -Wno-pointer-to-int-cast @gol
+-Wpointer-arith  -Wno-pointer-to-int-cast  -Wportable-volatility @gol
 -Wredundant-decls  -Wno-return-local-addr @gol
 -Wreturn-type  -Wsequence-point  -Wshadow @gol
 -Wsign-compare  -Wsign-conversion  -Wsizeof-pointer-memaccess @gol
@@ -4817,6 +4817,14 @@
 Suppress warnings from casts from a pointer to an integer type of a
 different size.
 
+@item -Wportable-volatility
+@opindex Wportable-volatility
+@opindex Wno-portable-volatility
+Warn about code to access volatile structure members which is
+dependent on whether -fstrict-volatile-bitfields is used.
+Accessing device registers may depend on this option
+however it contradicts the C11/C++11 memory model.
+
 @item -Winvalid-pch
 @opindex Winvalid-pch
 @opindex Wno-invalid-pch
