This is a minimal follow-on patch to:
http://reviews.llvm.org/D7093
That patch canonicalized constant splats as build_vectors, and this patch just removes the constant check so we can canonicalize all splats as build_vectors.
This fixes the 2nd test case in PR22283 ( http://llvm.org/bugs/show_bug.cgi?id=22283 ).
The unfortunate code duplication between SelectionDAG and DAGCombiner is discussed in the earlier patch. At least this patch is just removing code...
This improves an existing x86 AVX test and changes codegen in an ARM test. I don't know enough about ARM implementations to know if the new codegen is an improvement or not.
For the changed ARM tests, we currently generate something like this:
ldrsh r12, [sp] <--- load scalar vmov d17, r2, r3 vmov d16, r0, r1 vmov s0, r12 vcvt.f32.s32 s0, s0 vdup.32 q9, d0[0] <--- splat register value vsub.f32 q8, q9, q8 vmov r0, r1, d16 vmov r2, r3, d17 mov pc, lr
With this patch, we'll generate a 'vld1' to splat instead:
mov r12, sp vmov d19, r2, r3 vld1.16 {d16[]}, [r12:16] <--- load and splat vmov d18, r0, r1 vmovl.s16 q8, d16 vcvt.f32.s32 q8, q8 vsub.f32 q8, q8, q9 vmov r0, r1, d16 vmov r2, r3, d17 mov pc, lr