diff mbox series

[committed,PR,tree-optimization/87110] Further refine check in compute_trims

Message ID 1e032b81-3dd1-f81c-a1ca-71155fdab1e4@redhat.com
State New
Headers show
Series [committed,PR,tree-optimization/87110] Further refine check in compute_trims | expand

Commit Message

Jeff Law Aug. 28, 2018, 4:04 a.m. UTC
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 mbox series

Patch

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  <law@redhat.com>
+
+	PR tree-optimization/87110
+	* tree-ssa-dse.c (compute_trims): Handle non-constant
+	TYPE_SIZE_UNIT.
+
 2018-08-27  Martin Sebor  <msebor@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  <law@redhat.com>
+
+	PR tree-optimization/87110
+	* gcc.c-torture/compile/pr87110.c: New test.
+
 2018-08-27  Martin Sebor  <msebor@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;