https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97521
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot
gnu.org
Status|NEW |ASSIGNED
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jakub Jelinek from comment #3)
> And we do that because:
> case VECTOR_CST:
> {
> tree tmp = NULL_TREE;
> if (VECTOR_MODE_P (mode))
> return const_vector_from_tree (exp);
> scalar_int_mode int_mode;
> if (is_int_mode (mode, &int_mode))
> {
> if (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (exp)))
> return const_scalar_mask_from_tree (int_mode, exp);
I think const_scalar_mask_from_tree is completely wrong in ignoring the
precision of the VECTOR_BOOLEAN component type. At least it is
inconsistent with the processing of VECTOR_BOOLEAN_TYPE_P CTORs.
Now I can see that this was intended for AVX512 but I can't see how this
"inconsistency" can possibly work if you consider the use of _1:
_19 = BIT_FIELD_REF <_1, 64, 0>;
if you disable TER then how should we ever able to "reinterpret" the
BIT_FIELD_REF to the "narrowed" view of the VECTOR_BOOLEAN_TYPE_P
mask?
A heuristic for an intermediate hack might be to skip
const_scalar_mask_from_tree when the component precision times the
number of elements equals the mode precision of the vector.
Thus the following fixes the testcase
diff --git a/gcc/expr.c b/gcc/expr.c
index 9d951e82522..d87bda777d0 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -10356,7 +10356,10 @@ expand_expr_real_1 (tree exp, rtx target, machine_mode
tmode,
scalar_int_mode int_mode;
if (is_int_mode (mode, &int_mode))
{
- if (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (exp)))
+ if (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (exp))
+ && maybe_ne (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (exp)))
+ * TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp)),
+ GET_MODE_PRECISION (int_mode)))
return const_scalar_mask_from_tree (int_mode, exp);
else
but I have no easy access to a AVX512 runtime system (and no idea how to
make dejagnu use sde for a i386.exp testsuite run). On a AVX2 system
i386.exp is clean with the above.
Thoughts?
[AVX512 should have used VnBImode like SVE does]
> where the VECTOR_CST type is now a vector boolean with DImode element type
> and TImode as the (poor man's) vector mode.
>
> So, the question is how to differentiate between vector booleans that want
> to be a bitmask in an integral mode vs. poor man's vector booleans for which
> we'd want to fallthru into the VIEW_CONVERT_EXPR code below this.
> And what other spots need that.
> Perhaps check if the bitsize (or precision?) of the vector type's mode is
> equal to bitsize (or precision?) of the element mode times number of
> elements in the vector?