re PR tree-optimization/68583 (Missed if-conversion)
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. * 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
This commit is contained in:
parent
030809830a
commit
e56c602ea3
|
@ -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
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
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
|
||||
|
|
|
@ -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" } } */
|
|
@ -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++)
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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++)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue