re PR tree-optimization/60280 (gcc.target/arm/ivopts.c and gcc.target/arm/ivopts-2.c failed caused by preserving loop structure.)
PR target/60280 * tree-cfgcleanup.c (tree_forwarder_block_p): Protect loop preheaders and latches only if requested. Fix latch if it is removed. * tree-ssa-dom.c (tree_ssa_dominator_optimize): Set LOOPS_HAVE_PREHEADERS. PR target/60280 * gnat.dg/renaming5.adb: Change to two expected gotos. * gcc.dg/tree-ssa/pr21559.c: Change back to three expected jump threads. * gcc.dg/tree-prof/update-loopch.c: Check two "Invalid sum" messages for removed basic block. * gcc.dg/tree-ssa/ivopt_1.c: Fix unreliable scanning string. * gcc.dg/tree-ssa/ivopt_2.c: Ditto. * gcc.dg/tree-ssa/ivopt_3.c: Ditto. * gcc.dg/tree-ssa/ivopt_4.c: Ditto. From-SVN: r208165
This commit is contained in:
parent
b8a542c648
commit
a3afdbb809
@ -1,3 +1,12 @@
|
||||
2014-02-26 Bin Cheng <bin.cheng@arm.com>
|
||||
|
||||
PR target/60280
|
||||
* tree-cfgcleanup.c (tree_forwarder_block_p): Protect loop
|
||||
preheaders and latches only if requested. Fix latch if it
|
||||
is removed.
|
||||
* tree-ssa-dom.c (tree_ssa_dominator_optimize): Set
|
||||
LOOPS_HAVE_PREHEADERS.
|
||||
|
||||
2014-02-25 Andrew Pinski <apinski@cavium.com>
|
||||
|
||||
* builtins.c (expand_builtin_thread_pointer): Create a new target
|
||||
|
@ -1,3 +1,16 @@
|
||||
2014-02-26 Bin Cheng <bin.cheng@arm.com>
|
||||
|
||||
PR target/60280
|
||||
* gnat.dg/renaming5.adb: Change to two expected gotos.
|
||||
* gcc.dg/tree-ssa/pr21559.c: Change back to three expected
|
||||
jump threads.
|
||||
* gcc.dg/tree-prof/update-loopch.c: Check two "Invalid sum"
|
||||
messages for removed basic block.
|
||||
* gcc.dg/tree-ssa/ivopt_1.c: Fix unreliable scanning string.
|
||||
* gcc.dg/tree-ssa/ivopt_2.c: Ditto.
|
||||
* gcc.dg/tree-ssa/ivopt_3.c: Ditto.
|
||||
* gcc.dg/tree-ssa/ivopt_4.c: Ditto.
|
||||
|
||||
2014-02-25 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
|
||||
|
||||
* gcc.dg/vmx/ld-vsx.c: Don't use vec_all_eq.
|
||||
|
@ -16,6 +16,7 @@ main ()
|
||||
edge. */
|
||||
/* { dg-final-use { scan-ipa-dump "loop depth 1, count 33334" "profile"} } */
|
||||
/* { dg-final-use { scan-tree-dump "loop depth 1, count 33332" "optimized"} } */
|
||||
/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
|
||||
/* { dg-final-use { scan-tree-dump-times "Removing basic block \[^\r\n\]*\[\\r\\n\]+\[^\r\n\]*\[\\r\\n\]+Invalid sum of\[^\r\n\]*\[\\r\\n\]+Invalid sum of" 1 "optimized"} } */
|
||||
/* { dg-final-use { scan-tree-dump-times "Invalid sum of" 2 "optimized"} } */
|
||||
/* { dg-final-use { cleanup-ipa-dump "profile" } } */
|
||||
/* { dg-final-use { cleanup-tree-dump "optimized" } } */
|
||||
|
@ -14,5 +14,5 @@ void foo (int i_width, TYPE dst, TYPE src1, TYPE src2)
|
||||
}
|
||||
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "PHI <ivtmp" 1 "ivopts"} } */
|
||||
/* { dg-final { scan-tree-dump-times "ivtmp.\[0-9_\]* = PHI <" 1 "ivopts"} } */
|
||||
/* { dg-final { cleanup-tree-dump "ivopts" } } */
|
||||
|
@ -13,5 +13,5 @@ void foo (int i_width, TYPE dst, TYPE src1, TYPE src2)
|
||||
}
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "PHI <ivtmp" 1 "ivopts"} } */
|
||||
/* { dg-final { scan-tree-dump-times "ivtmp.\[0-9_\]* = PHI <" 1 "ivopts"} } */
|
||||
/* { dg-final { cleanup-tree-dump "ivopts" } } */
|
||||
|
@ -14,7 +14,7 @@ void foo (int i_width, char* dst, char* src1, char* src2)
|
||||
src1+=sizeof(TYPE);
|
||||
src2+=sizeof(TYPE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "PHI <ivtmp" 1 "ivopts"} } */
|
||||
/* { dg-final { scan-tree-dump-times "ivtmp.\[0-9_\]* = PHI <" 1 "ivopts"} } */
|
||||
/* { dg-final { cleanup-tree-dump "ivopts" } } */
|
||||
|
@ -15,5 +15,5 @@ void foo (int i_width, TYPE dst, TYPE src1, TYPE src2)
|
||||
}
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "PHI <ivtmp" 1 "ivopts"} } */
|
||||
/* { dg-final { scan-tree-dump-times "ivtmp.\[0-9_\]* = PHI <" 1 "ivopts"} } */
|
||||
/* { dg-final { cleanup-tree-dump "ivopts" } } */
|
||||
|
@ -36,8 +36,9 @@ void foo (void)
|
||||
|
||||
/* Second, we should thread the edge out of the loop via the break
|
||||
statement. We also realize that the final bytes == 0 test is useless,
|
||||
and thread over it. */
|
||||
/* { dg-final { scan-tree-dump-times "Threaded jump" 2 "vrp1" } } */
|
||||
and thread over it. We also know that toread != 0 is useless when
|
||||
entering while loop and thread over it. */
|
||||
/* { dg-final { scan-tree-dump-times "Threaded jump" 3 "vrp1" } } */
|
||||
|
||||
/* { dg-final { cleanup-tree-dump "vrp1" } } */
|
||||
|
||||
|
@ -26,5 +26,5 @@ package body Renaming5 is
|
||||
|
||||
end Renaming5;
|
||||
|
||||
-- { dg-final { scan-tree-dump-times "goto" 3 "optimized" } }
|
||||
-- { dg-final { scan-tree-dump-times "goto" 2 "optimized" } }
|
||||
-- { dg-final { cleanup-tree-dump "optimized" } }
|
||||
|
@ -308,14 +308,24 @@ tree_forwarder_block_p (basic_block bb, bool phi_wanted)
|
||||
if (current_loops)
|
||||
{
|
||||
basic_block dest;
|
||||
/* Protect loop latches, headers and preheaders. */
|
||||
/* Protect loop headers. */
|
||||
if (bb->loop_father->header == bb)
|
||||
return false;
|
||||
dest = EDGE_SUCC (bb, 0)->dest;
|
||||
|
||||
dest = EDGE_SUCC (bb, 0)->dest;
|
||||
/* Protect loop preheaders and latches if requested. */
|
||||
if (dest->loop_father->header == dest)
|
||||
return false;
|
||||
{
|
||||
if (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS)
|
||||
&& bb->loop_father->header != dest)
|
||||
return false;
|
||||
|
||||
if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES)
|
||||
&& bb->loop_father->header == dest)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -497,6 +507,11 @@ remove_forwarder_block (basic_block bb)
|
||||
set_immediate_dominator (CDI_DOMINATORS, dest, dom);
|
||||
}
|
||||
|
||||
/* Adjust latch infomation of BB's parent loop as otherwise
|
||||
the cfg hook has a hard time not to kill the loop. */
|
||||
if (current_loops && bb->loop_father->latch == bb)
|
||||
bb->loop_father->latch = dest;
|
||||
|
||||
/* And kill the forwarder block. */
|
||||
delete_basic_block (bb);
|
||||
|
||||
|
@ -849,8 +849,14 @@ tree_ssa_dominator_optimize (void)
|
||||
/* We need to know loop structures in order to avoid destroying them
|
||||
in jump threading. Note that we still can e.g. thread through loop
|
||||
headers to an exit edge, or through loop header to the loop body, assuming
|
||||
that we update the loop info. */
|
||||
loop_optimizer_init (LOOPS_HAVE_SIMPLE_LATCHES);
|
||||
that we update the loop info.
|
||||
|
||||
TODO: We don't need to set LOOPS_HAVE_PREHEADERS generally, but due
|
||||
to several overly conservative bail-outs in jump threading, case
|
||||
gcc.dg/tree-ssa/pr21417.c can't be threaded if loop preheader is
|
||||
missing. We should improve jump threading in future then
|
||||
LOOPS_HAVE_PREHEADERS won't be needed here. */
|
||||
loop_optimizer_init (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES);
|
||||
|
||||
/* Initialize the value-handle array. */
|
||||
threadedge_initialize_values ();
|
||||
|
Loading…
x
Reference in New Issue
Block a user