mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-24 04:10:29 +08:00
re PR rtl-optimization/79032 (unaligned memory access generated with LRA and optimization)
PR rtl-optimization/79032 * lra-constraints.c (simplify_operand_subreg): In the MEM case, test the alignment of the adjusted memory reference against that of MODE, instead of the alignment of the original memory reference. From-SVN: r244311
This commit is contained in:
parent
e325277522
commit
849fccf831
@ -1,3 +1,10 @@
|
||||
2017-01-11 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
PR rtl-optimization/79032
|
||||
* lra-constraints.c (simplify_operand_subreg): In the MEM case, test
|
||||
the alignment of the adjusted memory reference against that of MODE,
|
||||
instead of the alignment of the original memory reference.
|
||||
|
||||
2017-01-11 Martin Jambor <mjambor@suse.cz>
|
||||
|
||||
* hsa.c (hsa_callable_function_p): Revert addition of DECL_ARTIFICIAL
|
||||
|
@ -1505,15 +1505,15 @@ simplify_operand_subreg (int nop, machine_mode reg_mode)
|
||||
MEM_ADDR_SPACE (subst))))
|
||||
{
|
||||
/* If we change the address for a paradoxical subreg of memory, the
|
||||
address might violate the necessary alignment or the access might
|
||||
be slow. So take this into consideration. We need not worry
|
||||
new address might violate the necessary alignment or the access
|
||||
might be slow; take this into consideration. We need not worry
|
||||
about accesses beyond allocated memory for paradoxical memory
|
||||
subregs as we don't substitute such equiv memory (see processing
|
||||
equivalences in function lra_constraints) and because for spilled
|
||||
pseudos we allocate stack memory enough for the biggest
|
||||
corresponding paradoxical subreg. */
|
||||
if (!(MEM_ALIGN (reg) < GET_MODE_ALIGNMENT (mode)
|
||||
&& SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (reg)))
|
||||
if (!(MEM_ALIGN (subst) < GET_MODE_ALIGNMENT (mode)
|
||||
&& SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (subst)))
|
||||
|| (MEM_ALIGN (reg) < GET_MODE_ALIGNMENT (innermode)
|
||||
&& SLOW_UNALIGNED_ACCESS (innermode, MEM_ALIGN (reg))))
|
||||
return true;
|
||||
|
@ -1,3 +1,7 @@
|
||||
2017-01-11 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gcc.c-torture/execute/20170111-1.c: New test.
|
||||
|
||||
2017-01-11 Richard Biener <rguenther@suse.de>
|
||||
|
||||
* gcc.dg/tree-ssa/pr61743-1.c: Adjust.
|
||||
|
33
gcc/testsuite/gcc.c-torture/execute/20170111-1.c
Normal file
33
gcc/testsuite/gcc.c-torture/execute/20170111-1.c
Normal file
@ -0,0 +1,33 @@
|
||||
/* PR rtl-optimization/79032 */
|
||||
/* Reported by Daniel Cederman <cederman@gaisler.com> */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
struct S {
|
||||
short a;
|
||||
long long b;
|
||||
short c;
|
||||
char d;
|
||||
unsigned short e;
|
||||
long *f;
|
||||
};
|
||||
|
||||
static long foo (struct S *s) __attribute__((noclone, noinline));
|
||||
|
||||
static long foo (struct S *s)
|
||||
{
|
||||
long a = 1;
|
||||
a /= s->e;
|
||||
s->f[a]--;
|
||||
return a;
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
long val = 1;
|
||||
struct S s = { 0, 0, 0, 0, 2, &val };
|
||||
val = foo (&s);
|
||||
if (val != 0)
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user