cse.c (find_comparison_args): Stop if the argument is known to be constant.
authorJ"orn Rennecke <amylaar@redhat.com>
Fri, 5 Jan 2001 20:42:30 +0000 (20:42 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Fri, 5 Jan 2001 20:42:30 +0000 (20:42 +0000)
* cse.c (find_comparison_args): Stop if the argument is known to
be constant.

From-SVN: r38723

gcc/ChangeLog
gcc/cse.c

index 95d38f2de6a000bd8a4542230319ee6fdf8601c2..650faa7838f9c398330a8f4b9b71fc92f35e8d06 100644 (file)
@@ -1,3 +1,8 @@
+Fri Jan  5 20:34:06 2001  J"orn Rennecke <amylaar@redhat.com>
+
+       * cse.c (find_comparison_args): Stop if the argument is known to
+       be constant.
+
 2001-01-05  Alexandre Oliva  <aoliva@redhat.com>
 
        * config/sh/sh.md (movdf): When splitting load into pair of
index f5c93530a3560bce7dc03b4abb36021802a155ac..8642550c5127208c42b4384301eed19824eddd68 100644 (file)
--- 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)
        {