------- 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