return false;
tree op0 = TREE_OPERAND (ref, 0);
- if (TREE_CODE (op0) == VIEW_CONVERT_EXPR && DECL_P (TREE_OPERAND (op0, 0))
+ if (TREE_CODE (op0) == VIEW_CONVERT_EXPR
+ && DECL_P (TREE_OPERAND (op0, 0))
&& VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
- && TYPE_MODE (TREE_TYPE (ref))
- == TYPE_MODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0)))))
+ && (TYPE_MODE (TREE_TYPE (ref))
+ == TYPE_MODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0))))))
{
tree pos = TREE_OPERAND (ref, 1);
if (poly_int_tree_p (idx, &idx_poly))
{
poly_uint64 nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (view_op0));
- if (known_gt (idx_poly, nelts))
+ if (known_ge (idx_poly, nelts))
return false;
}
+ else if (poly_int_tree_p (idx))
+ // if idx doesn't fit into poly_uint64, but is constant, it
+ // must be out of bounds
+ return false;
machine_mode outermode = TYPE_MODE (TREE_TYPE (view_op0));
machine_mode extract_mode = TYPE_MODE (TREE_TYPE (ref));