http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52883
Eric Botcazou <ebotcazou at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |NEW
Component|rtl-optimization |target
AssignedTo|ebotcazou at gcc dot |unassigned at gcc dot
|gnu.org |gnu.org
--- Comment #7 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2012-04-08
13:36:16 UTC ---
> Leaving this to RTX experts, since the code does not match the comment.
The problem is elsewhere though, namely in the zero_extendsidi2_rex64 pattern:
(define_insn "*zero_extendsidi2_rex64"
[(set (match_operand:DI 0 "nonimmediate_operand"
"=r ,o,?*Ym,?*y,?*Yi,!*x")
(zero_extend:DI
(match_operand:SI 1 "x86_64_zext_general_operand"
"rmZ,0,r ,m ,r ,m*x")))]
"TARGET_64BIT"
The problematic RTL is generated by reload because the Z constraint is invalid
in the above pattern. Excerpt from the manual:
"For all conversion operations, X must not be `VOIDmode' because the
mode in which to do the conversion would not be known. The conversion
must either be done at compile-time or X must be placed into a register.
`(sign_extend:M X)'
Represents the result of sign-extending the value X to machine
mode M. M must be a fixed-point mode and X a fixed-point value of
a mode narrower than M.
`(zero_extend:M X)'
Represents the result of zero-extending the value X to machine
mode M. M must be a fixed-point mode and X a fixed-point value of
a mode narrower than M."