re PR tree-optimization/79408 (Missed VRP optimization of integer modulo)
PR tree-optimization/79408 * tree-vrp.c (simplify_div_or_mod_using_ranges): Handle also the case when on TRUNC_MOD_EXPR op0 is INTEGER_CST. (simplify_stmt_using_ranges): Call simplify_div_or_mod_using_ranges also if rhs1 is INTEGER_CST. * gcc.dg/tree-ssa/pr79408-2.c: New test. From-SVN: r245420
This commit is contained in:
parent
977472e8c6
commit
73424a0973
@ -1,3 +1,11 @@
|
||||
2017-02-14 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/79408
|
||||
* tree-vrp.c (simplify_div_or_mod_using_ranges): Handle also the
|
||||
case when on TRUNC_MOD_EXPR op0 is INTEGER_CST.
|
||||
(simplify_stmt_using_ranges): Call simplify_div_or_mod_using_ranges
|
||||
also if rhs1 is INTEGER_CST.
|
||||
|
||||
2017-02-14 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/79432
|
||||
|
@ -1,3 +1,8 @@
|
||||
2017-02-14 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/79408
|
||||
* gcc.dg/tree-ssa/pr79408-2.c: New test.
|
||||
|
||||
2017-02-14 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/79432
|
||||
|
34
gcc/testsuite/gcc.dg/tree-ssa/pr79408-2.c
Normal file
34
gcc/testsuite/gcc.dg/tree-ssa/pr79408-2.c
Normal file
@ -0,0 +1,34 @@
|
||||
/* PR tree-optimization/79408 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-optimized" } */
|
||||
|
||||
void link_error (void);
|
||||
|
||||
void
|
||||
foo (unsigned int y)
|
||||
{
|
||||
if (y <= 7312)
|
||||
return;
|
||||
if (7312 % y != 7312)
|
||||
link_error ();
|
||||
}
|
||||
|
||||
void
|
||||
bar (int x, int y)
|
||||
{
|
||||
if (y <= 7312)
|
||||
return;
|
||||
if (7312 % y != 7312)
|
||||
link_error ();
|
||||
}
|
||||
|
||||
void
|
||||
baz (int x, int y)
|
||||
{
|
||||
if (y <= 7312)
|
||||
return;
|
||||
if (-7312 % y != -7312)
|
||||
link_error ();
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized"} } */
|
@ -9241,8 +9241,24 @@ simplify_div_or_mod_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt)
|
||||
tree val = NULL;
|
||||
tree op0 = gimple_assign_rhs1 (stmt);
|
||||
tree op1 = gimple_assign_rhs2 (stmt);
|
||||
tree op0min = NULL_TREE, op0max = NULL_TREE;
|
||||
tree op1min = op1;
|
||||
value_range *vr = get_value_range (op0);
|
||||
value_range *vr = NULL;
|
||||
|
||||
if (TREE_CODE (op0) == INTEGER_CST)
|
||||
{
|
||||
op0min = op0;
|
||||
op0max = op0;
|
||||
}
|
||||
else
|
||||
{
|
||||
vr = get_value_range (op0);
|
||||
if (range_int_cst_p (vr))
|
||||
{
|
||||
op0min = vr->min;
|
||||
op0max = vr->max;
|
||||
}
|
||||
}
|
||||
|
||||
if (rhs_code == TRUNC_MOD_EXPR
|
||||
&& TREE_CODE (op1) == SSA_NAME)
|
||||
@ -9254,13 +9270,13 @@ simplify_div_or_mod_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt)
|
||||
if (rhs_code == TRUNC_MOD_EXPR
|
||||
&& TREE_CODE (op1min) == INTEGER_CST
|
||||
&& tree_int_cst_sgn (op1min) == 1
|
||||
&& range_int_cst_p (vr)
|
||||
&& tree_int_cst_lt (vr->max, op1min))
|
||||
&& op0max
|
||||
&& tree_int_cst_lt (op0max, op1min))
|
||||
{
|
||||
if (TYPE_UNSIGNED (TREE_TYPE (op0))
|
||||
|| tree_int_cst_sgn (vr->min) >= 0
|
||||
|| tree_int_cst_sgn (op0min) >= 0
|
||||
|| tree_int_cst_lt (fold_unary (NEGATE_EXPR, TREE_TYPE (op1min), op1min),
|
||||
vr->min))
|
||||
op0min))
|
||||
{
|
||||
/* If op0 already has the range op0 % op1 has,
|
||||
then TRUNC_MOD_EXPR won't change anything. */
|
||||
@ -9269,6 +9285,9 @@ simplify_div_or_mod_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt)
|
||||
}
|
||||
}
|
||||
|
||||
if (TREE_CODE (op0) != SSA_NAME)
|
||||
return false;
|
||||
|
||||
if (!integer_pow2p (op1))
|
||||
{
|
||||
/* X % -Y can be only optimized into X % Y either if
|
||||
@ -10377,7 +10396,8 @@ simplify_stmt_using_ranges (gimple_stmt_iterator *gsi)
|
||||
range. */
|
||||
case TRUNC_DIV_EXPR:
|
||||
case TRUNC_MOD_EXPR:
|
||||
if (TREE_CODE (rhs1) == SSA_NAME
|
||||
if ((TREE_CODE (rhs1) == SSA_NAME
|
||||
|| TREE_CODE (rhs1) == INTEGER_CST)
|
||||
&& INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
|
||||
return simplify_div_or_mod_using_ranges (gsi, stmt);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user