aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/sese.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/graphite/pr82449.f11
-rw-r--r--gcc/tree-chrec.c3
-rw-r--r--gcc/tree-chrec.h12
6 files changed, 38 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bfcd854..44ca159 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2017-10-09 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/82449
+ * sese.c (scev_analyzable_p): Check whether the SCEV is linear.
+ * tree-chrec.h (evolution_function_is_constant_p): Adjust to
+ allow constant addresses.
+ * tree-chrec.c (scev_is_linear_expression): Constant evolutions
+ are linear.
+
2017-10-09 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* config/s390/s390-builtins.def (vec_nabs, vec_vfi): Fix builtin
diff --git a/gcc/sese.c b/gcc/sese.c
index b3bf611..d6702ad 100644
--- a/gcc/sese.c
+++ b/gcc/sese.c
@@ -444,14 +444,13 @@ scev_analyzable_p (tree def, sese_l &region)
loop = loop_containing_stmt (SSA_NAME_DEF_STMT (def));
scev = scalar_evolution_in_region (region, loop, def);
- return !chrec_contains_undetermined (scev)
- && (TREE_CODE (scev) != SSA_NAME
- || !defined_in_sese_p (scev, region))
- && (tree_does_not_contain_chrecs (scev)
- || evolution_function_is_affine_p (scev))
- && (! loop
- || ! loop_in_sese_p (loop, region)
- || ! chrec_contains_symbols_defined_in_loop (scev, loop->num));
+ return (!chrec_contains_undetermined (scev)
+ && (TREE_CODE (scev) != SSA_NAME
+ || !defined_in_sese_p (scev, region))
+ && scev_is_linear_expression (scev)
+ && (! loop
+ || ! loop_in_sese_p (loop, region)
+ || ! chrec_contains_symbols_defined_in_loop (scev, loop->num)));
}
/* Returns the scalar evolution of T in REGION. Every variable that
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ae952c9..5768f42 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-10-09 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/82449
+ * gfortran.dg/graphite/pr82449.f: New testcase.
+
2017-10-09 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
PR target/82463
diff --git a/gcc/testsuite/gfortran.dg/graphite/pr82449.f b/gcc/testsuite/gfortran.dg/graphite/pr82449.f
new file mode 100644
index 0000000..974ea20
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/graphite/pr82449.f
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! { dg-options "-O2 -floop-nest-optimize" }
+
+ SUBROUTINE JDFIDX(MKL,KGSH)
+ DIMENSION MKL(6,6)
+ NKL=0
+ 400 DO 40 KG = 1,KGSH
+ DO 40 LG = 1,KG
+ NKL = NKL + 1
+ 40 MKL(LG,KG) = NKL
+ END
diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c
index 66d3a7b..3867072 100644
--- a/gcc/tree-chrec.c
+++ b/gcc/tree-chrec.c
@@ -1610,6 +1610,9 @@ operator_is_linear (tree scev)
bool
scev_is_linear_expression (tree scev)
{
+ if (evolution_function_is_constant_p (scev))
+ return true;
+
if (scev == NULL
|| !operator_is_linear (scev))
return false;
diff --git a/gcc/tree-chrec.h b/gcc/tree-chrec.h
index e980ec1..4a8a373 100644
--- a/gcc/tree-chrec.h
+++ b/gcc/tree-chrec.h
@@ -169,15 +169,9 @@ evolution_function_is_constant_p (const_tree chrec)
if (chrec == NULL_TREE)
return false;
- switch (TREE_CODE (chrec))
- {
- case INTEGER_CST:
- case REAL_CST:
- return true;
-
- default:
- return false;
- }
+ if (CONSTANT_CLASS_P (chrec))
+ return true;
+ return is_gimple_min_invariant (chrec);
}
/* Determine whether CHREC is an affine evolution function in LOOPNUM. */