tree-ssa-threadedge.c: Remove include of tree-ssa-threadbackward.h.
authorJeff Law <law@redhat.com>
Fri, 27 May 2016 16:32:38 +0000 (10:32 -0600)
committerJeff Law <law@gcc.gnu.org>
Fri, 27 May 2016 16:32:38 +0000 (10:32 -0600)
* tree-ssa-threadedge.c: Remove include of tree-ssa-threadbackward.h.
(thread_across_edge): Remove calls to find_jump_threads_backwards.
* passes.def: Add jump threading passes before DOM/VRP.
* tree-ssa-threadbackward.c (find_jump_threads_backwards): Change
argument to a basic block from an edge.  Remove tests which are
handled elsewhere.
(pass_data_thread_jumps, class pass_thread_jumps): New.
(pass_thread_jumps::gate, pass_thread_jumps::execute): New.
(make_pass_thread_jumps): Likewise.
* tree-pass.h (make_pass_thread_jumps): Declare.

* gcc.dg/tree-ssa/pr21417.c: Update expected output.
* gcc.dg/tree-ssa/pr66752-3.c: Likewise.
* gcc.dg/tree-ssa/pr68198.c: Likewise.
* gcc.dg/tree-ssa/pr69196-1.c: Likewise.
* gcc.dg/tree-ssa/pr69270-3.c: Likewise.
* gcc.dg/tree-ssa/ssa-dom-thread-2b.c: Likewise.
* gcc.dg/tree-ssa/ssa-dom-thread-2g.c: Likewise.
* gcc.dg/tree-ssa/ssa-dom-thread-2h.c: Likewise.
* gcc.dg/tree-ssa/ssa-dom-thread-6.c: Likewise.
* gcc.dg/tree-ssa/ssa-dom-thread-7.c: Likewise.
* gcc.dg/tree-ssa/ssa-dom-thread-12.c: Likewise.
* gcc.dg/tree-ssa/ssa-dom-thread-13.c: Likewise.
* gcc.dg/tree-ssa/vrp56.c: Likewise.

From-SVN: r236831

20 files changed:
gcc/ChangeLog
gcc/passes.def
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr21417.c
gcc/testsuite/gcc.dg/tree-ssa/pr66752-3.c
gcc/testsuite/gcc.dg/tree-ssa/pr68198.c
gcc/testsuite/gcc.dg/tree-ssa/pr69196-1.c
gcc/testsuite/gcc.dg/tree-ssa/pr69270-3.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2b.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2g.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2h.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-6.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-12.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-13.c
gcc/testsuite/gcc.dg/tree-ssa/vrp56.c
gcc/timevar.def
gcc/tree-pass.h
gcc/tree-ssa-threadbackward.c
gcc/tree-ssa-threadedge.c

index f04d26d8d565a3e4993313497dd69ca87c18c266..40bac96a87863c01c0f2b133d2b5d8dfdc55f3ef 100644 (file)
@@ -1,3 +1,16 @@
+2016-05-26  Jeff Law  <law@redhat.com>
+
+       * tree-ssa-threadedge.c: Remove include of tree-ssa-threadbackward.h.
+       (thread_across_edge): Remove calls to find_jump_threads_backwards.
+       * passes.def: Add jump threading passes before DOM/VRP.
+       * tree-ssa-threadbackward.c (find_jump_threads_backwards): Change
+       argument to a basic block from an edge.  Remove tests which are
+       handled elsewhere.
+       (pass_data_thread_jumps, class pass_thread_jumps): New.
+       (pass_thread_jumps::gate, pass_thread_jumps::execute): New.
+       (make_pass_thread_jumps): Likewise.
+       * tree-pass.h (make_pass_thread_jumps): Declare.
+
 2016-05-27  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/visium/visium-protos.h (split_double_move): Rename into...
index 993ed28628b3be8b708433403f516ad360727e39..3647e90ddfe59fe87e1e7a54564dfecd730b013c 100644 (file)
@@ -199,6 +199,7 @@ along with GCC; see the file COPYING3.  If not see
       NEXT_PASS (pass_return_slot);
       NEXT_PASS (pass_fre);
       NEXT_PASS (pass_merge_phi);
+      NEXT_PASS (pass_thread_jumps);
       NEXT_PASS (pass_vrp, true /* warn_array_bounds_p */);
       NEXT_PASS (pass_chkp_opt);
       NEXT_PASS (pass_dce);
@@ -218,6 +219,7 @@ along with GCC; see the file COPYING3.  If not see
         propagations have already run, but before some more dead code
         is removed, and this place fits nicely.  Remember this when
         trying to move or duplicate pass_dominator somewhere earlier.  */
+      NEXT_PASS (pass_thread_jumps);
       NEXT_PASS (pass_dominator, true /* may_peel_loop_headers_p */);
       /* At this point the majority of const/copy propagations
         are exposed.  Go ahead and identify paths that should never
@@ -305,8 +307,10 @@ along with GCC; see the file COPYING3.  If not see
       NEXT_PASS (pass_strength_reduction);
       NEXT_PASS (pass_split_paths);
       NEXT_PASS (pass_tracer);
+      NEXT_PASS (pass_thread_jumps);
       NEXT_PASS (pass_dominator, false /* may_peel_loop_headers_p */);
       NEXT_PASS (pass_strlen);
+      NEXT_PASS (pass_thread_jumps);
       NEXT_PASS (pass_vrp, false /* warn_array_bounds_p */);
       /* The only const/copy propagation opportunities left after
         DOM and VRP should be due to degenerate PHI nodes.  So rather than
index 00c2a99aaea9731c5b5edfd9d1fef507ab71e0b8..5ded2d4187358989b1653acdb4df06a5f8e9f4c0 100644 (file)
@@ -1,3 +1,19 @@
+2016-05-26  Jeff Law  <law@redhat.com>
+
+       * gcc.dg/tree-ssa/pr21417.c: Update expected output.
+       * gcc.dg/tree-ssa/pr66752-3.c: Likewise.
+       * gcc.dg/tree-ssa/pr68198.c: Likewise.
+       * gcc.dg/tree-ssa/pr69196-1.c: Likewise.
+       * gcc.dg/tree-ssa/pr69270-3.c: Likewise.
+       * gcc.dg/tree-ssa/ssa-dom-thread-2b.c: Likewise.
+       * gcc.dg/tree-ssa/ssa-dom-thread-2g.c: Likewise.
+       * gcc.dg/tree-ssa/ssa-dom-thread-2h.c: Likewise.
+       * gcc.dg/tree-ssa/ssa-dom-thread-6.c: Likewise.
+       * gcc.dg/tree-ssa/ssa-dom-thread-7.c: Likewise.
+       * gcc.dg/tree-ssa/ssa-dom-thread-12.c: Likewise.
+       * gcc.dg/tree-ssa/ssa-dom-thread-13.c: Likewise.
+       * gcc.dg/tree-ssa/vrp56.c: Likewise.
+
 2016-05-27  Ville Voutilainen  <ville.voutilainen@gmail.com>
 
        PR c++/69855
index c865ee3337c262026b22197e68277df869d001c9..484511978a1023724f6ca6a84cbb765777a598a7 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dom3-details" } */
+/* { dg-options "-O2 -fdump-tree-thread4-details" } */
 
 struct tree_common 
 { 
@@ -49,5 +49,5 @@ L23:
 /* We should thread the backedge to the top of the loop; ie we only
    execute the if (expr->common.code != 142) test once per loop
    iteration.  */
-/* { dg-final { scan-tree-dump-times "FSM jump thread" 1 "dom3" } } */
+/* { dg-final { scan-tree-dump-times "FSM jump thread" 1 "thread4" } } */
 
index 2949cbb5158d6a9e7367c20e854acfa03f91720f..896c8bf7edcc728016884d1f0968b0712303d79d 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-tree-thread1-details -fdump-tree-dce2" } */
 
 extern int status, pt;
 extern int count;
@@ -32,9 +32,10 @@ foo (int N, int c, int b, int *a)
    pt--;
 }
 
-/* There are 3 FSM jump threading opportunities, all of which will be
+/* There are 4 FSM jump threading opportunities, all of which will be
    realized, which will eliminate testing of FLAG, completely.  */
-/* { dg-final { scan-tree-dump-times "Registering FSM" 3 "vrp1"} } */
+/* { dg-final { scan-tree-dump-times "Registering FSM" 4 "thread1"} } */
 
-/* There should be no assignments or references to FLAG.  */
-/* { dg-final { scan-tree-dump-not "flag" "optimized"} } */
+/* There should be no assignments or references to FLAG, verify they're
+   eliminated as early as possible.  */
+/* { dg-final { scan-tree-dump-not "if .flag" "dce2"} } */
index 227ffeb65652b9054c685ad7ddcd4f9052ee2463..d678dc8c2cd3f97e17dd662d8d16a72aac5f890d 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdump-tree-thread1-details" } */
 
 extern void abort (void);
 
@@ -39,5 +39,5 @@ c_finish_omp_clauses (tree clauses)
 
 /* There are 3 FSM jump threading opportunities, two of which will
   get filtered out.  */
-/* { dg-final { scan-tree-dump-times "Registering FSM" 1 "vrp1"} } */
-/* { dg-final { scan-tree-dump-times "FSM Thread through multiway branch without threading a multiway branch" 2 "vrp1"} } */
+/* { dg-final { scan-tree-dump-times "Registering FSM" 1 "thread1"} } */
+/* { dg-final { scan-tree-dump-times "FSM Thread through multiway branch without threading a multiway branch" 2 "thread1"} } */
index 415ac2eafd9500c402039f720a0c47d5f82c3475..5842e28b94b69931a715469daca6b4bf09069b58 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-do compile { target sparc*-*-* x86_64-*-* } } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdump-tree-thread1-details" } */
 
-/* { dg-final { scan-tree-dump "FSM did not thread around loop and would copy too many statements" "vrp1" } } */
+/* { dg-final { scan-tree-dump "FSM did not thread around loop and would copy too many statements" "thread1" } } */
 
 
 typedef __builtin_va_list __gnuc_va_list;
index 89735f67de209af0b72720ab5e58c288593e1fb9..d546ac62b4625d6d74f29d69d449e9a364f080cb 100644 (file)
@@ -3,7 +3,7 @@
 
 /* We're looking for a constant argument a PHI node.  There
    should only be one if we unpropagate correctly.  */
-/* { dg-final { scan-tree-dump-times ", 1" 1 "uncprop1"} } */
+/* { dg-final { scan-tree-dump-times ", 1" 4 "uncprop1"} } */
 
 typedef long unsigned int size_t;
 typedef union gimple_statement_d *gimple;
index 0d40254b14d8c3cf19f00c9f83bac8bfbf5042eb..eb66136e47f99eefacb3a76f7c712090ff7e9a3f 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */ 
-/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom2-stats" } */
+/* { dg-options "-O2 -fdump-tree-thread1-stats -fdump-tree-dom2-stats" } */
 
 void foo();
 void bla();
@@ -26,4 +26,4 @@ void thread_latch_through_header (void)
    case.  And we want to thread through the header as well.  These
    are both caught by threading in DOM.  */
 /* { dg-final { scan-tree-dump-not "Jumps threaded" "dom2"} } */
-/* { dg-final { scan-tree-dump-times "Jumps threaded: 2" 1 "vrp1"} } */
+/* { dg-final { scan-tree-dump-times "Jumps threaded: 1" 1 "thread1"} } */
index 6d1ff5debd59f56e6b9e784c6720fa3638220fdb..ede03e09183a97f738af7c34e77c2304acf9466d 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom2-stats" } */
+/* { dg-options "-O2 -fdump-tree-dom2-details" } */
 
 void foo();
 void bla();
@@ -22,5 +22,8 @@ void dont_thread_1 (void)
     } while (i++ < 100);
 }
 
-/* { dg-final { scan-tree-dump "Jumps threaded: 2" "vrp1"} } */
-/* { dg-final { scan-tree-dump "Jumps threaded: 1" "dom2"} } */
+/* This one can only be threaded if both paths to the
+   conditional inside the loop are threaded at the same
+   time.  Else we potentially end up with irreducible
+   loops.  */
+/* { dg-final { scan-tree-dump-not "IRREDUCIBLE_LOOP" "dom2" } } */
index 61705e17ea83db3a5f839a0ec7bc2e65d1952f78..043918d7809c26ef9854127fe767e67c198d13ee 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom2-stats" } */
+/* { dg-options "-O2 -fdump-tree-dom2-details" } */
 
 void foo();
 void bla();
@@ -25,5 +25,4 @@ void dont_thread_2 (int first)
 
 /* Peeling off the first iteration would make threading through
    the loop latch safe, but we don't do that currently.  */
-/* { dg-final { scan-tree-dump "Jumps threaded: 1" "vrp1"} } */
-/* { dg-final { scan-tree-dump "Jumps threaded: 1" "dom2"} } */
+/* { dg-final { scan-tree-dump-not "IRREDUCIBLE_LOOP" "dom2" } } */
index ab6b6ebace2229c8a995b5c01fedf3daffdd797b..5ec4687d1270b10cda873965e05413f6f5099891 100644 (file)
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dom2-details" } */
-/* { dg-final { scan-tree-dump-times "FSM" 6 "dom2" } } */
+/* { dg-options "-O2 -fdump-tree-thread1-details -fdump-tree-thread2-details" } */
+/* { dg-final { scan-tree-dump-times "FSM" 3 "thread1" } } */
+/* { dg-final { scan-tree-dump-times "FSM" 4 "thread2" } } */
 
 int sum0, sum1, sum2, sum3;
 int foo (char *s, char **ret)
index a7a737be0ad38b821ee71d2c23f88dbea543f523..7cd14510724d3527c7bf1959f7e2f9fbc0ba256b 100644 (file)
@@ -1,7 +1,8 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom2-stats -fdump-tree-dom3-stats -fdump-tree-vrp2-stats" } */
-/* { dg-final { scan-tree-dump "Jumps threaded: 19"  "vrp1" } } */
-/* { dg-final { scan-tree-dump "Jumps threaded: 12" "dom2" } } */
+/* { dg-options "-O2 -fdump-tree-thread1-stats -fdump-tree-thread2-stats -fdump-tree-thread3-stats -fdump-tree-dom3-stats -fdump-tree-vrp2-stats" } */
+/* { dg-final { scan-tree-dump "Jumps threaded: 16"  "thread1" } } */
+/* { dg-final { scan-tree-dump "Jumps threaded: 11" "thread2" } } */
+/* { dg-final { scan-tree-dump "Jumps threaded: 3" "thread3" } } */
 /* { dg-final { scan-tree-dump-not "Jumps threaded"  "dom3" } } */
 /* { dg-final { scan-tree-dump-not "Jumps threaded"  "vrp2" } } */
 
index f250d224f2b82934d8c3c3a48d1308d68ea886f8..fa6da7bfd999799aaf1bfa343180bb84b99d9ac7 100644 (file)
@@ -1,6 +1,8 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dom2-details" } */
-/* { dg-final { scan-tree-dump "FSM" "dom2" } } */
+/* { dg-options "-O2 -fdump-tree-thread2-details -fdump-tree-thread3-details -fdump-tree-thread4-details" } */
+/* { dg-final { scan-tree-dump "FSM" "thread2" } } */
+/* { dg-final { scan-tree-dump "FSM" "thread3" } } */
+/* { dg-final { scan-tree-dump "FSM" "thread4" } } */
 
 typedef struct bitmap_head_def *bitmap;
 typedef const struct bitmap_head_def *const_bitmap;
index 99d45f5b7a44081d631f31016235ea8e04fa5044..f5f338ba35786137158f000b07afc87080f56457 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
-/* { dg-final { scan-tree-dump "FSM" "vrp1" } } */
+/* { dg-options "-O2 -fdump-tree-thread1-details" } */
+/* { dg-final { scan-tree-dump "FSM" "thread1" } } */
 
 typedef struct rtx_def *rtx;
 typedef const struct rtx_def *const_rtx;
index 481e888dbab24388538326755beee2a0fb1dc2d3..3a64b017c18105a7c3dd0358dd6a4f376c4691eb 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */ 
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdump-tree-thread1-stats" } */
 typedef struct basic_block_def *basic_block;
 struct basic_block_def;
 struct edge_def;
@@ -38,5 +38,5 @@ cleanup_empty_eh (basic_block bb)
        foo ();
     }
 }
-/* { dg-final { scan-tree-dump-times "Threaded" 1 "vrp1"} } */
+/* { dg-final { scan-tree-dump "Jumps threaded: 1" "thread1"} } */
 
index 170ee9a29c8fcbdb3bf761a9e5037d25da9d2890..362aa6e4247ab60da6a09dcc560fcfab30403d78 100644 (file)
@@ -156,6 +156,7 @@ DEFTIMEVAR (TV_TREE_SSA_OTHER            , "tree SSA other")
 DEFTIMEVAR (TV_TREE_SSA_INCREMENTAL  , "tree SSA incremental")
 DEFTIMEVAR (TV_TREE_OPS                     , "tree operand scan")
 DEFTIMEVAR (TV_TREE_SSA_DOMINATOR_OPTS   , "dominator optimization")
+DEFTIMEVAR (TV_TREE_SSA_THREAD_JUMPS , "backwards jump threading")
 DEFTIMEVAR (TV_TREE_SRA              , "tree SRA")
 DEFTIMEVAR (TV_ISOLATE_ERRONEOUS_PATHS    , "isolate eroneous paths")
 DEFTIMEVAR (TV_TREE_CCP                     , "tree CCP")
index 66e103ae37e8d19fbd475ae6ec30dc63bc8d0c9c..36299a61a5b9624aa8215bee24dcccae17e1549e 100644 (file)
@@ -398,6 +398,7 @@ extern gimple_opt_pass *make_pass_dce (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_cd_dce (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_call_cdce (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_merge_phi (gcc::context *ctxt);
+extern gimple_opt_pass *make_pass_thread_jumps (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_split_crit_edges (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_laddress (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_pre (gcc::context *ctxt);
index 636b67da42d520b1eab342f57dc94a4d49175bbc..57f1f5c54dad99e0e1f63f1db10f815047d78b4a 100644 (file)
@@ -33,6 +33,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-ssa-loop.h"
 #include "cfganal.h"
 #include "tree-pass.h"
+#include "gimple-ssa.h"
+#include "tree-phinodes.h"
 
 static int max_threaded_paths;
 
@@ -596,15 +598,13 @@ fsm_find_control_statement_thread_paths (tree name,
    finding a path where NAME is a constant, we can thread the path.  */
 
 void  
-find_jump_threads_backwards (edge e)
+find_jump_threads_backwards (basic_block bb)
 {     
   if (!flag_expensive_optimizations
-      || optimize_function_for_size_p (cfun)
-      || e->dest->loop_father != e->src->loop_father
-      || loop_depth (e->dest->loop_father) == 0)
+      || optimize_function_for_size_p (cfun))
     return;
 
-  gimple *stmt = get_gimple_control_stmt (e->dest);
+  gimple *stmt = get_gimple_control_stmt (bb);
   if (!stmt)
     return;
 
@@ -628,7 +628,7 @@ find_jump_threads_backwards (edge e)
 
   vec<basic_block, va_gc> *bb_path;
   vec_alloc (bb_path, 10);
-  vec_safe_push (bb_path, e->dest);
+  vec_safe_push (bb_path, bb);
   hash_set<basic_block> *visited_bbs = new hash_set<basic_block>;
 
   max_threaded_paths = PARAM_VALUE (PARAM_MAX_FSM_THREAD_PATHS);
@@ -637,3 +637,60 @@ find_jump_threads_backwards (edge e)
   delete visited_bbs;
   vec_free (bb_path);
 }
+
+namespace {
+
+const pass_data pass_data_thread_jumps =
+{
+  GIMPLE_PASS,
+  "thread",
+  OPTGROUP_NONE,
+  TV_TREE_SSA_THREAD_JUMPS,
+  ( PROP_cfg | PROP_ssa ),
+  0,
+  0,
+  0,
+  ( TODO_cleanup_cfg | TODO_update_ssa ),
+};
+
+class pass_thread_jumps : public gimple_opt_pass
+{
+public:
+  pass_thread_jumps (gcc::context *ctxt)
+    : gimple_opt_pass (pass_data_thread_jumps, ctxt)
+  {}
+
+  opt_pass * clone (void) { return new pass_thread_jumps (m_ctxt); }
+  virtual bool gate (function *);
+  virtual unsigned int execute (function *);
+};
+
+bool
+pass_thread_jumps::gate (function *fun ATTRIBUTE_UNUSED)
+{
+  return (flag_expensive_optimizations
+         && ! optimize_function_for_size_p (cfun));
+}
+
+
+unsigned int
+pass_thread_jumps::execute (function *fun)
+{
+  /* Try to thread each block with more than one successor.  */
+  basic_block bb;
+  FOR_EACH_BB_FN (bb, fun)
+    {
+      if (EDGE_COUNT (bb->succs) > 1)
+       find_jump_threads_backwards (bb);
+    }
+  thread_through_all_blocks (true);
+  return 0;
+}
+
+}
+
+gimple_opt_pass *
+make_pass_thread_jumps (gcc::context *ctxt)
+{
+  return new pass_thread_jumps (ctxt);
+}
index eca3812090f35c7d62504ca9e10239dcf0d80cd1..5fd5b98afe8d256797df0931da2f3ac8625e7d27 100644 (file)
@@ -34,7 +34,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "params.h"
 #include "tree-ssa-scopedtables.h"
 #include "tree-ssa-threadedge.h"
-#include "tree-ssa-threadbackward.h"
 #include "tree-ssa-dom.h"
 #include "gimple-fold.h"
 
@@ -1183,8 +1182,6 @@ thread_across_edge (gcond *dummy_cond,
       path->release ();
       delete path;
 
-      find_jump_threads_backwards (e);
-
       /* A negative status indicates the target block was deemed too big to
         duplicate.  Just quit now rather than trying to use the block as
         a joiner in a jump threading path.
@@ -1231,10 +1228,7 @@ thread_across_edge (gcond *dummy_cond,
       {
        if ((e->flags & EDGE_DFS_BACK) != 0
            || (taken_edge->flags & EDGE_DFS_BACK) != 0)
-         {
-           find_jump_threads_backwards (taken_edge);
-           continue;
-         }
+         continue;
 
        /* Push a fresh marker so we can unwind the equivalences created
           for each of E->dest's successors.  */
@@ -1282,10 +1276,7 @@ thread_across_edge (gcond *dummy_cond,
            register_jump_thread (path);
          }
        else
-         {
-           find_jump_threads_backwards (path->last ()->e);
-           delete_jump_thread_path (path);
-         }
+         delete_jump_thread_path (path);
 
        /* And unwind the equivalence table.  */
        if (avail_exprs_stack)