From 8b03b9843b8129d41b806a5e26f0da6142cc7468 Mon Sep 17 00:00:00 2001 From: "J\"orn Rennecke" Date: Fri, 5 Jan 2001 20:42:30 +0000 Subject: [PATCH] cse.c (find_comparison_args): Stop if the argument is known to be constant. * cse.c (find_comparison_args): Stop if the argument is known to be constant. From-SVN: r38723 --- gcc/ChangeLog | 5 +++++ gcc/cse.c | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 95d38f2de6a..650faa7838f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Fri Jan 5 20:34:06 2001 J"orn Rennecke + + * cse.c (find_comparison_args): Stop if the argument is known to + be constant. + 2001-01-05 Alexandre Oliva * config/sh/sh.md (movdf): When splitting load into pair of diff --git a/gcc/cse.c b/gcc/cse.c index f5c93530a35..8642550c512 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -3161,7 +3161,20 @@ find_comparison_args (code, parg1, parg2, pmode1, pmode2) p = lookup (arg1, safe_hash (arg1, GET_MODE (arg1)) & HASH_MASK, GET_MODE (arg1)); if (p) - p = p->first_same_value; + { + p = p->first_same_value; + + /* If what we compare is already known to be constant, that is as + good as it gets. + We need to break the loop in this case, because otherwise we + can have an infinite loop when looking at a reg that is known + to be a constant which is the same as a comparison of a reg + against zero which appears later in the insn stream, which in + turn is constant and the same as the comparison of the first reg + against zero... */ + if (p->is_const) + break; + } for (; p; p = p->next_same_value) { -- 2.30.2