mirror of git://gcc.gnu.org/git/gcc.git
2018-10-22 Richard Biener <rguenther@suse.de>
* gimple-ssa-evrp-analyze.c (evrp_range_analyzer::record_ranges_from_incoming_edge): Be smarter about what ranges to use. * tree-vrp.c (add_assert_info): Dump here. (register_edge_assert_for_2): Instead of here at multiple but not all places. * gcc.dg/tree-ssa/evrp12.c: New testcase. * gcc.dg/predict-6.c: Adjust. * gcc.dg/tree-ssa/vrp33.c: Disable EVRP. * gcc.dg/tree-ssa/vrp02.c: Likewise. * gcc.dg/tree-ssa/cunroll-9.c: Likewise. From-SVN: r265391
This commit is contained in:
parent
d1e14d9720
commit
e86087eeb8
|
|
@ -1,3 +1,18 @@
|
||||||
|
2018-10-22 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
* gimple-ssa-evrp-analyze.c
|
||||||
|
(evrp_range_analyzer::record_ranges_from_incoming_edge): Be
|
||||||
|
smarter about what ranges to use.
|
||||||
|
* tree-vrp.c (add_assert_info): Dump here.
|
||||||
|
(register_edge_assert_for_2): Instead of here at multiple but
|
||||||
|
not all places.
|
||||||
|
|
||||||
|
* gcc.dg/tree-ssa/evrp12.c: New testcase.
|
||||||
|
* gcc.dg/predict-6.c: Adjust.
|
||||||
|
* gcc.dg/tree-ssa/vrp33.c: Disable EVRP.
|
||||||
|
* gcc.dg/tree-ssa/vrp02.c: Likewise.
|
||||||
|
* gcc.dg/tree-ssa/cunroll-9.c: Likewise.
|
||||||
|
|
||||||
2018-10-22 Steven Bosscher <steven@gcc.gnu.org>
|
2018-10-22 Steven Bosscher <steven@gcc.gnu.org>
|
||||||
Richard Biener <rguenther@suse.de>
|
Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -203,6 +203,16 @@ evrp_range_analyzer::record_ranges_from_incoming_edge (basic_block bb)
|
||||||
ordering issues that can lead to worse ranges. */
|
ordering issues that can lead to worse ranges. */
|
||||||
for (unsigned i = 0; i < vrs.length (); ++i)
|
for (unsigned i = 0; i < vrs.length (); ++i)
|
||||||
{
|
{
|
||||||
|
/* But make sure we do not weaken ranges like when
|
||||||
|
getting first [64, +INF] and then ~[0, 0] from
|
||||||
|
conditions like (s & 0x3cc0) == 0). */
|
||||||
|
value_range *old_vr = get_value_range (vrs[i].first);
|
||||||
|
value_range tem (old_vr->kind (), old_vr->min (), old_vr->max ());
|
||||||
|
tem.intersect (vrs[i].second);
|
||||||
|
if (tem.kind () == old_vr->kind ()
|
||||||
|
&& tem.min () == old_vr->min ()
|
||||||
|
&& tem.max () == old_vr->max ())
|
||||||
|
continue;
|
||||||
push_value_range (vrs[i].first, vrs[i].second);
|
push_value_range (vrs[i].first, vrs[i].second);
|
||||||
if (is_fallthru
|
if (is_fallthru
|
||||||
&& all_uses_feed_or_dominated_by_stmt (vrs[i].first, stmt))
|
&& all_uses_feed_or_dominated_by_stmt (vrs[i].first, stmt))
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,11 @@
|
||||||
|
2018-10-22 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
* gcc.dg/tree-ssa/evrp12.c: New testcase.
|
||||||
|
* gcc.dg/predict-6.c: Adjust.
|
||||||
|
* gcc.dg/tree-ssa/vrp33.c: Disable EVRP.
|
||||||
|
* gcc.dg/tree-ssa/vrp02.c: Likewise.
|
||||||
|
* gcc.dg/tree-ssa/cunroll-9.c: Likewise.
|
||||||
|
|
||||||
2018-10-22 Martin Liska <mliska@suse.cz>
|
2018-10-22 Martin Liska <mliska@suse.cz>
|
||||||
|
|
||||||
PR tree-optimization/87686
|
PR tree-optimization/87686
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,9 @@ void foo (int base, int bound)
|
||||||
int i, ret = 0;
|
int i, ret = 0;
|
||||||
for (i = base; i <= bound; i++)
|
for (i = base; i <= bound; i++)
|
||||||
{
|
{
|
||||||
if (i < base)
|
if (i <= base)
|
||||||
global += bar (i);
|
global += bar (i);
|
||||||
if (i < base + 1)
|
if (i < base + 2)
|
||||||
global += bar (i);
|
global += bar (i);
|
||||||
if (i <= base + 3)
|
if (i <= base + 3)
|
||||||
global += bar (i);
|
global += bar (i);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/* { dg-do compile } */
|
/* { dg-do compile } */
|
||||||
/* { dg-options "-O2 -fdump-tree-cunrolli-details" } */
|
/* { dg-options "-O2 -fdump-tree-cunrolli-details -fdisable-tree-evrp" } */
|
||||||
void abort (void);
|
void abort (void);
|
||||||
int q (void);
|
int q (void);
|
||||||
int a[10];
|
int a[10];
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2 -fdump-tree-evrp" } */
|
||||||
|
|
||||||
|
extern void link_error ();
|
||||||
|
|
||||||
|
void
|
||||||
|
f3 (unsigned int s)
|
||||||
|
{
|
||||||
|
if ((s & 0x3cc0) == 0)
|
||||||
|
{
|
||||||
|
if (s >= -15552U)
|
||||||
|
link_error ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (s <= 0x3f)
|
||||||
|
link_error ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* { dg-final { scan-tree-dump-not "link_error" "evrp" } } */
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/* { dg-do compile } */
|
/* { dg-do compile } */
|
||||||
/* { dg-options "-O2 -fdump-tree-vrp1 -fdelete-null-pointer-checks" } */
|
/* { dg-options "-O2 -fdump-tree-vrp1 -fdelete-null-pointer-checks -fdisable-tree-evrp" } */
|
||||||
|
|
||||||
struct A
|
struct A
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/* { dg-do compile } */
|
/* { dg-do compile } */
|
||||||
/* { dg-options "-O2 -fdump-tree-vrp1 -fno-tree-fre" } */
|
/* { dg-options "-O2 -fdump-tree-vrp1 -fno-tree-fre -fdisable-tree-evrp" } */
|
||||||
|
|
||||||
/* This is from PR14052. */
|
/* This is from PR14052. */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2299,6 +2299,9 @@ add_assert_info (vec<assert_info> &asserts,
|
||||||
info.val = val;
|
info.val = val;
|
||||||
info.expr = expr;
|
info.expr = expr;
|
||||||
asserts.safe_push (info);
|
asserts.safe_push (info);
|
||||||
|
dump_printf (MSG_NOTE | MSG_PRIORITY_INTERNALS,
|
||||||
|
"Adding assert for %T from %T %s %T\n",
|
||||||
|
name, expr, op_symbol_code (comp_code), val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If NAME doesn't have an ASSERT_EXPR registered for asserting
|
/* If NAME doesn't have an ASSERT_EXPR registered for asserting
|
||||||
|
|
@ -2698,16 +2701,6 @@ register_edge_assert_for_2 (tree name, edge e,
|
||||||
tmp = build1 (NOP_EXPR, TREE_TYPE (name), name3);
|
tmp = build1 (NOP_EXPR, TREE_TYPE (name), name3);
|
||||||
if (cst2 != NULL_TREE)
|
if (cst2 != NULL_TREE)
|
||||||
tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
|
tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
|
||||||
|
|
||||||
if (dump_file)
|
|
||||||
{
|
|
||||||
fprintf (dump_file, "Adding assert for ");
|
|
||||||
print_generic_expr (dump_file, name3);
|
|
||||||
fprintf (dump_file, " from ");
|
|
||||||
print_generic_expr (dump_file, tmp);
|
|
||||||
fprintf (dump_file, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
add_assert_info (asserts, name3, tmp, comp_code, val);
|
add_assert_info (asserts, name3, tmp, comp_code, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2725,16 +2718,6 @@ register_edge_assert_for_2 (tree name, edge e,
|
||||||
tmp = build1 (NOP_EXPR, TREE_TYPE (name), tmp);
|
tmp = build1 (NOP_EXPR, TREE_TYPE (name), tmp);
|
||||||
if (cst2 != NULL_TREE)
|
if (cst2 != NULL_TREE)
|
||||||
tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
|
tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
|
||||||
|
|
||||||
if (dump_file)
|
|
||||||
{
|
|
||||||
fprintf (dump_file, "Adding assert for ");
|
|
||||||
print_generic_expr (dump_file, name2);
|
|
||||||
fprintf (dump_file, " from ");
|
|
||||||
print_generic_expr (dump_file, tmp);
|
|
||||||
fprintf (dump_file, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
add_assert_info (asserts, name2, tmp, comp_code, val);
|
add_assert_info (asserts, name2, tmp, comp_code, val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2857,16 +2840,6 @@ register_edge_assert_for_2 (tree name, edge e,
|
||||||
cst = fold_build2 (MINUS_EXPR, TREE_TYPE (name2), cst,
|
cst = fold_build2 (MINUS_EXPR, TREE_TYPE (name2), cst,
|
||||||
build_int_cst (TREE_TYPE (name2), 1));
|
build_int_cst (TREE_TYPE (name2), 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dump_file)
|
|
||||||
{
|
|
||||||
fprintf (dump_file, "Adding assert for ");
|
|
||||||
print_generic_expr (dump_file, name2);
|
|
||||||
fprintf (dump_file, " from ");
|
|
||||||
print_generic_expr (dump_file, tmp);
|
|
||||||
fprintf (dump_file, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
add_assert_info (asserts, name2, tmp, new_comp_code, cst);
|
add_assert_info (asserts, name2, tmp, new_comp_code, cst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2931,19 +2904,8 @@ register_edge_assert_for_2 (tree name, edge e,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_val)
|
if (new_val)
|
||||||
{
|
|
||||||
if (dump_file)
|
|
||||||
{
|
|
||||||
fprintf (dump_file, "Adding assert for ");
|
|
||||||
print_generic_expr (dump_file, name2);
|
|
||||||
fprintf (dump_file, " from ");
|
|
||||||
print_generic_expr (dump_file, tmp);
|
|
||||||
fprintf (dump_file, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
add_assert_info (asserts, name2, tmp, new_comp_code, new_val);
|
add_assert_info (asserts, name2, tmp, new_comp_code, new_val);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Add asserts for NAME cmp CST and NAME being defined as
|
/* Add asserts for NAME cmp CST and NAME being defined as
|
||||||
NAME = NAME2 & CST2.
|
NAME = NAME2 & CST2.
|
||||||
|
|
@ -3170,16 +3132,6 @@ register_edge_assert_for_2 (tree name, edge e,
|
||||||
maxv2 = maxv - minv;
|
maxv2 = maxv - minv;
|
||||||
}
|
}
|
||||||
new_val = wide_int_to_tree (type, maxv2);
|
new_val = wide_int_to_tree (type, maxv2);
|
||||||
|
|
||||||
if (dump_file)
|
|
||||||
{
|
|
||||||
fprintf (dump_file, "Adding assert for ");
|
|
||||||
print_generic_expr (dump_file, names[i]);
|
|
||||||
fprintf (dump_file, " from ");
|
|
||||||
print_generic_expr (dump_file, tmp);
|
|
||||||
fprintf (dump_file, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
add_assert_info (asserts, names[i], tmp, LE_EXPR, new_val);
|
add_assert_info (asserts, names[i], tmp, LE_EXPR, new_val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue