[Bug target/50762] [4.7 Regression] ICE: in extract_insn, at recog.c:2137 (unrecognizable insn)
uweigand at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Nov 11 13:14:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50762
--- Comment #24 from Ulrich Weigand <uweigand at gcc dot gnu.org> 2011-11-11 13:04:02 UTC ---
(In reply to comment #22)
> Yeah, this is also what I thought at the first sight. But please don't forget
> that additional c-code test effectively creates
>
> (and (match_operand (...)
> (match_test (call to c-code)))
>
> and this construct will _always_ force generation of mode checks.
No, it actually does not; see e.g. in the x86-64 insn-preds.c we have
(define_predicate "long_memory_operand"
(and (match_operand 0 "memory_operand")
(match_test "memory_address_length (op)")))
implemented as:
int
long_memory_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
{
return (memory_operand (op, mode)) && (
#line 994 "../../gcc-head/gcc/config/i386/predicates.md"
(memory_address_length (op)));
}
This is because the genpred routines have code to follow boolean
operators and reason correctly that if match_operand performs the
mode test, and some other test is joined via "and", the test is
still not necessary.
In fact, except for the address_operand case, the mode checks seem
to be correct in their actual effect: we either call a standard operator
and omit the mode check, or else we have the genpred-generated mode check,
but in conjunction with some match_code test that excludes CONST_INT
and CONST_DOUBLE anyway.
More information about the Gcc-bugs
mailing list