> Am 10.06.2025 um 19:53 schrieb Jakub Jelinek <ja...@redhat.com>:
> 
> 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)))
>     {

But with comments please, such CFG would fail verification.

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

Reply via email to