aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-05-18 10:12:20 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-05-18 10:12:20 +0000
commit6b9fc1782effc67dd9f6def16207653d79647553 (patch)
treefd645ec37779713599dd830519f77baa421a0e2a
parent5f007d14ce68073906656b725938a3be2625435b (diff)
downloadgcc-6b9fc1782effc67dd9f6def16207653d79647553.zip
gcc-6b9fc1782effc67dd9f6def16207653d79647553.tar.gz
gcc-6b9fc1782effc67dd9f6def16207653d79647553.tar.bz2
tree-dfa.c (get_ref_base_and_extent): Use range-info to refine results when processing array refs with variable index.
2018-05-18 Richard Biener <rguenther@suse.de> * tree-dfa.c (get_ref_base_and_extent): Use range-info to refine results when processing array refs with variable index. * gcc.dg/tree-ssa/ssa-dse-35.c: New testcase. * gcc.dg/graphite/scop-10.c: Adjust to avoid dead code. * gcc.dg/graphite/scop-6.c: Likewise. * gcc.dg/graphite/scop-7.c: Likewise. * gcc.dg/graphite/scop-8.c: Likewise. * gcc.dg/graphite/scop-9.c: Likewise. From-SVN: r260354
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gcc.dg/graphite/scop-10.c2
-rw-r--r--gcc/testsuite/gcc.dg/graphite/scop-6.c2
-rw-r--r--gcc/testsuite/gcc.dg/graphite/scop-7.c2
-rw-r--r--gcc/testsuite/gcc.dg/graphite/scop-8.c2
-rw-r--r--gcc/testsuite/gcc.dg/graphite/scop-9.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-35.c13
-rw-r--r--gcc/tree-dfa.c43
9 files changed, 75 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3026df4..8a1bc05 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2018-05-18 Richard Biener <rguenther@suse.de>
+
+ * tree-dfa.c (get_ref_base_and_extent): Use range-info to refine
+ results when processing array refs with variable index.
+
2018-05-18 Toon Moene <toon@moene.org>
* doc/invoke.texi: Move -floop-unroll-and-jam documentation
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 840d9a0..7d53f32 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2018-05-18 Richard Biener <rguenther@suse.de>
+
+ * gcc.dg/tree-ssa/ssa-dse-35.c: New testcase.
+ * gcc.dg/graphite/scop-10.c: Adjust to avoid dead code.
+ * gcc.dg/graphite/scop-6.c: Likewise.
+ * gcc.dg/graphite/scop-7.c: Likewise.
+ * gcc.dg/graphite/scop-8.c: Likewise.
+ * gcc.dg/graphite/scop-9.c: Likewise.
+
2018-05-18 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* gcc.target/aarch64/vect-init-ld1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/graphite/scop-10.c b/gcc/testsuite/gcc.dg/graphite/scop-10.c
index 20d5351..d041830 100644
--- a/gcc/testsuite/gcc.dg/graphite/scop-10.c
+++ b/gcc/testsuite/gcc.dg/graphite/scop-10.c
@@ -22,7 +22,7 @@ int toto()
b[i+k] = b[i+k-5] + 2;
}
- return a[3][5] + b[1];
+ return a[3][5] + b[2];
}
/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
diff --git a/gcc/testsuite/gcc.dg/graphite/scop-6.c b/gcc/testsuite/gcc.dg/graphite/scop-6.c
index 1da486a..9bc1d9f 100644
--- a/gcc/testsuite/gcc.dg/graphite/scop-6.c
+++ b/gcc/testsuite/gcc.dg/graphite/scop-6.c
@@ -23,7 +23,7 @@ int toto()
b[i+k] = b[i+k-5] + 2;
}
- return a[3][5] + b[1];
+ return a[3][5] + b[2];
}
/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
diff --git a/gcc/testsuite/gcc.dg/graphite/scop-7.c b/gcc/testsuite/gcc.dg/graphite/scop-7.c
index 2f0a504..f4f3093f 100644
--- a/gcc/testsuite/gcc.dg/graphite/scop-7.c
+++ b/gcc/testsuite/gcc.dg/graphite/scop-7.c
@@ -23,7 +23,7 @@ int toto()
b[i+k] = b[i+k-5] + 2;
}
- return a[3][5] + b[1];
+ return a[3][5] + b[2];
}
/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
diff --git a/gcc/testsuite/gcc.dg/graphite/scop-8.c b/gcc/testsuite/gcc.dg/graphite/scop-8.c
index 3ceb5d8..b062651 100644
--- a/gcc/testsuite/gcc.dg/graphite/scop-8.c
+++ b/gcc/testsuite/gcc.dg/graphite/scop-8.c
@@ -23,7 +23,7 @@ int toto()
b[i+k] = b[i+k-5] + 2;
}
- return a[3][5] + b[1];
+ return a[3][5] + b[2];
}
/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
diff --git a/gcc/testsuite/gcc.dg/graphite/scop-9.c b/gcc/testsuite/gcc.dg/graphite/scop-9.c
index 9388872..b19291b 100644
--- a/gcc/testsuite/gcc.dg/graphite/scop-9.c
+++ b/gcc/testsuite/gcc.dg/graphite/scop-9.c
@@ -18,7 +18,7 @@ int toto()
b[i+k] = b[i+k-5] + 2;
}
- return a[3][5] + b[1];
+ return a[3][5] + b[2];
}
/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-35.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-35.c
new file mode 100644
index 0000000..1f21670
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-35.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-dse1-details" } */
+
+int a[256];
+void foo (void)
+{
+ a[0] = 1;
+ for (int i = 5; i < 17; ++i)
+ a[i] = i;
+ a[0] = 2;
+}
+
+/* { dg-final { scan-tree-dump-times "Deleted dead store" 1 "dse1" } } */
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index a121b88..00aa75f 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -529,6 +529,49 @@ get_ref_base_and_extent (tree exp, poly_int64_pod *poffset,
/* Remember that we have seen an array ref with a variable
index. */
seen_variable_array_ref = true;
+
+ wide_int min, max;
+ if (TREE_CODE (index) == SSA_NAME
+ && (low_bound = array_ref_low_bound (exp),
+ poly_int_tree_p (low_bound))
+ && (unit_size = array_ref_element_size (exp),
+ TREE_CODE (unit_size) == INTEGER_CST)
+ && get_range_info (index, &min, &max) == VR_RANGE)
+ {
+ poly_offset_int lbound = wi::to_poly_offset (low_bound);
+ /* Try to constrain maxsize with range information. */
+ offset_int omax
+ = offset_int::from (max, TYPE_SIGN (TREE_TYPE (index)));
+ if (known_lt (lbound, omax))
+ {
+ poly_offset_int rmaxsize;
+ rmaxsize = (omax - lbound + 1)
+ * wi::to_offset (unit_size) << LOG2_BITS_PER_UNIT;
+ if (!known_size_p (maxsize)
+ || known_lt (rmaxsize, maxsize))
+ {
+ /* If we know an upper bound below the declared
+ one this is no longer variable. */
+ if (known_size_p (maxsize))
+ seen_variable_array_ref = false;
+ maxsize = rmaxsize;
+ }
+ }
+ /* Try to adjust bit_offset with range information. */
+ offset_int omin
+ = offset_int::from (min, TYPE_SIGN (TREE_TYPE (index)));
+ if (known_le (lbound, omin))
+ {
+ poly_offset_int woffset
+ = wi::sext (omin - lbound,
+ TYPE_PRECISION (TREE_TYPE (index)));
+ woffset *= wi::to_offset (unit_size);
+ woffset <<= LOG2_BITS_PER_UNIT;
+ bit_offset += woffset;
+ if (known_size_p (maxsize))
+ maxsize -= woffset;
+ }
+ }
}
}
break;