re PR debug/54796 (Non-addressable stack parameter debug quality regression)

PR debug/54796
	* rtl.h: Document jump flag on VALUE.
	* cselib.h (cselib_set_value_sp_based,
	cselib_sp_based_value_p): New prototypes.
	* alias.c (find_base_term): For cselib_sp_based_value_p
	return static_reg_base_value[STACK_POINTER_REGNUM].
	* cselib.c (SP_BASED_VALUE_P): Define.
	(cselib_set_value_sp_based, cselib_sp_based_value_p): New functions.
	* var-tracking.c (add_stores): Call cselib_set_value_sp_based
	for not yet preserved VALUEs of sp on sp assignments if
	hard_frame_pointer_adjustment != -1.
	(vt_initialize): When setting hard_frame_pointer_adjustment,
	disassociate sp from its previous value and call
	cselib_set_value_sp_based on a new VALUE created for sp.

	* gcc.dg/guality/pr54796.c: New test.

From-SVN: r192494
This commit is contained in:
Jakub Jelinek 2012-10-16 13:21:20 +02:00 committed by Jakub Jelinek
parent cded4e9ed7
commit 0fe03ac318
8 changed files with 89 additions and 1 deletions

View File

@ -1,5 +1,20 @@
2012-10-16 Jakub Jelinek <jakub@redhat.com>
PR debug/54796
* rtl.h: Document jump flag on VALUE.
* cselib.h (cselib_set_value_sp_based,
cselib_sp_based_value_p): New prototypes.
* alias.c (find_base_term): For cselib_sp_based_value_p
return static_reg_base_value[STACK_POINTER_REGNUM].
* cselib.c (SP_BASED_VALUE_P): Define.
(cselib_set_value_sp_based, cselib_sp_based_value_p): New functions.
* var-tracking.c (add_stores): Call cselib_set_value_sp_based
for not yet preserved VALUEs of sp on sp assignments if
hard_frame_pointer_adjustment != -1.
(vt_initialize): When setting hard_frame_pointer_adjustment,
disassociate sp from its previous value and call
cselib_set_value_sp_based on a new VALUE created for sp.
PR tree-optimization/54889
* tree-vect-stmts.c (vectorizable_load): Add VIEW_CONVERT_EXPR if
ARRAY_REF newref doesn't have compatible type with vectype element

View File

@ -1640,6 +1640,9 @@ find_base_term (rtx x)
if (!val)
return ret;
if (cselib_sp_based_value_p (val))
return static_reg_base_value[STACK_POINTER_REGNUM];
f = val->locs;
/* Temporarily reset val->locs to avoid infinite recursion. */
val->locs = NULL;

View File

@ -210,6 +210,9 @@ void (*cselib_record_sets_hook) (rtx insn, struct cselib_set *sets,
#define PRESERVED_VALUE_P(RTX) \
(RTL_FLAG_CHECK1("PRESERVED_VALUE_P", (RTX), VALUE)->unchanging)
#define SP_BASED_VALUE_P(RTX) \
(RTL_FLAG_CHECK1("SP_BASED_VALUE_P", (RTX), VALUE)->jump)
/* Allocate a struct elt_list and fill in its two elements with the
@ -739,6 +742,24 @@ cselib_preserve_only_values (void)
gcc_assert (first_containing_mem == &dummy_val);
}
/* Arrange for a value to be marked as based on stack pointer
for find_base_term purposes. */
void
cselib_set_value_sp_based (cselib_val *v)
{
SP_BASED_VALUE_P (v->val_rtx) = 1;
}
/* Test whether a value is based on stack pointer for
find_base_term purposes. */
bool
cselib_sp_based_value_p (cselib_val *v)
{
return SP_BASED_VALUE_P (v->val_rtx);
}
/* Return the mode in which a register was last set. If X is not a
register, return its mode. If the mode in which the register was
set is not known, or the value was already clobbered, return

View File

@ -99,6 +99,8 @@ extern void cselib_preserve_only_values (void);
extern void cselib_preserve_cfa_base_value (cselib_val *, unsigned int);
extern void cselib_add_permanent_equiv (cselib_val *, rtx, rtx);
extern bool cselib_have_permanent_equivalences (void);
extern void cselib_set_value_sp_based (cselib_val *);
extern bool cselib_sp_based_value_p (cselib_val *);
extern void dump_cselib_table (FILE *);

View File

@ -267,7 +267,8 @@ struct GTY((chain_next ("RTX_NEXT (&%h)"),
1 in a CALL_INSN if it is a sibling call.
1 in a SET that is for a return.
In a CODE_LABEL, part of the two-bit alternate entry field.
1 in a CONCAT is VAL_EXPR_IS_COPIED in var-tracking.c. */
1 in a CONCAT is VAL_EXPR_IS_COPIED in var-tracking.c.
1 in a VALUE is SP_BASED_VALUE_P in cselib.c. */
unsigned int jump : 1;
/* In a CODE_LABEL, part of the two-bit alternate entry field.
1 in a MEM if it cannot trap.

View File

@ -1,5 +1,8 @@
2012-10-16 Jakub Jelinek <jakub@redhat.com>
PR debug/54796
* gcc.dg/guality/pr54796.c: New test.
PR tree-optimization/54889
* gfortran.dg/pr54889.f90: New test.

View File

@ -0,0 +1,25 @@
/* PR debug/54796 */
/* { dg-do run } */
/* { dg-options "-g" } */
__attribute__((noinline, noclone)) void
bar (char *a, int b)
{
__asm volatile ("" : "+r" (a), "+r" (b) : : "memory");
}
__attribute__((noinline, noclone)) void
foo (int a, int b)
{
int c = a;
char d[b]; /* { dg-final { gdb-test 17 "a" "5" } } */
bar (d, 2); /* { dg-final { gdb-test 17 "b" "6" } } */
bar (d, 4); /* { dg-final { gdb-test 17 "c" "5" } } */
}
int
main ()
{
foo (5, 6);
return 0;
}

View File

@ -5769,6 +5769,11 @@ add_stores (rtx loc, const_rtx expr, void *cuip)
resolve = preserve = !cselib_preserved_value_p (v);
if (loc == stack_pointer_rtx
&& hard_frame_pointer_adjustment != -1
&& preserve)
cselib_set_value_sp_based (v);
nloc = replace_expr_with_values (oloc);
if (nloc)
oloc = nloc;
@ -9867,6 +9872,19 @@ vt_initialize (void)
{
vt_init_cfa_base ();
hard_frame_pointer_adjustment = fp_cfa_offset;
/* Disassociate sp from fp now. */
if (MAY_HAVE_DEBUG_INSNS)
{
cselib_val *v;
cselib_invalidate_rtx (stack_pointer_rtx);
v = cselib_lookup (stack_pointer_rtx, Pmode, 1,
VOIDmode);
if (v && !cselib_preserved_value_p (v))
{
cselib_set_value_sp_based (v);
preserve_value (v);
}
}
}
}
}