aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog17
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ifc-pr68583.c23
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-72.c3
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-cselim-2.c3
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-strided-store-a-u8-i2.c2
-rw-r--r--gcc/tree-if-conv.c47
7 files changed, 68 insertions, 35 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 82607d1..3da8d1b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,20 @@
+2015-12-09 Richard Biener <rguenther@suse.de>
+
+ 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 <tom@codesourcery.com>
PR tree-optimization/68716
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d5226ef..687e2b2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,13 @@
2015-12-09 Richard Biener <rguenther@suse.de>
+ 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 <rguenther@suse.de>
+
PR tree-optimization/68417
* gcc.dg/vect/pr68417.c: New testcase.
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 0000000..be89e08
--- /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 4c0a973..9c9be8e 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 d572283..95efe7a 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 <stdarg.h>
#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 17169bd..6be939e 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 c859695..637fa22 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<data_reference_p> 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;