re PR rtl-optimization/70886 (-frename-registers causes boostrap comparison failures...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 2 May 2016 10:08:59 +0000 (10:08 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 2 May 2016 10:08:59 +0000 (10:08 +0000)
PR rtl-optimization/70886
* sched-deps.c (estimate_dep_weak): Canonicalize cselib values.

* cselib.h (rtx_equal_for_cselib_1): Declare.
(rtx_equal_for_cselib_p: New inline function.
* cselib.c (rtx_equal_for_cselib_p): Delete.
(rtx_equal_for_cselib_1): Make public.

From-SVN: r235735

gcc/ChangeLog
gcc/cselib.c
gcc/cselib.h
gcc/sched-deps.c

index 3982115c31caa763a0aa8c9ed21ec5399e61309a..49a314aebc72965051b9f17122c5b158ba0fb741 100644 (file)
@@ -1,3 +1,13 @@
+2016-05-02  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR rtl-optimization/70886
+       * sched-deps.c (estimate_dep_weak): Canonicalize cselib values.
+
+       * cselib.h (rtx_equal_for_cselib_1): Declare.
+       (rtx_equal_for_cselib_p: New inline function.
+       * cselib.c (rtx_equal_for_cselib_p): Delete.
+       (rtx_equal_for_cselib_1): Make public.
+
 2016-05-02  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/predicates.md (nonimm_ssenomem_operand): New predicate.
index 2922465cf834829099e172a3bbff83c9c6821b6d..14c7b320b0353449e59cd6850ce16f366ebb1f5a 100644 (file)
@@ -49,7 +49,6 @@ static void unchain_one_value (cselib_val *);
 static void unchain_one_elt_list (struct elt_list **);
 static void unchain_one_elt_loc_list (struct elt_loc_list **);
 static void remove_useless_values (void);
-static int rtx_equal_for_cselib_1 (rtx, rtx, machine_mode);
 static unsigned int cselib_hash_rtx (rtx, int, machine_mode);
 static cselib_val *new_cselib_val (unsigned int, machine_mode, rtx);
 static void add_mem_for_addr (cselib_val *, cselib_val *, rtx);
@@ -788,15 +787,6 @@ cselib_reg_set_mode (const_rtx x)
   return GET_MODE (REG_VALUES (REGNO (x))->elt->val_rtx);
 }
 
-/* Return nonzero if we can prove that X and Y contain the same value, taking
-   our gathered information into account.  */
-
-int
-rtx_equal_for_cselib_p (rtx x, rtx y)
-{
-  return rtx_equal_for_cselib_1 (x, y, VOIDmode);
-}
-
 /* If x is a PLUS or an autoinc operation, expand the operation,
    storing the offset, if any, in *OFF.  */
 
@@ -843,7 +833,7 @@ autoinc_split (rtx x, rtx *off, machine_mode memmode)
    addressing modes.  If X and Y are not (known to be) part of
    addresses, MEMMODE should be VOIDmode.  */
 
-static int
+int
 rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode)
 {
   enum rtx_code code;
index bb03f83653dd39e557e922a11a11f56f637290ba..940fe99f64862379efc3bb5d0f2b30a8f4066c14 100644 (file)
@@ -82,7 +82,7 @@ extern void cselib_finish (void);
 extern void cselib_process_insn (rtx_insn *);
 extern bool fp_setter_insn (rtx_insn *);
 extern machine_mode cselib_reg_set_mode (const_rtx);
-extern int rtx_equal_for_cselib_p (rtx, rtx);
+extern int rtx_equal_for_cselib_1 (rtx, rtx, machine_mode);
 extern int references_value_p (const_rtx, int);
 extern rtx cselib_expand_value_rtx (rtx, bitmap, int);
 typedef rtx (*cselib_expand_callback)(rtx, bitmap, int, void *);
@@ -125,4 +125,16 @@ canonical_cselib_val (cselib_val *val)
   return canon;
 }
 
+/* Return nonzero if we can prove that X and Y contain the same value, taking
+   our gathered information into account.  */
+
+static inline int
+rtx_equal_for_cselib_p (rtx x, rtx y)
+{
+  if (x == y)
+    return 1;
+
+  return rtx_equal_for_cselib_1 (x, y, VOIDmode);
+}
+
 #endif /* GCC_CSELIB_H */
index 8f3a124a8fad518b6920fb041f9a0b08fe848d3b..5c8e020bb5b82d0710a48064f396da1dac33e9db 100644 (file)
@@ -4182,22 +4182,29 @@ finish_deps_global (void)
 dw_t
 estimate_dep_weak (rtx mem1, rtx mem2)
 {
-  rtx r1, r2;
-
   if (mem1 == mem2)
     /* MEMs are the same - don't speculate.  */
     return MIN_DEP_WEAK;
 
-  r1 = XEXP (mem1, 0);
-  r2 = XEXP (mem2, 0);
+  rtx r1 = XEXP (mem1, 0);
+  rtx r2 = XEXP (mem2, 0);
+
+  if (sched_deps_info->use_cselib)
+    {
+      /* We cannot call rtx_equal_for_cselib_p because the VALUEs might be
+        dangling at this point, since we never preserve them.  Instead we
+        canonicalize manually to get stable VALUEs out of hashing.  */
+      if (GET_CODE (r1) == VALUE && CSELIB_VAL_PTR (r1))
+       r1 = canonical_cselib_val (CSELIB_VAL_PTR (r1))->val_rtx;
+      if (GET_CODE (r2) == VALUE && CSELIB_VAL_PTR (r2))
+       r2 = canonical_cselib_val (CSELIB_VAL_PTR (r2))->val_rtx;
+    }
 
   if (r1 == r2
-      || (REG_P (r1) && REG_P (r2)
-         && REGNO (r1) == REGNO (r2)))
+      || (REG_P (r1) && REG_P (r2) && REGNO (r1) == REGNO (r2)))
     /* Again, MEMs are the same.  */
     return MIN_DEP_WEAK;
-  else if ((REG_P (r1) && !REG_P (r2))
-          || (!REG_P (r1) && REG_P (r2)))
+  else if ((REG_P (r1) && !REG_P (r2)) || (!REG_P (r1) && REG_P (r2)))
     /* Different addressing modes - reason to be more speculative,
        than usual.  */
     return NO_DEP_WEAK - (NO_DEP_WEAK - UNCERTAIN_DEP_WEAK) / 2;