[fortran] Re: Do not compare types in operands_equal_p if OEP_ADDRESS_OF is set

Jan Hubicka hubicka@ucw.cz
Thu Oct 8 06:13:00 GMT 2015


> > -  STRIP_NOPS (arg0);
> > -  STRIP_NOPS (arg1);
> > +      STRIP_NOPS (arg0);
> > +      STRIP_NOPS (arg1);
> > +    }
> > +  else
> > +    /* Addresses of NOP_EXPR (and many other things) are not well defined. 
> > +       Check that we did not forget to drop the
> > +       OEP_ADDRESS_OF/OEP_CONSTANT_ADDRESS_OF flags.  */
> > +    gcc_checking_assert (TREE_CODE (arg0) != NOP_EXPR
> > +			 && TREE_CODE (arg1) != NOP_EXPR);
> 
> Use ! CONVERT_EXPR_P (arg0) && ! CONVERT_EXPR_P (arg1)

Hi,
the x86_64 testing actually shows one regression at
gfortran.dg/coarray/coindexed_1.f90.  The problem is the new addrt that we do
not take an address of NOP_EXPR.  Fortran indeed does that:

 <addr_expr 0x7ffff6caa2e0
    type <pointer_type 0x7ffff6c9fdc8
        type <array_type 0x7ffff6c9fb28 type <integer_type 0x7ffff6adb540 character(kind=1)>
            string-flag BLK
            size <integer_cst 0x7ffff6c917b0 constant 56>
            unit size <integer_cst 0x7ffff6c91780 constant 7>
            align 8 symtab 0 alias set -1 canonical type 0x7ffff6c9fb28 domain <integer_type 0x7ffff6c9fa80>
            pointer_to_this <pointer_type 0x7ffff6c9fdc8>>
        unsigned DI
        size <integer_cst 0x7ffff6ad7bd0 constant 64>
        unit size <integer_cst 0x7ffff6ad7be8 constant 8>
        align 64 symtab 0 alias set -1 canonical type 0x7ffff6c9fdc8>
  
    arg 0 <nop_expr 0x7ffff6caa2a0 type <array_type 0x7ffff6c9fb28>
  
        arg 0 <var_decl 0x7ffff6ae1a20 str2a type <array_type 0x7ffff6c9fbd0>
            used static decl_0 BLK file /aux/hubicka/trunk-9/gcc/testsuite/gfortran.dg/coarray/coindexed_1.f90 line 10 col 0 size <integer_cst 0x7ffff6c917b0 56> unit size <integer_cst 0x7ffff6c91780 7>
            align 8 context <function_decl 0x7ffff6c97a80 char_test> chain <var_decl 0x7ffff6ae1990 str1b>>>


A NOP_EXPR truning one array type to another seems somewhat suspicious. 
Perhaps it should be VIEW_CONVERT_EXPR?  I tracked down that the NOP_EXPR is
introduced by:

 #3  0x000000000068c800 in gfc_conv_array_ref (se=se@entry=0x7fffffffe320, ar=ar@entry=0x1db8e78, expr=expr@entry=0x1db8da0, where=where@entry=0x1db8df0)
    at ../../gcc/fortran/trans-array.c:3299
3299                se->expr = fold_convert (TYPE_MAIN_VARIANT (TREE_TYPE (se->expr)),
(gdb) l
3294                  && TREE_CODE (TREE_TYPE (se->expr)) == POINTER_TYPE)
3295                se->expr = build_fold_indirect_ref_loc (input_location, se->expr);
3296
3297              /* Use the actual tree type and not the wrapped coarray.  */
3298              if (!se->want_pointer)
3299                se->expr = fold_convert (TYPE_MAIN_VARIANT (TREE_TYPE (se->expr)),
3300                                         se->expr);
3301            }

So it seems to be fuly concious decision to add the conversion.
I suppose this may make sense to the frontend trees.  It seems resonable to
however drop the NOP_EXPR before building ADDR_EXPR as follows. Calling
get_base_address on something that contains a NOP_EXPR in address is also
a bad idea.

Bootstrapping/regtesting x86_64-linux, seems sane?

Honza


	* trans.c (gfc_build_addr_expr): Do not build ADDR_EXPR of NOP_EXPR.
Index: trans.c
===================================================================
--- trans.c	(revision 228582)
+++ trans.c	(working copy)
@@ -297,6 +297,7 @@ gfc_build_addr_expr (tree type, tree t)
     }
   else
     {
+      STRIP_NOPS (t);
       tree base = get_base_address (t);
       if (base && DECL_P (base))
         TREE_ADDRESSABLE (base) = 1;



More information about the Gcc-patches mailing list