http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57785

Dominique d'Humieres <dominiq at lps dot ens.fr> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2013-07-02
                 CC|                            |burnus at gcc dot gnu.org,
                   |                            |franke.daniel at gmail dot com
     Ever confirmed|0                           |1

--- Comment #1 from Dominique d'Humieres <dominiq at lps dot ens.fr> ---
The following change

 print *, 'z.z= ',DOT_PRODUCT ((/ (1.0, 2.0), (2.0, 3.0) /), (/ (1.0, 1.0),
(1.0, 4.0) /))
 print *, 'z.z= ',SUM(   CONJG((/ (1.0, 2.0), (2.0, 3.0) /))*(/ (1.0, 1.0),
(1.0, 4.0) /))
 print *, 'z.z= ',SUM(         (/ (1.0, 2.0), (2.0, 3.0) /)*(/ (1.0, 1.0),
(1.0, 4.0) /))
end

gives

 z.z=  ( -11.000000    ,  14.000000    )
 z.z=  (  17.000000    ,  4.0000000    )
 z.z=  ( -11.000000    ,  14.000000    )

i.e., DOT_PRODUCT applied to constant vectors does not implement CONJG of the
first vector. If I am not mistaken, the computation is done in
compute_dot_product as

          case BT_INTEGER:
          case BT_REAL:
          case BT_COMPLEX:
            result = gfc_add (result,
                              gfc_multiply (gfc_copy_expr (a),
                                            gfc_copy_expr (b)));
            break;

          default:
            gcc_unreachable();

in fortran/simplify.c (if I comment the line
case BT_COMPLEX:
the compilation reaches the following gcc_unreachable();). 

This is right for MATMUL, but not for DOT_PRODUCT for which compute_dot_product
is called from gfc_simplify_dot_product as

  return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0);

The code has been introduced in revision 148243.

I think the fix should be applied in gfc_simplify_dot_product by applying
gfc_simplify_conjg to vector_a if it complex.

Reply via email to