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

Reply via email to