aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/X86/X86InstrInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/X86/X86InstrInfo.cpp')
-rw-r--r--llvm/lib/Target/X86/X86InstrInfo.cpp34
1 files changed, 33 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp
index 03ac1d3..1d2cd39 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.cpp
+++ b/llvm/lib/Target/X86/X86InstrInfo.cpp
@@ -8113,6 +8113,39 @@ MachineInstr *X86InstrInfo::foldMemoryOperandImpl(
MachineBasicBlock::iterator InsertPt, MachineInstr &LoadMI,
LiveIntervals *LIS) const {
+ // If LoadMI is a masked load, check MI having the same mask.
+ const MCInstrDesc &MCID = get(LoadMI.getOpcode());
+ unsigned NumOps = MCID.getNumOperands();
+ if (NumOps >= 3) {
+ Register MaskReg;
+ const MachineOperand &Op1 = LoadMI.getOperand(1);
+ const MachineOperand &Op2 = LoadMI.getOperand(2);
+
+ auto IsVKWMClass = [](const TargetRegisterClass *RC) {
+ return RC == &X86::VK2WMRegClass || RC == &X86::VK4WMRegClass ||
+ RC == &X86::VK8WMRegClass || RC == &X86::VK16WMRegClass ||
+ RC == &X86::VK32WMRegClass || RC == &X86::VK64WMRegClass;
+ };
+
+ if (Op1.isReg() && IsVKWMClass(getRegClass(MCID, 1, &RI)))
+ MaskReg = Op1.getReg();
+ else if (Op2.isReg() && IsVKWMClass(getRegClass(MCID, 2, &RI)))
+ MaskReg = Op2.getReg();
+
+ if (MaskReg) {
+ bool HasSameMask = false;
+ for (unsigned I = 1, E = MI.getDesc().getNumOperands(); I < E; ++I) {
+ const MachineOperand &Op = MI.getOperand(I);
+ if (Op.isReg() && Op.getReg() == MaskReg) {
+ HasSameMask = true;
+ break;
+ }
+ }
+ if (!HasSameMask)
+ return nullptr;
+ }
+ }
+
// TODO: Support the case where LoadMI loads a wide register, but MI
// only uses a subreg.
for (auto Op : Ops) {
@@ -8121,7 +8154,6 @@ MachineInstr *X86InstrInfo::foldMemoryOperandImpl(
}
// If loading from a FrameIndex, fold directly from the FrameIndex.
- unsigned NumOps = LoadMI.getDesc().getNumOperands();
int FrameIndex;
if (isLoadFromStackSlot(LoadMI, FrameIndex)) {
if (isNonFoldablePartialRegisterLoad(LoadMI, MI, MF))