[Bug rtl-optimization/105231] [12 Regression] ICE: in rtl_verify_bb_insns, at cfgrtl.cc:2797 (flow control insn inside a basic block) with custom flags since r12-4767-g81342e95827f77c0

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Apr 12 08:25:15 GMT 2022


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

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Before combine we had

(insn 22 17 78 3 (set (reg:SF 92)
        (mem/u/c:SF (symbol_ref/u:SI ("*.LC0") [flags 0x2]) [0  S4 A32]))
"t.c":6:3 142 {*movsf_internal}
     (expr_list:REG_EQUAL (const_double:SF 1.8446744073709551616e+19
[0x0.8p+65])
        (nil)))
(insn 78 22 24 3 (set (reg:XF 99)
        (float_extend:XF (reg:SF 92))) 166 {*extendsfxf2_i387}
     (expr_list:REG_DEAD (reg:SF 92)
        (expr_list:REG_EQUAL (const_double:XF 1.8446744073709551616e+19
[0x0.8p+65])
            (nil))))
(insn 24 78 65 3 (set (reg:XF 90)
        (plus:XF (reg:XF 90)
            (reg:XF 99))) "t.c":6:3 1070 {*fop_xf_comm_i387}
     (expr_list:REG_EH_REGION (const_int 1 [0x1])
        (nil)))
;;  succ:       9 [never]  count:0 (precise) (ABNORMAL,EH)

after:

(note 22 17 78 3 NOTE_INSN_DELETED)
(insn 78 22 24 3 (set (reg:XF 99)
        (float_extend:XF (mem/u/c:SF (symbol_ref/u:SI ("*.LC0") [flags 0x2]) [0
 S4 A32]))) 166 {*extendsfxf2_i387}
     (expr_list:REG_EH_REGION (const_int 1 [0x1])
        (nil)))
(insn 24 78 26 3 (set (reg:XF 90)
        (mem/u/c:XF (symbol_ref/u:SI ("*.LC3") [flags 0x2]) [0  S12 A128]))
"t.c":6:3 140 {*movxf_internal}
     (nil))
(insn 26 24 27 3 (set (reg:DF 83 [ _2 ])
        (float_truncate:DF (reg:XF 90))) "t.c":6:3 170 {truncxfdf2}
     (expr_list:REG_DEAD (reg:XF 90)
        (expr_list:REG_EH_REGION (const_int 1 [0x1])
            (nil))))
;;  succ:       9 [never]  count:0 (precise) (ABNORMAL,EH)

now sure where the REG_EH_REGION note on insn 78 comes from.  I suppose it's
from

Trying 78, 17 -> 24:
   78: r99:XF=float_extend([`*.LC0'])
      REG_EQUAL 1.8446744073709551616e+19
   17: r90:XF=[`*.LC1']
      REG_EQUAL -1.444529636382101633e+18
   24: r90:XF=r90:XF+r99:XF
      REG_EH_REGION 0x1
...
Successfully matched this instruction:
(set (reg:XF 99)
    (float_extend:XF (mem/u/c:SF (symbol_ref/u:SI ("*.LC0") [flags 0x2]) [0  S4
A32])))
Successfully matched this instruction:
(set (reg:XF 90)
    (mem/u/c:XF (symbol_ref/u:SI ("*.LC3") [flags 0x2]) [0  S12 A128]))
allowing combination of insns 17, 78 and 24
original costs 12 + 4 + 4 = 20
replacement costs 4 + 12 = 16
deferring deletion of insn with uid = 17.
modifying insn i2    78: r99:XF=float_extend([`*.LC0'])
      REG_EH_REGION 0x1
deferring rescan insn with uid = 78.
modifying insn i3    24: r90:XF=[`*.LC3']
deferring rescan insn with uid = 24.

(removed failing matches)

So it does look like a combine problem to me which moves the EH note to
a random place.  Also insn 26 still shows up from nowhere... (maybe that's
CFG cleanup).


More information about the Gcc-bugs mailing list