aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr78684.C20
-rw-r--r--gcc/tree-vect-loop-manip.c3
4 files changed, 32 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2026261..91a1ed3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-12-08 Bin Cheng <bin.cheng@arm.com>
+
+ PR middle-end/78684
+ * tree-vect-loop-manip.c (create_intersect_range_checks_index): Check
+ sign bit for index step of data reference.
+
2016-12-08 Naveen H.S <Naveen.Hurugalawadi@cavium.com>
* config/aarch64/aarch64.c (aarch64_load_symref_appropriately):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c7d2773..904d74f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-12-08 Bin Cheng <bin.cheng@arm.com>
+
+ PR middle-end/78684
+ * g++.dg/torture/pr78684.C: New test.
+
2016-12-08 Christophe Lyon <christophe.lyon@linaro.org>
* gcc.target/aarch64/advsimd-intrinsics/arm-neon-ref.h
diff --git a/gcc/testsuite/g++.dg/torture/pr78684.C b/gcc/testsuite/g++.dg/torture/pr78684.C
new file mode 100644
index 0000000..5d71be5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr78684.C
@@ -0,0 +1,20 @@
+// PR middle-end/78684
+// { dg-do compile }
+
+class a {
+public:
+ a(long);
+ void operator<<=(long) {
+ long b;
+ for (unsigned long c; c; c--)
+ d[c + b] = d[c];
+ }
+ a &g();
+ long d[28];
+};
+long e;
+int f;
+void j() {
+ a h(e), i = h;
+ i.g() <<= f;
+}
diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c
index e13d6a2..beb2f06 100644
--- a/gcc/tree-vect-loop-manip.c
+++ b/gcc/tree-vect-loop-manip.c
@@ -2070,8 +2070,7 @@ create_intersect_range_checks_index (loop_vec_info loop_vinfo, tree *cond_expr,
/* Index must have const step, otherwise DR_STEP won't be constant. */
gcc_assert (TREE_CODE (idx_step) == INTEGER_CST);
/* Index must evaluate in the same direction as DR. */
- gcc_assert (!neg_step
- || tree_int_cst_compare (idx_step, size_zero_node) < 0);
+ gcc_assert (!neg_step || tree_int_cst_sign_bit (idx_step) == 1);
tree min1 = CHREC_LEFT (access1);
tree min2 = CHREC_LEFT (access2);