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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |vmakarov at gcc dot gnu.org
           Keywords|                            |ra
          Component|debug                       |rtl-optimization

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index e99fb9ff5d1..e508d736de8 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -9019,7 +9019,7 @@ split_critical_edges (bool for_edge_insertion_p /* =
false */)
            {
              gimple_stmt_iterator gsi;

-             gsi = gsi_last_bb (e->src);
+             gsi = gsi_last_nondebug_bb (e->src);
              if (!gsi_end_p (gsi)
                  && stmt_ends_bb_p (gsi_stmt (gsi))
                  && (gimple_code (gsi_stmt (gsi)) != GIMPLE_RETURN

Doesn't fix it, disabling tail merging doesn't either.

The difference is

--- t.gkd       2020-04-16 16:15:15.906645135 +0200
+++ t.gk.gkd    2020-04-16 16:15:16.082647662 +0200
@@ -29,7 +29,7 @@
             (pc))) "t.C":17:5# {*jcc}
      (expr_list:REG_DEAD (reg:CCZ 17 flags)
         (int_list:REG_BR_PROB 536870916 (nil)))
- -> 13)
+ -> 14)
 (note # 0 0 [bb 3] NOTE_INSN_BASIC_BLOCK)
 (note # 0 0 NOTE_INSN_DELETED)
 (insn/f:TI # 0 0 3 (set (mem:DI (pre_dec:DI (reg/f:DI 7 sp)) [  S8 A8])
@@ -74,13 +74,13 @@
                 (const_int 8 [0x8])) [ MEM[(struct S *)this_2(D) + 8B].ae+0 S4
A32])) "t.C":8:12# {*movsi_internal}
      (expr_list:REG_EH_REGION (const_int -5 [0xfffffffffffffffb])
         (nil)))
+(note # 0 0 # NOTE_INSN_EH_REGION_BEG)
 (insn # 0 0 3 (set (reg:CCZ 17 flags)
         (compare:CCZ (mem:SI (plus:DI (reg/f:DI 5 di [orig:93 this ] [93])
                     (const_int 12 [0xc])) [ MEM[(struct S *)this_2(D) +
8B].af+0 S4 A32])
             (reg:SI 6 bp [orig:87 _10 ] [87]))) "t.C":18:28# {*cmpsi_1}
      (expr_list:REG_DEAD (reg/f:DI 5 di [orig:93 this ] [93])
-        (expr_list:REG_EH_REGION (const_int -6 [0xfffffffffffffffa])
-            (nil))))
+        (nil)))
 (jump_insn # 0 0 3 (set (pc)
         (if_then_else (eq (reg:CCZ 17 flags)
                 (const_int 0 [0]))
@@ -98,7 +98,6 @@
 (insn # 0 0 4 (set (reg:DI 5 di)
         (reg/f:DI 41 r13 [orig:82 _1 ] [82])) "t.C":19:4# {*movdi_internal}
      (nil))
-(note # 0 0 # NOTE_INSN_EH_REGION_BEG)
 (call_insn:TI # 0 0 4 (call (mem:QI (symbol_ref:DI ("_ZN1S1iEi") [flags 0x41] 
<function_decl # i>) [ i S1 A8])
         (const_int 0 [0])) "t.C":19:4# {*call}
      (expr_list:REG_DEAD (reg:DI 5 di)
@@ -246,7 +245,7 @@
  -> simple_return)
 (barrier # 0 0)
 (note # 0 0 NOTE_INSN_DELETED)
-(code_label # 0 0 9 13 (nil) [1 uses])
+(code_label # 0 0 9 14 (nil) [1 uses])
 (note # 0 0 [bb 9] NOTE_INSN_BASIC_BLOCK)
 (insn:TI # 0 0 9 (unspec_volatile [
             (const_int 0 [0])

but on GIMPLE I cannot see any difference in EH info.

Starting with LRA I see the disconnect with REG_EH_REGION notes on insn 17 /
41:

(insn 17 16 18 3 (set (reg:CCZ 17 flags)
        (compare:CCZ (mem:SI (plus:DI (reg/f:DI 3 bx [orig:93 this ] [93])
                    (const_int 12 [0xc])) [1 MEM[(struct S *)this_2(D) +
8B].af+0 S4 A32])
            (reg:SI 6 bp [orig:87 _10 ] [87]))) "t.C":18:28 11 {*cmpsi_1}
     (expr_list:REG_EH_REGION (const_int -6 [0xfffffffffffffffa])
        (nil)))

vs.

(insn 41 40 42 3 (set (reg:CCZ 17 flags)
        (compare:CCZ (mem:SI (plus:DI (reg/f:DI 3 bx [orig:93 this ] [93])
                    (const_int 12 [0xc])) [1 MEM[(struct S *)this_2(D) +
8B].af+0 S4 A32])
            (reg:SI 6 bp [orig:87 _10 ] [87]))) "t.C":18:28 11 {*cmpsi_1}
     (nil))

Reply via email to