diff options
author | Richard Biener <rguenther@suse.de> | 2021-01-14 14:08:41 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-01-14 16:14:01 +0100 |
commit | 2182274f510c180ea92a4f826a0f6cf5f1f55b66 (patch) | |
tree | 9f4b751f8f09cefcbaea037fc522ef5f1fedd89d /gcc/tree-data-ref.c | |
parent | a512079ef40e442c1269ea1cc55f18790ba68449 (diff) | |
download | gcc-2182274f510c180ea92a4f826a0f6cf5f1f55b66.zip gcc-2182274f510c180ea92a4f826a0f6cf5f1f55b66.tar.gz gcc-2182274f510c180ea92a4f826a0f6cf5f1f55b66.tar.bz2 |
tree-optimization/98674 - improve dependence analysis
This improves dependence analysis on refs that access the same
array but with different typed but same sized accesses. That's
obviously safe for the case of types that cannot have any
access function based off them. For the testcase this is
signed short vs. unsigned short.
2021-01-14 Richard Biener <rguenther@suse.de>
PR tree-optimization/98674
* tree-data-ref.c (base_supports_access_fn_components_p): New.
(initialize_data_dependence_relation): For two bases without
possible access fns resort to type size equality when determining
shape compatibility.
* gcc.dg/vect/pr98674.c: New testcase.
Diffstat (limited to 'gcc/tree-data-ref.c')
-rw-r--r-- | gcc/tree-data-ref.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 394470a..65fe6d5 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -1291,6 +1291,23 @@ access_fn_component_p (tree op) } } +/* Returns whether BASE can have a access_fn_component_p with BASE + as base. */ + +static bool +base_supports_access_fn_components_p (tree base) +{ + switch (TREE_CODE (TREE_TYPE (base))) + { + case COMPLEX_TYPE: + case ARRAY_TYPE: + case RECORD_TYPE: + return true; + default: + return false; + } +} + /* Determines the base object and the list of indices of memory reference DR, analyzed in LOOP and instantiated before NEST. */ @@ -3272,8 +3289,13 @@ initialize_data_dependence_relation (struct data_reference *a, && full_seq.start_b + full_seq.length == num_dimensions_b && DR_UNCONSTRAINED_BASE (a) == DR_UNCONSTRAINED_BASE (b) && operand_equal_p (base_a, base_b, OEP_ADDRESS_OF) - && types_compatible_p (TREE_TYPE (base_a), - TREE_TYPE (base_b)) + && (types_compatible_p (TREE_TYPE (base_a), + TREE_TYPE (base_b)) + || (!base_supports_access_fn_components_p (base_a) + && !base_supports_access_fn_components_p (base_b) + && operand_equal_p + (TYPE_SIZE (TREE_TYPE (base_a)), + TYPE_SIZE (TREE_TYPE (base_b)), 0))) && (!loop_nest.exists () || (object_address_invariant_in_loop_p (loop_nest[0], base_a)))); |