annotate lib/Target/NVPTX/NVPTXTargetMachine.cpp @ 131:f476a9ba4795

http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
author mir3636
date Fri, 16 Feb 2018 21:02:11 +0900
parents 803732b1fca8
children 3a76565eade5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===-- NVPTXTargetMachine.cpp - Define TargetMachine for NVPTX -----------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // Top-level implementation for the NVPTX target.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 #include "NVPTXTargetMachine.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 #include "NVPTX.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 #include "NVPTXAllocaHoisting.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 #include "NVPTXLowerAggrCopies.h"
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
18 #include "NVPTXTargetObjectFile.h"
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
19 #include "NVPTXTargetTransformInfo.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
20 #include "llvm/ADT/STLExtras.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
21 #include "llvm/ADT/Triple.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
22 #include "llvm/Analysis/TargetTransformInfo.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 #include "llvm/CodeGen/Passes.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
24 #include "llvm/CodeGen/TargetPassConfig.h"
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
25 #include "llvm/IR/LegacyPassManager.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
26 #include "llvm/Pass.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 #include "llvm/Support/CommandLine.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 #include "llvm/Support/TargetRegistry.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 #include "llvm/Target/TargetMachine.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 #include "llvm/Target/TargetOptions.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
31 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 #include "llvm/Transforms/Scalar.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
33 #include "llvm/Transforms/Scalar/GVN.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
34 #include "llvm/Transforms/Vectorize.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
35 #include <cassert>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
36 #include <string>
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 using namespace llvm;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
40 // LSV is still relatively new; this switch lets us turn it off in case we
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
41 // encounter (or suspect) a bug.
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
42 static cl::opt<bool>
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
43 DisableLoadStoreVectorizer("disable-nvptx-load-store-vectorizer",
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
44 cl::desc("Disable load/store vectorizer"),
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
45 cl::init(false), cl::Hidden);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
46
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 namespace llvm {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
48
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
49 void initializeNVVMIntrRangePass(PassRegistry&);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 void initializeNVVMReflectPass(PassRegistry&);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 void initializeGenericToNVVMPass(PassRegistry&);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
52 void initializeNVPTXAllocaHoistingPass(PassRegistry &);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
53 void initializeNVPTXAssignValidGlobalNamesPass(PassRegistry&);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
54 void initializeNVPTXLowerAggrCopiesPass(PassRegistry &);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
55 void initializeNVPTXLowerArgsPass(PassRegistry &);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
56 void initializeNVPTXLowerAllocaPass(PassRegistry &);
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
57
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
58 } // end namespace llvm
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 extern "C" void LLVMInitializeNVPTXTarget() {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 // Register the target.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
62 RegisterTargetMachine<NVPTXTargetMachine32> X(getTheNVPTXTarget32());
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
63 RegisterTargetMachine<NVPTXTargetMachine64> Y(getTheNVPTXTarget64());
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 // FIXME: This pass is really intended to be invoked during IR optimization,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 // but it's very NVPTX-specific.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
67 PassRegistry &PR = *PassRegistry::getPassRegistry();
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
68 initializeNVVMReflectPass(PR);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
69 initializeNVVMIntrRangePass(PR);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
70 initializeGenericToNVVMPass(PR);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
71 initializeNVPTXAllocaHoistingPass(PR);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
72 initializeNVPTXAssignValidGlobalNamesPass(PR);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
73 initializeNVPTXLowerArgsPass(PR);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
74 initializeNVPTXLowerAllocaPass(PR);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
75 initializeNVPTXLowerAggrCopiesPass(PR);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
76 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
77
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
78 static std::string computeDataLayout(bool is64Bit) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
79 std::string Ret = "e";
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
80
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
81 if (!is64Bit)
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
82 Ret += "-p:32:32";
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
83
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
84 Ret += "-i64:64-i128:128-v16:16-v32:32-n16:32:64";
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
85
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
86 return Ret;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
89 static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
90 if (CM)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
91 return *CM;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
92 return CodeModel::Small;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
93 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
94
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
95 NVPTXTargetMachine::NVPTXTargetMachine(const Target &T, const Triple &TT,
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
96 StringRef CPU, StringRef FS,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
97 const TargetOptions &Options,
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
98 Optional<Reloc::Model> RM,
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
99 Optional<CodeModel::Model> CM,
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
100 CodeGenOpt::Level OL, bool is64bit)
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
101 // The pic relocation model is used regardless of what the client has
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
102 // specified, as it is the only relocation model currently supported.
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
103 : LLVMTargetMachine(T, computeDataLayout(is64bit), TT, CPU, FS, Options,
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
104 Reloc::PIC_, getEffectiveCodeModel(CM), OL),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
105 is64bit(is64bit), TLOF(llvm::make_unique<NVPTXTargetObjectFile>()),
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
106 Subtarget(TT, CPU, FS, *this) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
107 if (TT.getOS() == Triple::NVCL)
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
108 drvInterface = NVPTX::NVCL;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
109 else
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
110 drvInterface = NVPTX::CUDA;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 initAsmInfo();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
114 NVPTXTargetMachine::~NVPTXTargetMachine() = default;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
115
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 void NVPTXTargetMachine32::anchor() {}
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
118 NVPTXTargetMachine32::NVPTXTargetMachine32(const Target &T, const Triple &TT,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
119 StringRef CPU, StringRef FS,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
120 const TargetOptions &Options,
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
121 Optional<Reloc::Model> RM,
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
122 Optional<CodeModel::Model> CM,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
123 CodeGenOpt::Level OL, bool JIT)
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 : NVPTXTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) {}
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 void NVPTXTargetMachine64::anchor() {}
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
128 NVPTXTargetMachine64::NVPTXTargetMachine64(const Target &T, const Triple &TT,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
129 StringRef CPU, StringRef FS,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
130 const TargetOptions &Options,
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
131 Optional<Reloc::Model> RM,
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
132 Optional<CodeModel::Model> CM,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
133 CodeGenOpt::Level OL, bool JIT)
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 : NVPTXTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {}
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 namespace {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
137
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 class NVPTXPassConfig : public TargetPassConfig {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 public:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
140 NVPTXPassConfig(NVPTXTargetMachine &TM, PassManagerBase &PM)
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 : TargetPassConfig(TM, PM) {}
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 NVPTXTargetMachine &getNVPTXTargetMachine() const {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 return getTM<NVPTXTargetMachine>();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
147 void addIRPasses() override;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
148 bool addInstSelector() override;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
149 void addPostRegAlloc() override;
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
150 void addMachineSSAOptimization() override;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
152 FunctionPass *createTargetRegisterAllocator(bool) override;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
153 void addFastRegAlloc(FunctionPass *RegAllocPass) override;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
154 void addOptimizedRegAlloc(FunctionPass *RegAllocPass) override;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
155
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
156 private:
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
157 // If the opt level is aggressive, add GVN; otherwise, add EarlyCSE. This
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
158 // function is only called in opt mode.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
159 void addEarlyCSEOrGVNPass();
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
160
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
161 // Add passes that propagate special memory spaces.
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
162 void addAddressSpaceInferencePasses();
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
163
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
164 // Add passes that perform straight-line scalar optimizations.
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
165 void addStraightLineScalarOptimizationPasses();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 };
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
167
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 } // end anonymous namespace
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 TargetPassConfig *NVPTXTargetMachine::createPassConfig(PassManagerBase &PM) {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
171 return new NVPTXPassConfig(*this, PM);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
172 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
173
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
174 void NVPTXTargetMachine::adjustPassManager(PassManagerBuilder &Builder) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
175 Builder.addExtension(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
176 PassManagerBuilder::EP_EarlyAsPossible,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
177 [&](const PassManagerBuilder &, legacy::PassManagerBase &PM) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
178 PM.add(createNVVMReflectPass());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
179 PM.add(createNVVMIntrRangePass(Subtarget.getSmVersion()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
180 });
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
183 TargetIRAnalysis NVPTXTargetMachine::getTargetIRAnalysis() {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
184 return TargetIRAnalysis([this](const Function &F) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
185 return TargetTransformInfo(NVPTXTTIImpl(this, F));
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
186 });
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
187 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
188
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
189 void NVPTXPassConfig::addEarlyCSEOrGVNPass() {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
190 if (getOptLevel() == CodeGenOpt::Aggressive)
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
191 addPass(createGVNPass());
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
192 else
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
193 addPass(createEarlyCSEPass());
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
194 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
195
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
196 void NVPTXPassConfig::addAddressSpaceInferencePasses() {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
197 // NVPTXLowerArgs emits alloca for byval parameters which can often
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
198 // be eliminated by SROA.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
199 addPass(createSROAPass());
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
200 addPass(createNVPTXLowerAllocaPass());
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
201 addPass(createInferAddressSpacesPass());
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
202 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
203
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
204 void NVPTXPassConfig::addStraightLineScalarOptimizationPasses() {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
205 addPass(createSeparateConstOffsetFromGEPPass());
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
206 addPass(createSpeculativeExecutionPass());
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
207 // ReassociateGEPs exposes more opportunites for SLSR. See
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
208 // the example in reassociate-geps-and-slsr.ll.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
209 addPass(createStraightLineStrengthReducePass());
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
210 // SeparateConstOffsetFromGEP and SLSR creates common expressions which GVN or
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
211 // EarlyCSE can reuse. GVN generates significantly better code than EarlyCSE
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
212 // for some of our benchmarks.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
213 addEarlyCSEOrGVNPass();
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
214 // Run NaryReassociate after EarlyCSE/GVN to be more effective.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
215 addPass(createNaryReassociatePass());
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
216 // NaryReassociate on GEPs creates redundant common expressions, so run
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
217 // EarlyCSE after it.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
218 addPass(createEarlyCSEPass());
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
219 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
220
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
221 void NVPTXPassConfig::addIRPasses() {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
222 // The following passes are known to not play well with virtual regs hanging
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
223 // around after register allocation (which in our case, is *all* registers).
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
224 // We explicitly disable them here. We do, however, need some functionality
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
225 // of the PrologEpilogCodeInserter pass, so we emulate that behavior in the
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
226 // NVPTXPrologEpilog pass (see NVPTXPrologEpilogPass.cpp).
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
227 disablePass(&PrologEpilogCodeInserterID);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
228 disablePass(&MachineCopyPropagationID);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
229 disablePass(&TailDuplicateID);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
230 disablePass(&StackMapLivenessID);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
231 disablePass(&LiveDebugValuesID);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
232 disablePass(&PostRASchedulerID);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
233 disablePass(&FuncletLayoutID);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
234 disablePass(&PatchableFunctionID);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
235
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
236 // NVVMReflectPass is added in addEarlyAsPossiblePasses, so hopefully running
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
237 // it here does nothing. But since we need it for correctness when lowering
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
238 // to NVPTX, run it here too, in case whoever built our pass pipeline didn't
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
239 // call addEarlyAsPossiblePasses.
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
240 addPass(createNVVMReflectPass());
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
241
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
242 if (getOptLevel() != CodeGenOpt::None)
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
243 addPass(createNVPTXImageOptimizerPass());
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
244 addPass(createNVPTXAssignValidGlobalNamesPass());
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
245 addPass(createGenericToNVVMPass());
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
246
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
247 // NVPTXLowerArgs is required for correctness and should be run right
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
248 // before the address space inference passes.
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
249 addPass(createNVPTXLowerArgsPass(&getNVPTXTargetMachine()));
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
250 if (getOptLevel() != CodeGenOpt::None) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
251 addAddressSpaceInferencePasses();
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
252 if (!DisableLoadStoreVectorizer)
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
253 addPass(createLoadStoreVectorizerPass());
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
254 addStraightLineScalarOptimizationPasses();
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
255 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
256
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
257 // === LSR and other generic IR passes ===
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
258 TargetPassConfig::addIRPasses();
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
259 // EarlyCSE is not always strong enough to clean up what LSR produces. For
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
260 // example, GVN can combine
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
261 //
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
262 // %0 = add %a, %b
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
263 // %1 = add %b, %a
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
264 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
265 // and
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
266 //
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
267 // %0 = shl nsw %a, 2
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
268 // %1 = shl %a, 2
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
269 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
270 // but EarlyCSE can do neither of them.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
271 if (getOptLevel() != CodeGenOpt::None)
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
272 addEarlyCSEOrGVNPass();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
274
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 bool NVPTXPassConfig::addInstSelector() {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
276 const NVPTXSubtarget &ST = *getTM<NVPTXTargetMachine>().getSubtargetImpl();
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
277
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 addPass(createLowerAggrCopies());
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 addPass(createAllocaHoisting());
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 addPass(createNVPTXISelDag(getNVPTXTargetMachine(), getOptLevel()));
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
281
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
282 if (!ST.hasImageHandles())
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
283 addPass(createNVPTXReplaceImageHandlesPass());
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
284
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 return false;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
287
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
288 void NVPTXPassConfig::addPostRegAlloc() {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
289 addPass(createNVPTXPrologEpilogPass(), false);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
290 if (getOptLevel() != CodeGenOpt::None) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
291 // NVPTXPrologEpilogPass calculates frame object offset and replace frame
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
292 // index with VRFrame register. NVPTXPeephole need to be run after that and
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
293 // will replace VRFrame with VRFrameLocal when possible.
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
294 addPass(createNVPTXPeephole());
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
295 }
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
297
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 FunctionPass *NVPTXPassConfig::createTargetRegisterAllocator(bool) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
299 return nullptr; // No reg alloc
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
301
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 void NVPTXPassConfig::addFastRegAlloc(FunctionPass *RegAllocPass) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 assert(!RegAllocPass && "NVPTX uses no regalloc!");
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 addPass(&PHIEliminationID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 addPass(&TwoAddressInstructionPassID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
307
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 void NVPTXPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 assert(!RegAllocPass && "NVPTX uses no regalloc!");
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
310
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 addPass(&ProcessImplicitDefsID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 addPass(&LiveVariablesID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 addPass(&MachineLoopInfoID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 addPass(&PHIEliminationID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
315
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 addPass(&TwoAddressInstructionPassID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 addPass(&RegisterCoalescerID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
318
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 // PreRA instruction scheduling.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 if (addPass(&MachineSchedulerID))
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 printAndVerify("After Machine Scheduling");
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
322
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
323
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 addPass(&StackSlotColoringID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
325
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 // FIXME: Needs physical registers
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
327 //addPass(&PostRAMachineLICMID);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
328
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 printAndVerify("After StackSlotColoring");
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 }
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
331
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
332 void NVPTXPassConfig::addMachineSSAOptimization() {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
333 // Pre-ra tail duplication.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
334 if (addPass(&EarlyTailDuplicateID))
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
335 printAndVerify("After Pre-RegAlloc TailDuplicate");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
336
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
337 // Optimize PHIs before DCE: removing dead PHI cycles may make more
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
338 // instructions dead.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
339 addPass(&OptimizePHIsID);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
340
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
341 // This pass merges large allocas. StackSlotColoring is a different pass
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
342 // which merges spill slots.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
343 addPass(&StackColoringID);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
344
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
345 // If the target requests it, assign local variables to stack slots relative
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
346 // to one another and simplify frame index references where possible.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
347 addPass(&LocalStackSlotAllocationID);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
348
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
349 // With optimization, dead code should already be eliminated. However
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
350 // there is one known exception: lowered code for arguments that are only
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
351 // used by tail calls, where the tail calls reuse the incoming stack
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
352 // arguments directly (see t11 in test/CodeGen/X86/sibcall.ll).
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
353 addPass(&DeadMachineInstructionElimID);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
354 printAndVerify("After codegen DCE pass");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
355
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
356 // Allow targets to insert passes that improve instruction level parallelism,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
357 // like if-conversion. Such passes will typically need dominator trees and
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
358 // loop info, just like LICM and CSE below.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
359 if (addILPOpts())
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
360 printAndVerify("After ILP optimizations");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
361
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
362 addPass(&MachineLICMID);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
363 addPass(&MachineCSEID);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
364
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
365 addPass(&MachineSinkingID);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
366 printAndVerify("After Machine LICM, CSE and Sinking passes");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
367
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
368 addPass(&PeepholeOptimizerID);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
369 printAndVerify("After codegen peephole optimization pass");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
370 }