[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