diff --git a/llvm/include/llvm/CodeGen/MachineFunction.h b/llvm/include/llvm/CodeGen/MachineFunction.h --- a/llvm/include/llvm/CodeGen/MachineFunction.h +++ b/llvm/include/llvm/CodeGen/MachineFunction.h @@ -1,5 +1,6 @@ //===- llvm/CodeGen/MachineFunction.h ---------------------------*- C++ -*-===// // +// // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception @@ -740,6 +741,12 @@ MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO, const AAMDNodes &AAInfo); + /// Allocate a new MachineMemOperand by copying an existing one, + /// replacing the flags. MachineMemOperands are owned + /// by the MachineFunction and need not be explicitly deallocated. + MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO, + MachineMemOperand::Flags Flags); + using OperandCapacity = ArrayRecycler::Capacity; /// Allocate an array of MachineOperands. This is only intended for use by diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp --- a/llvm/lib/CodeGen/MachineFunction.cpp +++ b/llvm/lib/CodeGen/MachineFunction.cpp @@ -430,6 +430,15 @@ MMO->getOrdering(), MMO->getFailureOrdering()); } +MachineMemOperand * +MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO, + MachineMemOperand::Flags Flags) { + return new (Allocator) MachineMemOperand( + MMO->getPointerInfo(), Flags, MMO->getSize(), MMO->getBaseAlignment(), + MMO->getAAInfo(), MMO->getRanges(), MMO->getSyncScopeID(), + MMO->getOrdering(), MMO->getFailureOrdering()); +} + MachineInstr::ExtraInfo * MachineFunction::createMIExtraInfo(ArrayRef MMOs, MCSymbol *PreInstrSymbol, diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -28669,10 +28669,18 @@ unsigned ArgMode = MI.getOperand(7).getImm(); unsigned Align = MI.getOperand(8).getImm(); + MachineFunction *MF = MBB->getParent(); + // Memory Reference assert(MI.hasOneMemOperand() && "Expected VAARG_64 to have one memoperand"); - SmallVector MMOs(MI.memoperands_begin(), - MI.memoperands_end()); + + MachineMemOperand *OldMMO = MI.memoperands().front(); + + // Clone the MMO into two separate MMOs for loading and storing + MachineMemOperand *LoadOnlyMMO = MF->getMachineMemOperand( + OldMMO, OldMMO->getFlags() & ~MachineMemOperand::MOStore); + MachineMemOperand *StoreOnlyMMO = MF->getMachineMemOperand( + OldMMO, OldMMO->getFlags() & ~MachineMemOperand::MOLoad); // Machine Information const TargetInstrInfo *TII = Subtarget.getInstrInfo(); @@ -28737,7 +28745,6 @@ OverflowDestReg = MRI.createVirtualRegister(AddrRegClass); const BasicBlock *LLVM_BB = MBB->getBasicBlock(); - MachineFunction *MF = MBB->getParent(); overflowMBB = MF->CreateMachineBasicBlock(LLVM_BB); offsetMBB = MF->CreateMachineBasicBlock(LLVM_BB); endMBB = MF->CreateMachineBasicBlock(LLVM_BB); @@ -28770,7 +28777,7 @@ .add(Index) .addDisp(Disp, UseFPOffset ? 4 : 0) .add(Segment) - .setMemRefs(MMOs); + .setMemRefs(LoadOnlyMMO); // Check if there is enough room left to pull this argument. BuildMI(thisMBB, DL, TII->get(X86::CMP32ri)) @@ -28795,7 +28802,7 @@ .add(Index) .addDisp(Disp, 16) .add(Segment) - .setMemRefs(MMOs); + .setMemRefs(LoadOnlyMMO); // Zero-extend the offset unsigned OffsetReg64 = MRI.createVirtualRegister(AddrRegClass); @@ -28823,7 +28830,7 @@ .addDisp(Disp, UseFPOffset ? 4 : 0) .add(Segment) .addReg(NextOffsetReg) - .setMemRefs(MMOs); + .setMemRefs(StoreOnlyMMO); // Jump to endMBB BuildMI(offsetMBB, DL, TII->get(X86::JMP_1)) @@ -28842,7 +28849,7 @@ .add(Index) .addDisp(Disp, 8) .add(Segment) - .setMemRefs(MMOs); + .setMemRefs(LoadOnlyMMO); // If we need to align it, do so. Otherwise, just copy the address // to OverflowDestReg. @@ -28879,7 +28886,7 @@ .addDisp(Disp, 8) .add(Segment) .addReg(NextAddrReg) - .setMemRefs(MMOs); + .setMemRefs(StoreOnlyMMO); // If we branched, emit the PHI to the front of endMBB. if (offsetMBB) { diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp --- a/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -5127,10 +5127,7 @@ } else { // Clone the MMO and unset the store flag. LoadMMOs.push_back(MF.getMachineMemOperand( - MMO->getPointerInfo(), MMO->getFlags() & ~MachineMemOperand::MOStore, - MMO->getSize(), MMO->getBaseAlignment(), MMO->getAAInfo(), nullptr, - MMO->getSyncScopeID(), MMO->getOrdering(), - MMO->getFailureOrdering())); + MMO, MMO->getFlags() & ~MachineMemOperand::MOStore)); } } @@ -5151,10 +5148,7 @@ } else { // Clone the MMO and unset the load flag. StoreMMOs.push_back(MF.getMachineMemOperand( - MMO->getPointerInfo(), MMO->getFlags() & ~MachineMemOperand::MOLoad, - MMO->getSize(), MMO->getBaseAlignment(), MMO->getAAInfo(), nullptr, - MMO->getSyncScopeID(), MMO->getOrdering(), - MMO->getFailureOrdering())); + MMO, MMO->getFlags() & ~MachineMemOperand::MOLoad)); } }