diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-02-28 00:43:03 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-02-28 00:43:03 +0000 |
commit | fb8075d03f5c87bd57dcc9c5f2304f6b13c55aad (patch) | |
tree | c0823b1738e1ce2f7c6c219547f9f116d53074bf /lib/Target/X86 | |
parent | 41ce5b82da30b27d00993a2882cc52f427f6309c (diff) | |
download | external_llvm-fb8075d03f5c87bd57dcc9c5f2304f6b13c55aad.zip external_llvm-fb8075d03f5c87bd57dcc9c5f2304f6b13c55aad.tar.gz external_llvm-fb8075d03f5c87bd57dcc9c5f2304f6b13c55aad.tar.bz2 |
Add a quick and dirty "loop aligner pass". x86 uses it to align its loops to 16-byte boundaries.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47703 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86')
-rw-r--r-- | lib/Target/X86/X86ATTAsmPrinter.cpp | 25 | ||||
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 1 | ||||
-rw-r--r-- | lib/Target/X86/X86IntelAsmPrinter.cpp | 4 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetAsmInfo.cpp | 1 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetMachine.cpp | 7 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetMachine.h | 1 |
6 files changed, 19 insertions, 20 deletions
diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index 304e0f7..b9770fe 100644 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -101,36 +101,25 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { switch (F->getLinkage()) { default: assert(0 && "Unknown linkage type!"); case Function::InternalLinkage: // Symbols default to internal. - if (Subtarget->isTargetDarwin()) - // FIXME: This should be parameterized somewhere. - EmitAlignment(4, F, 0, true, 0x90); - else - EmitAlignment(4, F); + EmitAlignment(4, F); break; case Function::DLLExportLinkage: DLLExportedFns.insert(Mang->makeNameProper(F->getName(), "")); //FALLS THROUGH case Function::ExternalLinkage: - if (Subtarget->isTargetDarwin()) - // FIXME: This should be parameterized somewhere. - EmitAlignment(4, F, 0, true, 0x90); - else - EmitAlignment(4, F); + EmitAlignment(4, F); O << "\t.globl\t" << CurrentFnName << "\n"; break; case Function::LinkOnceLinkage: case Function::WeakLinkage: + EmitAlignment(4, F); if (Subtarget->isTargetDarwin()) { - // FIXME: This should be parameterized somewhere. - EmitAlignment(4, F, 0, true, 0x90); O << "\t.globl\t" << CurrentFnName << "\n"; O << TAI->getWeakDefDirective() << CurrentFnName << "\n"; } else if (Subtarget->isTargetCygMing()) { - EmitAlignment(4, F); O << "\t.globl\t" << CurrentFnName << "\n"; O << "\t.linkonce discard\n"; } else { - EmitAlignment(4, F); O << "\t.weak\t" << CurrentFnName << "\n"; } break; @@ -180,7 +169,7 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { I != E; ++I) { // Print a label for the basic block. if (!I->pred_empty()) { - printBasicBlockLabel(I, true); + printBasicBlockLabel(I, true, true); O << '\n'; } for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); @@ -515,7 +504,7 @@ void X86ATTAsmPrinter::printPICJumpTableSetLabel(unsigned uid, O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix() << getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ','; - printBasicBlockLabel(MBB, false, false); + printBasicBlockLabel(MBB, false, false, false); if (Subtarget->isPICStyleRIPRel()) O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() << '_' << uid << '\n'; @@ -543,12 +532,12 @@ void X86ATTAsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, O << TAI->getPrivateGlobalPrefix() << getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber(); } else if (Subtarget->isPICStyleGOT()) { - printBasicBlockLabel(MBB, false, false); + printBasicBlockLabel(MBB, false, false, false); O << "@GOTOFF"; } else assert(0 && "Don't know how to print MBB label for this PIC mode"); } else - printBasicBlockLabel(MBB, false, false); + printBasicBlockLabel(MBB, false, false, false); } bool X86ATTAsmPrinter::printAsmMRegister(const MachineOperand &MO, diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 50014b3..8acf779 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -714,6 +714,7 @@ X86TargetLowering::X86TargetLowering(TargetMachine &TM) maxStoresPerMemcpy = 16; // For %llvm.memcpy -> sequence of stores maxStoresPerMemmove = 16; // For %llvm.memmove -> sequence of stores allowUnalignedMemoryAccesses = true; // x86 supports it! + setPrefLoopAlignment(16); } /// getMaxByValAlign - Helper for getByValTypeAlignment to determine diff --git a/lib/Target/X86/X86IntelAsmPrinter.cpp b/lib/Target/X86/X86IntelAsmPrinter.cpp index b753297..6c46b45 100644 --- a/lib/Target/X86/X86IntelAsmPrinter.cpp +++ b/lib/Target/X86/X86IntelAsmPrinter.cpp @@ -78,7 +78,7 @@ bool X86IntelAsmPrinter::runOnMachineFunction(MachineFunction &MF) { I != E; ++I) { // Print a label for the basic block if there are any predecessors. if (!I->pred_empty()) { - printBasicBlockLabel(I, true); + printBasicBlockLabel(I, true, true); O << '\n'; } for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end(); @@ -242,7 +242,7 @@ void X86IntelAsmPrinter::printPICJumpTableSetLabel(unsigned uid, O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix() << getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ','; - printBasicBlockLabel(MBB, false, false); + printBasicBlockLabel(MBB, false, false, false); O << '-' << "\"L" << getFunctionNumber() << "$pb\"'\n"; } diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index 42e63ec..acc13ba 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -47,6 +47,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) { switch (Subtarget->TargetType) { case X86Subtarget::isDarwin: AlignmentIsInBytes = false; + TextAlignFillValue = 0x90; GlobalPrefix = "_"; if (!Subtarget->is64Bit()) Data64bitsDirective = 0; // we can't emit a 64-bit unit diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index 850eb38..ad2775a 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -164,6 +164,13 @@ bool X86TargetMachine::addPostRegAlloc(FunctionPassManager &PM, bool Fast) { return true; // -print-machineinstr should print after this. } +bool X86TargetMachine::addPreEmitPass(FunctionPassManager &PM, bool Fast) { + if (Fast) return false; + + PM.add(createLoopAlignerPass()); + return true; +} + bool X86TargetMachine::addAssemblyEmitter(FunctionPassManager &PM, bool Fast, std::ostream &Out) { PM.add(createX86CodePrinterPass(Out, *this)); diff --git a/lib/Target/X86/X86TargetMachine.h b/lib/Target/X86/X86TargetMachine.h index e9148b5..61e4451 100644 --- a/lib/Target/X86/X86TargetMachine.h +++ b/lib/Target/X86/X86TargetMachine.h @@ -63,6 +63,7 @@ public: // Set up the pass pipeline. virtual bool addInstSelector(FunctionPassManager &PM, bool Fast); virtual bool addPostRegAlloc(FunctionPassManager &PM, bool Fast); + virtual bool addPreEmitPass(FunctionPassManager &PM, bool Fast); virtual bool addAssemblyEmitter(FunctionPassManager &PM, bool Fast, std::ostream &Out); virtual bool addCodeEmitter(FunctionPassManager &PM, bool Fast, |