https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104778
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Priority|P3 |P1
CC| |vmakarov at gcc dot gnu.org
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
This seems to go wrong during LRA.
In *.ira we have just:
(debug_insn 352 199 201 19 (var_location:SI D#2 (reg:SI 227)) -1
(nil))
but then LRA turns that into:
(debug_insn 352 199 201 19 (var_location:SI D#2 (plus:SI (plus:SI (minus:SI
(subreg:SI (reg:HI 130 [ _15 ]) 0)
(subreg:SI (reg:DI 325 [orig:131 _16 ] [131]) 4))
(subreg:SI (reg:HI 130 [ _15 ]) 0))
(zero_extend:SI (subreg:QI (mem/c:SI (reg:SI 304) [0 S4 A32]) 3)))) -1
(nil))
and later lra_substitute_pseudo turns that into:
(debug_insn 352 199 201 19 (var_location:SI D#2 (plus:SI (plus:SI (minus:SI
(subreg:SI (subreg:HI (reg:SI 270 [ a+4 ]) 2) 0)
(subreg:SI (reg:DI 325 [orig:131 _16 ] [131]) 4))
(subreg:SI (subreg:HI (reg:SI 270 [ a+4 ]) 2) 0))
(zero_extend:SI (subreg:QI (mem/c:SI (reg:SI 304) [0 S4 A32]) 3)))) -1
(nil))
and later another lra_substitute_pseudo turns that into:
(debug_insn 352 199 201 19 (var_location:SI D#2 (plus:SI (plus:SI (minus:SI
(subreg:SI (const_int 1 [0x1]) 0)
(subreg:SI (reg:DI 325 [orig:131 _16 ] [131]) 4))
(subreg:SI (const_int 1 [0x1]) 0))
(zero_extend:SI (subreg:QI (mem/c:SI (reg:SI 304) [0 S4 A32]) 3)))) -1
(nil))
I think we can deal in debug_insns with subreg inside of subreg, but we
certainly can't deal with a subreg with VOIDmode operand (ditto for
ZERO_EXTEND/SIGN_EXTEND etc.).
E.g. combine.cc (subst) has:
if (GET_CODE (x) == SUBREG && CONST_SCALAR_INT_P (new_rtx))
{
machine_mode mode = GET_MODE (x);
x = simplify_subreg (GET_MODE (x), new_rtx,
GET_MODE (SUBREG_REG (x)),
SUBREG_BYTE (x));
if (! x)
x = gen_rtx_CLOBBER (mode, const0_rtx);
}
else if (CONST_SCALAR_INT_P (new_rtx)
&& (GET_CODE (x) == ZERO_EXTEND
|| GET_CODE (x) == SIGN_EXTEND
|| GET_CODE (x) == FLOAT
|| GET_CODE (x) == UNSIGNED_FLOAT))
{
x = simplify_unary_operation (GET_CODE (x), GET_MODE (x),
new_rtx,
GET_MODE (XEXP (x, 0)));
if (!x)
return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
}
/* CONST_INTs shouldn't be substituted into PRE_DEC, PRE_MODIFY
etc. arguments, otherwise we can ICE before trying to recog
it. See PR104446. */
else if (CONST_SCALAR_INT_P (new_rtx)
&& GET_RTX_CLASS (GET_CODE (x)) == RTX_AUTOINC)
return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
else
SUBST (XEXP (x, i), new_rtx);
for this (note, RTX_AUTOINC shouldn't appear in debug insns, but the rest can).