Commit d5f7d535 by Richard Earnshaw Committed by Richard Earnshaw

re PR rtl-optimization/54300 (regcprop incorrectly looks through parallel register swap operation)

	PR rtl-optimization/54300

gcc/

	PR rtl-optimization/54300
	* regcprop.c (copyprop_hardreg_forward_1): Ensure any unused
	outputs in a single-set are killed from the value chains.

gcc/testsuite:

	PR rtl-optimization/54300
	* gcc.target/arm/pr54300.C: New test.

From-SVN: r205807
parent e52f6c68
2013-12-09 Richard Earnshaw <rearnsha@arm.com>
* arm.c (mem_ok_for_ldrd_strd): Rename first argument as MEM. Do
more address validation checks.
2013-12-09 Marek Polacek <polacek@redhat.com> 2013-12-09 Marek Polacek <polacek@redhat.com>
PR sanitizer/59415 PR sanitizer/59415
...@@ -15285,28 +15285,37 @@ operands_ok_ldrd_strd (rtx rt, rtx rt2, rtx rn, HOST_WIDE_INT offset, ...@@ -15285,28 +15285,37 @@ operands_ok_ldrd_strd (rtx rt, rtx rt2, rtx rn, HOST_WIDE_INT offset,
} }
/* Helper for gen_operands_ldrd_strd. Returns true iff the memory /* Helper for gen_operands_ldrd_strd. Returns true iff the memory
operand ADDR is an immediate offset from the base register and is operand MEM's address contains an immediate offset from the base
not volatile, in which case it sets BASE and OFFSET register and has no side effects, in which case it sets BASE and
accordingly. */ OFFSET accordingly. */
bool static bool
mem_ok_for_ldrd_strd (rtx addr, rtx *base, rtx *offset) mem_ok_for_ldrd_strd (rtx mem, rtx *base, rtx *offset)
{ {
rtx addr;
gcc_assert (base != NULL && offset != NULL);
/* TODO: Handle more general memory operand patterns, such as /* TODO: Handle more general memory operand patterns, such as
PRE_DEC and PRE_INC. */ PRE_DEC and PRE_INC. */
/* Convert a subreg of mem into mem itself. */ if (side_effects_p (mem))
if (GET_CODE (addr) == SUBREG) return false;
addr = alter_subreg (&addr, true);
gcc_assert (MEM_P (addr));
/* Don't modify volatile memory accesses. */ /* Can't deal with subregs. */
if (MEM_VOLATILE_P (addr)) if (GET_CODE (mem) == SUBREG)
return false; return false;
gcc_assert (MEM_P (mem));
*offset = const0_rtx; *offset = const0_rtx;
addr = XEXP (addr, 0); addr = XEXP (mem, 0);
/* If addr isn't valid for DImode, then we can't handle it. */
if (!arm_legitimate_address_p (DImode, addr,
reload_in_progress || reload_completed))
return false;
if (REG_P (addr)) if (REG_P (addr))
{ {
*base = addr; *base = addr;
......
2013-12-09 Richard Earnshaw <rearnsha@arm.com>
* gcc.target/arm/ldrd-strd-offset.c: New.
2013-12-09 Martin Jambor <mjambor@suse.cz> 2013-12-09 Martin Jambor <mjambor@suse.cz>
* gcc.c-torture/compile/pr39834.c: Remove optimization level option. * gcc.c-torture/compile/pr39834.c: Remove optimization level option.
......
/* { dg-do compile } */
/* { dg-options "-O2" } */
typedef struct
{
int x;
int i, j;
} off_struct;
int foo (char *str, int *a, int b, int c)
{
off_struct *p = (off_struct *)(str + 3);
b = p->i;
c = p->j;
*a = b + c;
return 0;
}
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