The pattern added here is intended as a last resort for targets like
SPIR-V where there are vector size restrictions and we need to be able
to break down large vector types. Vectorizing loads/stores for small
bitwidths (e.g. i8) relies on bitcasting to a larger element type and
patterns to bubble bitcast ops to where they can cancel.
This fails for cases such as
%1 = arith.trunci %0 : vector<2x32xi32> to vector<2x32xi8> vector.transfer_write %1, %destination[%c0, %c0] {in_bounds = [true, true]} : vector<2x32xi8>, memref<2x32xi8>
where the arith.trunci op essentially does the job of one of the
bitcasts, leading to a bitcast that need to be further broken down
vector.bitcast %0 : vector<16xi8> to vector<4xi32>
nit: Location loc and Type elemType