re PR tree-optimization/89111 (wrong code at -O1 and above on x86_64-linux-gnu)

2019-01-30  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/89111
	* tree-ssa-loop-im.c (gather_mem_refs_stmt): Restrict
	canonicalization to appropriately sized access types.

	* gcc.dg/torture/pr89111.c: New testcase.

From-SVN: r268388
This commit is contained in:
Richard Biener 2019-01-30 12:41:13 +00:00 committed by Richard Biener
parent 8c11f2693e
commit 79977c82ff
4 changed files with 46 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2019-01-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/89111
* tree-ssa-loop-im.c (gather_mem_refs_stmt): Restrict
canonicalization to appropriately sized access types.
2019-01-30 Jakub Jelinek <jakub@redhat.com>
PR c++/89105

View File

@ -1,7 +1,11 @@
2019-01-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/89111
* gcc.dg/torture/pr89111.c: New testcase.
2019-01-30 Andrew Stubbs <ams@codesourcery.com>
PR testsuite/88920
* lib/target-supports.exp: Cache result.
2019-01-30 Jakub Jelinek <jakub@redhat.com>

View File

@ -0,0 +1,30 @@
/* { dg-do run } */
/* { dg-require-effective-target int32plus } */
struct __attribute__((packed)) A { int b : 24; } c[243], f;
int d, e, g, j;
__attribute__((noipa)) int
foo (int x)
{
if (x != 0)
__builtin_abort ();
return 2;
}
int
main ()
{
struct A h = f;
h.b = 0;
while (e++ < 3)
{
while (d++ < 3)
c[46].b ^= 9890739;
f = c[46] = h;
}
while (g++ < 9)
j = foo (c[g * 9 + j].b);
return 0;
}

View File

@ -1472,6 +1472,11 @@ gather_mem_refs_stmt (struct loop *loop, gimple *stmt)
&& aor.max_size.is_constant (&max_size)
&& size == max_size
&& (size % BITS_PER_UNIT) == 0
/* We're canonicalizing to a MEM where TYPE_SIZE specifies the
size. Make sure this is consistent with the extraction. */
&& poly_int_tree_p (TYPE_SIZE (TREE_TYPE (*mem)))
&& known_eq (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (*mem))),
aor.size)
&& (mem_base = get_addr_base_and_unit_offset (aor.ref, &mem_off)))
{
hash = iterative_hash_expr (ao_ref_base (&aor), 0);