[Bug target/43348] [4.4 regression] ICE in final_scan_insn, at final.c:2604
wilson at codesourcery dot com
gcc-bugzilla@gcc.gnu.org
Wed Mar 17 01:46:00 GMT 2010
------- Comment #6 from wilson at codesourcery dot com 2010-03-17 01:46 -------
Subject: Re: New: [4.4 regression] ICE in final_scan_insn,
at final.c:2604
The testcase has
> if (newCapacity > std::numeric_limits<size_t>::max() / sizeof(T))
> do { *(int *)(uintptr_t)0xbbadbeef = 0; ((void(*)())0)(); } while(false);
which is not very C++ish, but none the less should "work".
The problem is in the ia64.md file. The call patterns use the predicate
call_operand which accepts only symbol_ref and register, and constraints
that include a register "b" and "i". The call operand remains a
register until reload, which sees that we have a register equivalent to
zero and an "i" constraint and does the substitution. After reload, we
then fail, as call_operand does not accept const_int.
We need to fix the ia64.md call patterns to use "s" instead of "i".
This bug has apparently been present since the port was submitted in
gcc-3.0.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43348
More information about the Gcc-bugs
mailing list