mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-20 12:41:17 +08:00
Don't use PHI equivalences in range-on-entry.
If there is only one argument to a PHI which is defined, an equivalency is created between the def and the argument. It is safe to consider the def equal to the argument, but it is dangerous to assume the argument is also equivalent to the def as there may be branches which change the range on the path to the PHI on that argument This patch avoid using that relation in range-on-entry calculations. PR tree-optimization/108139 gcc/ * gimple-range-cache.cc (ranger_cache::fill_block_cache): Do not use equivalences originating from PHIS. gcc/testsuite/ * gcc.dg/pr108139.c: New.
This commit is contained in:
parent
05b7cf52e1
commit
0bdd2261c2
@ -1235,6 +1235,13 @@ ranger_cache::fill_block_cache (tree name, basic_block bb, basic_block def_bb)
|
||||
if (!m_gori.has_edge_range_p (equiv_name))
|
||||
continue;
|
||||
|
||||
// PR 108139. It is hazardous to assume an equivalence with
|
||||
// a PHI is the same value. The PHI may be an equivalence
|
||||
// via UNDEFINED arguments which is really a one way equivalence.
|
||||
// PHIDEF == name, but name may not be == PHIDEF.
|
||||
if (is_a<gphi *> (SSA_NAME_DEF_STMT (equiv_name)))
|
||||
continue;
|
||||
|
||||
// Check if the equiv definition dominates this block
|
||||
if (equiv_bb == bb ||
|
||||
(equiv_bb && !dominated_by_p (CDI_DOMINATORS, bb, equiv_bb)))
|
||||
|
18
gcc/testsuite/gcc.dg/pr108139.c
Normal file
18
gcc/testsuite/gcc.dg/pr108139.c
Normal file
@ -0,0 +1,18 @@
|
||||
/* { dg-do compile { target int128 } } */
|
||||
/* { dg-options "-O1 -ftree-vrp -fdump-tree-vrp" } */
|
||||
|
||||
int a, b;
|
||||
int main() {
|
||||
int c;
|
||||
if (a > 1)
|
||||
a++;
|
||||
while (a)
|
||||
if (c == b)
|
||||
c = a;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* { dg-final { scan-tree-dump-not "Folding predicate" "vrp2" } } */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user