From: Jakub Jelinek Date: Wed, 11 Jun 2025 05:03:04 +0000 (+0200) Subject: ranger: Handle the theoretical case of GIMPLE_COND with one succ edge during expansio... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f3dde39e597f48832208f423fb20f29674ce49ae;p=thirdparty%2Fgcc.git ranger: Handle the theoretical case of GIMPLE_COND with one succ edge during expansion [PR120434] On Tue, Jun 10, 2025 at 10:51:25AM -0400, Andrew MacLeod wrote: > Edge range should be fine, and really that assert doesnt really need to be > there. > > Where the issue could arise is in gimple-range-fold.cc in > fold_using_range::range_of_range_op()  where we see something like: > >          else if (is_a (s) && gimple_bb (s)) >             { >               basic_block bb = gimple_bb (s); >               edge e0 = EDGE_SUCC (bb, 0); >               edge e1 = EDGE_SUCC (bb, 1); > >               if (!single_pred_p (e0->dest)) >                 e0 = NULL; >               if (!single_pred_p (e1->dest)) >                 e1 = NULL; >               src.register_outgoing_edges (as_a (s), >                                            as_a (r), e0, e1); > > Althogh, now that I look at it, it doesn't need much adjustment, just the > expectation that there are 2 edges.  I suppose EDGE_SUCC (bb, 1) cpould > potentially trap if there is only one edge.   we'd just have to guard it and > alloow for that case This patch implements that. 2025-06-11 Jakub Jelinek PR middle-end/120434 * gimple-range-fold.cc: Include rtl.h. (fold_using_range::range_of_range_op): Handle bb ending with GIMPLE_COND during RTL expansion where there is only one succ edge instead of two. --- diff --git a/gcc/gimple-range-fold.cc b/gcc/gimple-range-fold.cc index aed5c7dc21e..d18b37b3380 100644 --- a/gcc/gimple-range-fold.cc +++ b/gcc/gimple-range-fold.cc @@ -51,6 +51,7 @@ along with GCC; see the file COPYING3. If not see #include "sreal.h" #include "ipa-cp.h" #include "ipa-prop.h" +#include "rtl.h" // Construct a fur_source, and set the m_query field. fur_source::fur_source (range_query *q) @@ -778,11 +779,14 @@ fold_using_range::range_of_range_op (vrange &r, { basic_block bb = gimple_bb (s); edge e0 = EDGE_SUCC (bb, 0); - edge e1 = EDGE_SUCC (bb, 1); + /* During RTL expansion one of the edges can be removed + if expansion proves the jump is unconditional. */ + edge e1 = single_succ_p (bb) ? NULL : EDGE_SUCC (bb, 1); + gcc_checking_assert (e1 || currently_expanding_to_rtl); if (!single_pred_p (e0->dest)) e0 = NULL; - if (!single_pred_p (e1->dest)) + if (e1 && !single_pred_p (e1->dest)) e1 = NULL; src.register_outgoing_edges (as_a (s), as_a (r), e0, e1);