https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96466
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |rsandifo at gcc dot gnu.org
--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
So there's some weird stuff going along here. We end up with a BLKmode
vector<bool> because build_truth_vector_type_for is called with a
vector<long> which has DImode (rather than V1DImode - that's stor-layouts
fallback). And build_truth_vector_type_for does
static tree
build_truth_vector_type_for (tree vectype)
{
machine_mode vector_mode = TYPE_MODE (vectype);
poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype);
machine_mode mask_mode;
if (VECTOR_MODE_P (vector_mode)
&& targetm.vectorize.get_mask_mode (vector_mode).exists (&mask_mode))
return build_truth_vector_type_for_mode (nunits, mask_mode);
poly_uint64 vsize = tree_to_poly_uint64 (TYPE_SIZE (vectype));
unsigned HOST_WIDE_INT esize = vector_element_size (vsize, nunits);
tree bool_type = build_nonstandard_boolean_type (esize);
return make_vector_type (bool_type, nunits, BLKmode);
}
where I wonder why we do not use VOIDmode so that layout_type can make
an appropriate choice. If we do that then we ICE later
during RTL pass: expand
t.i: In function 'foo':
t.i:10:10: internal compiler error: in int_mode_for_mode, at stor-layout.c:404
10 | v &= x >= v;
| ~~^~~~
0x1270a2c int_mode_for_mode(machine_mode)
../../src/trunk/gcc/stor-layout.c:404
0xd94340 emit_move_via_integer
../../src/trunk/gcc/expr.c:3425
0xd9548d emit_move_insn_1(rtx_def*, rtx_def*)
../../src/trunk/gcc/expr.c:3793
0xd95dc5 emit_move_insn(rtx_def*, rtx_def*)
../../src/trunk/gcc/expr.c:3935
0xd65f48 force_reg(machine_mode, rtx_def*)
../../src/trunk/gcc/explow.c:657
0xf2384e expand_vect_cond_mask_optab_fn
../../src/trunk/gcc/internal-fn.c:2647
0xf27b82 expand_VCOND_MASK
../../src/trunk/gcc/internal-fn.def:146
because of the CONST_INT (DImode...) args with VOIDmode to force_reg in
expand_vect_cond_mask_optab_fn:
2642 mask = expand_normal (op0);
2643 rtx_op1 = expand_normal (op1);
2644 rtx_op2 = expand_normal (op2);
2645
2646 mask = force_reg (mask_mode, mask);
2647 rtx_op1 = force_reg (GET_MODE (rtx_op1), rtx_op1);
(gdb) p debug_rtx (rtx_op1)
(const_int -1 [0xffffffffffffffff])
simply using 'mode' here works and we expand the testcase to
bar:
.LFB0:
.cfi_startproc
fmov d1, x0
cmhs d1, d1, d0
and v0.8b, v1.8b, v0.8b
ret
.cfi_endproc
.LFE0:
.size bar, .-bar
.align 2
.global foo
.type foo, %function
foo:
.LFB1:
.cfi_startproc
fmov d0, xzr
ret