diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cda729aa0fdc37e6e979257d32fd98f81808396c..d01a0490d8d52f939d6a0cb38852b410dd6208f0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2006-02-16  Zdenek Dvorak <dvorakz@suse.cz>
+
+	PR rtl-optimization/26296
+	* Makefile.in (loop-invariant.c): Add except.h dependency.
+	* loop-invariant.c: Include except.h.
+	(find_invariant_insn): Ignore insns satisfying can_throw_internal.
+
 2005-02-16  Paul Brook  <paul@codesourcery.com>
 
 	* reload1.c (emit_reload_insns): Invalidate dead input registers used
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index f673502ce4df31ca9cfd2e7e2f4c0e7a1228827e..a6158b7795ad5c78dd8433f7e451d3a07a641784 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -2423,7 +2423,7 @@ loop-iv.o : loop-iv.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(BASIC_BLOCK_H) \
 loop-invariant.o : loop-invariant.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) \
    $(BASIC_BLOCK_H) hard-reg-set.h $(CFGLOOP_H) $(EXPR_H) coretypes.h \
    $(TM_H) $(TM_P_H) $(FUNCTION_H) $(FLAGS_H) $(DF_H) $(OBSTACK_H) output.h \
-   $(HASHTAB_H)
+   $(HASHTAB_H) except.h
 cfgloopmanip.o : cfgloopmanip.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) \
    $(BASIC_BLOCK_H) hard-reg-set.h $(CFGLOOP_H) $(CFGLAYOUT_H) output.h \
    coretypes.h $(TM_H) cfghooks.h $(OBSTACK_H)
diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c
index a57857d3831dfd6bac62ddad19e15624b6b4de26..03a0c34e6cba93f54cb35e9da445e63559889e4f 100644
--- a/gcc/loop-invariant.c
+++ b/gcc/loop-invariant.c
@@ -52,6 +52,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 #include "flags.h"
 #include "df.h"
 #include "hashtab.h"
+#include "except.h"
 
 /* The data stored for the loop.  */
 
@@ -761,16 +762,14 @@ find_invariant_insn (rtx insn, bool always_reached, bool always_executed)
       || !check_maybe_invariant (SET_SRC (set)))
     return;
 
-  if (may_trap_p (PATTERN (insn)))
-    {
-      if (!always_reached)
-	return;
+  /* If the insn can throw exception, we cannot move it at all without changing
+     cfg.  */
+  if (can_throw_internal (insn))
+    return;
 
-      /* Unless the exceptions are handled, the behavior is undefined
- 	 if the trap occurs.  */
-      if (flag_non_call_exceptions)
-	return;
-    }
+  /* We cannot make trapping insn executed, unless it was executed before.  */
+  if (may_trap_p (PATTERN (insn)) && !always_reached)
+    return;
 
   depends_on = BITMAP_ALLOC (NULL);
   if (!check_dependencies (insn, depends_on))