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

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
>From what I can see, the r13-5252 change removed for DEBUG_INSNs two things,
one is the
cselib_lookup_from_insn call with 1 as create and the other is the
shallow_copy_rtx + cselib_subst_to_values_from_insn.
As nothing really used t for the debug insns and
cselib_subst_to_values_from_insn shouldn't create new VALUEs and the like
(well, there is:
      /* This used to happen for autoincrements, but we deal with them
         properly now.  Remove the if stmt for the next release.  */
      if (! e)
        {
          /* Assign a value that doesn't match any other.  */
          e = new_cselib_val (next_uid, GET_MODE (x), x);
        }
which nobody removed so far), I think the shallow_copy_rtx +
cselib_subst_to_values_from_insn are just waste of resources (allocates various
rtxes nobody looks at).
But the cselib_lookup_from_insn actually creates new VALUEs (and mark them as
coming from DEBUG_INSNs), so I think we need to do that.
E.g. in the testcase from this PR (can be even simplified to:
typedef int __attribute__((__vector_size__ (32))) V;
int a;

void
foo (V v)
{
  a--;
  v = (V) v;
}
) after expansion:
(debug_insn 5 2 6 2 (debug_marker) "pr108463.c":7:3 -1
     (nil))
(insn 6 5 7 2 (parallel [
            (set (mem/c:SI (symbol_ref:DI ("a") [flags 0x2]  <var_decl
0x7fb055a70cf0 a>) [1 a+0 S4 A32])
                (plus:SI (mem/c:SI (symbol_ref:DI ("a") [flags 0x2]  <var_decl
0x7fb055a70cf0 a>) [1 a+0 S4 A32])
                    (const_int -1 [0xffffffffffffffff])))
            (clobber (reg:CC 17 flags))
        ]) "pr108463.c":7:4 240 {*addsi_1}
     (nil))
(debug_insn 7 6 8 2 (debug_marker) "pr108463.c":8:3 -1
     (nil))
(debug_insn 8 7 0 2 (var_location:BLK v (mem/c:BLK (reg/f:DI 16 argp) [1 v+0
S32 A256])) "pr108463.c":8:5 -1
     (nil))
and before scheduling:
(debug_insn 5 2 6 2 (debug_marker) "pr108463.c":7:3 -1
     (nil))
(insn 6 5 7 2 (parallel [
            (set (mem/c:SI (symbol_ref:DI ("a") [flags 0x2]  <var_decl
0x7fb055a70cf0 a>) [1 a+0 S4 A32])
                (plus:SI (mem/c:SI (symbol_ref:DI ("a") [flags 0x2]  <var_decl
0x7fb055a70cf0 a>) [1 a+0 S4 A32])
                    (const_int -1 [0xffffffffffffffff])))
            (clobber (reg:CC 17 flags))
        ]) "pr108463.c":7:4 240 {*addsi_1}
     (expr_list:REG_UNUSED (reg:CC 17 flags)
        (nil)))
(debug_insn 7 6 8 2 (debug_marker) "pr108463.c":8:3 -1
     (nil))
(debug_insn 8 7 13 2 (var_location:BLK v (mem/c:BLK (plus:DI (reg/f:DI 7 sp)
            (const_int 8 [0x8])) [1 v+0 S32 A256])) "pr108463.c":8:5 -1
     (nil))
(jump_insn 14 13 15 2 (simple_return) "pr108463.c":9:1 1006
{simple_return_internal}
     (nil)
when ignoring notes.  Without the cselib_lookup_from_insn call, we ICE in
cselib_subst_to_values because it is the only spot in the IL that mentions the
sp
register, so we haven't created a VALUE for it otherwise.

Unfortunately, while:
--- gcc/sched-deps.cc.jj        2023-01-19 09:58:50.971227752 +0100
+++ gcc/sched-deps.cc   2023-01-26 18:11:00.185963813 +0100
@@ -2605,7 +2605,14 @@ sched_analyze_2 (class deps_desc *deps,

     case MEM:
       {
-       if (!DEBUG_INSN_P (insn))
+       if (0 && DEBUG_INSN_P (insn) && sched_deps_info->use_cselib)
+         {
+           machine_mode address_mode = get_address_mode (x);
+
+           cselib_lookup_from_insn (XEXP (x, 0), address_mode, 1,
+                                    GET_MODE (x), insn);
+         }
+       else if (!DEBUG_INSN_P (insn))
          {
            /* Reading memory.  */
            rtx_insn_list *u;
fixes this PR, it breaks again PR106746.
So I think we really need to understand what is going on with PR106746.

Reply via email to