[Bug rtl-optimization/92264] [10 Regression] Compile time hog in 521.wrf_r with -Ofast -march=znver2 -g since r276318

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Mar 20 18:26:58 GMT 2020


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92264

--- Comment #32 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Some incremental progress, but still ICEs...
--- gcc/cselib.c        2020-03-20 17:42:02.333023994 +0100
+++ gcc/cselib.c        2020-03-20 19:23:33.506622424 +0100
@@ -58,6 +58,16 @@
 static void cselib_invalidate_mem (rtx);
 static void cselib_record_set (rtx, cselib_val *, cselib_val *);
 static void cselib_record_sets (rtx_insn *);
+static rtx autoinc_split (rtx, rtx *, machine_mode);
+
+#define PRESERVED_VALUE_P(RTX) \
+  (RTL_FLAG_CHECK1 ("PRESERVED_VALUE_P", (RTX), VALUE)->unchanging)
+
+#define SP_BASED_VALUE_P(RTX) \
+  (RTL_FLAG_CHECK1 ("SP_BASED_VALUE_P", (RTX), VALUE)->jump)
+
+#define SP_DERIVED_VALUE_P(RTX) \
+  (RTL_FLAG_CHECK1 ("SP_DERIVED_VALUE_P", (RTX), VALUE)->call)

 struct expand_value_data
 {
@@ -122,6 +132,13 @@
   if (GET_CODE (x) == VALUE)
     return x == v->val_rtx;

+  if (SP_DERIVED_VALUE_P (v->val_rtx) && GET_MODE (x) == Pmode)
+    {
+      rtx xoff = NULL;
+      if (autoinc_split (x, &xoff, memmode) == v->val_rtx && xoff == NULL_RTX)
+       return true;
+    }
+
   /* We don't guarantee that distinct rtx's have different hash values,
      so we need to do a comparison.  */
   for (l = v->locs; l; l = l->next)
@@ -256,15 +273,6 @@
 void (*cselib_record_sets_hook) (rtx_insn *insn, struct cselib_set *sets,
                                 int n_sets);

-#define PRESERVED_VALUE_P(RTX) \
-  (RTL_FLAG_CHECK1 ("PRESERVED_VALUE_P", (RTX), VALUE)->unchanging)
-
-#define SP_BASED_VALUE_P(RTX) \
-  (RTL_FLAG_CHECK1 ("SP_BASED_VALUE_P", (RTX), VALUE)->jump)
-
-#define SP_DERIVED_VALUE_P(RTX) \
-  (RTL_FLAG_CHECK1 ("SP_DERIVED_VALUE_P", (RTX), VALUE)->call)
-



 /* Allocate a struct elt_list and fill in its two elements with the
@@ -497,7 +505,7 @@
       };
       cselib_val **slot
        = cselib_preserved_hash_table->find_slot_with_hash (&lookup,
-                                                          v->hash, INSERT);
+                                                           v->hash, INSERT);
       gcc_assert (!*slot);
       *slot = v;
     }
@@ -535,6 +543,28 @@
       max_value_regs
        = hard_regno_nregs (regno,
                            GET_MODE (cfa_base_preserved_val->locs->loc));
+
+      /* If cfa_base is sp + const_int, need to preserve also the
+        SP_DERIVED_VALUE_P value.  */
+      for (struct elt_loc_list *l = cfa_base_preserved_val->locs;
+          l; l = l->next)
+       if (GET_CODE (l->loc) == PLUS
+           && GET_CODE (XEXP (l->loc, 0)) == VALUE
+           && SP_DERIVED_VALUE_P (XEXP (l->loc, 0))
+           && CONST_INT_P (XEXP (l->loc, 1)))
+         {
+           if (! invariant_or_equiv_p (CSELIB_VAL_PTR (XEXP (l->loc, 0))))
+             {
+               rtx val = cfa_base_preserved_val->val_rtx;
+               rtx_insn *save_cselib_current_insn = cselib_current_insn;
+               cselib_current_insn = l->setting_insn;
+               new_elt_loc_list (CSELIB_VAL_PTR (XEXP (l->loc, 0)),
+                                 plus_constant (Pmode, val,
+                                                -UINTVAL (XEXP (l->loc, 1))));
+               cselib_current_insn = save_cselib_current_insn;
+             }
+           break;
+         }
     }
   else
     {
@@ -544,8 +574,7 @@
     }

   if (cselib_preserve_constants)
-    cselib_hash_table->traverse <void *, preserve_constants_and_equivs>
-      (NULL);
+    cselib_hash_table->traverse <void *, preserve_constants_and_equivs>
(NULL);
   else
     {
       cselib_hash_table->empty ();


More information about the Gcc-bugs mailing list