diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 51a05540ab1ff991d29d51c47d08f624df26ebbc..1d1e5b5bbc4ddd3f53401a0cb747d6d7c0584515 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-22  Jeff Law  <law@redhat.com>
+
+	* loop-unroll.c (analyze_iv_to_split_insn): Handle
+	iv_analyze_result returning false.
+
 2006-03-22  Jie Zhang  <jie.zhang@analog.com>
 
 	* config/bfin/bfin.h (ASM_FORMAT_PRIVATE_NAME): Remove.
diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c
index 6ef594766578a9224420fb7f52220b383d9aa29e..5c28eaf2f19a93687f25a39061ef67659db5be31 100644
--- a/gcc/loop-unroll.c
+++ b/gcc/loop-unroll.c
@@ -1670,7 +1670,17 @@ analyze_iv_to_split_insn (rtx insn)
     return NULL;
 
   ok = iv_analyze_result (insn, dest, &iv);
-  gcc_assert (ok);
+
+  /* This used to be an assert under the assumption that if biv_p returns
+     true that iv_analyze_result must also return true.  However, that
+     assumption is not strictly correct as evidenced by pr25569.
+
+     Returning NULL when iv_analyze_result returns false is safe and
+     avoids the problems in pr25569 until the iv_analyze_* routines
+     can be fixed, which is apparently hard and time consuming
+     according to their author.  */
+  if (! ok)
+    return NULL;
 
   if (iv.step == const0_rtx
       || iv.mode != iv.extend_mode)