re PR middle-end/6963 (Linux kernel miscompile due to clobbered MEM_SIZE)
authorUlrich Weigand <uweigand@de.ibm.com>
Sat, 22 Jun 2002 14:26:53 +0000 (14:26 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Sat, 22 Jun 2002 14:26:53 +0000 (14:26 +0000)
PR middle-end/6963
* function.c (assign_stack_temp_for_type): Do not return
the same MEM rtx for multiple uses of a stack slot.

From-SVN: r54912

gcc/ChangeLog
gcc/function.c

index f4c29d9720bfb65e8952047fe16aebf8b6b6a5f7..261874de79468f07d31e71017f2fdf84bf031b38 100644 (file)
@@ -1,3 +1,9 @@
+2002-06-22  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       PR middle-end/6963
+       * function.c (assign_stack_temp_for_type): Do not return
+       the same MEM rtx for multiple uses of a stack slot.
+
 2002-06-22  David S. Miller  <davem@redhat.com>
 
        PR target/6841 target/6770 target/6719
index 4a963dc5fae0337e310fc0536b4f85cc6716285b..b2008b184f5c02316697a48c528f5e2f85984889 100644 (file)
@@ -642,6 +642,7 @@ assign_stack_temp_for_type (mode, size, keep, type)
 {
   unsigned int align;
   struct temp_slot *p, *best_p = 0;
+  rtx slot;
 
   /* If SIZE is -1 it means that somebody tried to allocate a temporary
      of a variable size.  */
@@ -787,29 +788,26 @@ assign_stack_temp_for_type (mode, size, keep, type)
       p->keep = keep;
     }
 
-  /* We may be reusing an old slot, so clear any MEM flags that may have been
-     set from before.  */
-  RTX_UNCHANGING_P (p->slot) = 0;
-  MEM_IN_STRUCT_P (p->slot) = 0;
-  MEM_SCALAR_P (p->slot) = 0;
-  MEM_VOLATILE_P (p->slot) = 0;
-  set_mem_alias_set (p->slot, 0);
+
+  /* Create a new MEM rtx to avoid clobbering MEM flags of old slots.  */
+  slot = gen_rtx_MEM (mode, XEXP (p->slot, 0));
+  stack_slot_list = gen_rtx_EXPR_LIST (VOIDmode, slot, stack_slot_list);
 
   /* If we know the alias set for the memory that will be used, use
      it.  If there's no TYPE, then we don't know anything about the
      alias set for the memory.  */
-  set_mem_alias_set (p->slot, type ? get_alias_set (type) : 0);
-  set_mem_align (p->slot, align);
+  set_mem_alias_set (slot, type ? get_alias_set (type) : 0);
+  set_mem_align (slot, align);
 
   /* If a type is specified, set the relevant flags.  */
   if (type != 0)
     {
-      RTX_UNCHANGING_P (p->slot) = TYPE_READONLY (type);
-      MEM_VOLATILE_P (p->slot) = TYPE_VOLATILE (type);
-      MEM_SET_IN_STRUCT_P (p->slot, AGGREGATE_TYPE_P (type));
+      RTX_UNCHANGING_P (slot) = TYPE_READONLY (type);
+      MEM_VOLATILE_P (slot) = TYPE_VOLATILE (type);
+      MEM_SET_IN_STRUCT_P (slot, AGGREGATE_TYPE_P (type));
     }
 
-  return p->slot;
+  return slot;
 }
 
 /* Allocate a temporary stack slot and record it for possible later