diff --git a/external/gpl3/gcc/dist/gcc/recog.c b/external/gpl3/gcc/dist/gcc/recog.c
index 63cdc237240b..a842496785df 100644
--- a/external/gpl3/gcc/dist/gcc/recog.c
+++ b/external/gpl3/gcc/dist/gcc/recog.c
@@ -1011,8 +1011,12 @@ general_operand (rtx op, machine_mode mode)
 	 might be called from cleanup_subreg_operands.
 
 	 ??? This is a kludge.  */
-      if (!reload_completed && SUBREG_BYTE (op) != 0
-	  && MEM_P (sub))
+      if (!reload_completed
+          && MEM_P (sub)
+          && (SUBREG_BYTE (op) > GET_MODE_SIZE (GET_MODE (sub))
+              || SUBREG_BYTE (op) % GET_MODE_SIZE (mode) != 0
+              )
+          )
 	return 0;
 
 #ifdef CANNOT_CHANGE_MODE_CLASS