On 6/10/25 13:52, Jakub Jelinek wrote:
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<gcond *> (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<gcond *> (s),
                                            as_a <irange> (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
So in that case
--- 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,12 @@ 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);
+             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);
--- gcc/gimple-range-path.cc.jj 2025-01-02 20:54:32.236128440 +0100
+++ gcc/gimple-range-path.cc    2025-06-10 19:50:36.188457163 +0200
@@ -32,6 +32,7 @@ along with GCC; see the file COPYING3.
  #include "ssa.h"
  #include "tree-cfg.h"
  #include "gimple-iterator.h"
+#include "rtl.h"
// Internal construct to help facilitate debugging of solver.
  #define DEBUG_SOLVER (dump_file && (param_threader_debug == 
THREADER_DEBUG_ALL))
@@ -750,6 +751,11 @@ path_range_query::compute_outgoing_relat
  {
    if (gcond *cond = safe_dyn_cast <gcond *> (*gsi_last_bb (bb)))
      {
+      if (single_succ_p (bb))
+       {
+         gcc_checking_assert (currently_expanding_to_rtl);
+         return;
+       }
        int_range<2> r;
        edge e0 = EDGE_SUCC (bb, 0);
        edge e1 = EDGE_SUCC (bb, 1);

as incremental patch?

        Jakub

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.

Reply via email to