public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/32298] New: Intrinsic MINLOC / MAXLOC gives wrong results (gfortran build 20070522)
@ 2007-06-12 8:25 jens dot bischoff at freenet dot de
2007-06-12 16:05 ` [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays burnus at gcc dot gnu dot org
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: jens dot bischoff at freenet dot de @ 2007-06-12 8:25 UTC (permalink / raw)
To: gcc-bugs
The following source code:
!-------------------------
PROGRAM ERR_MINLOC
INTEGER, PARAMETER :: N = 7
DOUBLE PRECISION, DIMENSION (N), PARAMETER :: A &
= (/ 0.3D0, 0.455D0, 0.6D0, 0.7D0, 0.72D0, 0.76D0, 0.79D0 /)
DOUBLE PRECISION :: B
INTEGER :: I, J, K
DO I = 1, N
B = A(I)
J = MINLOC (ABS (A - B), 1)
K = MAXLOC (ABS (A - B), 1)
PRINT *, I, J, K
END DO
STOP
END PROGRAM ERR_MINLOC
!----------------------
gives the following result:
(superflouos blanks are deleted):
--------------------------
1 2 7
2 2 7
3 3 7
4 4 2
5 5 2
6 6 2
7 7 2
--------------------------
The correct result is:
--------------------------
1 1 7
2 2 7
3 3 1
4 4 1
5 5 1
6 6 1
7 7 1
--------------------------
--
Summary: Intrinsic MINLOC / MAXLOC gives wrong results (gfortran
build 20070522)
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: jens dot bischoff at freenet dot de
GCC target triplet: i386-pc-mingw32
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32298
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays
2007-06-12 8:25 [Bug fortran/32298] New: Intrinsic MINLOC / MAXLOC gives wrong results (gfortran build 20070522) jens dot bischoff at freenet dot de
@ 2007-06-12 16:05 ` burnus at gcc dot gnu dot org
2007-06-12 16:12 ` burnus at gcc dot gnu dot org
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: burnus at gcc dot gnu dot org @ 2007-06-12 16:05 UTC (permalink / raw)
To: gcc-bugs
------- Comment #1 from burnus at gcc dot gnu dot org 2007-06-12 16:05 -------
The result is ok, if one removes PARAMETER.
If one looks at the dump one find the following difference between arrays which
are parameters and those which are variables:
- S.3 = 0;
+ S.3 = 1;
while (1)
{
- if (S.3 > 6) goto L.3;
+ if (S.3 > 7) goto L.3;
- if (ABS_EXPR <A.2[S.3] - D.1367> < limit.1 || pos.0 == 0)
+ if (ABS_EXPR <a[S.3 + -1] - D.1367> < limit.1 || pos.0 ==
0)
{
- limit.1 = ABS_EXPR <A.2[S.3] - D.1367>;
+ limit.1 = ABS_EXPR <a[S.3 + -1] - D.1367>;
- pos.0 = S.3;
+ pos.0 = S.3;
(This might also affect MAXVAL/MINVAL, though I did not manage to cook up an
example.)
--
burnus at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever Confirmed|0 |1
Keywords| |wrong-code
Last reconfirmed|0000-00-00 00:00:00 |2007-06-12 16:05:26
date| |
Summary|Intrinsic MINLOC / MAXLOC |MINLOC / MAXLOC: off-by one
|gives wrong results |for PARAMETER arrays
|(gfortran build 20070522) |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32298
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays
2007-06-12 8:25 [Bug fortran/32298] New: Intrinsic MINLOC / MAXLOC gives wrong results (gfortran build 20070522) jens dot bischoff at freenet dot de
2007-06-12 16:05 ` [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays burnus at gcc dot gnu dot org
@ 2007-06-12 16:12 ` burnus at gcc dot gnu dot org
2007-06-16 14:00 ` dfranke at gcc dot gnu dot org
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: burnus at gcc dot gnu dot org @ 2007-06-12 16:12 UTC (permalink / raw)
To: gcc-bugs
--
burnus at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |burnus at gcc dot gnu dot
| |org
GCC target triplet|i386-pc-mingw32 |
Known to fail| |4.3.0 4.2.0 4.1.3
Target Milestone|--- |4.3.0
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32298
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays
2007-06-12 8:25 [Bug fortran/32298] New: Intrinsic MINLOC / MAXLOC gives wrong results (gfortran build 20070522) jens dot bischoff at freenet dot de
2007-06-12 16:05 ` [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays burnus at gcc dot gnu dot org
2007-06-12 16:12 ` burnus at gcc dot gnu dot org
@ 2007-06-16 14:00 ` dfranke at gcc dot gnu dot org
2007-06-20 12:15 ` pault at gcc dot gnu dot org
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: dfranke at gcc dot gnu dot org @ 2007-06-16 14:00 UTC (permalink / raw)
To: gcc-bugs
------- Comment #2 from dfranke at gcc dot gnu dot org 2007-06-16 14:00 -------
A simplified testcase:
$> cat pr32298.f90
PROGRAM ERR_MINLOC
INTEGER, PARAMETER :: N = 7
DOUBLE PRECISION, DIMENSION (N), PARAMETER :: A &
= (/ 0.3D0, 0.455D0, 0.6D0, 0.7D0, 0.72D0, 0.76D0, 0.79D0 /)
INTEGER :: I, K
I = 7
K = MAXLOC (ABS (A - A(I)), 1)
PRINT *, I, K
END PROGRAM ERR_MINLOC
$> gfortran-svn -fdump-tree-original pr32298.f90
$> cat pr32298.f90.003t.original
[...]
pos.0 = 0;
{
int4 S.3;
S.3 = 0;
while (1)
{
if (S.3 > 6) goto L.1;
if (ABS_EXPR <A.2[S.3] - D.1011> > limit.1 || pos.0 == 0)
{
limit.1 = ABS_EXPR <A.2[S.3] - D.1011>;
pos.0 = S.3;
}
S.3 = S.3 + 1;
}
L.1:;
}
k = pos.0 + 1;
}
Variable pos.0 starts at 0 and thus triggers the right part of the or-clause
within the if-statement. Hence, it gets assigned the value of S.3, which
happens to be 0 within the first iteration. Within the second iteration of the
while, pos.0 still equals 0 which triggers the if-statement again - pos.0 will
now be set to 1 as S.3 was increased during the last iteration. At the end, K
ist set to pos.0 + 1, which (wrongly) equals 2 in this case.
Someone who intimiately knows the scalarizer should be able to fix this
easily?!
> (This might also affect MAXVAL/MINVAL, though I did not manage to cook
> up an example.)
I don't think so as MINVAL/MAXVAL do not track the respective positions.
--
dfranke at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |dfranke at gcc dot gnu dot
| |org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32298
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays
2007-06-12 8:25 [Bug fortran/32298] New: Intrinsic MINLOC / MAXLOC gives wrong results (gfortran build 20070522) jens dot bischoff at freenet dot de
` (2 preceding siblings ...)
2007-06-16 14:00 ` dfranke at gcc dot gnu dot org
@ 2007-06-20 12:15 ` pault at gcc dot gnu dot org
2007-06-21 5:05 ` patchapp at dberlin dot org
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: pault at gcc dot gnu dot org @ 2007-06-20 12:15 UTC (permalink / raw)
To: gcc-bugs
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 3804 bytes --]
------- Comment #3 from pault at gcc dot gnu dot org 2007-06-20 12:15 -------
This does the job by detecting the generation of a temporary. In this case the
loop is zero based but the calculated value for the position does not reflect
this.
I'll have a think about whether or not this is the cleanest way to fix the bug
and then I will submit tonight.
Paul
Index: gcc/fortran/trans-intrinsic.c
===================================================================
*** gcc/fortran/trans-intrinsic.c (révision 125706)
--- gcc/fortran/trans-intrinsic.c (copie de travail)
*************** gfc_conv_intrinsic_minmaxloc (gfc_se * s
*** 2046,2052 ****
gfc_add_modify_expr (&ifblock, limit, arrayse.expr);
/* Remember where we are. */
! gfc_add_modify_expr (&ifblock, pos, loop.loopvar[0]);
ifbody = gfc_finish_block (&ifblock);
--- 2046,2060 ----
gfc_add_modify_expr (&ifblock, limit, arrayse.expr);
/* Remember where we are. */
! if (loop.temp_dim)
! {
! tmp = build2 (PLUS_EXPR, TREE_TYPE (pos),
! loop.loopvar[0],
! build_int_cst (type, 1));
! gfc_add_modify_expr (&ifblock, pos, tmp);
! }
! else
! gfc_add_modify_expr (&ifblock, pos, loop.loopvar[0]);
ifbody = gfc_finish_block (&ifblock);
*************** gfc_conv_intrinsic_minmaxloc (gfc_se * s
*** 2099,2109 ****
gfc_cleanup_loop (&loop);
/* Return a value in the range 1..SIZE(array). */
! tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, loop.from[0],
! gfc_index_one_node);
! tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, pos, tmp);
/* And convert to the required type. */
! se->expr = convert (type, tmp);
}
static void
--- 2107,2120 ----
gfc_cleanup_loop (&loop);
/* Return a value in the range 1..SIZE(array). */
! if (!loop.temp_dim)
! {
! tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, loop.from[0],
! gfc_index_one_node);
! pos = fold_build2 (MINUS_EXPR, gfc_array_index_type, pos, tmp);
! }
/* And convert to the required type. */
! se->expr = convert (type, pos);
}
static void
Index: gcc/testsuite/gfortran.dg/minmax_loc_1.f90
===================================================================
*** gcc/testsuite/gfortran.dg/minmax_loc_1.f90 (révision 0)
--- gcc/testsuite/gfortran.dg/minmax_loc_1.f90 (révision 0)
***************
*** 0 ****
--- 1,29 ----
+ ! { dg-do run }
+ ! Tests the fix for PR32298, in which the scalarizer would generate
+ ! a temporary in the course of evaluating MINLOC or MAXLOC, thereby
+ ! setting the start of the scalarizer loop to zero.
+ !
+ ! Contributed by Jens Bischoff <jens.bischoff@freenet.de>
+ !
+ PROGRAM ERR_MINLOC
+
+ INTEGER, PARAMETER :: N = 7
+
+ DOUBLE PRECISION, DIMENSION (N), PARAMETER :: A &
+ = (/ 0.3D0, 0.455D0, 0.6D0, 0.7D0, 0.72D0, 0.76D0, 0.79D0 /)
+
+ DOUBLE PRECISION :: B
+ INTEGER :: I, J(N), K(N)
+
+ DO I = 1, N
+ B = A(I)
+ J(I) = MINLOC (ABS (A - B), 1)
+ K(I) = MAXLOC (ABS (A - B), 1)
+ END DO
+
+ if (any (J .NE. (/1,2,3,4,5,6,7/))) call abort ()
+ if (any (K .NE. (/7,7,1,1,1,1,1/))) call abort ()
+
+ STOP
+
+ END PROGRAM ERR_MINLOC
--
pault at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
AssignedTo|unassigned at gcc dot gnu |pault at gcc dot gnu dot org
|dot org |
Status|NEW |ASSIGNED
Last reconfirmed|2007-06-12 16:05:26 |2007-06-20 12:15:24
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32298
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays
2007-06-12 8:25 [Bug fortran/32298] New: Intrinsic MINLOC / MAXLOC gives wrong results (gfortran build 20070522) jens dot bischoff at freenet dot de
` (3 preceding siblings ...)
2007-06-20 12:15 ` pault at gcc dot gnu dot org
@ 2007-06-21 5:05 ` patchapp at dberlin dot org
2007-06-24 11:04 ` pault at gcc dot gnu dot org
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: patchapp at dberlin dot org @ 2007-06-21 5:05 UTC (permalink / raw)
To: gcc-bugs
------- Comment #4 from patchapp at dberlin dot org 2007-06-21 05:05 -------
Subject: Bug number PR32298
A patch for this bug has been added to the patch tracker.
The mailing list url for the patch is
http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01521.html
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32298
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays
2007-06-12 8:25 [Bug fortran/32298] New: Intrinsic MINLOC / MAXLOC gives wrong results (gfortran build 20070522) jens dot bischoff at freenet dot de
` (4 preceding siblings ...)
2007-06-21 5:05 ` patchapp at dberlin dot org
@ 2007-06-24 11:04 ` pault at gcc dot gnu dot org
2007-06-24 11:06 ` pault at gcc dot gnu dot org
2007-10-15 18:24 ` tkoenig at gcc dot gnu dot org
7 siblings, 0 replies; 9+ messages in thread
From: pault at gcc dot gnu dot org @ 2007-06-24 11:04 UTC (permalink / raw)
To: gcc-bugs
------- Comment #5 from pault at gcc dot gnu dot org 2007-06-24 11:04 -------
Subject: Bug 32298
Author: pault
Date: Sun Jun 24 11:04:02 2007
New Revision: 125983
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=125983
Log:
2007-06-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/32298
PR fortran/31726
* trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc): Calculate
the offset between the loop counter and the position as
defined. Add the offset within the loop so that the mask acts
correctly. Do not advance the location on the basis that it
is zero.
2007-06-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/31726
* gfortran.dg/minmaxloc_1.f90: New test.
PR fortran/32298
* gfortran.dg/minmaxloc_2.f90: New test.
Added:
trunk/gcc/testsuite/gfortran.dg/minmaxloc_1.f90
trunk/gcc/testsuite/gfortran.dg/minmaxloc_2.f90
Modified:
trunk/gcc/fortran/ChangeLog
trunk/gcc/fortran/trans-intrinsic.c
trunk/gcc/testsuite/ChangeLog
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32298
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays
2007-06-12 8:25 [Bug fortran/32298] New: Intrinsic MINLOC / MAXLOC gives wrong results (gfortran build 20070522) jens dot bischoff at freenet dot de
` (5 preceding siblings ...)
2007-06-24 11:04 ` pault at gcc dot gnu dot org
@ 2007-06-24 11:06 ` pault at gcc dot gnu dot org
2007-10-15 18:24 ` tkoenig at gcc dot gnu dot org
7 siblings, 0 replies; 9+ messages in thread
From: pault at gcc dot gnu dot org @ 2007-06-24 11:06 UTC (permalink / raw)
To: gcc-bugs
------- Comment #6 from pault at gcc dot gnu dot org 2007-06-24 11:06 -------
Fixed on trunk
Paul
--
pault at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |RESOLVED
Resolution| |FIXED
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32298
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays
2007-06-12 8:25 [Bug fortran/32298] New: Intrinsic MINLOC / MAXLOC gives wrong results (gfortran build 20070522) jens dot bischoff at freenet dot de
` (6 preceding siblings ...)
2007-06-24 11:06 ` pault at gcc dot gnu dot org
@ 2007-10-15 18:24 ` tkoenig at gcc dot gnu dot org
7 siblings, 0 replies; 9+ messages in thread
From: tkoenig at gcc dot gnu dot org @ 2007-10-15 18:24 UTC (permalink / raw)
To: gcc-bugs
------- Comment #7 from tkoenig at gcc dot gnu dot org 2007-10-15 18:23 -------
Subject: Bug 32298
Author: tkoenig
Date: Mon Oct 15 18:23:39 2007
New Revision: 129365
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=129365
Log:
2007-10-25 Thomas Koenig <tkoenig@gcc.gnu.org>
Paul Thomas <pault@gcc.gnu.org>
PR fortran/32298
PR fortran/31726
PR fortran/33354
Backport from trunk
* trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc): Calculate
the offset between the loop counter and the position as
defined. Add the offset within the loop so that the mask acts
correctly. Do not advance the location on the basis that it
is zero.
2007-10-15 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/33354
* gfortran.dg/minmaxloc_4.f90: New test.
Added:
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/minmaxloc_4.f90
Modified:
branches/gcc-4_2-branch/gcc/fortran/ChangeLog
branches/gcc-4_2-branch/gcc/fortran/trans-intrinsic.c
branches/gcc-4_2-branch/gcc/testsuite/ChangeLog
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32298
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2007-10-15 18:24 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-06-12 8:25 [Bug fortran/32298] New: Intrinsic MINLOC / MAXLOC gives wrong results (gfortran build 20070522) jens dot bischoff at freenet dot de
2007-06-12 16:05 ` [Bug fortran/32298] MINLOC / MAXLOC: off-by one for PARAMETER arrays burnus at gcc dot gnu dot org
2007-06-12 16:12 ` burnus at gcc dot gnu dot org
2007-06-16 14:00 ` dfranke at gcc dot gnu dot org
2007-06-20 12:15 ` pault at gcc dot gnu dot org
2007-06-21 5:05 ` patchapp at dberlin dot org
2007-06-24 11:04 ` pault at gcc dot gnu dot org
2007-06-24 11:06 ` pault at gcc dot gnu dot org
2007-10-15 18:24 ` tkoenig at gcc dot gnu dot 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).