Good catch, Thomas! Thanks for the fix.
Paul On Tue, 15 Oct 2024 at 08:50, Thomas Schwinge <tschwi...@baylibre.com> wrote: > Hi! > > On 2024-10-14T21:18:17+0100, Sam James <s...@gentoo.org> wrote: > > Sam James <s...@gentoo.org> writes: > >> Andre Vehreschild <ve...@gmx.de> writes: > >>> [...] During latest regression testing of the Fortran suite I got > >>> typebound_operator_7.f03 failing with: > >>> > >>> typebound_operator_7.f03:94:25: > >>> > >>> 94 | u = (u*2.0*4.0) + u*4.0 > >>> | 1 > >>> internal compiler error: tree check: expected function_decl, have > indirect_ref > >>> in DECL_FUNCTION_CODE, at tree.h:4329 0x3642f3e internal_error(char > const*, > >>> ...) > /mnt/work_store/gcc/gcc.test/gcc/diagnostic-global-context.cc:517 > >>> 0x1c0a703 tree_check_failed(tree_node const*, char const*, int, char > const*, > >>> ...) /mnt/work_store/gcc/gcc.test/gcc/tree.cc:9003 > >>> 0xeb9150 tree_check(tree_node const*, char const*, int, char const*, > tree_code) > >>> /mnt/work_store/gcc/gcc.test/gcc/tree.h:3921 > >>> 0xf5725b DECL_FUNCTION_CODE(tree_node const*) > >>> /mnt/work_store/gcc/gcc.test/gcc/tree.h:4329 > >>> 0xf383d6 update_builtin_function > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:4405 > >>> 0xf468b9 gfc_conv_procedure_call(gfc_se*, gfc_symbol*, > gfc_actual_arglist*, > >>> gfc_expr*, vec<tree_node*, va_gc, vl_embed>*) > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:8236 0xf48b0f > >>> gfc_conv_function_expr > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:8815 0xf4ceda > >>> gfc_conv_expr(gfc_se*, gfc_expr*) > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:9982 0xf40777 > >>> gfc_conv_procedure_call(gfc_se*, gfc_symbol*, gfc_actual_arglist*, > >>> gfc_expr*, vec<tree_node*, va_gc, vl_embed>*) > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:6816 0xf48b0f > >>> gfc_conv_function_expr > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:8815 0xf4ceda > >>> gfc_conv_expr(gfc_se*, gfc_expr*) > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:9982 0xf40777 > >>> gfc_conv_procedure_call(gfc_se*, gfc_symbol*, gfc_actual_arglist*, > >>> gfc_expr*, vec<tree_node*, va_gc, vl_embed>*) > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:6816 0xfb580a > >>> gfc_trans_call(gfc_code*, bool, tree_node*, tree_node*, bool) > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-stmt.cc:425 0xed9363 > >>> trans_code /mnt/work_store/gcc/gcc.test/gcc/fortran/trans.cc:2434 > 0xed97d5 > >>> gfc_trans_code(gfc_code*) > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans.cc:2713 0xf26342 > >>> gfc_generate_function_code(gfc_namespace*) > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-decl.cc:7958 0xed9819 > >>> gfc_generate_code(gfc_namespace*) > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans.cc:2730 0xe544ee > >>> translate_all_program_units > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/parse.cc:7156 0xe54e23 > >>> gfc_parse_file() > /mnt/work_store/gcc/gcc.test/gcc/fortran/parse.cc:7473 > >>> 0xebf7ce gfc_be_parse_file > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/f95-lang.cc:241 > > >> Tobias Burnus (1): > >> Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP' > __builtin_is_initial_device > > > Indeed: https://gcc.gnu.org/PR117136. > > On 2024-10-13T10:21:01+0200, Tobias Burnus <tbur...@baylibre.com> wrote: > > Now pushed as r15-4298-g3269a722b7a036. > > > --- a/gcc/fortran/trans-expr.cc > > +++ b/gcc/fortran/trans-expr.cc > > > static void > > -conv_function_val (gfc_se * se, gfc_symbol * sym, gfc_expr * expr, > > - gfc_actual_arglist *actual_args) > > +conv_function_val (gfc_se * se, bool *is_builtin, gfc_symbol * sym, > > + gfc_expr * expr, gfc_actual_arglist *actual_args) > > { > > tree tmp; > > > > + *is_builtin = false; > > [...] > > Unconditionally initializes '*is_builtin' here... > > > @@ -6324,6 +6366,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * > sym, > > gfc_actual_arglist *arg; > > int has_alternate_specifier = 0; > > bool need_interface_mapping; > > + bool is_builtin; > > bool callee_alloc; > > bool ulim_copy; > > gfc_typespec ts; > > @@ -8164,7 +8207,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * > sym, > > > > /* Generate the actual call. */ > > if (base_object == NULL_TREE) > > - conv_function_val (se, sym, expr, args); > > + conv_function_val (se, &is_builtin, sym, expr, args); > > else > > conv_base_obj_fcn_val (se, base_object, expr); > > > > @@ -8189,6 +8232,9 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * > sym, > > fntype = TREE_TYPE (TREE_TYPE (se->expr)); > > se->expr = build_call_vec (TREE_TYPE (fntype), se->expr, arglist); > > > > + if (is_builtin) > > + se->expr = update_builtin_function (se->expr, sym); > > + > > /* Allocatable scalar function results must be freed and nullified > > after use. This necessitates the creation of a temporary to > > hold the result to prevent duplicate calls. */ > > ..., however: 'conv_function_val' is not always called here, and > therefore 'is_builtin' not always initialized, giving rise to > PR117136 "[15 regression] ICE for gfortran.dg/typebound_operator_11.f90 > since r15-4298-g3269a722b7a036". > Based on Harald's analysis and patch, I've pushed to trunk branch > commit fa90febea9801d4255bf6a1e9f0fd998629c3c7c > "Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP' > __builtin_is_initial_device: Fix 'is_builtin' initialization", > see attached. > > > Grüße > Thomas > > >