]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR tree-optimization/92056 (ice in expr_object_size, at tree-object...
authorJakub Jelinek <jakub@redhat.com>
Mon, 21 Oct 2019 11:49:18 +0000 (13:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 21 Oct 2019 11:49:18 +0000 (13:49 +0200)
Backported from mainline
2019-10-17  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/92056
* tree-object-size.c (cond_expr_object_size): Return early if then_
processing resulted in unknown size.

* gcc.c-torture/compile/pr92056.c: New test.

From-SVN: r277259

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr92056.c [new file with mode: 0644]
gcc/tree-object-size.c

index a217f56d4da48e203e944c37b0a212027a8b8cc1..d213669fdb4839830efe01196ba356b51986b774 100644 (file)
@@ -1,6 +1,12 @@
 2019-10-21  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2019-10-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/92056
+       * tree-object-size.c (cond_expr_object_size): Return early if then_
+       processing resulted in unknown size.
+
        2019-10-05  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/91734
index 33b55ce7ae1968dbdfad219f9a40d1d7917ae012..54707bd1e0676ce7114554b533310ebbd5e6d579 100644 (file)
@@ -3,6 +3,9 @@
        Backported from mainline
        2019-10-17  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/92056
+       * gcc.c-torture/compile/pr92056.c: New test.
+
        PR fortran/87752
        * gfortran.dg/gomp/pr87752.f90: New test.
 
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr92056.c b/gcc/testsuite/gcc.c-torture/compile/pr92056.c
new file mode 100644 (file)
index 0000000..d04da76
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR tree-optimization/92056 */
+
+const char *d;
+
+void
+foo (int c, char *e, const char *a, const char *b)
+{
+  switch (c)
+    {
+    case 33:
+      for (;; d++)
+        if (__builtin_strcmp (b ? : "", d))
+          return;
+      break;
+    case 4:
+      __builtin_sprintf (e, a);
+    }
+}
index f9ad7e83943e30925685ed2916d6c3b91f3bdc60..25c5ced57b719924b46e6628fd7dac4aecf13da4 100644 (file)
@@ -890,6 +890,9 @@ cond_expr_object_size (struct object_size_info *osi, tree var, gimple *stmt)
   else
     expr_object_size (osi, var, then_);
 
+  if (object_sizes[object_size_type][varno] == unknown[object_size_type])
+    return reexamine;
+
   if (TREE_CODE (else_) == SSA_NAME)
     reexamine |= merge_object_sizes (osi, var, else_, 0);
   else