diff options
author | Richard Guenther <rguenther@suse.de> | 2011-04-03 08:30:53 +0000 |
---|---|---|
committer | Ira Rosen <ira.rosen@linaro.org> | 2011-04-03 08:30:53 +0000 |
commit | 6d8539fb02a400ab89a13887bb5803c607daf178 (patch) | |
tree | dcf06097c9c6142a7a4038eef56cba845bc7f087 /gcc/tree-if-conv.c | |
parent | effe7c1874d54288146341a0c722a38de191cd19 (diff) |
* tree-if-conv.c (memrefs_read_or_written_unconditionally): Strip all
non-variable offsets and compare the remaining bases of the two
accesses instead of looking for exact same data-ref.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@171900 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-if-conv.c')
-rw-r--r-- | gcc/tree-if-conv.c | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index d70e2321c15..7ca6deec123 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -464,8 +464,8 @@ struct ifc_dr { /* 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 + a data reference with the same base 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 @@ -489,21 +489,38 @@ memrefs_read_or_written_unconditionally (gimple stmt, 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))); + { + tree ref_base_a = DR_REF (a); + tree ref_base_b = DR_REF (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 (DR_STMT (b) == stmt) + continue; + + while (TREE_CODE (ref_base_a) == COMPONENT_REF + || TREE_CODE (ref_base_a) == IMAGPART_EXPR + || TREE_CODE (ref_base_a) == REALPART_EXPR) + ref_base_a = TREE_OPERAND (ref_base_a, 0); + + while (TREE_CODE (ref_base_b) == COMPONENT_REF + || TREE_CODE (ref_base_b) == IMAGPART_EXPR + || TREE_CODE (ref_base_b) == REALPART_EXPR) + ref_base_b = TREE_OPERAND (ref_base_b, 0); + + if (!operand_equal_p (ref_base_a, ref_base_b, 0)) + { + 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) |