aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr66768.c17
-rw-r--r--gcc/tree-ssa-loop-ivopts.c4
4 files changed, 32 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0909183..8f196d7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-03-02 Bin Cheng <bin.cheng@arm.com>
+
+ PR tree-optimization/66768
+ * tree-ssa-loop-ivopts.c (find_interesting_uses_address): Skip addr
+ iv_use if base object can't be determined.
+
2017-03-02 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/79345
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8677d67..9f23154 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-03-02 Bin Cheng <bin.cheng@arm.com>
+
+ PR tree-optimization/66768
+ * gcc.target/i386/pr66768.c: New test.
+
2017-03-02 Richard Biener <rguenther@suse.de>
* gcc.dg/rtl/x86_64/dfinit.c: Only run for lp64.
diff --git a/gcc/testsuite/gcc.target/i386/pr66768.c b/gcc/testsuite/gcc.target/i386/pr66768.c
new file mode 100644
index 0000000..9a8ad1f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr66768.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef __seg_gs struct foo_s {
+ int a[20];
+} foo_t;
+
+int sum(void)
+{
+ const foo_t *p = (const foo_t *)0x1234;
+ int i, total=0;
+ for (i=0; i<20; i++)
+ total += p->a[i];
+ return total;
+}
+
+/* { dg-final { scan-assembler "add*.\[ \t\]%gs:" } } */
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index c9d16b2..f3ad373 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -2324,6 +2324,10 @@ find_interesting_uses_address (struct ivopts_data *data, gimple *stmt,
}
civ = alloc_iv (data, base, step);
+ /* Fail if base object of this memory reference is unknown. */
+ if (civ->base_object == NULL_TREE)
+ goto fail;
+
record_group_use (data, op_p, civ, stmt, USE_ADDRESS);
return;