From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1011) id DC01E3858D38; Fri, 24 Mar 2023 13:12:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DC01E3858D38 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1679663522; bh=/ASih8t4+Vp3CLJF6abqfgZafGR8/mS1clsxum6ZEY8=; h=From:To:Subject:Date:From; b=grdCiJ3KbNNV+pR/PhcNTXderhErAJVJwGIUrUe4TVNTjR4RBxakpU6aTi0Ajd3+O 8MhT1Ppe5kgYIc3vBOjlwDjJ7NDsZaUfEe9SU9+PKQur8FY9Ku5WOvYGjzN9Uc0mjs 6H5hEWtmuES9ddUuMehkVohCtrEPAc3YylFeABow= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Andrew Macleod To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-6850] Ranger cache dominator queries should ignore backedges. X-Act-Checkin: gcc X-Git-Author: Andrew MacLeod X-Git-Refname: refs/heads/master X-Git-Oldrev: ed626f18b189920aeed9974aded3f9cb6f25b543 X-Git-Newrev: 0409aa5a2de9ce3164933814a4a7adc91f6acb96 Message-Id: <20230324131202.DC01E3858D38@sourceware.org> Date: Fri, 24 Mar 2023 13:12:02 +0000 (GMT) List-Id: https://gcc.gnu.org/g:0409aa5a2de9ce3164933814a4a7adc91f6acb96 commit r13-6850-g0409aa5a2de9ce3164933814a4a7adc91f6acb96 Author: Andrew MacLeod Date: Thu Mar 23 10:28:34 2023 -0400 Ranger cache dominator queries should ignore backedges. When querying dominators for cache values, ignore back edges in read-only mode. PR tree-optimization/109238 gcc/ * gimple-range-cache.cc (ranger_cache::resolve_dom): Ignore predecessors which this block dominates. gcc/testsuite/ * gcc.dg/pr109238.c: New. Diff: --- gcc/gimple-range-cache.cc | 5 +++++ gcc/testsuite/gcc.dg/pr109238.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc index cc56fd4dcb0..6a098d8ec28 100644 --- a/gcc/gimple-range-cache.cc +++ b/gcc/gimple-range-cache.cc @@ -1404,6 +1404,11 @@ ranger_cache::resolve_dom (vrange &r, tree name, basic_block bb) Value_Range er (TREE_TYPE (name)); FOR_EACH_EDGE (e, ei, bb->preds) { + // If the predecessor is dominated by this block, then there is a back + // edge, and won't provide anything useful. We'll actually end up with + // VARYING as we will not resolve this node. + if (dominated_by_p (CDI_DOMINATORS, e->src, bb)) + continue; edge_range (er, e, name, RFD_READ_ONLY); r.union_ (er); } diff --git a/gcc/testsuite/gcc.dg/pr109238.c b/gcc/testsuite/gcc.dg/pr109238.c new file mode 100644 index 00000000000..0cad8237208 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr109238.c @@ -0,0 +1,16 @@ +/* PR tree-optimization/109238 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wall" } */ + +void foo (void *) __attribute__((noreturn)); +void bar (void *); + +void +baz (void *p) +{ + void *c = __builtin_realloc (p, 16); + if (c) + foo (c); + for (;;) + bar (__builtin_realloc (p, 8)); /* { dg-bogus "pointer 'p' may be used after '__builtin_realloc'" } */ +}