diff options
| author | Craig Topper <craig.topper@intel.com> | 2019-06-05 18:25:09 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2019-06-05 18:25:09 +0000 |
| commit | d0fff89b81650e1b7d6c9c73c035672099b0c2db (patch) | |
| tree | 45c5037279072f7f6b6a0137284f8bcaa67dcf4b /llvm/lib | |
| parent | 13dd125043fa40b2bf1f8b5d3143b20caf6c68c2 (diff) | |
| download | bcm5719-llvm-d0fff89b81650e1b7d6c9c73c035672099b0c2db.tar.gz bcm5719-llvm-d0fff89b81650e1b7d6c9c73c035672099b0c2db.zip | |
[X86] Add the vector integer min/max instructions to isAssociativeAndCommutative.
As far as I know these should be freely reassociatable just like
the floating point MAXC/MINC instructions.
The *reduce* test changes are largely regressions and caused by
the "generic" CPU we default to not having a scheduler model.
The machine-combiner-int-vec.ll test shows the positive benefits
of this change.
Differential Revision: https://reviews.llvm.org/D62787
llvm-svn: 362629
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp index 2beb513d1a9..53b23c75737 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -6922,6 +6922,18 @@ bool X86InstrInfo::isAssociativeAndCommutative(const MachineInstr &Inst) const { case X86::PADDQrr: case X86::PMULLWrr: case X86::PMULLDrr: + case X86::PMAXSBrr: + case X86::PMAXSDrr: + case X86::PMAXSWrr: + case X86::PMAXUBrr: + case X86::PMAXUDrr: + case X86::PMAXUWrr: + case X86::PMINSBrr: + case X86::PMINSDrr: + case X86::PMINSWrr: + case X86::PMINUBrr: + case X86::PMINUDrr: + case X86::PMINUWrr: case X86::VPANDrr: case X86::VPANDYrr: case X86::VPANDDZ128rr: @@ -7025,6 +7037,78 @@ bool X86InstrInfo::isAssociativeAndCommutative(const MachineInstr &Inst) const { case X86::VPMULLQZ128rr: case X86::VPMULLQZ256rr: case X86::VPMULLQZrr: + case X86::VPMAXSBrr: + case X86::VPMAXSBYrr: + case X86::VPMAXSBZ128rr: + case X86::VPMAXSBZ256rr: + case X86::VPMAXSBZrr: + case X86::VPMAXSDrr: + case X86::VPMAXSDYrr: + case X86::VPMAXSDZ128rr: + case X86::VPMAXSDZ256rr: + case X86::VPMAXSDZrr: + case X86::VPMAXSQZ128rr: + case X86::VPMAXSQZ256rr: + case X86::VPMAXSQZrr: + case X86::VPMAXSWrr: + case X86::VPMAXSWYrr: + case X86::VPMAXSWZ128rr: + case X86::VPMAXSWZ256rr: + case X86::VPMAXSWZrr: + case X86::VPMAXUBrr: + case X86::VPMAXUBYrr: + case X86::VPMAXUBZ128rr: + case X86::VPMAXUBZ256rr: + case X86::VPMAXUBZrr: + case X86::VPMAXUDrr: + case X86::VPMAXUDYrr: + case X86::VPMAXUDZ128rr: + case X86::VPMAXUDZ256rr: + case X86::VPMAXUDZrr: + case X86::VPMAXUQZ128rr: + case X86::VPMAXUQZ256rr: + case X86::VPMAXUQZrr: + case X86::VPMAXUWrr: + case X86::VPMAXUWYrr: + case X86::VPMAXUWZ128rr: + case X86::VPMAXUWZ256rr: + case X86::VPMAXUWZrr: + case X86::VPMINSBrr: + case X86::VPMINSBYrr: + case X86::VPMINSBZ128rr: + case X86::VPMINSBZ256rr: + case X86::VPMINSBZrr: + case X86::VPMINSDrr: + case X86::VPMINSDYrr: + case X86::VPMINSDZ128rr: + case X86::VPMINSDZ256rr: + case X86::VPMINSDZrr: + case X86::VPMINSQZ128rr: + case X86::VPMINSQZ256rr: + case X86::VPMINSQZrr: + case X86::VPMINSWrr: + case X86::VPMINSWYrr: + case X86::VPMINSWZ128rr: + case X86::VPMINSWZ256rr: + case X86::VPMINSWZrr: + case X86::VPMINUBrr: + case X86::VPMINUBYrr: + case X86::VPMINUBZ128rr: + case X86::VPMINUBZ256rr: + case X86::VPMINUBZrr: + case X86::VPMINUDrr: + case X86::VPMINUDYrr: + case X86::VPMINUDZ128rr: + case X86::VPMINUDZ256rr: + case X86::VPMINUDZrr: + case X86::VPMINUQZ128rr: + case X86::VPMINUQZ256rr: + case X86::VPMINUQZrr: + case X86::VPMINUWrr: + case X86::VPMINUWYrr: + case X86::VPMINUWZ128rr: + case X86::VPMINUWZ256rr: + case X86::VPMINUWZrr: // Normal min/max instructions are not commutative because of NaN and signed // zero semantics, but these are. Thus, there's no need to check for global // relaxed math; the instructions themselves have the properties we need. |

