From e56c602ea3335648e81411442a66e52dd129dc3b Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 9 Dec 2015 13:30:41 +0000 Subject: [PATCH] re PR tree-optimization/68583 (Missed if-conversion) 2015-12-09 Richard Biener PR tree-optimization/68583 * tree-if-conv.c (if_convertible_phi_p): Drop flag_tree_loop_if_convert_stores check in favor of the existing any_mask_load_store check. (insert_gimplified_predicates): Likewise. (combine_blocks): Likewise. (tree_if_conversion): Likewise. (ifcvt_memrefs_wont_trap): Properly check flag_tree_loop_if_convert_stores in all places that can end up introducing store-data-races. (if_convertible_gimple_assign_stmt_p): Remove restriction on flag_tree_loop_if_convert_stores for stores we can if-convert without introducing store-data-races. Force versioning for all if-converted stores. * gcc.dg/tree-ssa/ifc-pr68583.c: New testcase. * gcc.dg/vect/vect-72.c: Adjust. * gcc.dg/vect/vect-cselim-2.c: Likewise. * gcc.dg/vect/vect-strided-store-a-u8-i2.c: Likewise. From-SVN: r231453 --- gcc/ChangeLog | 17 +++++++ gcc/testsuite/ChangeLog | 8 ++++ gcc/testsuite/gcc.dg/tree-ssa/ifc-pr68583.c | 23 +++++++++ gcc/testsuite/gcc.dg/vect/vect-72.c | 3 +- gcc/testsuite/gcc.dg/vect/vect-cselim-2.c | 3 ++ .../gcc.dg/vect/vect-strided-store-a-u8-i2.c | 2 + gcc/tree-if-conv.c | 47 +++++-------------- 7 files changed, 68 insertions(+), 35 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ifc-pr68583.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 82607d19ad4..3da8d1b6add 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2015-12-09 Richard Biener + + PR tree-optimization/68583 + * tree-if-conv.c (if_convertible_phi_p): Drop + flag_tree_loop_if_convert_stores check in favor of the + existing any_mask_load_store check. + (insert_gimplified_predicates): Likewise. + (combine_blocks): Likewise. + (tree_if_conversion): Likewise. + (ifcvt_memrefs_wont_trap): Properly check + flag_tree_loop_if_convert_stores in all places that can end + up introducing store-data-races. + (if_convertible_gimple_assign_stmt_p): Remove restriction + on flag_tree_loop_if_convert_stores for stores we can if-convert + without introducing store-data-races. Force versioning for + all if-converted stores. + 2015-12-09 Tom de Vries PR tree-optimization/68716 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d5226ef013d..687e2b2196f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-12-09 Richard Biener + + PR tree-optimization/68583 + * gcc.dg/tree-ssa/ifc-pr68583.c: New testcase. + * gcc.dg/vect/vect-72.c: Adjust. + * gcc.dg/vect/vect-cselim-2.c: Likewise. + * gcc.dg/vect/vect-strided-store-a-u8-i2.c: Likewise. + 2015-12-09 Richard Biener PR tree-optimization/68417 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr68583.c b/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr68583.c new file mode 100644 index 00000000000..be89e0855c3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr68583.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-ifcvt" } */ + +void foo (long *a) +{ + int i; + for (i = 0; i < 100; i+=2) + { + long *p = &a[i+1]; + if (a[i] == 0) + { + *p = 2; + a[i] = 3; + } + else + { + *p = 3; + a[i] = 4; + } + } +} + +/* { dg-final { scan-tree-dump "Applying if-conversion" "ifcvt" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-72.c b/gcc/testsuite/gcc.dg/vect/vect-72.c index 4c0a9737016..9c9be8eff13 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-72.c +++ b/gcc/testsuite/gcc.dg/vect/vect-72.c @@ -19,9 +19,10 @@ int main1 () for (i=0; i < N+1; i++) { ib[i] = i; - /* Avoid vectorization. */ if (i%3 == 0) ib[i] = 5; + /* Avoid vectorization. */ + __asm__ volatile ("" : : : "memory"); } for (i = 1; i < N+1; i++) diff --git a/gcc/testsuite/gcc.dg/vect/vect-cselim-2.c b/gcc/testsuite/gcc.dg/vect/vect-cselim-2.c index d57228300f2..95efe7ad62e 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-cselim-2.c +++ b/gcc/testsuite/gcc.dg/vect/vect-cselim-2.c @@ -1,4 +1,7 @@ /* { dg-require-effective-target vect_int } */ +/* We now if-convert the loop unconditonally as the memory locations + are always stored to. */ +/* { dg-additional-options "-fno-tree-loop-if-convert" } */ #include #include "tree-vect.h" diff --git a/gcc/testsuite/gcc.dg/vect/vect-strided-store-a-u8-i2.c b/gcc/testsuite/gcc.dg/vect/vect-strided-store-a-u8-i2.c index 17169bda602..6be939eea16 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-strided-store-a-u8-i2.c +++ b/gcc/testsuite/gcc.dg/vect/vect-strided-store-a-u8-i2.c @@ -26,6 +26,8 @@ main1 () b[i] = i * 2; if (i%3 == 0) a[i] = 10; + /* Prevent vectorization. */ + __asm__ volatile ("" : : : "memory"); } for (i = 0; i < N; i++) diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index c85969565cf..637fa226935 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -517,7 +517,7 @@ bb_with_exit_edge_p (struct loop *loop, basic_block bb) PHI is not if-convertible if: - it has more than 2 arguments. - When the flag_tree_loop_if_convert_stores is not set, PHI is not + When we didn't see if-convertible stores, PHI is not if-convertible if: - a virtual PHI is immediately used in another PHI node, - there is a virtual PHI in a BB other than the loop->header. @@ -545,10 +545,10 @@ if_convertible_phi_p (struct loop *loop, basic_block bb, gphi *phi, } } - if (flag_tree_loop_if_convert_stores || any_mask_load_store) + if (any_mask_load_store) return true; - /* When the flag_tree_loop_if_convert_stores is not set, check + /* When there were no if-convertible stores, check that there are no memory writes in the branches of the loop to be if-converted. */ if (virtual_operand_p (gimple_phi_result (phi))) @@ -713,16 +713,15 @@ ifcvt_memrefs_wont_trap (gimple *stmt, vec drs) to unconditionally. */ if (base_master_dr && DR_BASE_W_UNCONDITIONALLY (*base_master_dr)) - return true; + return flag_tree_loop_if_convert_stores; else { /* or the base is know to be not readonly. */ tree base_tree = get_base_address (DR_REF (a)); if (DECL_P (base_tree) && decl_binds_to_current_def_p (base_tree) - && flag_tree_loop_if_convert_stores - && !TREE_READONLY (base_tree)) - return true; + && ! TREE_READONLY (base_tree)) + return flag_tree_loop_if_convert_stores; } } return false; @@ -791,7 +790,6 @@ if_convertible_gimple_assign_stmt_p (gimple *stmt, bool *any_mask_load_store) { tree lhs = gimple_assign_lhs (stmt); - basic_block bb; if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -835,28 +833,10 @@ if_convertible_gimple_assign_stmt_p (gimple *stmt, return false; } - if (flag_tree_loop_if_convert_stores) - return true; - - bb = gimple_bb (stmt); - - if (TREE_CODE (lhs) != SSA_NAME - && bb != bb->loop_father->header - && !bb_with_exit_edge_p (bb->loop_father, bb)) - { - if (ifcvt_can_use_mask_load_store (stmt)) - { - gimple_set_plf (stmt, GF_PLF_2, true); - *any_mask_load_store = true; - return true; - } - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "LHS is not var\n"); - print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); - } - return false; - } + /* When if-converting stores force versioning, likewise if we + ended up generating store data races. */ + if (gimple_vdef (stmt)) + *any_mask_load_store = true; return true; } @@ -1851,8 +1831,7 @@ insert_gimplified_predicates (loop_p loop, bool any_mask_load_store) stmts = bb_predicate_gimplified_stmts (bb); if (stmts) { - if (flag_tree_loop_if_convert_stores - || any_mask_load_store) + if (any_mask_load_store) { /* Insert the predicate of the BB just after the label, as the if-conversion of memory writes will use this @@ -2174,7 +2153,7 @@ combine_blocks (struct loop *loop, bool any_mask_load_store) insert_gimplified_predicates (loop, any_mask_load_store); predicate_all_scalar_phis (loop); - if (flag_tree_loop_if_convert_stores || any_mask_load_store) + if (any_mask_load_store) predicate_mem_writes (loop); /* Merge basic blocks: first remove all the edges in the loop, @@ -2691,7 +2670,7 @@ tree_if_conversion (struct loop *loop) } todo |= TODO_cleanup_cfg; - if (flag_tree_loop_if_convert_stores || any_mask_load_store) + if (any_mask_load_store) { mark_virtual_operands_for_renaming (cfun); todo |= TODO_update_ssa_only_virtuals; -- 2.30.2