From: Richard Biener Date: Fri, 9 Jun 2023 07:29:09 +0000 (+0200) Subject: middle-end/110182 - TYPE_PRECISION on VECTOR_TYPE causes wrong-code X-Git-Tag: basepoints/gcc-15~8493 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3e12669a0eb968cfcbe9242b382fd8020935edf8;p=thirdparty%2Fgcc.git middle-end/110182 - TYPE_PRECISION on VECTOR_TYPE causes wrong-code When folding two conversions in a row we use TYPE_PRECISION but that's invalid for VECTOR_TYPE. The following fixes this by using element_precision instead. * match.pd (two conversions in a row): Use element_precision to DTRT for VECTOR_TYPE. --- diff --git a/gcc/match.pd b/gcc/match.pd index 4ad037d641a9..4072afb474a5 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -4147,19 +4147,19 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) int inside_ptr = POINTER_TYPE_P (inside_type); int inside_float = FLOAT_TYPE_P (inside_type); int inside_vec = VECTOR_TYPE_P (inside_type); - unsigned int inside_prec = TYPE_PRECISION (inside_type); + unsigned int inside_prec = element_precision (inside_type); int inside_unsignedp = TYPE_UNSIGNED (inside_type); int inter_int = INTEGRAL_TYPE_P (inter_type); int inter_ptr = POINTER_TYPE_P (inter_type); int inter_float = FLOAT_TYPE_P (inter_type); int inter_vec = VECTOR_TYPE_P (inter_type); - unsigned int inter_prec = TYPE_PRECISION (inter_type); + unsigned int inter_prec = element_precision (inter_type); int inter_unsignedp = TYPE_UNSIGNED (inter_type); int final_int = INTEGRAL_TYPE_P (type); int final_ptr = POINTER_TYPE_P (type); int final_float = FLOAT_TYPE_P (type); int final_vec = VECTOR_TYPE_P (type); - unsigned int final_prec = TYPE_PRECISION (type); + unsigned int final_prec = element_precision (type); int final_unsignedp = TYPE_UNSIGNED (type); } (switch