This improves the situation somewhat when vector lowering tries
to access vector bools as seen in PR96814.
We still fail to fold VIEW_CONVERT<int> { 0, -1, -1, ... } for
vector bools with integer mode.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
2020-09-03 Richard Biener <[email protected]>
* tree-vect-generic.c (tree_vec_extract): Remove odd
special-casing of boolean vectors.
* fold-const.c (fold_ternary_loc): Handle boolean vector
type BIT_FIELD_REFs.
---
gcc/fold-const.c | 4 +++-
gcc/tree-vect-generic.c | 14 +-------------
2 files changed, 4 insertions(+), 14 deletions(-)
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 1f861630225..0cc80adf632 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -12581,7 +12581,9 @@ fold_ternary_loc (location_t loc, enum tree_code code,
tree type,
&& tree_fits_uhwi_p (op2))
{
tree eltype = TREE_TYPE (TREE_TYPE (arg0));
- unsigned HOST_WIDE_INT width = tree_to_uhwi (TYPE_SIZE (eltype));
+ unsigned HOST_WIDE_INT width
+ = (TREE_CODE (eltype) == BOOLEAN_TYPE
+ ? TYPE_PRECISION (eltype) : tree_to_uhwi (TYPE_SIZE (eltype)));
unsigned HOST_WIDE_INT n = tree_to_uhwi (arg1);
unsigned HOST_WIDE_INT idx = tree_to_uhwi (op2);
diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
index 6d5d65195ae..d7bafa77134 100644
--- a/gcc/tree-vect-generic.c
+++ b/gcc/tree-vect-generic.c
@@ -136,19 +136,7 @@ tree_vec_extract (gimple_stmt_iterator *gsi, tree type,
t = gimple_assign_rhs1 (def_stmt);
}
if (bitpos)
- {
- if (TREE_CODE (type) == BOOLEAN_TYPE)
- {
- tree itype
- = build_nonstandard_integer_type (tree_to_uhwi (bitsize), 0);
- tree field = gimplify_build3 (gsi, BIT_FIELD_REF, itype, t,
- bitsize, bitpos);
- return gimplify_build2 (gsi, NE_EXPR, type, field,
- build_zero_cst (itype));
- }
- else
- return gimplify_build3 (gsi, BIT_FIELD_REF, type, t, bitsize, bitpos);
- }
+ return gimplify_build3 (gsi, BIT_FIELD_REF, type, t, bitsize, bitpos);
else
return gimplify_build1 (gsi, VIEW_CONVERT_EXPR, type, t);
}
--
2.26.2