diff options
author | Richard Biener <rguenther@suse.de> | 2023-06-23 10:20:45 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2023-06-23 11:22:38 +0200 |
commit | 1fe09b90f856ba27c3e44dda156b28adb5d4d8ea (patch) | |
tree | 0afd3ae3e2fc8eea675a608a45e397b99cef2a10 /gcc | |
parent | 6b32400e19a702137fd11571d199f725add0daf6 (diff) | |
download | gcc-1fe09b90f856ba27c3e44dda156b28adb5d4d8ea.zip gcc-1fe09b90f856ba27c3e44dda156b28adb5d4d8ea.tar.gz gcc-1fe09b90f856ba27c3e44dda156b28adb5d4d8ea.tar.bz2 |
Use element_precision for match.pd arith conversion optimization
The simplification (outertype)((innertype0)a+(innertype1)b) to
((newtype)a+(newtype)b) ends up using TYPE_PRECISION to check
whether it can elide a conversion but in some paths there can
be VECTOR_TYPEs where this instead compares the number of lanes.
The following fixes the missed optimizations and uses
element_precision in those places.
* match.pd ((outertype)((innertype0)a+(innertype1)b)
-> ((newtype)a+(newtype)b)): Use element_precision
where appropriate.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/match.pd | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/gcc/match.pd b/gcc/match.pd index 85d562a..48b76e6 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -7428,9 +7428,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && newtype == type && types_match (newtype, type)) (op (convert:newtype @1) (convert:newtype @2)) - (with { if (TYPE_PRECISION (ty1) > TYPE_PRECISION (newtype)) + (with { if (element_precision (ty1) > element_precision (newtype)) newtype = ty1; - if (TYPE_PRECISION (ty2) > TYPE_PRECISION (newtype)) + if (element_precision (ty2) > element_precision (newtype)) newtype = ty2; } /* Sometimes this transformation is safe (cannot change results through affecting double rounding @@ -7453,9 +7453,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) exponent range for the product or ratio of two values representable in the TYPE to be within the range of normal values of ITYPE. */ - (if (TYPE_PRECISION (newtype) < TYPE_PRECISION (itype) + (if (element_precision (newtype) < element_precision (itype) && (flag_unsafe_math_optimizations - || (TYPE_PRECISION (newtype) == TYPE_PRECISION (type) + || (element_precision (newtype) == element_precision (type) && real_can_shorten_arithmetic (TYPE_MODE (itype), TYPE_MODE (type)) && !excess_precision_type (newtype))) |