aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr84136.c15
-rw-r--r--gcc/tree-cfg.c12
4 files changed, 34 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dd78a34..8212952 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-02-08 David Malcolm <dmalcolm@redhat.com>
+
+ PR tree-optimization/84136
+ * tree-cfg.c (find_taken_edge_computed_goto): Remove assertion
+ that the result of find_edge is non-NULL.
+
2018-02-08 Sergey Shalnov <sergey.shalnov@intel.com>
PR target/83008
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d9ed50c..dfa8cb8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-02-08 David Malcolm <dmalcolm@redhat.com>
+
+ PR tree-optimization/84136
+ * gcc.c-torture/compile/pr84136.c: New test.
+
2018-02-08 Sergey Shalnov <sergey.shalnov@intel.com>
PR target/83008
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr84136.c b/gcc/testsuite/gcc.c-torture/compile/pr84136.c
new file mode 100644
index 0000000..0a70e4e
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr84136.c
@@ -0,0 +1,15 @@
+void* a;
+
+void foo() {
+ if ((a = &&l))
+ return;
+
+ l:;
+}
+
+int main() {
+ foo();
+ goto *a;
+
+ return 0;
+}
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index c5318b9..b87e48d 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -2379,10 +2379,14 @@ find_taken_edge_computed_goto (basic_block bb, tree val)
dest = label_to_block (val);
if (dest)
- {
- e = find_edge (bb, dest);
- gcc_assert (e != NULL);
- }
+ e = find_edge (bb, dest);
+
+ /* It's possible for find_edge to return NULL here on invalid code
+ that abuses the labels-as-values extension (e.g. code that attempts to
+ jump *between* functions via stored labels-as-values; PR 84136).
+ If so, then we simply return that NULL for the edge.
+ We don't currently have a way of detecting such invalid code, so we
+ can't assert that it was the case when a NULL edge occurs here. */
return e;
}