re PR tree-optimization/60930 (Wrong folding of - ((unsigned long long) a * (unsigned long long) (unsigned int)-1))

[gcc]

2014-04-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	PR tree-optimization/60930
	* gimple-ssa-strength-reduction.c (create_mul_imm_cand):  Reject
	creating a multiply candidate by folding two constant
	multiplicands when the result overflows.

[gcc/testsuite]

2014-04-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	PR tree-optimization/60930
	* gcc.dg/torture/pr60930.c:  New test.

From-SVN: r209805
This commit is contained in:
Bill Schmidt 2014-04-25 14:28:58 +00:00 committed by William Schmidt
parent 2b33282907
commit 61ba732927
4 changed files with 44 additions and 7 deletions

View file

@ -1,3 +1,10 @@
2014-04-25 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR tree-optimization/60930
* gimple-ssa-strength-reduction.c (create_mul_imm_cand): Reject
creating a multiply candidate by folding two constant
multiplicands when the result overflows.
2014-04-25 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/60960

View file

@ -1114,15 +1114,18 @@ create_mul_imm_cand (gimple gs, tree base_in, tree stride_in, bool speed)
X = Y * c
============================
X = (B + i') * (S * c) */
base = base_cand->base_expr;
index = base_cand->index;
temp = tree_to_double_int (base_cand->stride)
* tree_to_double_int (stride_in);
stride = double_int_to_tree (TREE_TYPE (stride_in), temp);
ctype = base_cand->cand_type;
if (has_single_use (base_in))
savings = (base_cand->dead_savings
+ stmt_cost (base_cand->cand_stmt, speed));
if (double_int_fits_to_tree_p (TREE_TYPE (stride_in), temp))
{
base = base_cand->base_expr;
index = base_cand->index;
stride = double_int_to_tree (TREE_TYPE (stride_in), temp);
ctype = base_cand->cand_type;
if (has_single_use (base_in))
savings = (base_cand->dead_savings
+ stmt_cost (base_cand->cand_stmt, speed));
}
}
else if (base_cand->kind == CAND_ADD && integer_onep (base_cand->stride))
{

View file

@ -1,3 +1,8 @@
2014-04-25 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR tree-optimization/60930
* gcc.dg/torture/pr60930.c: New test.
2014-04-25 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/60960

View file

@ -0,0 +1,22 @@
/* { dg-do run } */
int x = 1;
__attribute__((noinline, noclone)) void
foo (unsigned long long t)
{
asm volatile ("" : : "r" (&t));
if (t == 1)
__builtin_abort ();
}
int
main ()
{
#if __SIZEOF_LONG_LONG__ >= 8
unsigned long long t = 0xffffffffffffffffULL * (0xffffffffUL * x);
if (t != 0xffffffff00000001ULL)
foo (t);;
#endif
return 0;
}