[v6,03/11] Make BIT_FIELD_REF CONSTRUCTOR pattern more robust

Message ID 20251206165518.5449-4-chris.bazley@arm.com
State Superseded
Headers
Series Extend BB SLP vectorization to use predicated tails |

Commit Message

Christopher Bazley Dec. 6, 2025, 4:55 p.m. UTC
  e7301f5fcbfa6 required the sizes and offsets of a
BIT_FIELD_REF to be poly_uint64s rather than uhwis.

When support for predicated vector tails with BB SLP
is enabled, GIMPLE will sometimes contain statements
such as:

float _246;
vector([4,4]) float _251;
_251 =
{ _234, _236, _238, _84 }

;
246 = BIT_FIELD_REF <_251, 32, POLY_INT_CST [96, 128]>

Update an existing pattern named 'Simplify vector extracts'
to guard against invalid invocations of tree_to_uhwi
in such circumstances (by checking beforehand with
tree_fits_uhwi_p).

gcc/ChangeLog:

	* match.pd: Require the offset and size parameters of
	a BIT_FIELD_REF to fit type unsigned HOST_WIDE_INT
	before attempting to convert them.

---
 gcc/match.pd | 2 ++
 1 file changed, 2 insertions(+)
  

Patch

diff --git a/gcc/match.pd b/gcc/match.pd
index f164ec59100..db7f4374bbf 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -9969,6 +9969,8 @@  DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
  (BIT_FIELD_REF CONSTRUCTOR@0 @1 @2)
  (if (VECTOR_TYPE_P (TREE_TYPE (@0))
       && tree_fits_uhwi_p (TYPE_SIZE (type))
+      && tree_fits_uhwi_p (@1)
+      && tree_fits_uhwi_p (@2)
       && ((tree_to_uhwi (TYPE_SIZE (type))
 	   == tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (@0)))))
           || (VECTOR_TYPE_P (type)