@@ -1,3 +1,13 @@
+2013-09-10 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/58343
+ * tree-ssa-threadupdate.c (thread_block): Identify and disable
+ jump threading requests through loop headers buried in the middle
+ of a jump threading path.
+
+ * tree-ssa-threadedge.c (thread_around_empty_blocks): Fix thinko
+ in return value/type.
+
2013-09-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58365
@@ -1,3 +1,7 @@
+2013-09-10 Jeff Law <law@redhat.com>
+
+ * gcc.c-torture/compile/pr58343.c: New test.
+
2013-09-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58365
new file mode 100644
@@ -0,0 +1,15 @@
+int a;
+
+int main ()
+{
+ int b = a;
+
+ for (a = 1; a > 0; a--)
+ ;
+
+ lbl:
+ if (b && a)
+ goto lbl;
+
+ return 0;
+}
@@ -764,7 +764,7 @@ thread_around_empty_blocks (edge taken_edge,
when threading. Thus they can not have visible side effects such
as PHI nodes. */
if (!gsi_end_p (gsi_start_phis (bb)))
- return NULL;
+ return false;
/* Skip over DEBUG statements at the start of the block. */
gsi = gsi_start_nondebug_bb (bb);
@@ -640,14 +640,36 @@ thread_block (basic_block bb, bool noloop_only)
else
e2 = THREAD_TARGET (e);
- if (!e2
+ if (!e2 || noloop_only)
+ {
/* If NOLOOP_ONLY is true, we only allow threading through the
- header of a loop to exit edges. */
- || (noloop_only
- && bb == bb->loop_father->header
+ header of a loop to exit edges.
+
+ There are two cases to consider. The first when BB is the
+ loop header. We will attempt to thread this elsewhere, so
+ we can just continue here. */
+
+ if (bb == bb->loop_father->header
&& (!loop_exit_edge_p (bb->loop_father, e2)
- || THREAD_TARGET2 (e))))
- continue;
+ || THREAD_TARGET2 (e)))
+ continue;
+
+
+ /* The second occurs when there was loop header buried in a jump
+ threading path. We do not try and thread this elsewhere, so
+ just cancel the jump threading request by clearing the AUX
+ field now. */
+ if (bb->loop_father != e2->src->loop_father
+ && !loop_exit_edge_p (e2->src->loop_father, e2))
+ {
+ /* Since this case is not handled by our special code
+ to thread through a loop header, we must explicitly
+ cancel the threading request here. */
+ free (e->aux);
+ e->aux = NULL;
+ continue;
+ }
+ }
if (e->dest == e2->src)
update_bb_profile_for_threading (e->dest, EDGE_FREQUENCY (e),