Commit 8c996ec6 by Richard Biener Committed by Richard Biener

re PR tree-optimization/56049 (Simplification to constants not done)

2019-04-16  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/56049
	* tree-ssa-loop-im.c (mem_ref_hasher::equal): Elide alias-set
	equality check if alias-set zero will prevail.

	* gfortran.dg/pr56049.f90: New testcase.

From-SVN: r270378
parent 5d71d6f2
2019-04-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/56049
* tree-ssa-loop-im.c (mem_ref_hasher::equal): Elide alias-set
equality check if alias-set zero will prevail.
2019-04-15 Jeff Law <law@redhat.com> 2019-04-15 Jeff Law <law@redhat.com>
* config/microblaze/microblaze.c (microblaze_expand_block_move): Treat * config/microblaze/microblaze.c (microblaze_expand_block_move): Treat
......
2019-04-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/56049
* gfortran.dg/pr56049.f90: New testcase.
2019-04-15 Richard Biener <rguenther@suse.de> 2019-04-15 Richard Biener <rguenther@suse.de>
PR debug/90074 PR debug/90074
......
! { dg-do compile }
! { dg-options "-O3 -fdump-tree-optimized" }
program inline
integer i
integer a(8,8), b(8,8)
a = 0
do i = 1, 10000000
call add(b, a, 1)
a = b
end do
print *, a
contains
subroutine add(b, a, o)
integer, intent(inout) :: b(8,8)
integer, intent(in) :: a(8,8), o
b = a + o
end subroutine add
end program inline
! Check there's no loop left, just two bb 2 in two functions.
! { dg-final { scan-tree-dump-times "<bb \[0-9\]*>" 2 "optimized" } }
! { dg-final { scan-tree-dump-times "<bb 2>" 2 "optimized" } }
...@@ -178,7 +178,17 @@ mem_ref_hasher::equal (const im_mem_ref *mem1, const ao_ref *obj2) ...@@ -178,7 +178,17 @@ mem_ref_hasher::equal (const im_mem_ref *mem1, const ao_ref *obj2)
&& known_eq (mem1->mem.size, obj2->size) && known_eq (mem1->mem.size, obj2->size)
&& known_eq (mem1->mem.max_size, obj2->max_size) && known_eq (mem1->mem.max_size, obj2->max_size)
&& mem1->mem.volatile_p == obj2->volatile_p && mem1->mem.volatile_p == obj2->volatile_p
&& mem1->mem.ref_alias_set == obj2->ref_alias_set && (mem1->mem.ref_alias_set == obj2->ref_alias_set
/* We are not canonicalizing alias-sets but for the
special-case we didn't canonicalize yet and the
incoming ref is a alias-set zero MEM we pick
the correct one already. */
|| (!mem1->ref_canonical
&& (TREE_CODE (obj2->ref) == MEM_REF
|| TREE_CODE (obj2->ref) == TARGET_MEM_REF)
&& obj2->ref_alias_set == 0)
/* Likewise if there's a canonical ref with alias-set zero. */
|| (mem1->ref_canonical && mem1->mem.ref_alias_set == 0))
&& types_compatible_p (TREE_TYPE (mem1->mem.ref), && types_compatible_p (TREE_TYPE (mem1->mem.ref),
TREE_TYPE (obj2->ref))); TREE_TYPE (obj2->ref)));
else else
......
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