[Bug middle-end/21309] internal compiler error: in expand_mult_const, at expmed.c:2884
matt at 3am-software dot com
gcc-bugzilla@gcc.gnu.org
Sun May 8 15:32:00 GMT 2005
------- Additional Comments From matt at 3am-software dot com 2005-05-08 15:32 -------
This bug is to due to struct mult_cost having its member defined as shorts.
Since MAX_COST is defined to be INT_MAX, when a cost value is moved from div_mod
to mult_cost, the upper bits are truncated and the 0x7fffffd9 cost becomes
0xffd9. This results is a negative cost and causes a premature to happen in
synth_mult due to:
if (cost_limit->cost < 0
|| (cost_limit->cost == 0 && cost_limit->latency <= 0))
return;
And so the algorithm fails to be set resulting in the eventual call to
gcc_unreachable.
Simply changing the members of mult_cost from short to int causes the ICE to be
avoided.
--- expmed.c 27 Apr 2005 16:02:33 -0000 1.228
+++ expmed.c 8 May 2005 15:32:04 -0000
@@ -2315,8 +2315,8 @@ enum alg_code { alg_unknown, alg_zero, a
leaves and rtx_cost(op) + max(latency(a), latency(b)) otherwise. */
struct mult_cost {
- short cost; /* Total rtx_cost of the multiplication sequence. */
- short latency; /* The latency of the multiplication sequence. */
+ int cost; /* Total rtx_cost of the multiplication sequence. */
+ int latency; /* The latency of the multiplication sequence. */
};
/* This macro is used to compare a pointer to a mult_cost against an
--
What |Removed |Added
----------------------------------------------------------------------------
Component|target |middle-end
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21309
More information about the Gcc-bugs
mailing list