summaryrefslogtreecommitdiff
path: root/gcc/loop.c
diff options
context:
space:
mode:
authorm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>1999-02-13 14:25:58 +0000
committerm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>1999-02-13 14:25:58 +0000
commit4739b929ee3f52764e1be1a05076d771af19808e (patch)
treec51b0dcea97d8e97c98a6e0be8cf36f60fb69e5f /gcc/loop.c
parent35407120b6557b15bbeaf25e16dbc7ed4d7664be (diff)
downloadgcc-4739b929ee3f52764e1be1a05076d771af19808e.tar.gz
* loop.c (scan_loop): Call reg_in_basic_block_p before
loop_reg_used_before_p. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@25182 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/loop.c')
-rw-r--r--gcc/loop.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/gcc/loop.c b/gcc/loop.c
index 12b52adbb79..9e230a63ade 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -851,17 +851,23 @@ scan_loop (loop_start, end, loop_cont, unroll_p, bct_p)
We don't know its life-span, so we can't compute the benefit. */
if (REGNO (SET_DEST (set)) >= max_reg_before_loop)
;
- else if (/* The set is not guaranteed to be executed one
- the loop starts, or the value before the set is
- needed before the set occurs... */
- (maybe_never
- || loop_reg_used_before_p (set, p, loop_start,
- scan_start, end))
- /* And the register is used in basic blocks other
+ else if (/* The register is used in basic blocks other
than the one where it is set (meaning that
something after this point in the loop might
depend on its value before the set). */
- && !reg_in_basic_block_p (p, SET_DEST (set)))
+ ! reg_in_basic_block_p (p, SET_DEST (set))
+ /* And the set is not guaranteed to be executed one
+ the loop starts, or the value before the set is
+ needed before the set occurs...
+
+ ??? Note we have quadratic behaviour here, mitigated
+ by the fact that the previous test will often fail for
+ large loops. Rather than re-scanning the entire loop
+ each time for register usage, we should build tables
+ of the register usage and use them here instead. */
+ && (maybe_never
+ || loop_reg_used_before_p (set, p, loop_start,
+ scan_start, end)))
/* It is unsafe to move the set.
This code used to consider it OK to move a set of a variable