I'm getting an ICE on 64-bit sparc for some vector test cases but
I'm not sure where the fix belongs.

When the compiler expands a vecor shift by scalar into a vector
shift by a vector it uses expand_vector_broadcast(), which has
a comment which states:

"The mode of OP must be the element mode of VMODE."

But no such guarentee exists, and during the compilation of
gcc.dg/vect/pr33953.c we end up trying to expand a broadcast where the
vector mode is V2SI and the scalar object is of type DImode.

The tree node for the shift count that gets expanded by
expand_normal() into this DImode rtx looks like:

 <ssa_name 0xf7269800
    type <integer_type 0xf71e63c0 int public SI
        size <integer_cst 0xf71ce960 constant 32>
        unit size <integer_cst 0xf71ce980 constant 4>
        align 32 symtab 0 alias set 2 canonical type 0xf71e63c0 precision 32 
min <integer_cst 0xf71ce90\
0 -2147483648> max <integer_cst 0xf71ce920 2147483647>
        pointer_to_this <pointer_type 0xf71e6ae0>>
    visited var <parm_decl 0xf7270210 srcshift>def_stmt GIMPLE_NOP

    version 12>

Anyways, in the sparc backend I made use of the invariant
expand_vector_broadcast() mentions, and assumed that the vector
inner mode equals the mode of the RTX object being broadcast.

This results in a crash because I end up making a emit_move_insn()
call where the modes don't match up.

So should expand_vector_broadcast() really provide this invariant to
the vec_init expander, or does the vec_init expander need to tidy
things up with gen_lowpart() etc. calls?

Reply via email to