Hi,
On 20/10/16 02:54, Andrew Pinski wrote:
On Wed, Oct 19, 2016 at 1:01 AM, Christophe Lyon
<christophe.l...@linaro.org> wrote:
On 18 October 2016 at 09:34, Richard Biener <rguent...@suse.de> wrote:
On Mon, 17 Oct 2016, Richard Biener wrote:
This refactors propagation vs. substitution and handles condition
simplification properly as well as passing a known taken edge down
to the DOM walker (avoiding useless work and properly handling PHIs).
If we do all the work it's stupid to not fold away dead code...
Bootstrap and regtest pending on x86_64-unknown-linux-gnu.
The following is what I applied, also fixing a spelling mistake noticed
by Bernhard.
Hi Richard,
This patch is causing regressions on aarch64. These tests now fail:
So I looked into it and found the testcase themselves need to be changed.
The functions are marked as noinline but not noclone.
For an example:
static void __attribute__((noinline))
check_args_8 (int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7,
int a8)
....
Indeed. In test12 and so on, arguments for check_args_8/check_args_24 is
now becoming constant which enables ipa-cp to create specialized clones.
Though this is good, in order to preserve the tested functionality, we
need to add noclone attribute. Here is a patch to do this.
Regression tested on aatch64-linux-gnu. Is this OK for trunk?
Thanks,
Kugan
gcc/testsuite/ChangeLog:
2016-10-20 Kugan Vivekanandarajah <kuga...@linaro.org>
* gcc.target/aarch64/test_frame_common.h: Add noclone attribute
such that cloned verions of tested functions are not created.
Thanks,
Andrew
gcc.target/aarch64/test_frame_12.c scan-assembler-times ldp\tx29,
x30, \\[sp, [0-9]+\\] 1
gcc.target/aarch64/test_frame_12.c scan-assembler-times sub\tsp, sp, #[0-9]+ 1
gcc.target/aarch64/test_frame_15.c scan-assembler-times stp\tx29,
x30, \\[sp, [0-9]+\\] 1
gcc.target/aarch64/test_frame_15.c scan-assembler-times sub\tsp, sp, #[0-9]+ 1
gcc.target/aarch64/test_frame_8.c scan-assembler-times ldr\tx30,
\\[sp, [0-9]+\\] 1
gcc.target/aarch64/test_frame_8.c scan-assembler-times str\tx30,
\\[sp, [0-9]+\\] 1
Christophe
Richard.
2016-10-18 Richard Biener <rguent...@suse.de>
* tree-vrp.c (evrp_dom_walker::before_dom_children): Handle
not visited but non-executable predecessors. Return taken edge.
Simplify conditions and refactor propagation vs. folding step.
* gcc.dg/tree-ssa/pr20318.c: Disable EVRP.
* gcc.dg/tree-ssa/pr21001.c: Likewise.
* gcc.dg/tree-ssa/pr21090.c: Likewise.
* gcc.dg/tree-ssa/pr21294.c: Likewise.
* gcc.dg/tree-ssa/pr21563.c: Likewise.
* gcc.dg/tree-ssa/pr23744.c: Likewise.
* gcc.dg/tree-ssa/pr25382.c: Likewise.
* gcc.dg/tree-ssa/pr68431.c: Likewise.
* gcc.dg/tree-ssa/vrp03.c: Likewise.
* gcc.dg/tree-ssa/vrp06.c: Likewise.
* gcc.dg/tree-ssa/vrp07.c: Likewise.
* gcc.dg/tree-ssa/vrp09.c: Likewise.
* gcc.dg/tree-ssa/vrp19.c: Likewise.
* gcc.dg/tree-ssa/vrp20.c: Likewise.
* gcc.dg/tree-ssa/vrp92.c: Likewise.
* gcc.dg/pr68217.c: Likewise.
* gcc.dg/predict-9.c: Likewise.
* gcc.dg/tree-prof/val-prof-5.c: Adjust.
* gcc.dg/predict-1.c: Likewise.
Index: gcc/tree-vrp.c
===================================================================
--- gcc/tree-vrp.c (revision 241242)
+++ gcc/tree-vrp.c (working copy)
@@ -10741,12 +10741,13 @@ evrp_dom_walker::before_dom_children (ba
gimple_stmt_iterator gsi;
edge e;
edge_iterator ei;
- bool has_unvisived_preds = false;
+ bool has_unvisited_preds = false;
FOR_EACH_EDGE (e, ei, bb->preds)
- if (!(e->src->flags & BB_VISITED))
+ if (e->flags & EDGE_EXECUTABLE
+ && !(e->src->flags & BB_VISITED))
{
- has_unvisived_preds = true;
+ has_unvisited_preds = true;
break;
}
@@ -10756,7 +10757,7 @@ evrp_dom_walker::before_dom_children (ba
gphi *phi = gpi.phi ();
tree lhs = PHI_RESULT (phi);
value_range vr_result = VR_INITIALIZER;
- if (!has_unvisived_preds
+ if (!has_unvisited_preds
&& stmt_interesting_for_vrp (phi))
extract_range_from_phi_node (phi, &vr_result);
else
@@ -10764,81 +10765,90 @@ evrp_dom_walker::before_dom_children (ba
update_value_range (lhs, &vr_result);
}
+ edge taken_edge = NULL;
+
/* Visit all other stmts and discover any new VRs possible. */
for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
{
gimple *stmt = gsi_stmt (gsi);
- edge taken_edge;
tree output = NULL_TREE;
gimple *old_stmt = stmt;
bool was_noreturn = (is_gimple_call (stmt)
&& gimple_call_noreturn_p (stmt));
- /* TODO, if found taken_edge, we should visit (return it) and travel
- again to improve VR as done in DOM/SCCVN optimizations. It should
- be done carefully as stmts might prematurely leave a BB like
- in EH. */
- if (stmt_interesting_for_vrp (stmt))
+ if (gcond *cond = dyn_cast <gcond *> (stmt))
+ {
+ vrp_visit_cond_stmt (cond, &taken_edge);
+ if (taken_edge)
+ {
+ if (taken_edge->flags & EDGE_TRUE_VALUE)
+ gimple_cond_make_true (cond);
+ else if (taken_edge->flags & EDGE_FALSE_VALUE)
+ gimple_cond_make_false (cond);
+ else
+ gcc_unreachable ();
+ }
+ }
+ else if (stmt_interesting_for_vrp (stmt))
{
+ edge taken_edge;
value_range vr = VR_INITIALIZER;
extract_range_from_stmt (stmt, &taken_edge, &output, &vr);
if (output
&& (vr.type == VR_RANGE || vr.type == VR_ANTI_RANGE))
- update_value_range (output, &vr);
- else
- set_defs_to_varying (stmt);
-
- /* Try folding stmts with the VR discovered. */
- bool did_replace
- = replace_uses_in (stmt,
- op_with_constant_singleton_value_range);
- if (fold_stmt (&gsi, follow_single_use_edges)
- || did_replace)
- update_stmt (gsi_stmt (gsi));
-
- if (did_replace)
{
- /* If we cleaned up EH information from the statement,
- remove EH edges. */
- if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
- bitmap_set_bit (need_eh_cleanup, bb->index);
-
- /* If we turned a not noreturn call into a noreturn one
- schedule it for fixup. */
- if (!was_noreturn
- && is_gimple_call (stmt)
- && gimple_call_noreturn_p (stmt))
- stmts_to_fixup.safe_push (stmt);
+ update_value_range (output, &vr);
- if (gimple_assign_single_p (stmt))
+ /* Set the SSA with the value range. */
+ if (INTEGRAL_TYPE_P (TREE_TYPE (output)))
{
- tree rhs = gimple_assign_rhs1 (stmt);
- if (TREE_CODE (rhs) == ADDR_EXPR)
- recompute_tree_invariant_for_addr_expr (rhs);
+ value_range *vr = get_value_range (output);
+
+ if ((vr->type == VR_RANGE
+ || vr->type == VR_ANTI_RANGE)
+ && (TREE_CODE (vr->min) == INTEGER_CST)
+ && (TREE_CODE (vr->max) == INTEGER_CST))
+ set_range_info (output, vr->type, vr->min, vr->max);
}
}
+ else
+ set_defs_to_varying (stmt);
+ }
+ else
+ set_defs_to_varying (stmt);
- def_operand_p def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);
- /* Set the SSA with the value range. */
- if (def_p
- && TREE_CODE (DEF_FROM_PTR (def_p)) == SSA_NAME
- && INTEGRAL_TYPE_P (TREE_TYPE (DEF_FROM_PTR (def_p))))
- {
- tree def = DEF_FROM_PTR (def_p);
- value_range *vr = get_value_range (def);
+ /* Try folding stmts with the VR discovered. */
+ bool did_replace
+ = replace_uses_in (stmt, op_with_constant_singleton_value_range);
+ if (fold_stmt (&gsi, follow_single_use_edges)
+ || did_replace)
+ update_stmt (gsi_stmt (gsi));
- if ((vr->type == VR_RANGE
- || vr->type == VR_ANTI_RANGE)
- && (TREE_CODE (vr->min) == INTEGER_CST)
- && (TREE_CODE (vr->max) == INTEGER_CST))
- set_range_info (def, vr->type, vr->min, vr->max);
+ if (did_replace)
+ {
+ /* If we cleaned up EH information from the statement,
+ remove EH edges. */
+ if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
+ bitmap_set_bit (need_eh_cleanup, bb->index);
+
+ /* If we turned a not noreturn call into a noreturn one
+ schedule it for fixup. */
+ if (!was_noreturn
+ && is_gimple_call (stmt)
+ && gimple_call_noreturn_p (stmt))
+ stmts_to_fixup.safe_push (stmt);
+
+ if (gimple_assign_single_p (stmt))
+ {
+ tree rhs = gimple_assign_rhs1 (stmt);
+ if (TREE_CODE (rhs) == ADDR_EXPR)
+ recompute_tree_invariant_for_addr_expr (rhs);
}
}
- else
- set_defs_to_varying (stmt);
}
bb->flags |= BB_VISITED;
- return NULL;
+
+ return taken_edge;
}
/* Restore/pop VRs valid only for BB when we leave BB. */
Index: gcc/testsuite/gcc.dg/pr68217.c
===================================================================
--- gcc/testsuite/gcc.dg/pr68217.c (revision 241241)
+++ gcc/testsuite/gcc.dg/pr68217.c (working copy)
@@ -1,6 +1,5 @@
-
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1" } */
int foo (void)
{
Index: gcc/testsuite/gcc.dg/predict-1.c
===================================================================
--- gcc/testsuite/gcc.dg/predict-1.c (revision 241241)
+++ gcc/testsuite/gcc.dg/predict-1.c (working copy)
@@ -23,4 +23,4 @@ void foo (int bound)
}
}
-/* { dg-final { scan-tree-dump-times "guess loop iv compare heuristics of edge\[^:\]*:
2.0%" 5 "profile_estimate"} } */
+/* { dg-final { scan-tree-dump-times "guess loop iv compare heuristics of edge\[^:\]*:
2.0%" 4 "profile_estimate"} } */
Index: gcc/testsuite/gcc.dg/predict-9.c
===================================================================
--- gcc/testsuite/gcc.dg/predict-9.c (revision 241241)
+++ gcc/testsuite/gcc.dg/predict-9.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-profile_estimate" } */
extern int global;
extern int global2;
Index: gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-prof/val-prof-5.c (working copy)
@@ -6,7 +6,7 @@ main()
{
int i;
for (i = 0; i < 1000; i++)
- if (a[i])
+ if (a[i] != 1)
a[i]/=b;
else
a[i]/=b;
Index: gcc/testsuite/gcc.dg/tree-ssa/pr20318.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/pr20318.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr20318.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile { target { ! keeps_null_pointer_checks } } } */
-/* { dg-options "-O2 -fdump-tree-original -fdump-tree-vrp1
-fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fdump-tree-original -fdump-tree-vrp1
-fdelete-null-pointer-checks -fdisable-tree-evrp" } */
extern int* f(int) __attribute__((returns_nonnull));
extern void eliminate ();
Index: gcc/testsuite/gcc.dg/tree-ssa/pr21001.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/pr21001.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr21001.c (working copy)
@@ -5,7 +5,7 @@
range information out of the conditional. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-dominator-opts -fno-tree-fre
-fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fno-tree-dominator-opts -fno-tree-fre -fdisable-tree-evrp
-fdump-tree-vrp1-details" } */
int
foo (int a)
Index: gcc/testsuite/gcc.dg/tree-ssa/pr21090.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/pr21090.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr21090.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1 -fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1
-fdelete-null-pointer-checks" } */
int g, h;
Index: gcc/testsuite/gcc.dg/tree-ssa/pr21294.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/pr21294.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr21294.c (working copy)
@@ -4,7 +4,7 @@
allows us to eliminate the second "if" statement. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fno-tree-dominator-opts -fdisable-tree-evrp
-fdump-tree-vrp1-details" } */
struct f {
int i;
Index: gcc/testsuite/gcc.dg/tree-ssa/pr21563.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/pr21563.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr21563.c (working copy)
@@ -2,7 +2,7 @@
Make sure VRP folds the second "if" statement. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fno-tree-dominator-opts -fdisable-tree-evrp
-fdump-tree-vrp1-details" } */
int
foo (int a)
Index: gcc/testsuite/gcc.dg/tree-ssa/pr23744.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/pr23744.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr23744.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fno-tree-ccp -fdisable-tree-evrp -fdump-tree-vrp1" } */
void h (void);
Index: gcc/testsuite/gcc.dg/tree-ssa/pr25382.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/pr25382.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr25382.c (working copy)
@@ -3,7 +3,7 @@
Check that VRP now gets ranges from BIT_AND_EXPRs. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fno-tree-ccp -fdisable-tree-evrp -fdump-tree-vrp1" } */
int
foo (int a)
Index: gcc/testsuite/gcc.dg/tree-ssa/pr68431.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/pr68431.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr68431.c (working copy)
@@ -1,5 +1,5 @@
/* PR tree-optimization/68431 */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1-details" } */
unsigned int x = 1;
int
Index: gcc/testsuite/gcc.dg/tree-ssa/vrp03.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/vrp03.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/vrp03.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1" } */
struct A
{
Index: gcc/testsuite/gcc.dg/tree-ssa/vrp06.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/vrp06.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/vrp06.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1" } */
int baz (void);
Index: gcc/testsuite/gcc.dg/tree-ssa/vrp07.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/vrp07.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/vrp07.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-fre -fdump-tree-vrp1-details
-fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1-details
-fdelete-null-pointer-checks" } */
int
foo (int i, int *p)
Index: gcc/testsuite/gcc.dg/tree-ssa/vrp09.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/vrp09.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/vrp09.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-fre -fdump-tree-vrp1 -std=gnu89" } */
+/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1
-std=gnu89" } */
foo (int *p)
{
Index: gcc/testsuite/gcc.dg/tree-ssa/vrp19.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/vrp19.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/vrp19.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-fwrapv -O1 -ftree-vrp -fdump-tree-vrp1" } */
+/* { dg-options "-fwrapv -O1 -ftree-vrp -fdisable-tree-evrp -fdump-tree-vrp1"
} */
#include <limits.h>
extern void abort ();
Index: gcc/testsuite/gcc.dg/tree-ssa/vrp20.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/vrp20.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/vrp20.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-fwrapv -O1 -fno-tree-fre -ftree-vrp -fdump-tree-vrp1" } */
+/* { dg-options "-fwrapv -O1 -fno-tree-fre -fdisable-tree-evrp -ftree-vrp
-fdump-tree-vrp1" } */
extern void abort ();
extern void exit (int);
Index: gcc/testsuite/gcc.dg/tree-ssa/vrp92.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/vrp92.c (revision 241241)
+++ gcc/testsuite/gcc.dg/tree-ssa/vrp92.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details -fdisable-tree-ethread" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1-details
-fdisable-tree-ethread" } */
void bar (void);
int foo (int i, int j)
diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_common.h
b/gcc/testsuite/gcc.target/aarch64/test_frame_common.h
index d7fed25..c63fbce 100644
--- a/gcc/testsuite/gcc.target/aarch64/test_frame_common.h
+++ b/gcc/testsuite/gcc.target/aarch64/test_frame_common.h
@@ -2,7 +2,7 @@ extern void abort ();
#define CVT(v) ((unsigned char)(v))
-static void __attribute__((noinline))
+static void __attribute__((noinline, noclone))
check_args_8 (int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7,
int a8)
{
@@ -18,7 +18,7 @@ check_args_8 (int a0, int a1, int a2, int a3, int a4, int a5,
int a6, int a7,
abort ();
}
-static void __attribute__((noinline))
+static void __attribute__((noinline, noclone))
check_args_24 (int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7,
int a8, int a9, int a10)
{
@@ -36,7 +36,7 @@ check_args_24 (int a0, int a1, int a2, int a3, int a4, int
a5, int a6, int a7,
abort ();
}
-void __attribute__ ((noinline))
+void __attribute__ ((noinline, noclone))
initialize_array (unsigned char *a, int len)
{
int i;