https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92123
--- Comment #12 from Tobias Burnus <burnus at gcc dot gnu.org> --- (all related to gcc/testsuite/gfortran.dg/ISO_Fortran_binding_15.f90) I tried - with Paul's attached patch (attachment 47261) DECL_CONTEXT (gfc_desc) = current_function_decl; instead of TREE_STATIC - but I have the feeling it is unrelated to the real problem. Or at least, if I have this, I observe the following: If I remove the 'allocate(dat)', which is not needed as Fortran does (re)allocate on assignment, it works (-m64 -O1). However, with the 'allocate(dat)' kept, there are two mallocs – and GCC will remove the assignment of '42'. Namely: With -O0, I see in -fdump-tree-optimized: gfc_desc_ptr.1_15 = &gfc_desc.0; CFI_desc_ptr.2 = dat_12(D); _gfortran_cfi_desc_to_gfc_desc (gfc_desc_ptr.1_15, &CFI_desc_ptr.2); dat_18 = gfc_desc_ptr.1_15; __tmp_INTEGER_4_rank_0_26 = dat_3->data; __tmp_INTEGER_4_rank_0_28 = __builtin_malloc (4); __tmp_INTEGER_4_rank_0_30 = __builtin_malloc (4); # __tmp_INTEGER_4_rank_0_4 = PHI <__tmp_INTEGER_4_rank_0_28(15), __tmp_INTEGER_4_rank_0_30(16)> *__tmp_INTEGER_4_rank_0_4 = 42; /// <<<<<<<<<<<< dat_3->data = __tmp_INTEGER_4_rank_0_4; _gfortran_gfc_desc_to_cfi_desc (&CFI_desc_ptr.2, gfc_desc_ptr.1_5); But with -O1, one has: CFI_desc_ptr.2 = dat_14(D); _gfortran_cfi_desc_to_gfc_desc (&gfc_desc.0, &CFI_desc_ptr.2); # DEBUG dat => &gfc_desc.0 __tmp_INTEGER_4_rank_0_20 = gfc_desc.0.data; __tmp_INTEGER_4_rank_0_22 = __builtin_malloc (4); gfc_desc.0.data = __tmp_INTEGER_4_rank_0_22; _gfortran_gfc_desc_to_cfi_desc (&CFI_desc_ptr.2, &gfc_desc.0);