119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===-- PTXTargetMachine.cpp - Define TargetMachine for PTX ---------------===// 219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// The LLVM Compiler Infrastructure 419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source 619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details. 719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// Top-level implementation for the PTX target. 1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "PTX.h" 1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "PTXTargetMachine.h" 1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/PassManager.h" 1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Analysis/Passes.h" 1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Analysis/Verifier.h" 1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Assembly/PrintModulePass.h" 2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/OwningPtr.h" 2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/AsmPrinter.h" 2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/MachineFunctionAnalysis.h" 2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/MachineModuleInfo.h" 2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/Passes.h" 2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCAsmInfo.h" 2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCInstrInfo.h" 2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCStreamer.h" 2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSubtargetInfo.h" 2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/TargetRegistry.h" 3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/raw_ostream.h" 3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetData.h" 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetInstrInfo.h" 3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetLowering.h" 3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetLoweringObjectFile.h" 3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetMachine.h" 3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetOptions.h" 3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetRegisterInfo.h" 3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetSubtargetInfo.h" 3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Transforms/Scalar.h" 4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/Debug.h" 4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/TargetRegistry.h" 4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm; 4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm { 4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCStreamer *createPTXAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool isVerboseAsm, bool useLoc, 4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool useCFI, 5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCInstPrinter *InstPrint, 5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCCodeEmitter *CE, 5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCAsmBackend *MAB, 5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool ShowInst); 5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanextern "C" void LLVMInitializePTXTarget() { 5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman RegisterTargetMachine<PTX32TargetMachine> X(ThePTX32Target); 5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman RegisterTargetMachine<PTX64TargetMachine> Y(ThePTX64Target); 6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TargetRegistry::RegisterAsmStreamer(ThePTX32Target, createPTXAsmStreamer); 6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TargetRegistry::RegisterAsmStreamer(ThePTX64Target, createPTXAsmStreamer); 6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace { 6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const char* DataLayout32 = 6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "e-p:32:32-i64:32:32-f64:32:32-v128:32:128-v64:32:64-n32:64"; 6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const char* DataLayout64 = 6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "e-p:64:64-i64:32:32-f64:32:32-v128:32:128-v64:32:64-n32:64"; 7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Copied from LLVMTargetMachine.cpp 7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void printNoVerify(PassManagerBase &PM, const char *Banner) { 7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (PrintMachineCode) 7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createMachineFunctionPrinterPass(dbgs(), Banner)); 7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void printAndVerify(PassManagerBase &PM, 7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const char *Banner) { 7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (PrintMachineCode) 8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createMachineFunctionPrinterPass(dbgs(), Banner)); 8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman //if (VerifyMachineCode) 8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // PM.add(createMachineVerifierPass(Banner)); 8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// DataLayout and FrameLowering are filled with dummy data 8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanPTXTargetMachine::PTXTargetMachine(const Target &T, 8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StringRef TT, StringRef CPU, StringRef FS, 9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Reloc::Model RM, CodeModel::Model CM, 9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool is64Bit) 9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : LLVMTargetMachine(T, TT, CPU, FS, RM, CM), 9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman DataLayout(is64Bit ? DataLayout64 : DataLayout32), 9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Subtarget(TT, CPU, FS, is64Bit), 9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman FrameLowering(Subtarget), 9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman InstrInfo(*this), 9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TSInfo(*this), 9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TLInfo(*this) { 9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanPTX32TargetMachine::PTX32TargetMachine(const Target &T, StringRef TT, 10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StringRef CPU, StringRef FS, 10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Reloc::Model RM, CodeModel::Model CM) 10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : PTXTargetMachine(T, TT, CPU, FS, RM, CM, false) { 10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanPTX64TargetMachine::PTX64TargetMachine(const Target &T, StringRef TT, 10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StringRef CPU, StringRef FS, 10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Reloc::Model RM, CodeModel::Model CM) 11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : PTXTargetMachine(T, TT, CPU, FS, RM, CM, true) { 11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool PTXTargetMachine::addInstSelector(PassManagerBase &PM, 11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman CodeGenOpt::Level OptLevel) { 11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createPTXISelDag(*this, OptLevel)); 11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool PTXTargetMachine::addPostRegAlloc(PassManagerBase &PM, 12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman CodeGenOpt::Level OptLevel) { 12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // PTXMFInfoExtract must after register allocation! 12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman //PM.add(createPTXMFInfoExtract(*this, OptLevel)); 12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 12419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 12519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool PTXTargetMachine::addPassesToEmitFile(PassManagerBase &PM, 12719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman formatted_raw_ostream &Out, 12819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman CodeGenFileType FileType, 12919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman CodeGenOpt::Level OptLevel, 13019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool DisableVerify) { 13119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // This is mostly based on LLVMTargetMachine::addPassesToEmitFile 13219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 13319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Add common CodeGen passes. 13419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCContext *Context = 0; 13519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (addCommonCodeGenPasses(PM, OptLevel, DisableVerify, Context)) 13619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 13719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(Context != 0 && "Failed to get MCContext"); 13819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 13919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (hasMCSaveTempLabels()) 14019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Context->setAllowTemporaryLabels(false); 14119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 14219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCAsmInfo &MAI = *getMCAsmInfo(); 14319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); 14419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman OwningPtr<MCStreamer> AsmStreamer; 14519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman switch (FileType) { 14719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman default: return true; 14819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case CGFT_AssemblyFile: { 14919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCInstPrinter *InstPrinter = 15019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI, STI); 15119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 15219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Create a code emitter if asked to show the encoding. 15319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCCodeEmitter *MCE = 0; 15419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCAsmBackend *MAB = 0; 15519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 15619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCStreamer *S = getTarget().createAsmStreamer(*Context, Out, 15719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman true, /* verbose asm */ 15819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman hasMCUseLoc(), 15919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman hasMCUseCFI(), 16019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman InstPrinter, 16119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCE, MAB, 16219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman false /* show MC encoding */); 16319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman AsmStreamer.reset(S); 16419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman break; 16519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 16619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case CGFT_ObjectFile: { 16719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman llvm_unreachable("Object file emission is not supported with PTX"); 16819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 16919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case CGFT_Null: 17019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // The Null output is intended for use for performance analysis and testing, 17119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // not real users. 17219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman AsmStreamer.reset(createNullStreamer(*Context)); 17319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman break; 17419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 17519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // MC Logging 17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman //AsmStreamer.reset(createLoggingStreamer(AsmStreamer.take(), errs())); 17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer); 18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Printer == 0) 18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If successful, createAsmPrinter took ownership of AsmStreamer. 18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman AsmStreamer.take(); 18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(Printer); 18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 18919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createGCInfoDeleter()); 19019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 19119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 19219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 19319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool PTXTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM, 19419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman CodeGenOpt::Level OptLevel, 19519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool DisableVerify, 19619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCContext *&OutContext) { 19719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Add standard LLVM codegen passes. 19819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // This is derived from LLVMTargetMachine::addCommonCodeGenPasses, with some 19919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // modifications for the PTX target. 20019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 20119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Standard LLVM-Level Passes. 20219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 20319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Basic AliasAnalysis support. 20419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that 20519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // BasicAliasAnalysis wins if they disagree. This is intended to help 20619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // support "obvious" type-punning idioms. 20719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createTypeBasedAliasAnalysisPass()); 20819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createBasicAliasAnalysisPass()); 20919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 21019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Before running any passes, run the verifier to determine if the input 21119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // coming from the front-end and/or optimizer is valid. 21219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!DisableVerify) 21319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createVerifierPass()); 21419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 21519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Run loop strength reduction before anything else. 21619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (OptLevel != CodeGenOpt::None) { 21719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createLoopStrengthReducePass(getTargetLowering())); 21819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman //PM.add(createPrintFunctionPass("\n\n*** Code after LSR ***\n", &dbgs())); 21919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 22019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 22119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createGCLoweringPass()); 22219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 22319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Make sure that no unreachable blocks are instruction selected. 22419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createUnreachableBlockEliminationPass()); 22519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 22619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createLowerInvokePass(getTargetLowering())); 22719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // The lower invoke pass may create unreachable code. Remove it. 22819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createUnreachableBlockEliminationPass()); 22919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 23019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (OptLevel != CodeGenOpt::None) 23119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createCodeGenPreparePass(getTargetLowering())); 23219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 23319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createStackProtectorPass(getTargetLowering())); 23419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 23519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman addPreISel(PM, OptLevel); 23619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 23719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman //PM.add(createPrintFunctionPass("\n\n" 23819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // "*** Final LLVM Code input to ISel ***\n", 23919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // &dbgs())); 24019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 24119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // All passes which modify the LLVM IR are now complete; run the verifier 24219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // to ensure that the IR is valid. 24319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!DisableVerify) 24419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createVerifierPass()); 24519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 24619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Standard Lower-Level Passes. 24719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 24819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Install a MachineModuleInfo class, which is an immutable pass that holds 24919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // all the per-module stuff we're generating, including MCContext. 25019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineModuleInfo *MMI = new MachineModuleInfo(*getMCAsmInfo(), 25119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman *getRegisterInfo(), 25219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman &getTargetLowering()->getObjFileLowering()); 25319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(MMI); 25419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman OutContext = &MMI->getContext(); // Return the MCContext specifically by-ref. 25519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 25619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Set up a MachineFunction for the rest of CodeGen to work on. 25719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(new MachineFunctionAnalysis(*this, OptLevel)); 25819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 25919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Ask the target for an isel. 26019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (addInstSelector(PM, OptLevel)) 26119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 26219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 26319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Print the instruction selected machine code... 26419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After Instruction Selection"); 26519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 26619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Expand pseudo-instructions emitted by ISel. 26719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createExpandISelPseudosPass()); 26819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 26919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Pre-ra tail duplication. 27019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (OptLevel != CodeGenOpt::None) { 27119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createTailDuplicatePass(true)); 27219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After Pre-RegAlloc TailDuplicate"); 27319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 27419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 27519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Optimize PHIs before DCE: removing dead PHI cycles may make more 27619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // instructions dead. 27719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (OptLevel != CodeGenOpt::None) 27819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createOptimizePHIsPass()); 27919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 28019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If the target requests it, assign local variables to stack slots relative 28119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // to one another and simplify frame index references where possible. 28219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createLocalStackSlotAllocationPass()); 28319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 28419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (OptLevel != CodeGenOpt::None) { 28519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // With optimization, dead code should already be eliminated. However 28619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // there is one known exception: lowered code for arguments that are only 28719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // used by tail calls, where the tail calls reuse the incoming stack 28819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // arguments directly (see t11 in test/CodeGen/X86/sibcall.ll). 28919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createDeadMachineInstructionElimPass()); 29019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After codegen DCE pass"); 29119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 29219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createMachineLICMPass()); 29319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createMachineCSEPass()); 29419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createMachineSinkingPass()); 29519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After Machine LICM, CSE and Sinking passes"); 29619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 29719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createPeepholeOptimizerPass()); 29819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After codegen peephole optimization pass"); 29919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 30019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 30119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Run pre-ra passes. 30219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (addPreRegAlloc(PM, OptLevel)) 30319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After PreRegAlloc passes"); 30419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 30519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Perform register allocation. 30619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createPTXRegisterAllocator()); 30719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After Register Allocation"); 30819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 30919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Perform stack slot coloring and post-ra machine LICM. 31019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (OptLevel != CodeGenOpt::None) { 31119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // FIXME: Re-enable coloring with register when it's capable of adding 31219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // kill markers. 31319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createStackSlotColoringPass(false)); 31419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 31519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // FIXME: Post-RA LICM has asserts that fire on virtual registers. 31619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Run post-ra machine LICM to hoist reloads / remats. 31719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman //if (!DisablePostRAMachineLICM) 31819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // PM.add(createMachineLICMPass(false)); 31919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 32019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After StackSlotColoring and postra Machine LICM"); 32119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 32219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 32319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Run post-ra passes. 32419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (addPostRegAlloc(PM, OptLevel)) 32519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After PostRegAlloc passes"); 32619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 32719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createExpandPostRAPseudosPass()); 32819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After ExpandPostRAPseudos"); 32919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 33019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Insert prolog/epilog code. Eliminate abstract frame index references... 33119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createPrologEpilogCodeInserter()); 33219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After PrologEpilogCodeInserter"); 33319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 33419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Run pre-sched2 passes. 33519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (addPreSched2(PM, OptLevel)) 33619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After PreSched2 passes"); 33719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 33819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Second pass scheduler. 33919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (OptLevel != CodeGenOpt::None) { 34019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createPostRAScheduler(OptLevel)); 34119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printAndVerify(PM, "After PostRAScheduler"); 34219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 34319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 34419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Branch folding must be run after regalloc and prolog/epilog insertion. 34519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (OptLevel != CodeGenOpt::None) { 34619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createBranchFoldingPass(getEnableTailMergeDefault())); 34719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printNoVerify(PM, "After BranchFolding"); 34819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 34919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 35019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Tail duplication. 35119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (OptLevel != CodeGenOpt::None) { 35219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createTailDuplicatePass(false)); 35319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printNoVerify(PM, "After TailDuplicate"); 35419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 35519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 35619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createGCMachineCodeAnalysisPass()); 35719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 35819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman //if (PrintGCInfo) 35919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // PM.add(createGCInfoPrinter(dbgs())); 36019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 36119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (OptLevel != CodeGenOpt::None) { 36219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createCodePlacementOptPass()); 36319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printNoVerify(PM, "After CodePlacementOpt"); 36419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 36519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 36619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (addPreEmitPass(PM, OptLevel)) 36719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman printNoVerify(PM, "After PreEmit passes"); 36819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 36919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createPTXMFInfoExtract(*this, OptLevel)); 37019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PM.add(createPTXFPRoundingModePass(*this, OptLevel)); 37119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 37219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 37319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 374