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?

Reply via email to