aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-04-17 09:07:49 +0200
committerJakub Jelinek <jakub@redhat.com>2020-04-17 09:24:03 +0200
commitc58cb6ac6891886b7aa01c440ac71a5e7cbcba97 (patch)
treefdb519f82bc17d195a0d24c169218e70b442661b /gcc
parente9f799d25973fc38022c5ea71ed5a2bca58a847f (diff)
downloadgcc-c58cb6ac6891886b7aa01c440ac71a5e7cbcba97.zip
gcc-c58cb6ac6891886b7aa01c440ac71a5e7cbcba97.tar.gz
gcc-c58cb6ac6891886b7aa01c440ac71a5e7cbcba97.tar.bz2
inliner: Don't ICE on NULL TYPE_DOMAIN [PR94621]
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr94621.c16
-rw-r--r--gcc/tree-inline.c5
4 files changed, 28 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 80a3761..80b0534 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2020-04-17 Martin Liska <mliska@suse.cz>
Jonathan Yong <10walls@gmail.com>
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1341eb2..64181e4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2020-04-17 Jakub Jelinek <jakub@redhat.com>
+ PR tree-optimization/94621
+ * gcc.c-torture/compile/pr94621.c: New test.
+
PR c++/94314
* g++.dg/pr94314-4.C: Require c++14 rather than c++11.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr94621.c b/gcc/testsuite/gcc.c-torture/compile/pr94621.c
new file mode 100644
index 0000000..0d98dfd
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr94621.c
@@ -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);
+}
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index f095795..26c23f5 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -556,8 +556,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)));