ira.c (update_equiv_regs): Revert to using may_trap_or_fault_p again.
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Fri, 23 Jun 2017 12:44:07 +0000 (12:44 +0000)
committerBernd Edlinger <edlinger@gcc.gnu.org>
Fri, 23 Jun 2017 12:44:07 +0000 (12:44 +0000)
2017-06-23  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        rtl-optimizatoin/79286
        * ira.c (update_equiv_regs): Revert to using may_trap_or_fault_p again.
        * rtlanal.c (rtx_addr_can_trap_p_1): SYMBOL_REF_FUNCTION_P can never
        trap.  PIC register plus a const unspec without offset can never trap.

From-SVN: r249588

gcc/ChangeLog
gcc/ira.c
gcc/rtlanal.c

index 4f750a63dd1d46cf4407cba104d114d68af0e9d9..b3a9adda731b1e485616c2a8347eef5fd18712bf 100644 (file)
@@ -1,3 +1,10 @@
+2017-06-23  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       rtl-optimizatoin/79286
+       * ira.c (update_equiv_regs): Revert to using may_trap_or_fault_p again.
+       * rtlanal.c (rtx_addr_can_trap_p_1): SYMBOL_REF_FUNCTION_P can never
+       trap.  PIC register plus a const unspec without offset can never trap.
+
 2017-06-23  Marc Glisse  <marc.glisse@inria.fr>
 
        * tree.h (builtin_structptr_type): New type.
index 36a779bd37f0e5e0c060dac19ffbab688c326675..08a1cc550b24ff31375fa9ecaf6bb3dd7d9065ba 100644 (file)
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -3551,7 +3551,8 @@ update_equiv_regs (void)
          if (DF_REG_DEF_COUNT (regno) == 1
              && note
              && !rtx_varies_p (XEXP (note, 0), 0)
-             && def_dominates_uses (regno))
+             && (!may_trap_or_fault_p (XEXP (note, 0))
+                 || def_dominates_uses (regno)))
            {
              rtx note_value = XEXP (note, 0);
              remove_note (insn, note);
index d9f57c30d8e6f01172e090a9077321b0d3216420..bf4183e793dcb07ecdc511b8fdff3560141cf8e8 100644 (file)
@@ -485,7 +485,7 @@ rtx_addr_can_trap_p_1 (const_rtx x, HOST_WIDE_INT offset, HOST_WIDE_INT size,
     case SYMBOL_REF:
       if (SYMBOL_REF_WEAK (x))
        return 1;
-      if (!CONSTANT_POOL_ADDRESS_P (x))
+      if (!CONSTANT_POOL_ADDRESS_P (x) && !SYMBOL_REF_FUNCTION_P (x))
        {
          tree decl;
          HOST_WIDE_INT decl_size;
@@ -644,8 +644,11 @@ rtx_addr_can_trap_p_1 (const_rtx x, HOST_WIDE_INT offset, HOST_WIDE_INT size,
 
     case PLUS:
       /* An address is assumed not to trap if:
-         - it is the pic register plus a constant.  */
-      if (XEXP (x, 0) == pic_offset_table_rtx && CONSTANT_P (XEXP (x, 1)))
+        - it is the pic register plus a const unspec without offset.  */
+      if (XEXP (x, 0) == pic_offset_table_rtx
+         && GET_CODE (XEXP (x, 1)) == CONST
+         && GET_CODE (XEXP (XEXP (x, 1), 0)) == UNSPEC
+         && offset == 0)
        return 0;
 
       /* - or it is an address that can't trap plus a constant integer.  */