public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/64137] New: Fortran FE builds invalid GENERIC
@ 2014-12-01 13:32 rguenth at gcc dot gnu.org
  2014-12-01 13:45 ` [Bug fortran/64137] " rguenth at gcc dot gnu.org
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: rguenth at gcc dot gnu.org @ 2014-12-01 13:32 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64137

            Bug ID: 64137
           Summary: Fortran FE builds invalid GENERIC
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org

#6  0x000000000085f420 in gfc_conv_intrinsic_minmaxloc (se=0x7fffffffd150, 
    expr=0x235ba70, op=GT_EXPR)
    at /space/rguenther/tramp3d/trunk/gcc/fortran/trans-intrinsic.c:3734
(gdb) l
3729         possible value is HUGE in both cases.  */
3730      if (op == GT_EXPR)
3731        tmp = fold_build1_loc (input_location, NEGATE_EXPR, TREE_TYPE
(tmp), tmp);
3732      if (op == GT_EXPR && expr->ts.type == BT_INTEGER)
3733        tmp = fold_build2_loc (input_location, MINUS_EXPR, TREE_TYPE (tmp),
tmp,
3734                               build_int_cst (type, 1));

the body of the 2nd if builds REAL_CST - INTEGER_CST for at least
gfortran.dg/maxloc_2.f90 at -O1+.  Currently it is lucky that fold-const.c

10523         /* A - B -> A + (-B) if B is easily negatable.  */
10524         if (negate_expr_p (arg1)
10525             && !TYPE_OVERFLOW_SANITIZED (type)
(gdb) l
10526             && ((FLOAT_TYPE_P (type)
10527                  /* Avoid this transformation if B is a positive
REAL_CST.  */
10528                  && (TREE_CODE (arg1) != REAL_CST
10529                      ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
10530                 || INTEGRAL_TYPE_P (type)))
10531           return fold_build2_loc (loc, PLUS_EXPR, type,
10532                               fold_convert_loc (loc, type, arg0),
10533                               fold_convert_loc (loc, type,
10534                                                 negate_expr (arg1)));

applies as that fold_convert()s to REAL after negating the integer, hiding
this bug.  When I move that to match.pd patterns that no longer happens,
but we simply get -Huge + -1 with bogus types here.

Not sure what is intended here (integer Huge or Float 1).


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-12-02  8:52 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-12-01 13:32 [Bug fortran/64137] New: Fortran FE builds invalid GENERIC rguenth at gcc dot gnu.org
2014-12-01 13:45 ` [Bug fortran/64137] " rguenth at gcc dot gnu.org
2014-12-01 18:22 ` burnus at gcc dot gnu.org
2014-12-02  8:51 ` rguenth at gcc dot gnu.org
2014-12-02  8:52 ` rguenth at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).