mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-13 07:30:31 +08:00
re PR tree-optimization/61682 (wrong code at -O3 on x86_64-linux-gnu)
PR tree-optimization/61682 * wide-int.cc (wi::mul_internal): Handle high correctly for umul_ppmm using cases and when one of the operands is equal to 1. * gcc.c-torture/execute/pr61682.c: New test. From-SVN: r212273
This commit is contained in:
parent
f707da16f7
commit
c01d6ad948
gcc
@ -1,3 +1,10 @@
|
||||
2014-07-03 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/61682
|
||||
* wide-int.cc (wi::mul_internal): Handle high correctly
|
||||
for umul_ppmm using cases and when one of the operands is
|
||||
equal to 1.
|
||||
|
||||
2014-07-03 Segher Boessenkool <segher@kernel.crashing.org>
|
||||
|
||||
* config/rs6000/rs6000.md (rotl<mode>3, ashl<mode>3, lshr<mode>3,
|
||||
|
@ -1,3 +1,8 @@
|
||||
2014-07-03 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/61682
|
||||
* gcc.c-torture/execute/pr61682.c: New test.
|
||||
|
||||
2014-07-03 Segher Boessenkool <segher@kernel.crashing.org>
|
||||
|
||||
* gcc.target/powerpc/shift-dot.c: New test.
|
||||
|
17
gcc/testsuite/gcc.c-torture/execute/pr61682.c
Normal file
17
gcc/testsuite/gcc.c-torture/execute/pr61682.c
Normal file
@ -0,0 +1,17 @@
|
||||
/* PR tree-optimization/61682 */
|
||||
|
||||
int a, b;
|
||||
static int *c = &b;
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
int *d = &a;
|
||||
for (a = 0; a < 12; a++)
|
||||
*c |= *d / 9;
|
||||
|
||||
if (b != 1)
|
||||
__builtin_abort ();
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/* Operations with very long integers.
|
||||
Copyright (C) 2012-2013 Free Software Foundation, Inc.
|
||||
Copyright (C) 2012-2014 Free Software Foundation, Inc.
|
||||
Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
|
||||
|
||||
This file is part of GCC.
|
||||
@ -1282,6 +1282,12 @@ wi::mul_internal (HOST_WIDE_INT *val, const HOST_WIDE_INT *op1val,
|
||||
&& wi::fits_uhwi_p (op1)
|
||||
&& wi::fits_uhwi_p (op2))
|
||||
{
|
||||
/* This case never overflows. */
|
||||
if (high)
|
||||
{
|
||||
val[0] = 0;
|
||||
return 1;
|
||||
}
|
||||
umul_ppmm (val[1], val[0], op1.ulow (), op2.ulow ());
|
||||
return 1 + (val[1] != 0 || val[0] < 0);
|
||||
}
|
||||
@ -1294,6 +1300,8 @@ wi::mul_internal (HOST_WIDE_INT *val, const HOST_WIDE_INT *op1val,
|
||||
umul_ppmm (upper, val[0], op1.ulow (), op2.ulow ());
|
||||
if (needs_overflow)
|
||||
*overflow = (upper != 0);
|
||||
if (high)
|
||||
val[0] = upper;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@ -1302,12 +1310,22 @@ wi::mul_internal (HOST_WIDE_INT *val, const HOST_WIDE_INT *op1val,
|
||||
/* Handle multiplications by 1. */
|
||||
if (op1 == 1)
|
||||
{
|
||||
if (high)
|
||||
{
|
||||
val[0] = wi::neg_p (op2, sgn) ? -1 : 0;
|
||||
return 1;
|
||||
}
|
||||
for (i = 0; i < op2len; i++)
|
||||
val[i] = op2val[i];
|
||||
return op2len;
|
||||
}
|
||||
if (op2 == 1)
|
||||
{
|
||||
if (high)
|
||||
{
|
||||
val[0] = wi::neg_p (op1, sgn) ? -1 : 0;
|
||||
return 1;
|
||||
}
|
||||
for (i = 0; i < op1len; i++)
|
||||
val[i] = op1val[i];
|
||||
return op1len;
|
||||
|
Loading…
x
Reference in New Issue
Block a user