blob: cf45c8fe47b1494a81535814e38ff7a110f5a231 [file] [log] [blame]
Nick Lewyckyf7a3c502010-09-07 18:14:24 +00001//===-- PTXTargetMachine.cpp - Define TargetMachine for PTX ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Top-level implementation for the PTX target.
11//
12//===----------------------------------------------------------------------===//
13
14#include "PTX.h"
15#include "PTXTargetMachine.h"
Eric Christopher50880d02010-09-18 18:52:28 +000016#include "llvm/PassManager.h"
Justin Holewinski40466cc2011-09-22 16:45:37 +000017#include "llvm/Analysis/Passes.h"
18#include "llvm/Analysis/Verifier.h"
19#include "llvm/Assembly/PrintModulePass.h"
20#include "llvm/ADT/OwningPtr.h"
21#include "llvm/CodeGen/AsmPrinter.h"
22#include "llvm/CodeGen/MachineFunctionAnalysis.h"
23#include "llvm/CodeGen/MachineModuleInfo.h"
24#include "llvm/CodeGen/Passes.h"
25#include "llvm/MC/MCAsmInfo.h"
26#include "llvm/MC/MCInstrInfo.h"
27#include "llvm/MC/MCStreamer.h"
28#include "llvm/MC/MCSubtargetInfo.h"
Evan Cheng3e74d6f2011-08-24 18:08:43 +000029#include "llvm/Support/TargetRegistry.h"
Che-Liang Chiouf48817c2011-03-02 07:36:48 +000030#include "llvm/Support/raw_ostream.h"
Justin Holewinski40466cc2011-09-22 16:45:37 +000031#include "llvm/Target/TargetData.h"
32#include "llvm/Target/TargetInstrInfo.h"
33#include "llvm/Target/TargetLowering.h"
34#include "llvm/Target/TargetLoweringObjectFile.h"
35#include "llvm/Target/TargetMachine.h"
36#include "llvm/Target/TargetOptions.h"
37#include "llvm/Target/TargetRegisterInfo.h"
38#include "llvm/Target/TargetSubtargetInfo.h"
39#include "llvm/Transforms/Scalar.h"
40#include "llvm/Support/Debug.h"
41#include "llvm/Support/TargetRegistry.h"
42
Nick Lewyckyf7a3c502010-09-07 18:14:24 +000043
44using namespace llvm;
45
Rafael Espindolaa484f2c2010-11-28 14:48:34 +000046namespace llvm {
47 MCStreamer *createPTXAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
Rafael Espindola89b93722010-12-10 07:39:47 +000048 bool isVerboseAsm, bool useLoc,
Nick Lewycky44d798d2011-10-17 23:05:28 +000049 bool useCFI, bool useDwarfDirectory,
Rafael Espindolaa484f2c2010-11-28 14:48:34 +000050 MCInstPrinter *InstPrint,
51 MCCodeEmitter *CE,
Evan Cheng78c10ee2011-07-25 23:24:55 +000052 MCAsmBackend *MAB,
Bill Wendlinge266ce62011-06-17 20:55:01 +000053 bool ShowInst);
Rafael Espindolaa484f2c2010-11-28 14:48:34 +000054}
55
Eric Christopher50880d02010-09-18 18:52:28 +000056extern "C" void LLVMInitializePTXTarget() {
Justin Holewinskie1fee482011-04-20 15:37:17 +000057
58 RegisterTargetMachine<PTX32TargetMachine> X(ThePTX32Target);
59 RegisterTargetMachine<PTX64TargetMachine> Y(ThePTX64Target);
60
Justin Holewinskie1fee482011-04-20 15:37:17 +000061 TargetRegistry::RegisterAsmStreamer(ThePTX32Target, createPTXAsmStreamer);
62 TargetRegistry::RegisterAsmStreamer(ThePTX64Target, createPTXAsmStreamer);
Nick Lewyckyf7a3c502010-09-07 18:14:24 +000063}
64
Che-Liang Chiouf48817c2011-03-02 07:36:48 +000065namespace {
Che-Liang Chiou31c488c2011-03-02 07:58:46 +000066 const char* DataLayout32 =
67 "e-p:32:32-i64:32:32-f64:32:32-v128:32:128-v64:32:64-n32:64";
68 const char* DataLayout64 =
69 "e-p:64:64-i64:32:32-f64:32:32-v128:32:128-v64:32:64-n32:64";
Che-Liang Chiouf48817c2011-03-02 07:36:48 +000070}
71
Anton Korobeynikov16c29b52011-01-10 12:39:04 +000072// DataLayout and FrameLowering are filled with dummy data
Nick Lewyckyf7a3c502010-09-07 18:14:24 +000073PTXTargetMachine::PTXTargetMachine(const Target &T,
Evan Cheng34ad6db2011-07-20 07:51:56 +000074 StringRef TT, StringRef CPU, StringRef FS,
Nick Lewycky8a8d4792011-12-02 22:16:29 +000075 const TargetOptions &Options,
Evan Cheng34ad6db2011-07-20 07:51:56 +000076 Reloc::Model RM, CodeModel::Model CM,
Evan Chengb95fc312011-11-16 08:38:26 +000077 CodeGenOpt::Level OL,
Evan Cheng34ad6db2011-07-20 07:51:56 +000078 bool is64Bit)
Nick Lewycky8a8d4792011-12-02 22:16:29 +000079 : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
Justin Holewinskie1fee482011-04-20 15:37:17 +000080 DataLayout(is64Bit ? DataLayout64 : DataLayout32),
Evan Cheng276365d2011-06-30 01:53:36 +000081 Subtarget(TT, CPU, FS, is64Bit),
Anton Korobeynikov16c29b52011-01-10 12:39:04 +000082 FrameLowering(Subtarget),
Che-Liang Chiou31c488c2011-03-02 07:58:46 +000083 InstrInfo(*this),
Justin Holewinskibc97f442011-09-26 18:57:27 +000084 TSInfo(*this),
Che-Liang Chiou31c488c2011-03-02 07:58:46 +000085 TLInfo(*this) {
Eric Christopher50880d02010-09-18 18:52:28 +000086}
87
David Blaikie2d24e2a2011-12-20 02:50:00 +000088void PTX32TargetMachine::anchor() { }
89
Evan Cheng43966132011-07-19 06:37:02 +000090PTX32TargetMachine::PTX32TargetMachine(const Target &T, StringRef TT,
91 StringRef CPU, StringRef FS,
Nick Lewycky8a8d4792011-12-02 22:16:29 +000092 const TargetOptions &Options,
Evan Chengb95fc312011-11-16 08:38:26 +000093 Reloc::Model RM, CodeModel::Model CM,
94 CodeGenOpt::Level OL)
Nick Lewycky8a8d4792011-12-02 22:16:29 +000095 : PTXTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) {
Justin Holewinskie1fee482011-04-20 15:37:17 +000096}
97
David Blaikie2d24e2a2011-12-20 02:50:00 +000098void PTX64TargetMachine::anchor() { }
99
Evan Cheng43966132011-07-19 06:37:02 +0000100PTX64TargetMachine::PTX64TargetMachine(const Target &T, StringRef TT,
101 StringRef CPU, StringRef FS,
Nick Lewycky8a8d4792011-12-02 22:16:29 +0000102 const TargetOptions &Options,
Evan Chengb95fc312011-11-16 08:38:26 +0000103 Reloc::Model RM, CodeModel::Model CM,
104 CodeGenOpt::Level OL)
Nick Lewycky8a8d4792011-12-02 22:16:29 +0000105 : PTXTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {
Justin Holewinskie1fee482011-04-20 15:37:17 +0000106}
107
Andrew Trick843ee2e2012-02-03 05:12:41 +0000108namespace {
109/// PTX Code Generator Pass Configuration Options.
110class PTXPassConfig : public TargetPassConfig {
111public:
112 PTXPassConfig(PTXTargetMachine *TM, PassManagerBase &PM, bool DisableVerifyFlag)
113 : TargetPassConfig(TM, PM, DisableVerifyFlag) {}
114
115 PTXTargetMachine &getPTXTargetMachine() const {
116 return getTM<PTXTargetMachine>();
117 }
118
119 bool addInstSelector();
120 bool addPostRegAlloc();
121 bool addCodeGenPasses(MCContext *&OutContext);
122};
123} // namespace
124
125TargetPassConfig *PTXTargetMachine::createPassConfig(PassManagerBase &PM,
126 bool DisableVerify) {
127 return new PTXPassConfig(this, PM, DisableVerify);
128}
129
130bool PTXPassConfig::addInstSelector() {
131 PM.add(createPTXISelDag(getPTXTargetMachine(), getOptLevel()));
Che-Liang Chiouad83c1d2011-01-01 10:50:37 +0000132 return false;
133}
134
Andrew Trick843ee2e2012-02-03 05:12:41 +0000135bool PTXPassConfig::addPostRegAlloc() {
Che-Liang Chiouad83c1d2011-01-01 10:50:37 +0000136 // PTXMFInfoExtract must after register allocation!
Andrew Trick843ee2e2012-02-03 05:12:41 +0000137 //PM.add(createPTXMFInfoExtract(getPTXTargetMachine()));
Eric Christopher50880d02010-09-18 18:52:28 +0000138 return false;
Nick Lewyckyf7a3c502010-09-07 18:14:24 +0000139}
Justin Holewinski40466cc2011-09-22 16:45:37 +0000140
141bool PTXTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
142 formatted_raw_ostream &Out,
143 CodeGenFileType FileType,
Justin Holewinski40466cc2011-09-22 16:45:37 +0000144 bool DisableVerify) {
145 // This is mostly based on LLVMTargetMachine::addPassesToEmitFile
146
147 // Add common CodeGen passes.
148 MCContext *Context = 0;
Andrew Trick843ee2e2012-02-03 05:12:41 +0000149 OwningPtr<TargetPassConfig> PassConfig(createPassConfig(PM, DisableVerify));
150 if (PassConfig->addCodeGenPasses(Context))
Justin Holewinski40466cc2011-09-22 16:45:37 +0000151 return true;
152 assert(Context != 0 && "Failed to get MCContext");
153
154 if (hasMCSaveTempLabels())
155 Context->setAllowTemporaryLabels(false);
156
157 const MCAsmInfo &MAI = *getMCAsmInfo();
158 const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();
159 OwningPtr<MCStreamer> AsmStreamer;
160
161 switch (FileType) {
Justin Holewinski40466cc2011-09-22 16:45:37 +0000162 case CGFT_AssemblyFile: {
163 MCInstPrinter *InstPrinter =
164 getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI, STI);
165
166 // Create a code emitter if asked to show the encoding.
167 MCCodeEmitter *MCE = 0;
168 MCAsmBackend *MAB = 0;
169
170 MCStreamer *S = getTarget().createAsmStreamer(*Context, Out,
171 true, /* verbose asm */
172 hasMCUseLoc(),
173 hasMCUseCFI(),
Nick Lewycky44d798d2011-10-17 23:05:28 +0000174 hasMCUseDwarfDirectory(),
Justin Holewinski40466cc2011-09-22 16:45:37 +0000175 InstPrinter,
176 MCE, MAB,
177 false /* show MC encoding */);
178 AsmStreamer.reset(S);
179 break;
180 }
181 case CGFT_ObjectFile: {
182 llvm_unreachable("Object file emission is not supported with PTX");
183 }
184 case CGFT_Null:
185 // The Null output is intended for use for performance analysis and testing,
186 // not real users.
187 AsmStreamer.reset(createNullStreamer(*Context));
188 break;
189 }
190
Justin Holewinski40466cc2011-09-22 16:45:37 +0000191 // Create the AsmPrinter, which takes ownership of AsmStreamer if successful.
192 FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer);
193 if (Printer == 0)
194 return true;
195
196 // If successful, createAsmPrinter took ownership of AsmStreamer.
197 AsmStreamer.take();
198
199 PM.add(Printer);
200
201 PM.add(createGCInfoDeleter());
202 return false;
203}
204
Andrew Trick843ee2e2012-02-03 05:12:41 +0000205bool PTXPassConfig::addCodeGenPasses(MCContext *&OutContext) {
Justin Holewinski40466cc2011-09-22 16:45:37 +0000206 // Add standard LLVM codegen passes.
207 // This is derived from LLVMTargetMachine::addCommonCodeGenPasses, with some
208 // modifications for the PTX target.
209
210 // Standard LLVM-Level Passes.
211
212 // Basic AliasAnalysis support.
213 // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that
214 // BasicAliasAnalysis wins if they disagree. This is intended to help
215 // support "obvious" type-punning idioms.
216 PM.add(createTypeBasedAliasAnalysisPass());
217 PM.add(createBasicAliasAnalysisPass());
218
219 // Before running any passes, run the verifier to determine if the input
220 // coming from the front-end and/or optimizer is valid.
221 if (!DisableVerify)
222 PM.add(createVerifierPass());
223
224 // Run loop strength reduction before anything else.
Evan Chengb95fc312011-11-16 08:38:26 +0000225 if (getOptLevel() != CodeGenOpt::None) {
Justin Holewinski40466cc2011-09-22 16:45:37 +0000226 PM.add(createLoopStrengthReducePass(getTargetLowering()));
227 //PM.add(createPrintFunctionPass("\n\n*** Code after LSR ***\n", &dbgs()));
228 }
229
230 PM.add(createGCLoweringPass());
231
232 // Make sure that no unreachable blocks are instruction selected.
233 PM.add(createUnreachableBlockEliminationPass());
234
235 PM.add(createLowerInvokePass(getTargetLowering()));
236 // The lower invoke pass may create unreachable code. Remove it.
237 PM.add(createUnreachableBlockEliminationPass());
238
Evan Chengb95fc312011-11-16 08:38:26 +0000239 if (getOptLevel() != CodeGenOpt::None)
Justin Holewinski40466cc2011-09-22 16:45:37 +0000240 PM.add(createCodeGenPreparePass(getTargetLowering()));
241
242 PM.add(createStackProtectorPass(getTargetLowering()));
243
Andrew Trick843ee2e2012-02-03 05:12:41 +0000244 addPreISel();
Justin Holewinski40466cc2011-09-22 16:45:37 +0000245
246 //PM.add(createPrintFunctionPass("\n\n"
247 // "*** Final LLVM Code input to ISel ***\n",
248 // &dbgs()));
249
250 // All passes which modify the LLVM IR are now complete; run the verifier
251 // to ensure that the IR is valid.
252 if (!DisableVerify)
253 PM.add(createVerifierPass());
254
255 // Standard Lower-Level Passes.
256
257 // Install a MachineModuleInfo class, which is an immutable pass that holds
258 // all the per-module stuff we're generating, including MCContext.
Andrew Trick843ee2e2012-02-03 05:12:41 +0000259 MachineModuleInfo *MMI = new MachineModuleInfo(*TM->getMCAsmInfo(),
260 *TM->getRegisterInfo(),
Justin Holewinski05591be2011-09-22 16:45:43 +0000261 &getTargetLowering()->getObjFileLowering());
Justin Holewinski40466cc2011-09-22 16:45:37 +0000262 PM.add(MMI);
263 OutContext = &MMI->getContext(); // Return the MCContext specifically by-ref.
264
265 // Set up a MachineFunction for the rest of CodeGen to work on.
Andrew Trick843ee2e2012-02-03 05:12:41 +0000266 PM.add(new MachineFunctionAnalysis(*TM));
Justin Holewinski40466cc2011-09-22 16:45:37 +0000267
268 // Ask the target for an isel.
Andrew Trick843ee2e2012-02-03 05:12:41 +0000269 if (addInstSelector())
Justin Holewinski40466cc2011-09-22 16:45:37 +0000270 return true;
271
272 // Print the instruction selected machine code...
Andrew Trick843ee2e2012-02-03 05:12:41 +0000273 printAndVerify("After Instruction Selection");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000274
275 // Expand pseudo-instructions emitted by ISel.
276 PM.add(createExpandISelPseudosPass());
277
278 // Pre-ra tail duplication.
Evan Chengb95fc312011-11-16 08:38:26 +0000279 if (getOptLevel() != CodeGenOpt::None) {
Justin Holewinski40466cc2011-09-22 16:45:37 +0000280 PM.add(createTailDuplicatePass(true));
Andrew Trick843ee2e2012-02-03 05:12:41 +0000281 printAndVerify("After Pre-RegAlloc TailDuplicate");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000282 }
283
284 // Optimize PHIs before DCE: removing dead PHI cycles may make more
285 // instructions dead.
Evan Chengb95fc312011-11-16 08:38:26 +0000286 if (getOptLevel() != CodeGenOpt::None)
Justin Holewinski40466cc2011-09-22 16:45:37 +0000287 PM.add(createOptimizePHIsPass());
288
289 // If the target requests it, assign local variables to stack slots relative
290 // to one another and simplify frame index references where possible.
291 PM.add(createLocalStackSlotAllocationPass());
292
Evan Chengb95fc312011-11-16 08:38:26 +0000293 if (getOptLevel() != CodeGenOpt::None) {
Justin Holewinski40466cc2011-09-22 16:45:37 +0000294 // With optimization, dead code should already be eliminated. However
295 // there is one known exception: lowered code for arguments that are only
296 // used by tail calls, where the tail calls reuse the incoming stack
297 // arguments directly (see t11 in test/CodeGen/X86/sibcall.ll).
298 PM.add(createDeadMachineInstructionElimPass());
Andrew Trick843ee2e2012-02-03 05:12:41 +0000299 printAndVerify("After codegen DCE pass");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000300
301 PM.add(createMachineLICMPass());
302 PM.add(createMachineCSEPass());
303 PM.add(createMachineSinkingPass());
Andrew Trick843ee2e2012-02-03 05:12:41 +0000304 printAndVerify("After Machine LICM, CSE and Sinking passes");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000305
306 PM.add(createPeepholeOptimizerPass());
Andrew Trick843ee2e2012-02-03 05:12:41 +0000307 printAndVerify("After codegen peephole optimization pass");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000308 }
309
310 // Run pre-ra passes.
Andrew Trick843ee2e2012-02-03 05:12:41 +0000311 if (addPreRegAlloc())
312 printAndVerify("After PreRegAlloc passes");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000313
314 // Perform register allocation.
315 PM.add(createPTXRegisterAllocator());
Andrew Trick843ee2e2012-02-03 05:12:41 +0000316 printAndVerify("After Register Allocation");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000317
318 // Perform stack slot coloring and post-ra machine LICM.
Evan Chengb95fc312011-11-16 08:38:26 +0000319 if (getOptLevel() != CodeGenOpt::None) {
Justin Holewinski40466cc2011-09-22 16:45:37 +0000320 // FIXME: Re-enable coloring with register when it's capable of adding
321 // kill markers.
322 PM.add(createStackSlotColoringPass(false));
323
324 // FIXME: Post-RA LICM has asserts that fire on virtual registers.
325 // Run post-ra machine LICM to hoist reloads / remats.
326 //if (!DisablePostRAMachineLICM)
327 // PM.add(createMachineLICMPass(false));
328
Andrew Trick843ee2e2012-02-03 05:12:41 +0000329 printAndVerify("After StackSlotColoring and postra Machine LICM");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000330 }
331
332 // Run post-ra passes.
Andrew Trick843ee2e2012-02-03 05:12:41 +0000333 if (addPostRegAlloc())
334 printAndVerify("After PostRegAlloc passes");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000335
Jakob Stoklund Olesen74e2d6e2011-09-25 16:46:08 +0000336 PM.add(createExpandPostRAPseudosPass());
Andrew Trick843ee2e2012-02-03 05:12:41 +0000337 printAndVerify("After ExpandPostRAPseudos");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000338
339 // Insert prolog/epilog code. Eliminate abstract frame index references...
340 PM.add(createPrologEpilogCodeInserter());
Andrew Trick843ee2e2012-02-03 05:12:41 +0000341 printAndVerify("After PrologEpilogCodeInserter");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000342
343 // Run pre-sched2 passes.
Andrew Trick843ee2e2012-02-03 05:12:41 +0000344 if (addPreSched2())
345 printAndVerify("After PreSched2 passes");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000346
347 // Second pass scheduler.
Evan Chengb95fc312011-11-16 08:38:26 +0000348 if (getOptLevel() != CodeGenOpt::None) {
349 PM.add(createPostRAScheduler(getOptLevel()));
Andrew Trick843ee2e2012-02-03 05:12:41 +0000350 printAndVerify("After PostRAScheduler");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000351 }
352
353 // Branch folding must be run after regalloc and prolog/epilog insertion.
Evan Chengb95fc312011-11-16 08:38:26 +0000354 if (getOptLevel() != CodeGenOpt::None) {
Justin Holewinski40466cc2011-09-22 16:45:37 +0000355 PM.add(createBranchFoldingPass(getEnableTailMergeDefault()));
Andrew Trick843ee2e2012-02-03 05:12:41 +0000356 printNoVerify("After BranchFolding");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000357 }
358
359 // Tail duplication.
Evan Chengb95fc312011-11-16 08:38:26 +0000360 if (getOptLevel() != CodeGenOpt::None) {
Justin Holewinski40466cc2011-09-22 16:45:37 +0000361 PM.add(createTailDuplicatePass(false));
Andrew Trick843ee2e2012-02-03 05:12:41 +0000362 printNoVerify("After TailDuplicate");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000363 }
364
365 PM.add(createGCMachineCodeAnalysisPass());
366
367 //if (PrintGCInfo)
368 // PM.add(createGCInfoPrinter(dbgs()));
369
Evan Chengb95fc312011-11-16 08:38:26 +0000370 if (getOptLevel() != CodeGenOpt::None) {
Justin Holewinski40466cc2011-09-22 16:45:37 +0000371 PM.add(createCodePlacementOptPass());
Andrew Trick843ee2e2012-02-03 05:12:41 +0000372 printNoVerify("After CodePlacementOpt");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000373 }
374
Andrew Trick843ee2e2012-02-03 05:12:41 +0000375 if (addPreEmitPass())
376 printNoVerify("After PreEmit passes");
Justin Holewinski40466cc2011-09-22 16:45:37 +0000377
Andrew Trick843ee2e2012-02-03 05:12:41 +0000378 PM.add(createPTXMFInfoExtract(getPTXTargetMachine(), getOptLevel()));
379 PM.add(createPTXFPRoundingModePass(getPTXTargetMachine(), getOptLevel()));
Justin Holewinski6b8990d2011-09-26 16:20:25 +0000380
Justin Holewinski40466cc2011-09-22 16:45:37 +0000381 return false;
382}