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.