]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/21309 (internal compiler error: in expand_mult_const, at expmed...
authorRoger Sayle <roger@eyesopen.com>
Sat, 26 Nov 2005 04:06:57 +0000 (04:06 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sat, 26 Nov 2005 04:06:57 +0000 (04:06 +0000)
PR middle-end/21309
* expmed.c (choose_mult_variant): Return immediately when mult_cost
is less than zero.  Limit mult_cost to a reasonable upper bound for
the synthetic multiplication sequence.

From-SVN: r107537

gcc/ChangeLog
gcc/expmed.c

index 654acf22846a6a6c36f1fd7afbabca57095532a9..c4ec10c521f72e6764699bfb8ecfcffd0f1c6cbe 100644 (file)
@@ -1,3 +1,10 @@
+2005-11-25  Roger Sayle  <roger@eyesopen.com>
+
+       PR middle-end/21309
+       * expmed.c (choose_mult_variant): Return immediately when mult_cost
+       is less than zero.  Limit mult_cost to a reasonable upper bound for
+       the synthetic multiplication sequence.
+
 2005-11-25  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        PR middle-end/25022
index d591b6bc7c2b72f542bab2f2ae31c7975e32e267..ec2758ec8eff059f15047f4dd1797247b4074ff0 100644 (file)
@@ -2836,6 +2836,17 @@ choose_mult_variant (enum machine_mode mode, HOST_WIDE_INT val,
   struct mult_cost limit;
   int op_cost;
 
+  /* Fail quickly for impossible bounds.  */
+  if (mult_cost < 0)
+    return false;
+
+  /* Ensure that mult_cost provides a reasonable upper bound.
+     Any constant multiplication can be performed with less
+     than 2 * bits additions.  */
+  op_cost = 2 * GET_MODE_BITSIZE (mode) * add_cost[mode];
+  if (mult_cost > op_cost)
+    mult_cost = op_cost;
+
   *variant = basic_variant;
   limit.cost = mult_cost;
   limit.latency = mult_cost;