]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/loop-invariant.c
2019-01-09 Sandra Loosemore <sandra@codesourcery.com>
[thirdparty/gcc.git] / gcc / loop-invariant.c
index 1cdb5cbf5854ea738d2f50e4c1d128fc39df2b55..3e82f1e10d5e5b867af315e1378915cdff8e5ef4 100644 (file)
@@ -1,5 +1,5 @@
 /* RTL-level loop invariant motion.
-   Copyright (C) 2004-2017 Free Software Foundation, Inc.
+   Copyright (C) 2004-2019 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -335,6 +335,8 @@ hash_invariant_expr_1 (rtx_insn *insn, rtx x)
        }
       else if (fmt[i] == 'i' || fmt[i] == 'n')
        val ^= XINT (x, i);
+      else if (fmt[i] == 'p')
+       val ^= constant_lower_bound (SUBREG_BYTE (x));
     }
 
   return val;
@@ -420,6 +422,11 @@ invariant_expr_equal_p (rtx_insn *insn1, rtx e1, rtx_insn *insn2, rtx e2)
          if (XINT (e1, i) != XINT (e2, i))
            return false;
        }
+      else if (fmt[i] == 'p')
+       {
+         if (maybe_ne (SUBREG_BYTE (e1), SUBREG_BYTE (e2)))
+           return false;
+       }
       /* Unhandled type of subexpression, we fail conservatively.  */
       else
        return false;
@@ -653,6 +660,9 @@ may_assign_reg_p (rtx x)
   return (GET_MODE (x) != VOIDmode
          && GET_MODE (x) != BLKmode
          && can_copy_p (GET_MODE (x))
+         /* Do not mess with the frame pointer adjustments that can
+            be generated e.g. by expand_builtin_setjmp_receiver.  */
+         && x != frame_pointer_rtx
          && (!REG_P (x)
              || !HARD_REGISTER_P (x)
              || REGNO_REG_CLASS (REGNO (x)) != NO_REGS));
@@ -1043,7 +1053,7 @@ check_dependencies (rtx_insn *insn, bitmap depends_on)
   return true;
 }
 
-/* Pre-check candidate DEST to skip the one which can not make a valid insn
+/* Pre-check candidate DEST to skip the one which cannot make a valid insn
    during move_invariant_reg.  SIMPLE is to skip HARD_REGISTER.  */
 static bool
 pre_check_invariant_p (bool simple, rtx dest)
@@ -1355,7 +1365,7 @@ get_inv_cost (struct invariant *inv, int *comp_cost, unsigned *regs_needed,
        This usually has the effect that FP constant loads from the constant
        pool are not moved out of the loop.
 
-       Note that this also means that dependent invariants can not be moved.
+       Note that this also means that dependent invariants cannot be moved.
        However, the primary purpose of this pass is to move loop invariant
        address arithmetic out of loops, and address arithmetic that depends
        on floating point constants is unlikely to ever occur.  */
@@ -2191,7 +2201,7 @@ calculate_loop_reg_pressure (void)
            }
        }
     }
-  bitmap_clear (&curr_regs_live);
+  bitmap_release (&curr_regs_live);
   if (flag_ira_region == IRA_REGION_MIXED
       || flag_ira_region == IRA_REGION_ALL)
     FOR_EACH_LOOP (loop, 0)