@@ -1,5 +1,21 @@
2010-10-20 Sebastian Pop <sebastian.pop@amd.com>
+ * tree-if-conv.c (struct ifc_dr): Removed.
+ (IFC_DR): Removed.
+ (DR_WRITTEN_AT_LEAST_ONCE): Removed.
+ (DR_RW_UNCONDITIONALLY): Removed.
+ (memrefs_read_or_written_unconditionally): Removed.
+ (write_memrefs_written_at_least_once): Removed.
+ (ifcvt_memrefs_wont_trap): Removed.
+ (ifcvt_could_trap_p): Does not take refs parameter anymore.
+ (if_convertible_gimple_assign_stmt_p): Same.
+ (if_convertible_stmt_p): Same.
+ (if_convertible_loop_p_1): Remove initialization of dr->aux,
+ DR_WRITTEN_AT_LEAST_ONCE, and DR_RW_UNCONDITIONALLY.
+ (if_convertible_loop_p): Remove deallocation of the same.
+
+2010-10-20 Sebastian Pop <sebastian.pop@amd.com>
+
* Makefile.in (OBJS-common): Add tree-loop-flattening.o.
(tree-loop-flattening.o): New.
* common.opt (ftree-loop-flatten): New.
@@ -446,168 +446,14 @@ if_convertible_phi_p (struct loop *loop, basic_block bb, gimple phi)
return true;
}
-/* Records the status of a data reference. This struct is attached to
- each DR->aux field. */
-
-struct ifc_dr {
- /* -1 when not initialized, 0 when false, 1 when true. */
- int written_at_least_once;
-
- /* -1 when not initialized, 0 when false, 1 when true. */
- int rw_unconditionally;
-};
-
-#define IFC_DR(DR) ((struct ifc_dr *) (DR)->aux)
-#define DR_WRITTEN_AT_LEAST_ONCE(DR) (IFC_DR (DR)->written_at_least_once)
-#define DR_RW_UNCONDITIONALLY(DR) (IFC_DR (DR)->rw_unconditionally)
-
-/* Returns true when the memory references of STMT are read or written
- unconditionally. In other words, this function returns true when
- for every data reference A in STMT there exist other accesses to
- the same data reference with predicates that add up (OR-up) to the
- true predicate: this ensures that the data reference A is touched
- (read or written) on every iteration of the if-converted loop. */
-
-static bool
-memrefs_read_or_written_unconditionally (gimple stmt,
- VEC (data_reference_p, heap) *drs)
-{
- int i, j;
- data_reference_p a, b;
- tree ca = bb_predicate (gimple_bb (stmt));
-
- for (i = 0; VEC_iterate (data_reference_p, drs, i, a); i++)
- if (DR_STMT (a) == stmt)
- {
- bool found = false;
- int x = DR_RW_UNCONDITIONALLY (a);
-
- if (x == 0)
- return false;
-
- if (x == 1)
- continue;
-
- for (j = 0; VEC_iterate (data_reference_p, drs, j, b); j++)
- if (DR_STMT (b) != stmt
- && same_data_refs (a, b))
- {
- tree cb = bb_predicate (gimple_bb (DR_STMT (b)));
-
- if (DR_RW_UNCONDITIONALLY (b) == 1
- || is_true_predicate (cb)
- || is_true_predicate (ca = fold_or_predicates (EXPR_LOCATION (cb),
- ca, cb)))
- {
- DR_RW_UNCONDITIONALLY (a) = 1;
- DR_RW_UNCONDITIONALLY (b) = 1;
- found = true;
- break;
- }
- }
-
- if (!found)
- {
- DR_RW_UNCONDITIONALLY (a) = 0;
- return false;
- }
- }
-
- return true;
-}
-
-/* Returns true when the memory references of STMT are unconditionally
- written. In other words, this function returns true when for every
- data reference A written in STMT, there exist other writes to the
- same data reference with predicates that add up (OR-up) to the true
- predicate: this ensures that the data reference A is written on
- every iteration of the if-converted loop. */
-
-static bool
-write_memrefs_written_at_least_once (gimple stmt,
- VEC (data_reference_p, heap) *drs)
-{
- int i, j;
- data_reference_p a, b;
- tree ca = bb_predicate (gimple_bb (stmt));
-
- for (i = 0; VEC_iterate (data_reference_p, drs, i, a); i++)
- if (DR_STMT (a) == stmt
- && DR_IS_WRITE (a))
- {
- bool found = false;
- int x = DR_WRITTEN_AT_LEAST_ONCE (a);
-
- if (x == 0)
- return false;
-
- if (x == 1)
- continue;
-
- for (j = 0; VEC_iterate (data_reference_p, drs, j, b); j++)
- if (DR_STMT (b) != stmt
- && DR_IS_WRITE (b)
- && same_data_refs_base_objects (a, b))
- {
- tree cb = bb_predicate (gimple_bb (DR_STMT (b)));
-
- if (DR_WRITTEN_AT_LEAST_ONCE (b) == 1
- || is_true_predicate (cb)
- || is_true_predicate (ca = fold_or_predicates (EXPR_LOCATION (cb),
- ca, cb)))
- {
- DR_WRITTEN_AT_LEAST_ONCE (a) = 1;
- DR_WRITTEN_AT_LEAST_ONCE (b) = 1;
- found = true;
- break;
- }
- }
-
- if (!found)
- {
- DR_WRITTEN_AT_LEAST_ONCE (a) = 0;
- return false;
- }
- }
-
- return true;
-}
-
-/* Return true when the memory references of STMT won't trap in the
- if-converted code. There are two things that we have to check for:
-
- - writes to memory occur to writable memory: if-conversion of
- memory writes transforms the conditional memory writes into
- unconditional writes, i.e. "if (cond) A[i] = foo" is transformed
- into "A[i] = cond ? foo : A[i]", and as the write to memory may not
- be executed at all in the original code, it may be a readonly
- memory. To check that A is not const-qualified, we check that
- there exists at least an unconditional write to A in the current
- function.
-
- - reads or writes to memory are valid memory accesses for every
- iteration. To check that the memory accesses are correctly formed
- and that we are allowed to read and write in these locations, we
- check that the memory accesses to be if-converted occur at every
- iteration unconditionally. */
-
-static bool
-ifcvt_memrefs_wont_trap (gimple stmt, VEC (data_reference_p, heap) *refs)
-{
- return write_memrefs_written_at_least_once (stmt, refs)
- && memrefs_read_or_written_unconditionally (stmt, refs);
-}
-
/* Wrapper around gimple_could_trap_p refined for the needs of the
- if-conversion. Try to prove that the memory accesses of STMT could
- not trap in the innermost loop containing STMT. */
+ if-conversion. */
static bool
-ifcvt_could_trap_p (gimple stmt, VEC (data_reference_p, heap) *refs)
+ifcvt_could_trap_p (gimple stmt)
{
if (gimple_vuse (stmt)
- && !gimple_could_trap_p_1 (stmt, false, false)
- && ifcvt_memrefs_wont_trap (stmt, refs))
+ && !gimple_could_trap_p_1 (stmt, false, false))
return false;
return gimple_could_trap_p (stmt);
@@ -621,8 +467,7 @@ ifcvt_could_trap_p (gimple stmt, VEC (data_reference_p, heap) *refs)
- LHS is not var decl. */
static bool
-if_convertible_gimple_assign_stmt_p (gimple stmt,
- VEC (data_reference_p, heap) *refs)
+if_convertible_gimple_assign_stmt_p (gimple stmt)
{
tree lhs = gimple_assign_lhs (stmt);
basic_block bb;
@@ -650,7 +495,7 @@ if_convertible_gimple_assign_stmt_p (gimple stmt,
if (flag_tree_loop_if_convert_stores)
{
- if (ifcvt_could_trap_p (stmt, refs))
+ if (ifcvt_could_trap_p (stmt))
{
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "tree could trap...\n");
@@ -690,7 +535,7 @@ if_convertible_gimple_assign_stmt_p (gimple stmt,
- it is a GIMPLE_LABEL or a GIMPLE_COND. */
static bool
-if_convertible_stmt_p (gimple stmt, VEC (data_reference_p, heap) *refs)
+if_convertible_stmt_p (gimple stmt)
{
switch (gimple_code (stmt))
{
@@ -700,7 +545,7 @@ if_convertible_stmt_p (gimple stmt, VEC (data_reference_p, heap) *refs)
return true;
case GIMPLE_ASSIGN:
- return if_convertible_gimple_assign_stmt_p (stmt, refs);
+ return if_convertible_gimple_assign_stmt_p (stmt);
default:
/* Don't know what to do with 'em so don't do anything. */
@@ -1016,18 +861,6 @@ if_convertible_loop_p_1 (struct loop *loop,
if (!res)
return false;
- if (flag_tree_loop_if_convert_stores)
- {
- data_reference_p dr;
-
- for (i = 0; VEC_iterate (data_reference_p, *refs, i, dr); i++)
- {
- dr->aux = XNEW (struct ifc_dr);
- DR_WRITTEN_AT_LEAST_ONCE (dr) = -1;
- DR_RW_UNCONDITIONALLY (dr) = -1;
- }
- }
-
for (i = 0; i < loop->num_nodes; i++)
{
basic_block bb = ifc_bbs[i];
@@ -1040,7 +873,7 @@ if_convertible_loop_p_1 (struct loop *loop,
/* Check the if-convertibility of statements in predicated BBs. */
if (is_predicated (bb))
for (itr = gsi_start_bb (bb); !gsi_end_p (itr); gsi_next (&itr))
- if (!if_convertible_stmt_p (gsi_stmt (itr), *refs))
+ if (!if_convertible_stmt_p (gsi_stmt (itr)))
return false;
}
@@ -1101,15 +934,6 @@ if_convertible_loop_p (struct loop *loop)
ddrs = VEC_alloc (ddr_p, heap, 25);
res = if_convertible_loop_p_1 (loop, &refs, &ddrs);
- if (flag_tree_loop_if_convert_stores)
- {
- data_reference_p dr;
- unsigned int i;
-
- for (i = 0; VEC_iterate (data_reference_p, refs, i, dr); i++)
- free (dr->aux);
- }
-
free_data_refs (refs);
free_dependence_relations (ddrs);
return res;