Commit faa964e5 by Ulrich Weigand Committed by Ulrich Weigand

re PR middle-end/6963 (Linux kernel miscompile due to clobbered MEM_SIZE)

	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
parent 7ae3e57c
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> 2002-06-22 David S. Miller <davem@redhat.com>
PR target/6841 target/6770 target/6719 PR target/6841 target/6770 target/6719
......
...@@ -642,6 +642,7 @@ assign_stack_temp_for_type (mode, size, keep, type) ...@@ -642,6 +642,7 @@ assign_stack_temp_for_type (mode, size, keep, type)
{ {
unsigned int align; unsigned int align;
struct temp_slot *p, *best_p = 0; struct temp_slot *p, *best_p = 0;
rtx slot;
/* If SIZE is -1 it means that somebody tried to allocate a temporary /* If SIZE is -1 it means that somebody tried to allocate a temporary
of a variable size. */ of a variable size. */
...@@ -787,29 +788,26 @@ assign_stack_temp_for_type (mode, size, keep, type) ...@@ -787,29 +788,26 @@ assign_stack_temp_for_type (mode, size, keep, type)
p->keep = keep; p->keep = keep;
} }
/* We may be reusing an old slot, so clear any MEM flags that may have been
set from before. */ /* Create a new MEM rtx to avoid clobbering MEM flags of old slots. */
RTX_UNCHANGING_P (p->slot) = 0; slot = gen_rtx_MEM (mode, XEXP (p->slot, 0));
MEM_IN_STRUCT_P (p->slot) = 0; stack_slot_list = gen_rtx_EXPR_LIST (VOIDmode, slot, stack_slot_list);
MEM_SCALAR_P (p->slot) = 0;
MEM_VOLATILE_P (p->slot) = 0;
set_mem_alias_set (p->slot, 0);
/* If we know the alias set for the memory that will be used, use /* 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 it. If there's no TYPE, then we don't know anything about the
alias set for the memory. */ alias set for the memory. */
set_mem_alias_set (p->slot, type ? get_alias_set (type) : 0); set_mem_alias_set (slot, type ? get_alias_set (type) : 0);
set_mem_align (p->slot, align); set_mem_align (slot, align);
/* If a type is specified, set the relevant flags. */ /* If a type is specified, set the relevant flags. */
if (type != 0) if (type != 0)
{ {
RTX_UNCHANGING_P (p->slot) = TYPE_READONLY (type); RTX_UNCHANGING_P (slot) = TYPE_READONLY (type);
MEM_VOLATILE_P (p->slot) = TYPE_VOLATILE (type); MEM_VOLATILE_P (slot) = TYPE_VOLATILE (type);
MEM_SET_IN_STRUCT_P (p->slot, AGGREGATE_TYPE_P (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 /* Allocate a temporary stack slot and record it for possible later
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment