aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2010-09-23 19:37:48 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2010-09-23 19:37:48 +0000
commit962b8a0e7e609d75dcb3e9b28bc381a4976695a9 (patch)
treef8f7c145a1029518e56592b7e60f7b1e09fcfabe /gcc
parent5109c83f9a7fbf224ff7c6a9b0c054dbe86da8f2 (diff)
downloadgcc-962b8a0e7e609d75dcb3e9b28bc381a4976695a9.zip
gcc-962b8a0e7e609d75dcb3e9b28bc381a4976695a9.tar.gz
gcc-962b8a0e7e609d75dcb3e9b28bc381a4976695a9.tar.bz2
re PR fortran/45744 (ICE with -O1 in gfc_conv_expr_op, at fortran/trans-expr.c:1366)
2010-09-23 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/45744 * frontend-passes.c (optimize_binop_array_assignment): Only re-use lhs as intermediate storage if kind and type parameters match. 2010-09-23 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/45744 * gfortran.dg/dependency_36.f90: New test. From-SVN: r164570
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog11
-rw-r--r--gcc/fortran/frontend-passes.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/dependency_36.f9028
4 files changed, 49 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d57a449..02ab36d 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,9 +1,16 @@
+2010-09-23 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/45744
+ * frontend-passes.c (optimize_binop_array_assignment):
+ Only re-use lhs as intermediate storage if kind and type
+ parameters match.
+
2010-09-23 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/45745
PR fortran/45648
- * trans-array.c (gfc_conv_expr_descriptor): Handle
- ss->type == GFC_SS_INTRINSIC (for {l,u}bound intrinsics) case.
+ * trans-array.c (gfc_conv_expr_descriptor): Handle
+ ss->type == GFC_SS_INTRINSIC (for {l,u}bound intrinsics) case.
2010-09-23 Tobias Burnus <burnus@net-b.de>
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index b456f47..aefee62 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -122,8 +122,13 @@ optimize_binop_array_assignment (gfc_code *c, gfc_expr **rhs, bool seen_op)
else if (seen_op && e->expr_type == EXPR_FUNCTION && e->rank > 0
&& ! (e->value.function.esym
&& (e->value.function.esym->attr.elemental
- || e->value.function.esym->attr.allocatable))
- && ! (e->value.function.isym && e->value.function.isym->elemental))
+ || e->value.function.esym->attr.allocatable
+ || e->value.function.esym->ts.type != c->expr1->ts.type
+ || e->value.function.esym->ts.kind != c->expr1->ts.kind))
+ && ! (e->value.function.isym
+ && (e->value.function.isym->elemental
+ || e->ts.type != c->expr1->ts.type
+ || e->ts.kind != c->expr1->ts.kind)))
{
gfc_code *n;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 65fca96..3773f07 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-09-23 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/45744
+ * gfortran.dg/dependency_36.f90: New test.
+
2010-09-23 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/pad-1.c: Remove -S from dg-options.
diff --git a/gcc/testsuite/gfortran.dg/dependency_36.f90 b/gcc/testsuite/gfortran.dg/dependency_36.f90
new file mode 100644
index 0000000..f3c0ef7
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dependency_36.f90
@@ -0,0 +1,28 @@
+! { dg-do compile }
+! { dg-options "-O -Warray-temporaries" }
+! PR 45744 - this used to ICE because of type mismatch
+! in the generated temporary.
+MODULE m
+CONTAINS
+ FUNCTION rnd(n)
+ INTEGER, INTENT(in) :: n
+ REAL(8), DIMENSION(n) :: rnd
+ CALL RANDOM_NUMBER(rnd)
+ END FUNCTION rnd
+
+ SUBROUTINE GeneticOptimize(n)
+ INTEGER :: n
+ LOGICAL :: mask(n)
+ REAL(8) :: popcross=0
+ REAL(4) :: foo(n)
+ real(4) :: a(n,n), b(n,n)
+ real(8) :: c(n,n)
+ integer(4) :: x(n,n)
+ integer(8) :: bar(n)
+ mask = (rnd(n) < popcross) ! { dg-warning "Creating array temporary" }
+ foo = rnd(n) ! { dg-warning "Creating array temporary" }
+ bar = rnd(n) ! { dg-warning "Creating array temporary" }
+ c = matmul(a,b) ! { dg-warning "Creating array temporary" }
+ x = matmul(a,b) ! { dg-warning "Creating array temporary" }
+ END SUBROUTINE GeneticOptimize
+END MODULE m