As shown in the testcase within the PR we need to handle VLAs in
compute_trims as well.  We can't pass down a non-constant to
compare_tree_int.

Bootstrapped & regression tested on x86.  Installing on the trunk.

jeff
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4cbea7a195d..a8553043887 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-08-27  Jeff Law  <l...@redhat.com>
+
+       PR tree-optimization/87110
+       * tree-ssa-dse.c (compute_trims): Handle non-constant
+       TYPE_SIZE_UNIT.
+
 2018-08-27  Martin Sebor  <mse...@redhat.com>
 
        PR tree-optimization/86914
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4b5c1533c33..6d85561ef83 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-08-27  Jeff Law  <l...@redhat.com>
+
+       PR tree-optimization/87110
+       * gcc.c-torture/compile/pr87110.c: New test.
+
 2018-08-27  Martin Sebor  <mse...@redhat.com>
 
        PR tree-optimization/86914
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr87110.c 
b/gcc/testsuite/gcc.c-torture/compile/pr87110.c
new file mode 100644
index 00000000000..8428d3d120a
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr87110.c
@@ -0,0 +1,13 @@
+enum a { b, c };
+struct d {
+  _Bool e;
+  enum a f
+};
+g, h;
+i() {
+  struct d j[h];
+  j[0] = (struct d){.f = c};
+  for (; g;)
+    (struct d){};
+}
+
diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c
index bddbbe8377a..8b7aea0e54e 100644
--- a/gcc/tree-ssa-dse.c
+++ b/gcc/tree-ssa-dse.c
@@ -250,9 +250,13 @@ compute_trims (ao_ref *ref, sbitmap live, int *trim_head, 
int *trim_tail,
       *trim_tail = last_orig - last_live;
 
       /* But don't trim away out of bounds accesses, as this defeats
-        proper warnings.  */
+        proper warnings.
+
+        We could have a type with no TYPE_SIZE_UNIT or we could have a VLA
+        where TYPE_SIZE_UNIT is not a constant.  */
       if (*trim_tail
          && TYPE_SIZE_UNIT (TREE_TYPE (ref->base))
+         && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (ref->base))) == INTEGER_CST
          && compare_tree_int (TYPE_SIZE_UNIT (TREE_TYPE (ref->base)),
                               last_orig) <= 0)
        *trim_tail = 0;

Reply via email to