You've already forked linux-packaging-mono
Imported Upstream version 6.4.0.137
Former-commit-id: 943baa9f16a098c33e129777827f3a9d20da00d6
This commit is contained in:
parent
e9207cf623
commit
ef583813eb
@ -299,6 +299,11 @@ void AArch64AsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNum,
|
||||
printOffset(MO.getOffset(), O);
|
||||
break;
|
||||
}
|
||||
case MachineOperand::MO_BlockAddress: {
|
||||
MCSymbol *Sym = GetBlockAddressSymbol(MO.getBlockAddress());
|
||||
Sym->print(O, MAI);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/DebugCounter.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <cassert>
|
||||
#include <iterator>
|
||||
@ -60,6 +61,8 @@ STATISTIC(NumCollisionsAvoided,
|
||||
"Number of HW prefetch tag collisions avoided");
|
||||
STATISTIC(NumCollisionsNotAvoided,
|
||||
"Number of HW prefetch tag collisions not avoided due to lack of regsiters");
|
||||
DEBUG_COUNTER(FixCounter, "falkor-hwpf",
|
||||
"Controls which tag collisions are avoided");
|
||||
|
||||
namespace {
|
||||
|
||||
@ -729,6 +732,21 @@ void FalkorHWPFFix::runOnLoop(MachineLoop &L, MachineFunction &Fn) {
|
||||
bool Fixed = false;
|
||||
DEBUG(dbgs() << "Attempting to fix tag collision: " << MI);
|
||||
|
||||
if (!DebugCounter::shouldExecute(FixCounter)) {
|
||||
DEBUG(dbgs() << "Skipping fix due to debug counter:\n " << MI);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Add the non-base registers of MI as live so we don't use them as
|
||||
// scratch registers.
|
||||
for (unsigned OpI = 0, OpE = MI.getNumOperands(); OpI < OpE; ++OpI) {
|
||||
if (OpI == static_cast<unsigned>(LdI.BaseRegIdx))
|
||||
continue;
|
||||
MachineOperand &MO = MI.getOperand(OpI);
|
||||
if (MO.isReg() && MO.readsReg())
|
||||
LR.addReg(MO.getReg());
|
||||
}
|
||||
|
||||
for (unsigned ScratchReg : AArch64::GPR64RegClass) {
|
||||
if (!LR.available(ScratchReg) || MRI.isReserved(ScratchReg))
|
||||
continue;
|
||||
|
@ -917,6 +917,8 @@ int AArch64FrameLowering::resolveFrameIndexReference(const MachineFunction &MF,
|
||||
int FPOffset = MFI.getObjectOffset(FI) + FixedObject + 16;
|
||||
int Offset = MFI.getObjectOffset(FI) + MFI.getStackSize();
|
||||
bool isFixed = MFI.isFixedObjectIndex(FI);
|
||||
bool isCSR = !isFixed && MFI.getObjectOffset(FI) >=
|
||||
-((int)AFI->getCalleeSavedStackSize());
|
||||
|
||||
// Use frame pointer to reference fixed objects. Use it for locals if
|
||||
// there are VLAs or a dynamically realigned SP (and thus the SP isn't
|
||||
@ -930,6 +932,12 @@ int AArch64FrameLowering::resolveFrameIndexReference(const MachineFunction &MF,
|
||||
// Argument access should always use the FP.
|
||||
if (isFixed) {
|
||||
UseFP = hasFP(MF);
|
||||
} else if (isCSR && RegInfo->needsStackRealignment(MF)) {
|
||||
// References to the CSR area must use FP if we're re-aligning the stack
|
||||
// since the dynamically-sized alignment padding is between the SP/BP and
|
||||
// the CSR area.
|
||||
assert(hasFP(MF) && "Re-aligned stack must have frame pointer");
|
||||
UseFP = true;
|
||||
} else if (hasFP(MF) && !RegInfo->hasBasePointer(MF) &&
|
||||
!RegInfo->needsStackRealignment(MF)) {
|
||||
// Use SP or FP, whichever gives us the best chance of the offset
|
||||
@ -947,9 +955,9 @@ int AArch64FrameLowering::resolveFrameIndexReference(const MachineFunction &MF,
|
||||
}
|
||||
}
|
||||
|
||||
assert((isFixed || !RegInfo->needsStackRealignment(MF) || !UseFP) &&
|
||||
assert(((isFixed || isCSR) || !RegInfo->needsStackRealignment(MF) || !UseFP) &&
|
||||
"In the presence of dynamic stack pointer realignment, "
|
||||
"non-argument objects cannot be accessed through the frame pointer");
|
||||
"non-argument/CSR objects cannot be accessed through the frame pointer");
|
||||
|
||||
if (UseFP) {
|
||||
FrameReg = RegInfo->getFrameRegister(MF);
|
||||
|
@ -1 +1 @@
|
||||
9a021c751eec90145bb1ee521df8e93258028de5
|
||||
3fa5457b4e0cd4affafb6c28aff7b0e1156bc74c
|
@ -1 +1 @@
|
||||
79826ca2ed8dc6f3d0f111508f3cb638fe2f4281
|
||||
040011d858e771021341f098d0f852310aba87f1
|
@ -355,6 +355,7 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF,
|
||||
unsigned ArgRegsSaveSize = AFI->getArgRegsSaveSize();
|
||||
unsigned NumBytes = MFI.getStackSize();
|
||||
const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo();
|
||||
bool AvoidNonfpCFA = false;
|
||||
|
||||
// Debug location must be unknown since the first debug location is used
|
||||
// to determine the end of the prologue.
|
||||
@ -580,6 +581,7 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF,
|
||||
dl, TII, FramePtr, ARM::SP,
|
||||
PushSize + FramePtrOffsetInPush,
|
||||
MachineInstr::FrameSetup);
|
||||
#if 0
|
||||
if (FramePtrOffsetInPush + PushSize != 0) {
|
||||
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createDefCfa(
|
||||
nullptr, MRI->getDwarfRegNum(FramePtr, true),
|
||||
@ -595,6 +597,15 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF,
|
||||
.addCFIIndex(CFIIndex)
|
||||
.setMIFlags(MachineInstr::FrameSetup);
|
||||
}
|
||||
#else
|
||||
/* on iOS `r7 + 8` is always the previous stack pointer */
|
||||
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createDefCfa(nullptr, MRI->getDwarfRegNum(FramePtr, true), -8));
|
||||
BuildMI(MBB, AfterPush, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
|
||||
.addCFIIndex(CFIIndex)
|
||||
.setMIFlags(MachineInstr::FrameSetup);
|
||||
|
||||
AvoidNonfpCFA = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Now that the prologue's actual instructions are finalised, we can insert
|
||||
@ -683,7 +694,8 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF,
|
||||
// throughout the process. If we have a frame pointer, it takes over the job
|
||||
// half-way through, so only the first few .cfi_def_cfa_offset instructions
|
||||
// actually get emitted.
|
||||
DefCFAOffsetCandidates.emitDefCFAOffsets(MBB, dl, TII, HasFP);
|
||||
if (!AvoidNonfpCFA)
|
||||
DefCFAOffsetCandidates.emitDefCFAOffsets(MBB, dl, TII, HasFP);
|
||||
|
||||
if (STI.isTargetELF() && hasFP(MF))
|
||||
MFI.setOffsetAdjustment(MFI.getOffsetAdjustment() -
|
||||
|
@ -225,6 +225,8 @@ unsigned MipsELFObjectWriter::getRelocType(MCContext &Ctx,
|
||||
switch (Kind) {
|
||||
case Mips::fixup_Mips_NONE:
|
||||
return ELF::R_MIPS_NONE;
|
||||
case FK_Data_1:
|
||||
report_fatal_error("MIPS does not support one byte relocations");
|
||||
case Mips::fixup_Mips_16:
|
||||
case FK_Data_2:
|
||||
return IsPCRel ? ELF::R_MIPS_PC16 : ELF::R_MIPS_16;
|
||||
|
@ -1 +1 @@
|
||||
ba05b0f48df79816f8fb55249b06a9b4ddbf9ba8
|
||||
3d383b3dfe3e476d0a59da5df71e4f1baac71288
|
@ -1 +1 @@
|
||||
f7d7e2af85e476555070b6045488a799d7022d3c
|
||||
eee5b23117f6fba5f0536879d0ab7f3b0fdc892c
|
@ -44,6 +44,14 @@ static cl::opt<bool>
|
||||
cl::desc("Disable load/store vectorizer"),
|
||||
cl::init(false), cl::Hidden);
|
||||
|
||||
// TODO: Remove this flag when we are confident with no regressions.
|
||||
static cl::opt<bool> DisableRequireStructuredCFG(
|
||||
"disable-nvptx-require-structured-cfg",
|
||||
cl::desc("Transitional flag to turn off NVPTX's requirement on preserving "
|
||||
"structured CFG. The requirement should be disabled only when "
|
||||
"unexpected regressions happen."),
|
||||
cl::init(false), cl::Hidden);
|
||||
|
||||
namespace llvm {
|
||||
|
||||
void initializeNVVMIntrRangePass(PassRegistry&);
|
||||
@ -108,6 +116,8 @@ NVPTXTargetMachine::NVPTXTargetMachine(const Target &T, const Triple &TT,
|
||||
drvInterface = NVPTX::NVCL;
|
||||
else
|
||||
drvInterface = NVPTX::CUDA;
|
||||
if (!DisableRequireStructuredCFG)
|
||||
setRequiresStructuredCFG(true);
|
||||
initAsmInfo();
|
||||
}
|
||||
|
||||
|
@ -1 +1 @@
|
||||
fb16700a5e177a112820eda422ceb6c6a9a2971b
|
||||
4ef71effd49b4eabfd27e4569c4d229210b90b4e
|
1
external/llvm/lib/Target/X86/CMakeLists.txt
vendored
1
external/llvm/lib/Target/X86/CMakeLists.txt
vendored
@ -31,6 +31,7 @@ set(sources
|
||||
X86FixupBWInsts.cpp
|
||||
X86FixupLEAs.cpp
|
||||
X86FixupSetCC.cpp
|
||||
X86FlagsCopyLowering.cpp
|
||||
X86FloatingPoint.cpp
|
||||
X86FrameLowering.cpp
|
||||
X86InstructionSelector.cpp
|
||||
|
@ -265,13 +265,10 @@ MCDisassembler::DecodeStatus X86GenericDisassembler::getInstruction(
|
||||
/// @param reg - The Reg to append.
|
||||
static void translateRegister(MCInst &mcInst, Reg reg) {
|
||||
#define ENTRY(x) X86::x,
|
||||
uint8_t llvmRegnums[] = {
|
||||
ALL_REGS
|
||||
0
|
||||
};
|
||||
static constexpr MCPhysReg llvmRegnums[] = {ALL_REGS};
|
||||
#undef ENTRY
|
||||
|
||||
uint8_t llvmRegnum = llvmRegnums[reg];
|
||||
MCPhysReg llvmRegnum = llvmRegnums[reg];
|
||||
mcInst.addOperand(MCOperand::createReg(llvmRegnum));
|
||||
}
|
||||
|
||||
|
3
external/llvm/lib/Target/X86/X86.h
vendored
3
external/llvm/lib/Target/X86/X86.h
vendored
@ -66,6 +66,9 @@ FunctionPass *createX86OptimizeLEAs();
|
||||
/// Return a pass that transforms setcc + movzx pairs into xor + setcc.
|
||||
FunctionPass *createX86FixupSetCC();
|
||||
|
||||
/// Return a pass that lowers EFLAGS copy pseudo instructions.
|
||||
FunctionPass *createX86FlagsCopyLoweringPass();
|
||||
|
||||
/// Return a pass that expands WinAlloca pseudo-instructions.
|
||||
FunctionPass *createX86WinAllocaExpander();
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/TargetRegisterInfo.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/Printable.h"
|
||||
#include <bitset>
|
||||
|
||||
using namespace llvm;
|
||||
@ -262,25 +263,6 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/// An Instruction Converter which completely deletes an instruction.
|
||||
/// For example, IMPLICIT_DEF instructions can be deleted when converting from
|
||||
/// GPR to mask.
|
||||
class InstrDeleter : public InstrConverterBase {
|
||||
public:
|
||||
InstrDeleter(unsigned SrcOpcode) : InstrConverterBase(SrcOpcode) {}
|
||||
|
||||
bool convertInstr(MachineInstr *MI, const TargetInstrInfo *TII,
|
||||
MachineRegisterInfo *MRI) const override {
|
||||
assert(isLegal(MI, TII) && "Cannot convert instruction");
|
||||
return true;
|
||||
}
|
||||
|
||||
double getExtraCost(const MachineInstr *MI,
|
||||
MachineRegisterInfo *MRI) const override {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
// Key type to be used by the Instruction Converters map.
|
||||
// A converter is identified by <destination domain, source opcode>
|
||||
typedef std::pair<int, unsigned> InstrConverterBaseKeyTy;
|
||||
@ -310,8 +292,12 @@ private:
|
||||
/// Domains which this closure can legally be reassigned to.
|
||||
std::bitset<NumDomains> LegalDstDomains;
|
||||
|
||||
/// An ID to uniquely identify this closure, even when it gets
|
||||
/// moved around
|
||||
unsigned ID;
|
||||
|
||||
public:
|
||||
Closure(std::initializer_list<RegDomain> LegalDstDomainList) {
|
||||
Closure(unsigned ID, std::initializer_list<RegDomain> LegalDstDomainList) : ID(ID) {
|
||||
for (RegDomain D : LegalDstDomainList)
|
||||
LegalDstDomains.set(D);
|
||||
}
|
||||
@ -347,6 +333,27 @@ public:
|
||||
return Instrs;
|
||||
}
|
||||
|
||||
LLVM_DUMP_METHOD void dump(const MachineRegisterInfo *MRI) const {
|
||||
dbgs() << "Registers: ";
|
||||
bool First = true;
|
||||
for (unsigned Reg : Edges) {
|
||||
if (!First)
|
||||
dbgs() << ", ";
|
||||
First = false;
|
||||
dbgs() << printReg(Reg, MRI->getTargetRegisterInfo());
|
||||
}
|
||||
dbgs() << "\n" << "Instructions:";
|
||||
for (MachineInstr *MI : Instrs) {
|
||||
dbgs() << "\n ";
|
||||
MI->print(dbgs());
|
||||
}
|
||||
dbgs() << "\n";
|
||||
}
|
||||
|
||||
unsigned getID() const {
|
||||
return ID;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class X86DomainReassignment : public MachineFunctionPass {
|
||||
@ -358,7 +365,7 @@ class X86DomainReassignment : public MachineFunctionPass {
|
||||
DenseSet<unsigned> EnclosedEdges;
|
||||
|
||||
/// All instructions that are included in some closure.
|
||||
DenseMap<MachineInstr *, Closure *> EnclosedInstrs;
|
||||
DenseMap<MachineInstr *, unsigned> EnclosedInstrs;
|
||||
|
||||
public:
|
||||
static char ID;
|
||||
@ -435,14 +442,14 @@ void X86DomainReassignment::visitRegister(Closure &C, unsigned Reg,
|
||||
void X86DomainReassignment::encloseInstr(Closure &C, MachineInstr *MI) {
|
||||
auto I = EnclosedInstrs.find(MI);
|
||||
if (I != EnclosedInstrs.end()) {
|
||||
if (I->second != &C)
|
||||
if (I->second != C.getID())
|
||||
// Instruction already belongs to another closure, avoid conflicts between
|
||||
// closure and mark this closure as illegal.
|
||||
C.setAllIllegal();
|
||||
return;
|
||||
}
|
||||
|
||||
EnclosedInstrs[MI] = &C;
|
||||
EnclosedInstrs[MI] = C.getID();
|
||||
C.addInstruction(MI);
|
||||
|
||||
// Mark closure as illegal for reassignment to domains, if there is no
|
||||
@ -587,7 +594,7 @@ void X86DomainReassignment::initConverters() {
|
||||
new InstrIgnore(TargetOpcode::PHI);
|
||||
|
||||
Converters[{MaskDomain, TargetOpcode::IMPLICIT_DEF}] =
|
||||
new InstrDeleter(TargetOpcode::IMPLICIT_DEF);
|
||||
new InstrIgnore(TargetOpcode::IMPLICIT_DEF);
|
||||
|
||||
Converters[{MaskDomain, TargetOpcode::INSERT_SUBREG}] =
|
||||
new InstrReplaceWithCopy(TargetOpcode::INSERT_SUBREG, 2);
|
||||
@ -723,6 +730,7 @@ bool X86DomainReassignment::runOnMachineFunction(MachineFunction &MF) {
|
||||
std::vector<Closure> Closures;
|
||||
|
||||
// Go over all virtual registers and calculate a closure.
|
||||
unsigned ClosureID = 0;
|
||||
for (unsigned Idx = 0; Idx < MRI->getNumVirtRegs(); ++Idx) {
|
||||
unsigned Reg = TargetRegisterInfo::index2VirtReg(Idx);
|
||||
|
||||
@ -735,7 +743,7 @@ bool X86DomainReassignment::runOnMachineFunction(MachineFunction &MF) {
|
||||
continue;
|
||||
|
||||
// Calculate closure starting with Reg.
|
||||
Closure C({MaskDomain});
|
||||
Closure C(ClosureID++, {MaskDomain});
|
||||
buildClosure(C, Reg);
|
||||
|
||||
// Collect all closures that can potentially be converted.
|
||||
@ -743,15 +751,16 @@ bool X86DomainReassignment::runOnMachineFunction(MachineFunction &MF) {
|
||||
Closures.push_back(std::move(C));
|
||||
}
|
||||
|
||||
for (Closure &C : Closures)
|
||||
for (Closure &C : Closures) {
|
||||
DEBUG(C.dump(MRI));
|
||||
if (isReassignmentProfitable(C, MaskDomain)) {
|
||||
reassign(C, MaskDomain);
|
||||
++NumClosuresConverted;
|
||||
Changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto I : Converters)
|
||||
delete I.second;
|
||||
DeleteContainerSeconds(Converters);
|
||||
|
||||
DEBUG(dbgs() << "***** Machine Function after Domain Reassignment *****\n");
|
||||
DEBUG(MF.print(dbgs()));
|
||||
|
@ -1 +1 @@
|
||||
d482edc4b3d857336a8e0ff82a0d2a1b9039ed9d
|
||||
42fac99997d5480ca2c9886d1fb3a557f0f54abe
|
935
external/llvm/lib/Target/X86/X86FlagsCopyLowering.cpp
vendored
Normal file
935
external/llvm/lib/Target/X86/X86FlagsCopyLowering.cpp
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@ -1 +1 @@
|
||||
261c9ce22a183900c16001661122c89f5f9df44c
|
||||
aa97a905ded038ea12e52b9e5ae1161a84cc37db
|
@ -1 +1 @@
|
||||
2bd332f545da11681e63ee22d9eef248b8fb7b64
|
||||
3a23916ad4b5b53e4f14128e415bed14167d9f11
|
@ -1099,9 +1099,6 @@ namespace llvm {
|
||||
bool lowerInterleavedStore(StoreInst *SI, ShuffleVectorInst *SVI,
|
||||
unsigned Factor) const override;
|
||||
|
||||
|
||||
void finalizeLowering(MachineFunction &MF) const override;
|
||||
|
||||
protected:
|
||||
std::pair<const TargetRegisterClass *, uint8_t>
|
||||
findRepresentativeClass(const TargetRegisterInfo *TRI,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user