On 03/31/2011 05:42 PM, Richard Henderson wrote:
>> (rotate:SI (match_operand:SI 1 "register_operand" "")
>> - (match_operand:SI 2 "immediate_operand" "")))]
>> + (match_operand:SI 2 "const_int_operand" "")))]
>> ""
>> {
>> - if (INTVAL (operands[2]) != 16)
>> + if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 16)
>> FAIL;
>
> The point was, that you'd not need the CONST_INT check anymore,
> because it's handled by the predicate.
I have a dim memory of the problem being that something didn't check the
predicate. Sure enough, with the patch below applied to a 4.3 tree, I get
/local/src/egcs/gcc-4_3-branch/gcc/testsuite/gcc.c-torture/execute/20020226-1.c:43:
internal compiler error: in gen_rotrsi3, at config/bfin/bfin.md:1632
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
compiler exited with status 1
output is:
(reg:SI 193)
Stuart, try to identify whether it still happens. If so, a better fix
would be to change the expanders to honour the predicate.
Bernd
Index: ../gcc-4_3-branch/gcc/config/bfin/bfin.md
===================================================================
--- ../gcc-4_3-branch/gcc/config/bfin/bfin.md (revision 147761)
+++ ../gcc-4_3-branch/gcc/config/bfin/bfin.md (working copy)
@@ -1611,6 +1611,11 @@ (define_expand "rotlsi3"
(match_operand:SI 2 "immediate_operand" "")))]
""
{
+ if (GET_CODE (operands[2]) != CONST_INT)
+ {
+ debug_rtx (operands[2]);
+ abort ();
+ }
if (INTVAL (operands[2]) != 16)
FAIL;
})
@@ -1621,6 +1626,11 @@ (define_expand "rotrsi3"
(match_operand:SI 2 "immediate_operand" "")))]
""
{
+ if (GET_CODE (operands[2]) != CONST_INT)
+ {
+ debug_rtx (operands[2]);
+ abort ();
+ }
if (INTVAL (operands[2]) != 16)
FAIL;
emit_insn (gen_rotl16 (operands[0], operands[1]));