https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96466
--- Comment #5 from Martin Liška <marxin at gcc dot gnu.org> --- Looking at the ICE, we actually ICE at the place where a fake comparison is constructed: if (TREE_CODE_CLASS (tcode) != tcc_comparison) { gcc_assert (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (op0))); if (get_vcond_mask_icode (mode, TYPE_MODE (TREE_TYPE (op0))) != CODE_FOR_nothing) return gimple_build_call_internal (IFN_VCOND_MASK, 3, op0, op1, op2); /* Fake op0 < 0. */ else { gcc_assert (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (op0))) == MODE_VECTOR_INT); op0a = op0; op0b = build_zero_cst (TREE_TYPE (op0)); tcode = LT_EXPR; } } So we have: (gdb) p debug_tree(op0a) <ssa_name 0x7ffff74815e8 type <vector_type 0x7ffff743b1f8 type <boolean_type 0x7ffff743bf18 public DI size <integer_cst 0x7ffff75d4d98 constant 64> unit-size <integer_cst 0x7ffff75d4db0 constant 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff743bf18 precision:64 min <integer_cst 0x7ffff73da090 -9223372036854775808> max <integer_cst 0x7ffff7448d20 9223372036854775807>> BLK size <integer_cst 0x7ffff75d4d98 64> unit-size <integer_cst 0x7ffff75d4db0 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff743b1f8 nunits:1> visited def_stmt _4 = { 0 }; version:4> $4 = void (gdb) p debug_tree(op0b) <vector_cst 0x7ffff74892a0 type <vector_type 0x7ffff743b1f8 type <boolean_type 0x7ffff743bf18 public DI size <integer_cst 0x7ffff75d4d98 constant 64> unit-size <integer_cst 0x7ffff75d4db0 constant 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff743bf18 precision:64 min <integer_cst 0x7ffff73da090 -9223372036854775808> max <integer_cst 0x7ffff7448d20 9223372036854775807>> BLK size <integer_cst 0x7ffff75d4d98 64> unit-size <integer_cst 0x7ffff75d4db0 8> align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7ffff743b1f8 nunits:1> constant npatterns:1 nelts-per-pattern:1 elt:0: <integer_cst 0x7ffff7489258 type <boolean_type 0x7ffff743bf18> constant 0>> $5 = void (gdb) p tcode $7 = LT_EXPR but the modes do not match: (gdb) p mode $1 = E_DImode (gdb) p cmp_op_mode $2 = E_BLKmode and so we ICE here: gcc_assert (known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (cmp_op_mode)) && known_eq (GET_MODE_NUNITS (mode), GET_MODE_NUNITS (cmp_op_mode))); So what to do about it?