From 560af66a9aba07bb656034b5bf121d46f5b6026f Mon Sep 17 00:00:00 2001
From: sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Fri, 3 Mar 2006 14:35:23 +0000
Subject: [PATCH] 	PR tree-optimization/26524 	*
 tree-scalar-evolution.c (interpret_rhs_modify_expr): Use 	fold_convert
 to create a constant of the appropriate type.

	* gfortran.dg/pr26524.f: New test case.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111676 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                       |  6 ++++++
 gcc/testsuite/ChangeLog             |  5 +++++
 gcc/testsuite/gfortran.dg/pr26524.f | 16 ++++++++++++++++
 gcc/tree-scalar-evolution.c         |  6 +++---
 4 files changed, 30 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/pr26524.f

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 11527685c542..464b36dcfb54 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-03-03  Roger Sayle  <roger@eyesopen.com>
+
+	PR tree-optimization/26524
+	* tree-scalar-evolution.c (interpret_rhs_modify_expr): Use
+	fold_convert to create a constant of the appropriate type.
+
 2006-03-03  Richard Sandiford  <richard@codesourcery.com>
 
 	* doc/tm.texi: Refer to SYMBOL_REF_HAS_BLOCK_INFO_P instead of
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6765c46e9845..28dcd430c22d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-03  Roger Sayle  <roger@eyesopen.com>
+
+	PR tree-optimization/26524
+	* gfortran.dg/pr26524.f: New test case.
+
 2006-03-02  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
 	* g++.dg/template/repo5.C: Cleanup repo files.
diff --git a/gcc/testsuite/gfortran.dg/pr26524.f b/gcc/testsuite/gfortran.dg/pr26524.f
new file mode 100644
index 000000000000..3997477420dc
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr26524.f
@@ -0,0 +1,16 @@
+C PR tree-optimization/26524
+C { dg-do compile }
+C { dg-options "-O2 -ffast-math" }
+      SUBROUTINE CLATM5( PRTYPE, M, N, A, LDA, B, LDB, C, LDC, D, LDD,
+     $                   E, LDE, F, LDF, R, LDR, L, LDL, ALPHA, QBLCKA,
+     $                   QBLCKB )
+      COMPLEX            A( LDA, * ), B( LDB, * ), C( LDC, * ),
+     $                   L( LDL, * ), R( LDR, * )
+      COMPLEX            IMEPS, REEPS
+         DO 240 I = 1, M
+               IF( MOD( I, 2 ).NE.0 .AND. I.LT.M ) THEN
+                  A( I, I-1 ) = -IMEPS*2
+               END IF
+  240    CONTINUE
+      END
+
diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c
index 998b6aa459f0..a346aa5d9e25 100644
--- a/gcc/tree-scalar-evolution.c
+++ b/gcc/tree-scalar-evolution.c
@@ -1647,9 +1647,9 @@ interpret_rhs_modify_expr (struct loop *loop, tree at_stmt,
       opnd10 = TREE_OPERAND (opnd1, 0);
       chrec10 = analyze_scalar_evolution (loop, opnd10);
       chrec10 = chrec_convert (type, chrec10, at_stmt);
-      res = chrec_fold_multiply (type, chrec10, SCALAR_FLOAT_TYPE_P (type)
-				  ? build_real (type, dconstm1)
-				  : build_int_cst_type (type, -1));
+      /* TYPE may be integer, real or complex, so use fold_convert.  */
+      res = chrec_fold_multiply (type, chrec10,
+				 fold_convert (type, integer_minus_one_node));
       break;
 
     case MULT_EXPR:
-- 
GitLab