Blob Blame History Raw
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 6dfbb4642..9f30b2749 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -316,6 +316,15 @@ stack_var_conflict_p (size_t x, size_t y)
   struct stack_var *b = &stack_vars[y];
   if (x == y)
     return false;
+  /* GCC 4.8 does not calculate the control flow for setjmp correctly
+     (BZ 56982).  This might lead to merging stack variable slots
+     which in fact are live at the same time.  The following check
+     considers all variables being live across setjmp invocations
+     (these must be marked volatile) to conflict with all other stack
+     variables.  */
+  if (cfun->calls_setjmp
+      && (TREE_THIS_VOLATILE (a->decl) || TREE_THIS_VOLATILE (b->decl)))
+    return true;
   /* Partitions containing an SSA name result from gimple registers
      with things like unsupported modes.  They are top-level and
      hence conflict with everything else.  */