]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Backport PRs 84873, 85168, 85244, 85284
authorRichard Biener <rguenther@suse.de>
Thu, 26 Apr 2018 10:00:24 +0000 (10:00 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 26 Apr 2018 10:00:24 +0000 (10:00 +0000)
2018-04-26  Richard Biener  <rguenther@suse.de>

Backport from mainline
2018-04-09  Richard Biener  <rguenther@suse.de>

PR tree-optimization/85284
* tree-ssa-loop-niter.c (number_of_iterations_exit_assumptions):
Only use the niter constraining form of simple_iv when the exit
is always executed.

* gcc.dg/torture/pr85284.c: New testcase.

2018-04-06  Richard Biener  <rguenther@suse.de>

PR middle-end/85244
* tree-dfa.c (get_ref_base_and_extent): Reset seen_variable_array_ref
after seeing a component reference with an adjacent field.  Treat
refs to arrays at struct end of external decls similar to
refs to unconstrained commons.

* gcc.dg/torture/pr85244-1.c: New testcase.
* gcc.dg/torture/pr85244-2.c: Likewise.

2018-04-04  Richard Biener  <rguenther@suse.de>

PR tree-optimization/85168
* tree-ssa-sccvn.c (vn_reference_maybe_forwprop_address): Avoid
propagating abnormals.

* gcc.dg/torture/pr85168.c: New testcase.

2018-03-16  Richard Biener  <rguenther@suse.de>

PR c/84873
* c-gimplify.c (c_gimplify_expr): Revert previous change.  Instead
unshare the possibly folded expression.

2018-03-15  Richard Biener  <rguenther@suse.de>

PR c/84873
* c-gimplify.c (c_gimplify_expr): Do not fold expressions.

* c-c++-common/pr84873.c: New testcase.

From-SVN: r259670

12 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr84873.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr85168.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr85244-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr85244-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr85284.c [new file with mode: 0644]
gcc/tree-dfa.c
gcc/tree-ssa-loop-niter.c
gcc/tree-ssa-sccvn.c

index b841dafaf6f9bc3842e1e72b1c95e203ba0fe60e..42bb3021c040e582a7a4ca17c970eb307b5cee68 100644 (file)
@@ -1,3 +1,27 @@
+2018-04-26  Richard Biener  <rguenther@suse.de>
+
+       Backport from mainline
+       2018-04-09  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/85284
+       * tree-ssa-loop-niter.c (number_of_iterations_exit_assumptions):
+       Only use the niter constraining form of simple_iv when the exit
+       is always executed.
+
+       2018-04-06  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/85244
+       * tree-dfa.c (get_ref_base_and_extent): Reset seen_variable_array_ref
+       after seeing a component reference with an adjacent field.  Treat
+       refs to arrays at struct end of external decls similar to
+       refs to unconstrained commons.
+
+       2018-04-04  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/85168
+       * tree-ssa-sccvn.c (vn_reference_maybe_forwprop_address): Avoid
+       propagating abnormals.
+
 2018-04-24  Martin Liska  <mliska@suse.cz>
 
        Backport from mainline
index 7a83a0a906238816a2eda3b7053134133fd289fc..962f62844a3b87b7ebbdedd5783dc9a5c48f1646 100644 (file)
@@ -1,3 +1,17 @@
+2018-04-26  Richard Biener  <rguenther@suse.de>
+
+       Backport from mainline
+       2018-03-16  Richard Biener  <rguenther@suse.de>
+
+       PR c/84873
+       * c-gimplify.c (c_gimplify_expr): Revert previous change.  Instead
+       unshare the possibly folded expression.
+
+       2018-03-15  Richard Biener  <rguenther@suse.de>
+
+       PR c/84873
+       * c-gimplify.c (c_gimplify_expr): Do not fold expressions.
+
 2018-03-03  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
index 57edb41af0f08dfb193965213808d852a5ea53c3..deecb1a3e4a1cc3fd74a5aefa332e565c627b365 100644 (file)
@@ -244,7 +244,9 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED,
                                    unsigned_type_node)
            && !types_compatible_p (TYPE_MAIN_VARIANT (TREE_TYPE (*op1_p)),
                                    integer_type_node))
-         *op1_p = convert (unsigned_type_node, *op1_p);
+         /* Make sure to unshare the result, tree sharing is invalid
+            during gimplification.  */
+         *op1_p = unshare_expr (convert (unsigned_type_node, *op1_p));
        break;
       }
 
index f655439d65ba5bc01ec9aed82d13d5c62bdb12e7..f9e027b964da07ffbf9ba5e1e9c3a695479a7e90 100644 (file)
@@ -1,3 +1,27 @@
+2018-04-26  Richard Biener  <rguenther@suse.de>
+
+       Backport from mainline
+       2018-04-09  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/85284
+       * gcc.dg/torture/pr85284.c: New testcase.
+
+       2018-04-06  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/85244
+       * gcc.dg/torture/pr85244-1.c: New testcase.
+       * gcc.dg/torture/pr85244-2.c: Likewise.
+
+       2018-04-04  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/85168
+       * gcc.dg/torture/pr85168.c: New testcase.
+
+       2018-03-15  Richard Biener  <rguenther@suse.de>
+
+       PR c/84873
+       * c-c++-common/pr84873.c: New testcase.
+
 2018-04-24  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/85520
diff --git a/gcc/testsuite/c-c++-common/pr84873.c b/gcc/testsuite/c-c++-common/pr84873.c
new file mode 100644 (file)
index 0000000..5eb8a8d
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-frounding-math" } */
+
+int
+i1 (int w3, int n9)
+{
+  return w3 >> ((long int)(1 + 0.1) + -!n9);
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr85168.c b/gcc/testsuite/gcc.dg/torture/pr85168.c
new file mode 100644 (file)
index 0000000..cc5e664
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target indirect_jumps } */
+
+typedef struct {
+    struct {
+       char a;
+    } b;
+} c;
+
+int d, f;
+c *e;
+
+extern void i(void);
+extern void sejtmp () __attribute__((returns_twice));
+
+void g(void)
+{
+  c *h = e;
+  if (f)
+    {
+      i();
+      h--;
+      if (d)
+       if (h->b.a)
+         i();
+    }
+  if (h->b.a)
+    sejtmp();
+  e = h;
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr85244-1.c b/gcc/testsuite/gcc.dg/torture/pr85244-1.c
new file mode 100644 (file)
index 0000000..44716aa
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+/* { dg-additional-sources "pr85244-2.c" } */
+
+struct s {
+ long a;
+ int b;
+ int tab[];
+};
+
+extern const struct s val;
+extern int idx;
+extern void abort (void);
+
+int main()
+{
+  if (val.tab[0] != 42 || val.tab[1] != 1337 || val.tab[idx] != 1337)
+    abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr85244-2.c b/gcc/testsuite/gcc.dg/torture/pr85244-2.c
new file mode 100644 (file)
index 0000000..d57cb71
--- /dev/null
@@ -0,0 +1,8 @@
+struct s {
+    long a;
+    int b;
+    int tab[];
+};
+
+int idx = 1;
+const struct s val = { 0, 0, { 42, 1337 } };
diff --git a/gcc/testsuite/gcc.dg/torture/pr85284.c b/gcc/testsuite/gcc.dg/torture/pr85284.c
new file mode 100644 (file)
index 0000000..80e2c5b
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do run } */
+
+static int p[48], v;
+
+int
+main ()
+{
+  p[32] = 1;
+  for (int i = 48; i--;)
+    {
+      if (!p[i])
+       continue;
+      if ((i & 7) > 2)
+       break;
+      v = i & 1;
+    }
+  if (v != 0)
+    __builtin_abort ();
+  return 0;
+}
index 4e47be1dc05ee7f9cbf3bc4f8b81e70d57842c91..645db9e1459645162346db255e5f2fa11381d34d 100644 (file)
@@ -438,7 +438,7 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
                   referenced the last field of a struct or a union member
                   then we have to adjust maxsize by the padding at the end
                   of our field.  */
-               if (seen_variable_array_ref && maxsize != -1)
+               if (seen_variable_array_ref)
                  {
                    tree stype = TREE_TYPE (TREE_OPERAND (exp, 0));
                    tree next = DECL_CHAIN (field);
@@ -454,7 +454,7 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
                            || ssize == NULL
                            || TREE_CODE (ssize) != INTEGER_CST)
                          maxsize = -1;
-                       else
+                       else if (maxsize != -1)
                          {
                            offset_int tem = (wi::to_offset (ssize)
                                              - wi::to_offset (fsize));
@@ -463,6 +463,11 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
                            maxsize += tem;
                          }
                      }
+                   /* An component ref with an adjacent field up in the
+                      structure hierarchy constrains the size of any variable
+                      array ref lower in the access hierarchy.  */
+                   else
+                     seen_variable_array_ref = false;
                  }
              }
            else
@@ -617,7 +622,9 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
 
   if (DECL_P (exp))
     {
-      if (flag_unconstrained_commons && VAR_P (exp) && DECL_COMMON (exp))
+      if (VAR_P (exp)
+         && ((flag_unconstrained_commons && DECL_COMMON (exp))
+             || (DECL_EXTERNAL (exp) && seen_variable_array_ref)))
        {
          tree sz_tree = TYPE_SIZE (TREE_TYPE (exp));
          /* If size is unknown, or we have read to the end, assume there
index 6b829cc4d79f4bdc4cca468e62987f6349db9d9c..3f51cb9878854292e44041028fbb5c01b4ffe705 100644 (file)
@@ -2320,11 +2320,11 @@ number_of_iterations_exit_assumptions (struct loop *loop, edge exit,
 
   tree iv0_niters = NULL_TREE;
   if (!simple_iv_with_niters (loop, loop_containing_stmt (stmt),
-                             op0, &iv0, &iv0_niters, false))
+                             op0, &iv0, safe ? &iv0_niters : NULL, false))
     return false;
   tree iv1_niters = NULL_TREE;
   if (!simple_iv_with_niters (loop, loop_containing_stmt (stmt),
-                             op1, &iv1, &iv1_niters, false))
+                             op1, &iv1, safe ? &iv1_niters : NULL, false))
     return false;
   /* Give up on complicated case.  */
   if (iv0_niters && iv1_niters)
index 01e060b66903466b757170157ae5110ca0a35235..0607b4bf0839e9d39fca8a7131ffb68efb87708d 100644 (file)
@@ -1245,7 +1245,9 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops,
          return true;
        }
       if (!addr_base
-         || TREE_CODE (addr_base) != MEM_REF)
+         || TREE_CODE (addr_base) != MEM_REF
+         || (TREE_CODE (TREE_OPERAND (addr_base, 0)) == SSA_NAME
+             && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (addr_base, 0))))
        return false;
 
       off += addr_offset;
@@ -1258,6 +1260,7 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops,
       ptr = gimple_assign_rhs1 (def_stmt);
       ptroff = gimple_assign_rhs2 (def_stmt);
       if (TREE_CODE (ptr) != SSA_NAME
+         || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ptr)
          || TREE_CODE (ptroff) != INTEGER_CST)
        return false;