diff mbox

Fix widening multiply expansion (PR c/59708)

Message ID 20141203171017.GY1860@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Dec. 3, 2014, 5:10 p.m. UTC
Hi!

While expand_mult correctly checks for multiplication by zero,
expand_widening_mult does not and as floor_log2 (0) returns -1,
it attempts to expand a double-word shift by -1 and on ppc32
happens to return 2 w* 0 = 1.  Usually earlier optimizations
just ensure that w* 0 isn't expanded using expand_widening_mult,
e.g. expand_mul_overflow which expands widening multiply separately
on highpart and lowpart of some value can end up with this.
I think it is better to fix this on the expand_widening_mult side
rather than having to bother with those special cases in every caller.
In 4.9, I think ubsan_expand_si_overflow_mul_check can trigger the
same thing.

Testcase for this is builtin-arith-overflow-14.c on ppc32.
Bootstrapped/regtested on x86_64-linux and i686-linux, tested on
the testcase with ppc cross.  Ok for trunk/4.9?

2014-12-03  Jakub Jelinek  <jakub@redhat.com>

	PR c/59708
	* expmed.c (expand_widening_mult): Return const0_rtx if
	coeff is 0.


	Jakub

Comments

Jeff Law Dec. 3, 2014, 8:23 p.m. UTC | #1
On 12/03/14 10:10, Jakub Jelinek wrote:
> Hi!
>
> While expand_mult correctly checks for multiplication by zero,
> expand_widening_mult does not and as floor_log2 (0) returns -1,
> it attempts to expand a double-word shift by -1 and on ppc32
> happens to return 2 w* 0 = 1.  Usually earlier optimizations
> just ensure that w* 0 isn't expanded using expand_widening_mult,
> e.g. expand_mul_overflow which expands widening multiply separately
> on highpart and lowpart of some value can end up with this.
> I think it is better to fix this on the expand_widening_mult side
> rather than having to bother with those special cases in every caller.
> In 4.9, I think ubsan_expand_si_overflow_mul_check can trigger the
> same thing.
>
> Testcase for this is builtin-arith-overflow-14.c on ppc32.
> Bootstrapped/regtested on x86_64-linux and i686-linux, tested on
> the testcase with ppc cross.  Ok for trunk/4.9?
>
> 2014-12-03  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR c/59708
> 	* expmed.c (expand_widening_mult): Return const0_rtx if
> 	coeff is 0.
OK.
Jeff
diff mbox

Patch

--- gcc/expmed.c.jj	2014-11-18 08:26:45.000000000 +0100
+++ gcc/expmed.c	2014-12-03 11:12:37.519297971 +0100
@@ -3289,6 +3289,9 @@  expand_widening_mult (machine_mode mode,
       enum mult_variant variant;
       struct algorithm algorithm;
 
+      if (coeff == 0)
+	return CONST0_RTX (mode);
+
       /* Special case powers of two.  */
       if (EXACT_POWER_OF_2_OR_ZERO_P (coeff))
 	{