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

Reply via email to