tree-optimization/96565 - improve DSE with paths ending in noreturn
This improves DSEs stmt walking by not considering a DEF without uses for further processing (and thus giving up when there's two paths to follow). 2020-08-26 Richard Biener <rguenther@suse.de> PR tree-optimization/96565 * tree-ssa-dse.c (dse_classify_store): Remove defs with no uses from further processing. * gcc.dg/tree-ssa/ssa-dse-40.c: New testcase. * gcc.dg/builtin-object-size-4.c: Adjust.
This commit is contained in:
parent
3ae0cd94ab
commit
989bc4ca2f
3 changed files with 30 additions and 0 deletions
|
@ -170,6 +170,9 @@ test1 (void *q, int x)
|
||||||
r = (char *) L"abcd\0efg";
|
r = (char *) L"abcd\0efg";
|
||||||
if (__builtin_object_size (r + 2, 3) != sizeof (L"abcd\0efg") - 2)
|
if (__builtin_object_size (r + 2, 3) != sizeof (L"abcd\0efg") - 2)
|
||||||
abort ();
|
abort ();
|
||||||
|
/* Prevent DSE from removing calls that prevent bad combining of
|
||||||
|
addresses and offsets. */
|
||||||
|
asm volatile ("" : : "g" (&a));
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t l1 = 1;
|
size_t l1 = 1;
|
||||||
|
|
16
gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-40.c
Normal file
16
gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-40.c
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O -fdump-tree-dse1-details" } */
|
||||||
|
|
||||||
|
_Bool g(void);
|
||||||
|
|
||||||
|
void f(int x)
|
||||||
|
{
|
||||||
|
char arr[x];
|
||||||
|
|
||||||
|
arr[0] = 0;
|
||||||
|
|
||||||
|
if (g())
|
||||||
|
__builtin_abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* { dg-final { scan-tree-dump "Deleted dead store" "dse1" } } */
|
|
@ -898,6 +898,17 @@ dse_classify_store (ao_ref *ref, gimple *stmt,
|
||||||
*by_clobber_p = false;
|
*by_clobber_p = false;
|
||||||
defs.unordered_remove (i);
|
defs.unordered_remove (i);
|
||||||
}
|
}
|
||||||
|
/* If the path ends here we do not need to process it further.
|
||||||
|
This for example happens with calls to noreturn functions. */
|
||||||
|
else if (gimple_code (def) != GIMPLE_PHI
|
||||||
|
&& has_zero_uses (gimple_vdef (def)))
|
||||||
|
{
|
||||||
|
/* But if the store is to global memory it is definitely
|
||||||
|
not dead. */
|
||||||
|
if (ref_may_alias_global_p (ref))
|
||||||
|
return DSE_STORE_LIVE;
|
||||||
|
defs.unordered_remove (i);
|
||||||
|
}
|
||||||
/* In addition to kills we can remove defs whose only use
|
/* In addition to kills we can remove defs whose only use
|
||||||
is another def in defs. That can only ever be PHIs of which
|
is another def in defs. That can only ever be PHIs of which
|
||||||
we track a single for simplicity reasons (we fail for multiple
|
we track a single for simplicity reasons (we fail for multiple
|
||||||
|
|
Loading…
Add table
Reference in a new issue