HomePhabricator

[PowerPC] Fix MI peephole optimization for splats

Authored by lkail on Dec 6 2019, 10:43 PM.

Description

[PowerPC] Fix MI peephole optimization for splats

Summary:
This patch fixes an issue where the PPC MI peephole optimization pass incorrectly remove a vector swap.

Specifically, the pass can combine a splat/swap to a splat/copy. It uses TargetRegisterInfo::lookThruCopyLike to determine that the operands to the splat are the same. However, the current logic only compares the operands based on register numbers. In the case where the splat operands are ultimately feed from the same physical register, the pass can incorrectly remove a swap if the feed register for one of the operands has been clobbered.

This patch adds a check to ensure that the registers feeding are both virtual registers or the operands to the splat or swap are both the same register.

Here is an example in pseudo-MIR of what happens in the test cased added in this patch:

Before PPC MI peephole optimization:

%arg = XVADDDP %0, %1

$f1 = COPY %arg.sub_64
call double rint(double)
%res.first = COPY $f1
%vec.res.first = SUBREG_TO_REG 1, %res.first, %subreg.sub_64

%arg.swapped = XXPERMDI %arg, %arg, 2
$f1 = COPY %arg.swapped.sub_64
call double rint(double)
%res.second = COPY $f1

%vec.res.second = SUBREG_TO_REG 1, %res.second, %subreg.sub_64
%vec.res.splat = XXPERMDI %vec.res.first, %vec.res.second, 0
%vec.res = XXPERMDI %vec.res.splat, %vec.res.splat, 2
; %vec.res == [ %vec.res.second[0], %vec.res.first[0] ]

After optimization:

; ...
%vec.res.splat = XXPERMDI %vec.res.first, %vec.res.second, 0
; lookThruCopyLike(%vec.res.first) == lookThruCopyLike(%vec.res.second) == $f1
; so the pass replaces the swap with a copy:
%vec.res = COPY %vec.res.splat
; %vec.res == [ %vec.res.first[0], %vec.res.second[0] ]

As best as I can tell, this has occurred since r288152, which added support for lowering certain vector operations to direct moves in the form of a splat.

Committed for vddvss (Colin Samples). Thanks Colin for the patch!
Differential Revision: https://reviews.llvm.org/D69497

Details

Committed
lkailDec 6 2019, 10:51 PM
Differential Revision
D69497: [PowerPC] Fix MI peephole optimization for splats
Parents
rGedf6717d8d30: export.sh: Fetch sources from GitHub instead of SVN
Branches
Unknown
Tags
Unknown

Event Timeline

jsji added a subscriber: jsji.EditedDec 9 2019, 7:31 AM

@lkail When committing code for others, please follow the format described in Developer Policy. Thanks.
https://llvm.org/docs/DeveloperPolicy.html#attribution-of-changes

https://llvm.org/docs/DeveloperPolicy.html#commit-messages

Attribution of Changes should be in a separate line, after the end of the body, as simple as “Patch by John Doe.”. This is how we officially handle attribution, and there are automated processes that rely on this format.
lkail added a comment.Dec 9 2019, 4:03 PM
This comment was removed by lkail.
lkail added a comment.Dec 9 2019, 4:04 PM

@lkail When committing code for others, please follow the format described in Developer Policy. Thanks.
https://llvm.org/docs/DeveloperPolicy.html#attribution-of-changes

https://llvm.org/docs/DeveloperPolicy.html#commit-messages

Attribution of Changes should be in a separate line, after the end of the body, as simple as “Patch by John Doe.”. This is how we officially handle attribution, and there are automated processes that rely on this format.

Thanks for the information.