This is an archive of the discontinued LLVM Phabricator instance.

[InstCombine] canonicalize cast before unary shuffle
ClosedPublic

Authored by spatel on May 24 2021, 11:51 AM.

Details

Summary

We could go either direction on this transform. VectorCombine already goes this way for bitcasts (and handles more complicated cases using the cost model), so I'm proposing cast-first.

Deferring completely to VectorCombine is another possibility. But the backend should be able to invert this easily when the vectors have the same shape, so it doesn't seem like a transform that we need to avoid.

The motivating example from https://bugs.llvm.org/show_bug.cgi?id=49081 has an int-to-float sandwiched between 2 shuffles, and the backend currently does not reduce that, so on x86, we get something like:

pshufd	$249, %xmm0, %xmm0              ## xmm0 = xmm0[1,2,3,3]
cvtdq2ps	%xmm0, %xmm0
shufps	$144, %xmm0, %xmm0              ## xmm0 = xmm0[0,0,1,2]

...instead of just a single conversion instruction.

Diff Detail

Event Timeline

spatel created this revision.May 24 2021, 11:51 AM
spatel requested review of this revision.May 24 2021, 11:51 AM
Herald added a project: Restricted Project. · View Herald TranscriptMay 24 2021, 11:51 AM
spatel edited the summary of this revision. (Show Details)May 24 2021, 11:52 AM
spatel edited the summary of this revision. (Show Details)May 24 2021, 11:52 AM
lebedev.ri edited the summary of this revision. (Show Details)May 24 2021, 11:54 AM
lebedev.ri accepted this revision.May 24 2021, 12:09 PM

I *think*, shuf last is the right approach.

This revision is now accepted and ready to land.May 24 2021, 12:09 PM

LGTM - maybe add scalable vector test coverage (and a TODO to support them in the future?)

In DAG, we already pass shuffles through binops (both upward and downward), we should probably extend that to unaryops equivalents (although they will have to handle different src/dst types as well)

This revision was landed with ongoing or failed builds.May 25 2021, 5:44 AM
This revision was automatically updated to reflect the committed changes.