On Tue, Jun 10, 2025 at 03:03:27PM -0400, Andrew MacLeod wrote:
> Thats perfect, but you arent using the path ranger (thats just threading),so
> that latter bit is not neceesary... it'll never trigger where you are in
> expand.

Ok, here is what I've committed after bootstrap/regtest on x86_64-linux,
i686-linux and aarch64-linux (just range fold, not range path, plus
added comment which Richard requested):

2025-06-11  Jakub Jelinek  <ja...@redhat.com>

        * 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.

--- gcc/gimple-range-fold.cc.jj 2025-04-30 18:19:09.914047199 +0200
+++ gcc/gimple-range-fold.cc    2025-06-10 19:50:25.537598812 +0200
@@ -51,6 +51,7 @@ along with GCC; see the file COPYING3.
 #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 (vra
            {
              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<gcond *> (s),
                                           as_a <irange> (r), e0, e1);


        Jakub

Reply via email to