* cfgrtl.c (purge_dead_edges): Fix handling of EH edges.
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Feb 2002 11:03:16 +0000 (11:03 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Feb 2002 11:03:16 +0000 (11:03 +0000)
* i386.h (CONDITIONAL_REGISTER_USAGE): Do not write to
PIC_OFFSET_TABLE_REGNUM when it is INVALID_REGNUM

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50128 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgrtl.c
gcc/config/i386/i386.h

index d757905..165147b 100644 (file)
@@ -1,3 +1,10 @@
+Don Feb 28 11:24:30 CET 2002  Jan Hubicka  <jh@suse.cz>
+
+       * cfgrtl.c (purge_dead_edges): Fix handling of EH edges.
+
+       * i386.h (CONDITIONAL_REGISTER_USAGE): Do not write to
+       PIC_OFFSET_TABLE_REGNUM when it is INVALID_REGNUM
+
 Don Feb 28 11:07:36 CET 2002  Jan Hubicka  <jh@suse.cz>
 
        * basic-block.h (BB_REACHABLE): Renumber.
index 1b00a61..a45d4a3 100644 (file)
@@ -1899,9 +1899,30 @@ purge_dead_edges (bb)
   rtx insn = bb->end, note;
   bool purged = false;
 
-  /* ??? This makes no sense since the later test includes more cases.  */
-  if (GET_CODE (insn) == JUMP_INSN && !simplejump_p (insn))
-    return false;
+  /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
+  if (GET_CODE (insn) == INSN
+      && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
+    {
+      rtx eqnote;
+
+      if (! may_trap_p (PATTERN (insn))
+         || ((eqnote = find_reg_equal_equiv_note (insn))
+             && ! may_trap_p (XEXP (eqnote, 0))))
+       remove_note (insn, note);
+    }
+
+  /* Cleanup abnormal edges caused by throwing insns that have been
+     eliminated.  */
+  if (! can_throw_internal (bb->end))
+    for (e = bb->succ; e; e = next)
+      {
+       next = e->succ_next;
+       if (e->flags & EDGE_EH)
+         {
+           remove_edge (e);
+           purged = true;
+         }
+      }
 
   if (GET_CODE (insn) == JUMP_INSN)
     {
@@ -1970,31 +1991,6 @@ purge_dead_edges (bb)
       return purged;
     }
 
-  /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
-  if (GET_CODE (insn) == INSN
-      && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
-    {
-      rtx eqnote;
-
-      if (! may_trap_p (PATTERN (insn))
-         || ((eqnote = find_reg_equal_equiv_note (insn))
-             && ! may_trap_p (XEXP (eqnote, 0))))
-       remove_note (insn, note);
-    }
-
-  /* Cleanup abnormal edges caused by throwing insns that have been
-     eliminated.  */
-  if (! can_throw_internal (bb->end))
-    for (e = bb->succ; e; e = next)
-      {
-       next = e->succ_next;
-       if (e->flags & EDGE_EH)
-         {
-           remove_edge (e);
-           purged = true;
-         }
-      }
-
   /* If we don't see a jump insn, we don't know exactly why the block would
      have been broken at this point.  Look for a simple, non-fallthru edge,
      as these are only created by conditional branches.  If we find such an
index 342105d..63dae01 100644 (file)
@@ -957,7 +957,7 @@ do {                                                                        \
         call_used_regs[i] = (call_used_regs[i]                         \
                             & (TARGET_64BIT ? 2 : 1)) != 0;            \
       }                                                                        \
-    if (flag_pic)                                                      \
+    if (flag_pic && PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)         \
       {                                                                        \
        fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;                        \
        call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;                    \