https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126303

            Bug ID: 126303
           Summary: [13/14/15/16/17 Regression] ICE in gmp with
                    non-integral loop iterator since r15-11154
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

COMMON FOO(8)
      DO 10 M=1,8
        DO 10 T=0D0,1D0
          FOO(M)=1
   10 CONTINUE
      END

ICEs with -std=legacy if f951 is 32-bit or big-endian binary.
The ICE is in
#0  0xf7e60331 in __gmpn_copyi_x86 () from /lib/libgmp.so.10
#1  0xf7e08c0c in __gmpz_init_set () from /lib/libgmp.so.10
#2  0x088d4785 in evaluate_loop_bound (e=<optimized out>, sym=<optimized out>,
val=<optimized out>, ret=0xffffc794) at
../../gcc/fortran/frontend-passes.cc:2755
#3  inner_loop_may_be_skipped (loop_index=loop_index@entry=0,
outer_sym=outer_sym@entry=0xc712040, outer_val=outer_val@entry=0xffffc7ec) at
../../gcc/fortran/frontend-passes.cc:2781
#4  0x088d935e in do_subscript (e=<optimized out>) at
../../gcc/fortran/frontend-passes.cc:2945
#5  do_function (walk_subtrees=<optimized out>, data=<optimized out>,
e=<optimized out>) at ../../gcc/fortran/frontend-passes.cc:2673
#6  do_function (e=<optimized out>, walk_subtrees=<optimized out>,
data=<optimized out>) at ../../gcc/fortran/frontend-passes.cc:2657
#7  0x088d41e0 in gfc_expr_walker (e=0xc76a56c, exprfn=0x88d8d10
<do_function(gfc_expr**, int*, void*)>, data=0x0) at
../../gcc/fortran/frontend-passes.cc:5283
#8  0x088d699e in gfc_code_walker (c=0xc769f48, codefn=0x88d8810
<doloop_code(gfc_code**, int*, void*)>, exprfn=0x88d8d10
<do_function(gfc_expr**, int*, void*)>, data=0x0)
    at ../../gcc/fortran/frontend-passes.cc:5728
#9  0x088d6a3c in gfc_code_walker (c=0xc711148, codefn=0x88d8810
<doloop_code(gfc_code**, int*, void*)>, exprfn=0x88d8d10
<do_function(gfc_expr**, int*, void*)>, data=0x0)
    at ../../gcc/fortran/frontend-passes.cc:5736
#10 0x088d6a3c in gfc_code_walker (c=0xc76278c, codefn=0x88d8810
<doloop_code(gfc_code**, int*, void*)>, exprfn=0x88d8d10
<do_function(gfc_expr**, int*, void*)>, data=0x0)
    at ../../gcc/fortran/frontend-passes.cc:5736
#11 0x088d81bd in doloop_warn (ns=ns@entry=0xc7621b0) at
../../gcc/fortran/frontend-passes.cc:3110
#12 0x088d86ba in gfc_run_passes (ns=0xc7621b0) at
../../gcc/fortran/frontend-passes.cc:155
Guess on little-endian 64-bit f951 one is lucky enough that calling
mpz_init_set on
EXPR_CONSTANT with BT_REAL ts, so where e->value.real is
$4 = {{_mpfr_prec = 24, _mpfr_sign = 1, _mpfr_exp = 1, _mpfr_d = 0xc7118f4}}
the mpfr_t vs. mpz_t in there happen to have a pointer at the same offset,
while on 32-bit f951 it is
$5 = {{_mp_alloc = 24, _mp_size = 1, _mp_d = 0x1}}

I suspect r15-11154-g005358093fd8566824b088d9bf7c8512ef5844fa which has been
backported, but our bisect seed only has 64-bit f951.

Reply via email to