aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-data-ref.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-12-04 11:13:48 +0100
committerRichard Biener <rguenther@suse.de>2020-12-07 08:15:15 +0100
commit7b4ea2827d2003c8ffc76cd478f8974360cbd78f (patch)
tree31ea9a8ce51a8fef5e4214c627c118778a5a1546 /gcc/tree-data-ref.c
parent0e49145550fe1284dc56e8e02ba1720c4f737a74 (diff)
downloadgcc-7b4ea2827d2003c8ffc76cd478f8974360cbd78f.zip
gcc-7b4ea2827d2003c8ffc76cd478f8974360cbd78f.tar.gz
gcc-7b4ea2827d2003c8ffc76cd478f8974360cbd78f.tar.bz2
tree-optimization/98137 - enhance split_constant_offset range handling
split_constant_offset currently gives up looking at ranges when dealing with possibly wrapping operations for looking through conversions when the downstream analysis does not yield a SSA name. That's overly conservative and we have a nice helper that can deal with arbitrary expresssions. Use that. This helps data reference group analysis so the testcase is fully SLP vectorized, making use of the whole-function "BB" vectorization capabilities we now have. 2020-12-04 Richard Biener <rguenther@suse.de> PR tree-optimization/98137 * tree-data-ref.c (split_constant_offset_1): Use determine_value_range instead of get_range_info to handle arbitrary expressions. * gcc.dg/vect/bb-slp-pr98137.c: New testcase.
Diffstat (limited to 'gcc/tree-data-ref.c')
-rw-r--r--gcc/tree-data-ref.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index 3bf460c..e8308ce 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -763,18 +763,22 @@ split_constant_offset_1 (tree type, tree op0, enum tree_code code, tree op1,
tree tmp_var, tmp_off;
split_constant_offset (op0, &tmp_var, &tmp_off, cache, limit);
- /* See whether we have an SSA_NAME whose range is known
- to be [A, B]. */
- if (TREE_CODE (tmp_var) != SSA_NAME)
- return false;
+ /* See whether we have an known range [A, B] for tmp_var. */
wide_int var_min, var_max;
- value_range_kind vr_type = get_range_info (tmp_var, &var_min,
- &var_max);
- wide_int var_nonzero = get_nonzero_bits (tmp_var);
signop sgn = TYPE_SIGN (itype);
- if (intersect_range_with_nonzero_bits (vr_type, &var_min,
- &var_max, var_nonzero,
- sgn) != VR_RANGE)
+ if (TREE_CODE (tmp_var) == SSA_NAME)
+ {
+ value_range_kind vr_type
+ = get_range_info (tmp_var, &var_min, &var_max);
+ wide_int var_nonzero = get_nonzero_bits (tmp_var);
+ if (intersect_range_with_nonzero_bits (vr_type, &var_min,
+ &var_max,
+ var_nonzero,
+ sgn) != VR_RANGE)
+ return false;
+ }
+ else if (determine_value_range (tmp_var, &var_min, &var_max)
+ != VR_RANGE)
return false;
/* See whether the range of OP0 (i.e. TMP_VAR + TMP_OFF)