]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
inliner: Don't ICE on NULL TYPE_DOMAIN [PR94621]
authorJakub Jelinek <jakub@redhat.com>
Fri, 17 Apr 2020 07:07:49 +0000 (09:07 +0200)
committerJakub Jelinek <jakub@redhat.com>
Wed, 16 Sep 2020 17:06:18 +0000 (19:06 +0200)
When I've added the VLA tweak for OpenMP to avoid error_mark_nodes in the IL in
type, I forgot that TYPE_DOMAIN could be NULL.  Furthermore, as an optimization,
this patch checks the hopefully cheapest condition that is very likely false
most of the time (enabled only during OpenMP handling) first.

2020-04-17  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/94621
* tree-inline.c (remap_type_1): Don't dereference NULL TYPE_DOMAIN.
Move id->adjust_array_error_bounds check first in the condition.

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

(cherry picked from commit c58cb6ac6891886b7aa01c440ac71a5e7cbcba97)

gcc/testsuite/gcc.c-torture/compile/pr94621.c [new file with mode: 0644]
gcc/tree-inline.c

diff --git a/gcc/testsuite/gcc.c-torture/compile/pr94621.c b/gcc/testsuite/gcc.c-torture/compile/pr94621.c
new file mode 100644 (file)
index 0000000..0d98dfd
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR tree-optimization/94621 */
+
+struct S { int c, e[]; };
+
+static inline int
+foo (struct S *m, int r, int c)
+{
+  int (*a)[][m->c] = (int (*)[][m->c])&m->e;
+  return (*a)[r][c];
+}
+
+void
+bar (struct S *a)
+{
+  foo (a, 0, 0);
+}
index 7a41f64bcc34a1c12cfc76ef7238d0471533bd93..878f1631a179c203da0bb0a239eefcf37330fbdb 100644 (file)
@@ -543,8 +543,9 @@ remap_type_1 (tree type, copy_body_data *id)
          /* For array bounds where we have decided not to copy over the bounds
             variable which isn't used in OpenMP/OpenACC region, change them to
             an uninitialized VAR_DECL temporary.  */
-         if (TYPE_MAX_VALUE (TYPE_DOMAIN (new_tree)) == error_mark_node
-             && id->adjust_array_error_bounds
+         if (id->adjust_array_error_bounds
+             && TYPE_DOMAIN (new_tree)
+             && TYPE_MAX_VALUE (TYPE_DOMAIN (new_tree)) == error_mark_node
              && TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != error_mark_node)
            {
              tree v = create_tmp_var (TREE_TYPE (TYPE_DOMAIN (new_tree)));