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:
Richard Biener 2020-08-26 08:44:59 +02:00
parent 3ae0cd94ab
commit 989bc4ca2f
3 changed files with 30 additions and 0 deletions

View file

@ -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;

View 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" } } */

View file

@ -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