]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR tree-optimization/70190
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Mar 2016 22:32:11 +0000 (22:32 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Mar 2016 22:32:11 +0000 (22:32 +0000)
* tree-ssa-threadbackward.c (fsm_find_control_statement_thread_paths):
Handle cases where we can not extract the taken edge, even though we
found a constant value.

PR tree-optimization/70190
* gcc.c-torture/compile/pr70190.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234151 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr70190.c [new file with mode: 0644]
gcc/tree-ssa-threadbackward.c

index f3a73515480c236b6bb4938ce4fcf1103de49aa4..1bc7ab5c8d373b649f48c9b8ba873bbe3b34eda0 100644 (file)
@@ -1,5 +1,10 @@
 2016-03-11  Jeff Law  <law@redhat.com>
 
+       PR tree-optimization/70190
+       * tree-ssa-threadbackward.c (fsm_find_control_statement_thread_paths):
+       Handle cases where we can not extract the taken edge, even though we
+       found a constant value.
+
        PR tree-optimization/64058
        * tree-ssa-coalesce.c (struct coalesce_pair): Add new field INDEX.
        (num_coalesce_pairs): Move up earlier in file.
index f42e94375530af4ba38c5c2dbd6dc7a853d5a8a4..e48430c6f74181d6e6828cc8d7a0a6654f9b2e19 100644 (file)
@@ -1,3 +1,8 @@
+2016-03-11  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/70190
+       * gcc.c-torture/compile/pr70190.c: New test.
+
 2016-03-11  David Malcolm  <dmalcolm@redhat.com>
 
        PR c/68187
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr70190.c b/gcc/testsuite/gcc.c-torture/compile/pr70190.c
new file mode 100644 (file)
index 0000000..d3d209a
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-require-effective-target indirect_jumps } */
+/* { dg-require-effective-target label_values } */
+
+
+int
+fn1 ()
+{
+  static char a[] = "foo";
+  static void *b[] = { &&l1, &&l2 };
+  goto *(b[1]);
+ l1: goto *(a[0]);
+ l2: return 0;
+}
+
index 6f1b7573e5d112ba9b8c5731557019ba2afdd63b..88f8d5eb7783f968dd205db113a412d979707a41 100644 (file)
@@ -385,6 +385,16 @@ fsm_find_control_statement_thread_paths (tree name,
 
             We have to know the outgoing edge to figure this out.  */
          edge taken_edge = find_taken_edge ((*path)[0], arg);
+
+         /* There are cases where we may not be able to extract the
+            taken edge.  For example, a computed goto to an absolute
+            address.  Handle those cases gracefully.  */
+         if (taken_edge == NULL)
+           {
+             path->pop ();
+             continue;
+           }
+
          bool creates_irreducible_loop = false;
          if (threaded_through_latch
              && loop == taken_edge->dest->loop_father