This is an archive of the discontinued LLVM Phabricator instance.

[AArch64][GlobalISel] Fold binops on the true side of G_SELECT
ClosedPublic

Authored by paquette on Dec 8 2020, 9:51 AM.

Details

Summary

This implements the following folds:

G_SELECT cc, (G_SUB 0, %x), %false -> CSNEG %x, %false, inv_cc
G_SELECT cc, (G_XOR x, -1), %false -> CSINV %x, %false, inv_cc

This is similar to the folds introduced in 5bc0bd05e6a8d788e08cdf3d154f3a33202aee53.

In 5bc0bd05e6a8d788e08cdf3d154f3a33202aee53 I mentioned that we may prefer to do this in AArch64PostLegalizerLowering.

I think that it's probably better to do this in the selector. The way we select G_SELECT depends on what register banks end up being assigned to it. If we did this in AArch64PostLegalizerLowering, then we'd end up checking *every* G_SELECT to see if it's worth swapping operands. Doing it in the selector allows us to restrict the optimization to only relevant G_SELECTs.

Also fix up some comments in TryFoldBinOpIntoSelect which are kind of confusing IMO.

Example IR: https://godbolt.org/z/3qPGca

Diff Detail