Do not fold ADDR_EXPR conditions leading to builtin_unreachable early.
Ranges can not represent &var globally yet, so we cannot fold these expressions early or we lose the __builtin_unreachable information. PR tree-optimization/109546 gcc/ * tree-vrp.cc (remove_unreachable::remove_and_update_globals): Do not fold conditions with ADDR_EXPR early. gcc/testsuite/ * gcc.dg/pr109546.c: New.
This commit is contained in:
parent
03cebd3049
commit
f828503eeb
2 changed files with 27 additions and 1 deletions
24
gcc/testsuite/gcc.dg/pr109546.c
Normal file
24
gcc/testsuite/gcc.dg/pr109546.c
Normal file
|
@ -0,0 +1,24 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O3 -fdump-tree-optimized" } */
|
||||
|
||||
void foo(void);
|
||||
static int a, c;
|
||||
static int *b = &a;
|
||||
static int **d = &b;
|
||||
void assert_fail() __attribute__((__noreturn__));
|
||||
int main() {
|
||||
int *e = *d;
|
||||
if (e == &a || e == &c);
|
||||
else {
|
||||
__builtin_unreachable();
|
||||
assert_fail();
|
||||
}
|
||||
if (e == &a || e == &c);
|
||||
else
|
||||
foo();
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-not "assert_fail" "optimized" } } */
|
||||
/* { dg-final { scan-tree-dump-not "foo" "optimized" } } */
|
||||
|
||||
|
|
@ -150,7 +150,9 @@ remove_unreachable::remove_and_update_globals (bool final_p)
|
|||
// If this is already a constant condition, don't look either
|
||||
if (!lhs_p && !rhs_p)
|
||||
continue;
|
||||
|
||||
// Do not remove addresses early. ie if (x == &y)
|
||||
if (!final_p && lhs_p && TREE_CODE (gimple_cond_rhs (s)) == ADDR_EXPR)
|
||||
continue;
|
||||
bool dominate_exit_p = true;
|
||||
FOR_EACH_GORI_EXPORT_NAME (m_ranger.gori (), e->src, name)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue