[PATCH] D30962: [GlobalISel] Translate shufflevector
Volkan Keles via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 21 00:52:33 PDT 2017
volkan added a comment.
In https://reviews.llvm.org/D30962#705203, @dsanders wrote:
> In https://reviews.llvm.org/D30962#704916, @ab wrote:
>
> > We don't need to do this now, but should we encode the mask in the G_SHUFFLE_VECTOR itself? Either as multiple Imm MOs, or a single new 'VectorMask' operand of some sort?
>
>
> I think we should probably stick with a single operand to represent the mask since some targets can use vector registers to specify the shuffle mask (e.g. VSHF.df on Mips), but I do agree that a single operand containing a whole constant mask would be nicer to match than the current G_MERGE_VALUES of G_CONSTANTS since there's lots of ways of writing the same constant right now. For example:
I agree, a single operand would be better. In this way, we can simplify constant vectors as well and this problem would be fixed automatically as the mask is a constant vector.
> (G_MERGE_VALUES (G_CONSTANT i32 0), (G_CONSTANT i32 1), (G_CONSTANT i32 2), (G_CONSTANT i32 3))
>
> and:
>
> (G_MERGE_VALUES (G_MERGE_VALUES (G_CONSTANT i32 0), (G_CONSTANT i32 1)), (G_MERGE_VALUES (G_CONSTANT i32 2), (G_CONSTANT i32 3)))
>
> are the same. The snag is that we would need to limit any flattening to the supportable masks (or be able to revert the transformation).
>
> While I'm thinking about legalizing shuffles, it would be nice in some ways if LegalizeAction were an object so we could write something like:
>
> extern bool isReversedElements(const MachineOperand &);
> extern bool isInterleavedElements(const MachineOperand &);
>
> for (const auto &Ty : {v2s64, v4s32, v8s16, v16s8}) {
> setAction({G_SHUFFLE_VECTOR, Ty}, ContentSensitiveLegalizer(/* Default case */ Lower));
> auto &Legalizer = getAction({G_SHUFFLE_VECTOR, Ty});
> if (hasFoo()) {
> Legalizer.addCase(isReversedElements(), Legal);
> Legalizer.addCase(isInterleavedElements(), Legal);
> }
> if (hasBar()) {
> Legalizer.addCase([](const MachineOperand &Op) { ... each 4-elements sub-sequence only shuffles within itself ... }, Legal);
> // Register-based shuffles handle everything.
> Legalizer.setDefaultCase(Legal);
> }
> }
>
> We can achieve the same effect with Custom but it seems nice to keep the high-level conditions together in AArch64LegalizerInfo::AArch64LegalizerInfo() instead of distributing them across various callbacks and re-checking them for every MachineInstr.
https://reviews.llvm.org/D30962
More information about the llvm-commits
mailing list