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> 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 PR tree-optimization/54889
* tree-vect-stmts.c (vectorizable_load): Add VIEW_CONVERT_EXPR if * tree-vect-stmts.c (vectorizable_load): Add VIEW_CONVERT_EXPR if
ARRAY_REF newref doesn't have compatible type with vectype element ARRAY_REF newref doesn't have compatible type with vectype element

View File

@ -1640,6 +1640,9 @@ find_base_term (rtx x)
if (!val) if (!val)
return ret; return ret;
if (cselib_sp_based_value_p (val))
return static_reg_base_value[STACK_POINTER_REGNUM];
f = val->locs; f = val->locs;
/* Temporarily reset val->locs to avoid infinite recursion. */ /* Temporarily reset val->locs to avoid infinite recursion. */
val->locs = NULL; 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) \ #define PRESERVED_VALUE_P(RTX) \
(RTL_FLAG_CHECK1("PRESERVED_VALUE_P", (RTX), VALUE)->unchanging) (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 /* 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); 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 /* 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 register, return its mode. If the mode in which the register was
set is not known, or the value was already clobbered, return 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_preserve_cfa_base_value (cselib_val *, unsigned int);
extern void cselib_add_permanent_equiv (cselib_val *, rtx, rtx); extern void cselib_add_permanent_equiv (cselib_val *, rtx, rtx);
extern bool cselib_have_permanent_equivalences (void); 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 *); 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 CALL_INSN if it is a sibling call.
1 in a SET that is for a return. 1 in a SET that is for a return.
In a CODE_LABEL, part of the two-bit alternate entry field. 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; unsigned int jump : 1;
/* In a CODE_LABEL, part of the two-bit alternate entry field. /* In a CODE_LABEL, part of the two-bit alternate entry field.
1 in a MEM if it cannot trap. 1 in a MEM if it cannot trap.

View File

@ -1,5 +1,8 @@
2012-10-16 Jakub Jelinek <jakub@redhat.com> 2012-10-16 Jakub Jelinek <jakub@redhat.com>
PR debug/54796
* gcc.dg/guality/pr54796.c: New test.
PR tree-optimization/54889 PR tree-optimization/54889
* gfortran.dg/pr54889.f90: New test. * 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); 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); nloc = replace_expr_with_values (oloc);
if (nloc) if (nloc)
oloc = nloc; oloc = nloc;
@ -9867,6 +9872,19 @@ vt_initialize (void)
{ {
vt_init_cfa_base (); vt_init_cfa_base ();
hard_frame_pointer_adjustment = fp_cfa_offset; 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);
}
}
} }
} }
} }