Hello, and ping please.
Thanks, Martin On Fri, Jun 05 2026, Martin Jambor wrote: > Hi, > > function ipa_vr_intersect_with_arith_jfunc in ipa-cp.cc contains a > check > > if (src_type == dst_type) > > which should have been > > if (operation_type == dst_type) > > which lead to an ICE in the ranger machinery as it tried to intersect > a signed and an unsigned integer when compiling the testcases from > PR124128. > > The condition itself is basically an early exit to avoid calling yet > another ipa_vr_operation_and_type_effects to type-convert the value > range when we already can simply compare the types and see we already > have the righ thing. A better place for it is however just before > that conversion, where it can also avoid the call when dealing with > the most simple of pass-through jump functions (and where it generally > "makes more sense") so this is what the patch does. > > gcc/ChangeLog: > > 2026-06-04 Martin Jambor <[email protected]> > > PR ipa/124128 > * ipa-cp.cc (ipa_vr_intersect_with_arith_jfunc): Move the check if > the final type conversion needs to happen before the conversion. > > gcc/testsuite/ChangeLog: > > 2026-06-04 Martin Jambor <[email protected]> > > PR ipa/124128 > * gcc.dg/ipa/pr124128.c: New test. > --- > gcc/ipa-cp.cc | 19 ++++++++++--------- > gcc/testsuite/gcc.dg/ipa/pr124128.c | 19 +++++++++++++++++++ > 2 files changed, 29 insertions(+), 9 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/ipa/pr124128.c > > diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc > index 9e0b698b8cb..628ffc325b1 100644 > --- a/gcc/ipa-cp.cc > +++ b/gcc/ipa-cp.cc > @@ -1818,21 +1818,22 @@ ipa_vr_intersect_with_arith_jfunc (vrange &vr, > if (!ipa_vr_operation_and_type_effects (op_res, src_vr, operation, > operation_type, src_type)) > return; > - if (src_type == dst_type) > - { > - vr.intersect (op_res); > - return; > - } > inter_vr = &op_res; > src_type = operation_type; > } > else > inter_vr = &src_vr; > > - value_range tmp_res (dst_type); > - if (ipa_vr_operation_and_type_effects (tmp_res, *inter_vr, NOP_EXPR, > - dst_type, src_type)) > - vr.intersect (tmp_res); > + if (src_type != dst_type) > + { > + value_range tmp_res (dst_type); > + if (!ipa_vr_operation_and_type_effects (tmp_res, *inter_vr, NOP_EXPR, > + dst_type, src_type)) > + return; > + vr.intersect (tmp_res); > + } > + else > + vr.intersect (*inter_vr); > return; > } > > diff --git a/gcc/testsuite/gcc.dg/ipa/pr124128.c > b/gcc/testsuite/gcc.dg/ipa/pr124128.c > new file mode 100644 > index 00000000000..e41f0d56bfd > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/ipa/pr124128.c > @@ -0,0 +1,19 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fno-early-inlining" } */ > + > +typedef int blasint; > +void blas_level1_thread(long); > +void cblas_sscal(blasint, float, float, blasint incx) { > + blas_level1_thread(incx); > +} > +blasint c_api_check_saxpby_n; > +float c_api_check_saxpby_beta; > +long labs(long); > +static void c_api_check_saxpby(blasint incy) { > + blasint incy_abs = labs(incy); > + cblas_sscal(c_api_check_saxpby_n, c_api_check_saxpby_beta, 0, incy_abs); > +} > +void __ctest_saxpby_c_api_inc_x_2_inc_y_1_N_100_run() { > + c_api_check_saxpby(1); > + c_api_check_saxpby(2); > +} > -- > 2.54.0
