summaryrefslogtreecommitdiff
path: root/gcc/gimple.c
diff options
context:
space:
mode:
authorSebastian Pop <sebastian.pop@amd.com>2010-08-24 23:35:56 +0000
committerSebastian Pop <spop@gcc.gnu.org>2010-08-24 23:35:56 +0000
commite1fd038a0c859f7f669370f06f0516e4bd5307b9 (patch)
tree82b29bdf050426fdf9c44df1c3fd18a14cf5b09d /gcc/gimple.c
parentbd544141e09187ded0b02cac4ee5ce56ca38622c (diff)
downloadgcc-e1fd038a0c859f7f669370f06f0516e4bd5307b9.tar.gz
Do not check whether memory references accessed in every iteration trap.
This patch relaxes the checks from gimple_could_trap_p in order to allow the flag_loop_if_convert_stores to if-convert more loops in which it is possible to prove that: - the accesses to an array in a loop do not trap (more than the original non-if-converted loop). This is true when the memory accesses are executed at every iteration of the if-converted loop. - the writes to memory occur on arrays that are not const qualified. This is true when there exists at least one unconditional write to the array in the analyzed program. In this patch this analysis is limited to the loop to be if-converted. * gimple.c (gimple_could_trap_p_1): Not static anymore. Pass an extra bool parameter include_mem. (gimple_could_trap_p): Adjust call to gimple_could_trap_p_1. (gimple_assign_rhs_could_trap_p): Same. * gimple.h (gimple_could_trap_p_1): Declared. * tree-data-ref.h (same_data_refs_base_objects): New. (same_data_refs): New. * tree-if-conv.c (memrefs_read_or_written_unconditionally): New. (write_memrefs_written_at_least_once): New. (ifcvt_memrefs_wont_trap): New. (operations_could_trap): New. (ifcvt_could_trap_p): New. (if_convertible_gimple_assign_stmt_p): Call ifcvt_could_trap_p. Gets a vector of data refs. (if_convertible_stmt_p): Same. (if_convertible_loop_p_1): New. (if_convertible_loop_p): Call if_convertible_loop_p_1. * gcc.dg/tree-ssa/ifc-5.c: New. From-SVN: r163531
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r--gcc/gimple.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/gcc/gimple.c b/gcc/gimple.c
index 64d338ccfac..9d5c61bcecf 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -2399,24 +2399,25 @@ gimple_rhs_has_side_effects (const_gimple s)
return false;
}
-
/* Helper for gimple_could_trap_p and gimple_assign_rhs_could_trap_p.
- Return true if S can trap. If INCLUDE_LHS is true and S is a
- GIMPLE_ASSIGN, the LHS of the assignment is also checked.
- Otherwise, only the RHS of the assignment is checked. */
+ Return true if S can trap. When INCLUDE_MEM is true, check whether
+ the memory operations could trap. When INCLUDE_STORES is true and
+ S is a GIMPLE_ASSIGN, the LHS of the assignment is also checked. */
-static bool
-gimple_could_trap_p_1 (gimple s, bool include_lhs)
+bool
+gimple_could_trap_p_1 (gimple s, bool include_mem, bool include_stores)
{
- unsigned i, start;
tree t, div = NULL_TREE;
enum tree_code op;
- start = (is_gimple_assign (s) && !include_lhs) ? 1 : 0;
+ if (include_mem)
+ {
+ unsigned i, start = (is_gimple_assign (s) && !include_stores) ? 1 : 0;
- for (i = start; i < gimple_num_ops (s); i++)
- if (tree_could_trap_p (gimple_op (s, i)))
- return true;
+ for (i = start; i < gimple_num_ops (s); i++)
+ if (tree_could_trap_p (gimple_op (s, i)))
+ return true;
+ }
switch (gimple_code (s))
{
@@ -2445,26 +2446,23 @@ gimple_could_trap_p_1 (gimple s, bool include_lhs)
}
return false;
-
}
-
/* Return true if statement S can trap. */
bool
gimple_could_trap_p (gimple s)
{
- return gimple_could_trap_p_1 (s, true);
+ return gimple_could_trap_p_1 (s, true, true);
}
-
/* Return true if RHS of a GIMPLE_ASSIGN S can trap. */
bool
gimple_assign_rhs_could_trap_p (gimple s)
{
gcc_assert (is_gimple_assign (s));
- return gimple_could_trap_p_1 (s, false);
+ return gimple_could_trap_p_1 (s, true, false);
}