http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55876
--- Comment #2 from vries at gcc dot gnu.org 2013-01-04 16:00:07 UTC --- This patch introduces an assert that triggers before rather than during gen_rtx_SUBREG: ... Index: optabs.c =================================================================== --- optabs.c (revision 194898) +++ optabs.c (working copy) @@ -330,7 +330,12 @@ widen_operand (rtx op, enum machine_mode /* If MODE is no wider than a single word, we return a paradoxical SUBREG. */ if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD) - return gen_rtx_SUBREG (mode, force_reg (GET_MODE (op), op), 0); + { + /* Check that the result is a paradoxical subreg (outer mode strictly + larger than inner mode. */ + gcc_assert (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (op))); + return gen_rtx_SUBREG (mode, force_reg (GET_MODE (op), op), 0); + } /* Otherwise, get an object of MODE, clobber it, and set the low-order part to OP. */ ... This assert allows triggers both with -EB and -EL, while the original assert only triggers with -EB.