OSDN Git Service

PR rtl-optimization/26296
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Feb 2006 15:47:20 +0000 (15:47 +0000)
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Feb 2006 15:47:20 +0000 (15:47 +0000)
* 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
gcc/Makefile.in
gcc/loop-invariant.c

index cda729a..d01a049 100644 (file)
@@ -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
index f673502..a6158b7 100644 (file)
@@ -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)
index a57857d..03a0c34 100644 (file)
@@ -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))