Page MenuHomePhabricator

[SelectionDAG] Optimize build_vector of truncates and shifts

Authored by sebastian-ne on Feb 3 2020, 7:23 AM.



Add a simplification to fuse a manual vector extract with shifts and
truncate into a bitcast.

Unpacking and packing values into vectors is only optimized with
extractelement instructions, not when manually unpacked using shifts
and truncates.
This patch simplifies shifts and truncates into a bitcast if possible.

Simplify (build_vec (trunc $1)

(trunc (srl $1 width))
(trunc (srl $1 (2 * width))) ...)

to (bitcast $1)

Diff Detail

Event Timeline

sebastian-ne created this revision.Feb 3 2020, 7:23 AM
arsenm added a subscriber: arsenm.Feb 3 2020, 7:32 AM
arsenm added inline comments.

Why does this matter? This doesn't touch memory


You don't need the SDValue copy constructor here

sebastian-ne added inline comments.Feb 3 2020, 8:18 AM

I think it does matter for the shifts and for bitcasting a vector to a number.
If I’m not mistaken, for big endian the function should convert like this:

Simplify (build_vec (trunc (srl $1 (2 * half-width)))
                    (trunc (srl $1 half-width))
                    (trunc $1) …)
to (bitcast $1)

That could be fixed easily, however the selection-dag bitcast documentation states that there may be more shuffling on big endian architectures?

Remove unecessary copy constructor, thanks Matt.

nhaehnle accepted this revision.Feb 5 2020, 5:22 AM
nhaehnle added reviewers: spatel, lebedev.ri.

LGTM, but wait a few days to give others a chance to weigh in.


Right, because bitcasts are defined as behaving as-if you store to and then load from memory. Which may well be quite problematic, but that's what the documentation says...

This revision is now accepted and ready to land.Feb 5 2020, 5:22 AM
This revision was automatically updated to reflect the committed changes.