From a39b96b6bfbdd308b18086d8eb1f9fad36256218 Mon Sep 17 00:00:00 2001
From: rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 16 Feb 2006 15:47:20 +0000
Subject: [PATCH] 	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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111139 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog        |  7 +++++++
 gcc/Makefile.in      |  2 +-
 gcc/loop-invariant.c | 17 ++++++++---------
 3 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cda729aa0fdc..d01a0490d8d5 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 f673502ce4df..a6158b7795ad 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 a57857d3831d..03a0c34e6cba 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))
-- 
GitLab