| Jia Liu | b22310f | 2012-02-18 12:03:15 +0000 | [diff] [blame] | 1 | //===-- HexagonTargetMachine.cpp - Define TargetMachine for Hexagon -------===// | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 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 | // | 
| Jia Liu | b22310f | 2012-02-18 12:03:15 +0000 | [diff] [blame] | 10 | // Implements the info about Hexagon target spec. | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
|  | 13 |  | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 14 | #include "HexagonTargetMachine.h" | 
|  | 15 | #include "Hexagon.h" | 
|  | 16 | #include "HexagonISelLowering.h" | 
| Sergei Larin | 4d8986a | 2012-09-04 14:49:56 +0000 | [diff] [blame] | 17 | #include "HexagonMachineScheduler.h" | 
| Jyotsna Verma | 5eb5980 | 2013-05-07 19:53:00 +0000 | [diff] [blame] | 18 | #include "HexagonTargetObjectFile.h" | 
| Krzysztof Parzyszek | 73e66f3 | 2015-08-05 18:35:37 +0000 | [diff] [blame] | 19 | #include "HexagonTargetTransformInfo.h" | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 20 | #include "llvm/CodeGen/Passes.h" | 
| Chandler Carruth | 30d69c2 | 2015-02-13 10:01:29 +0000 | [diff] [blame] | 21 | #include "llvm/IR/LegacyPassManager.h" | 
| Chandler Carruth | 9fb823b | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 22 | #include "llvm/IR/Module.h" | 
| Benjamin Kramer | ae87d7b | 2012-02-06 10:19:29 +0000 | [diff] [blame] | 23 | #include "llvm/Support/CommandLine.h" | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 24 | #include "llvm/Support/TargetRegistry.h" | 
| Chandler Carruth | ed0881b | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 25 | #include "llvm/Transforms/Scalar.h" | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 26 |  | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 27 | using namespace llvm; | 
|  | 28 |  | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 29 | static cl:: opt<bool> DisableHardwareLoops("disable-hexagon-hwloops", | 
| Krzysztof Parzyszek | c05dff1 | 2015-03-31 13:35:12 +0000 | [diff] [blame] | 30 | cl::Hidden, cl::desc("Disable Hardware Loops for Hexagon target")); | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 31 |  | 
| Jyotsna Verma | 653d883 | 2013-03-27 11:14:24 +0000 | [diff] [blame] | 32 | static cl::opt<bool> DisableHexagonCFGOpt("disable-hexagon-cfgopt", | 
| Krzysztof Parzyszek | c05dff1 | 2015-03-31 13:35:12 +0000 | [diff] [blame] | 33 | cl::Hidden, cl::ZeroOrMore, cl::init(false), | 
|  | 34 | cl::desc("Disable Hexagon CFG Optimization")); | 
|  | 35 |  | 
| Krzysztof Parzyszek | 5b7dd0c | 2015-10-16 19:43:56 +0000 | [diff] [blame] | 36 | static cl::opt<bool> DisableStoreWidening("disable-store-widen", | 
|  | 37 | cl::Hidden, cl::init(false), cl::desc("Disable store widening")); | 
|  | 38 |  | 
| Krzysztof Parzyszek | c05dff1 | 2015-03-31 13:35:12 +0000 | [diff] [blame] | 39 | static cl::opt<bool> EnableExpandCondsets("hexagon-expand-condsets", | 
|  | 40 | cl::init(true), cl::Hidden, cl::ZeroOrMore, | 
|  | 41 | cl::desc("Early expansion of MUX")); | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 42 |  | 
| Krzysztof Parzyszek | fb33824 | 2015-10-06 15:49:14 +0000 | [diff] [blame] | 43 | static cl::opt<bool> EnableEarlyIf("hexagon-eif", cl::init(true), cl::Hidden, | 
|  | 44 | cl::ZeroOrMore, cl::desc("Enable early if-conversion")); | 
|  | 45 |  | 
| Krzysztof Parzyszek | 21b53a5 | 2015-07-08 14:47:34 +0000 | [diff] [blame] | 46 | static cl::opt<bool> EnableGenInsert("hexagon-insert", cl::init(true), | 
|  | 47 | cl::Hidden, cl::desc("Generate \"insert\" instructions")); | 
| Jyotsna Verma | 653d883 | 2013-03-27 11:14:24 +0000 | [diff] [blame] | 48 |  | 
| Krzysztof Parzyszek | 79b2433 | 2015-07-08 19:22:28 +0000 | [diff] [blame] | 49 | static cl::opt<bool> EnableCommGEP("hexagon-commgep", cl::init(true), | 
|  | 50 | cl::Hidden, cl::ZeroOrMore, cl::desc("Enable commoning of GEP instructions")); | 
|  | 51 |  | 
| Krzysztof Parzyszek | a0ecf07 | 2015-07-14 17:07:24 +0000 | [diff] [blame] | 52 | static cl::opt<bool> EnableGenExtract("hexagon-extract", cl::init(true), | 
|  | 53 | cl::Hidden, cl::desc("Generate \"extract\" instructions")); | 
| Krzysztof Parzyszek | 79b2433 | 2015-07-08 19:22:28 +0000 | [diff] [blame] | 54 |  | 
| Krzysztof Parzyszek | 9217220 | 2015-07-20 21:23:25 +0000 | [diff] [blame] | 55 | static cl::opt<bool> EnableGenMux("hexagon-mux", cl::init(true), cl::Hidden, | 
|  | 56 | cl::desc("Enable converting conditional transfers into MUX instructions")); | 
|  | 57 |  | 
| Krzysztof Parzyszek | 7587447 | 2015-07-14 19:30:21 +0000 | [diff] [blame] | 58 | static cl::opt<bool> EnableGenPred("hexagon-gen-pred", cl::init(true), | 
|  | 59 | cl::Hidden, cl::desc("Enable conversion of arithmetic operations to " | 
|  | 60 | "predicate instructions")); | 
|  | 61 |  | 
| Krzysztof Parzyszek | a7c5f04 | 2015-10-16 20:38:54 +0000 | [diff] [blame] | 62 | static cl::opt<bool> DisableHSDR("disable-hsdr", cl::init(false), cl::Hidden, | 
|  | 63 | cl::desc("Disable splitting double registers")); | 
|  | 64 |  | 
| Krzysztof Parzyszek | ced9941 | 2015-10-20 22:57:13 +0000 | [diff] [blame] | 65 | static cl::opt<bool> EnableBitSimplify("hexagon-bit", cl::init(true), | 
|  | 66 | cl::Hidden, cl::desc("Bit simplification")); | 
|  | 67 |  | 
|  | 68 | static cl::opt<bool> EnableLoopResched("hexagon-loop-resched", cl::init(true), | 
|  | 69 | cl::Hidden, cl::desc("Loop rescheduling")); | 
|  | 70 |  | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 71 | /// HexagonTargetMachineModule - Note that this is used on hosts that | 
|  | 72 | /// cannot link in a library unless there are references into the | 
|  | 73 | /// library.  In particular, it seems that it is not possible to get | 
|  | 74 | /// things to work on Win32 without this.  Though it is unused, do not | 
|  | 75 | /// remove it. | 
|  | 76 | extern "C" int HexagonTargetMachineModule; | 
|  | 77 | int HexagonTargetMachineModule = 0; | 
|  | 78 |  | 
|  | 79 | extern "C" void LLVMInitializeHexagonTarget() { | 
|  | 80 | // Register the target. | 
|  | 81 | RegisterTargetMachine<HexagonTargetMachine> X(TheHexagonTarget); | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 82 | } | 
|  | 83 |  | 
| Sergei Larin | 4d8986a | 2012-09-04 14:49:56 +0000 | [diff] [blame] | 84 | static ScheduleDAGInstrs *createVLIWMachineSched(MachineSchedContext *C) { | 
| David Blaikie | 422b93d | 2014-04-21 20:32:32 +0000 | [diff] [blame] | 85 | return new VLIWMachineScheduler(C, make_unique<ConvergingVLIWScheduler>()); | 
| Sergei Larin | 4d8986a | 2012-09-04 14:49:56 +0000 | [diff] [blame] | 86 | } | 
|  | 87 |  | 
|  | 88 | static MachineSchedRegistry | 
|  | 89 | SchedCustomRegistry("hexagon", "Run Hexagon's custom scheduler", | 
|  | 90 | createVLIWMachineSched); | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 91 |  | 
| Krzysztof Parzyszek | c05dff1 | 2015-03-31 13:35:12 +0000 | [diff] [blame] | 92 | namespace llvm { | 
| Krzysztof Parzyszek | ced9941 | 2015-10-20 22:57:13 +0000 | [diff] [blame] | 93 | FunctionPass *createHexagonBitSimplify(); | 
| Krzysztof Parzyszek | db86770 | 2015-10-19 17:46:01 +0000 | [diff] [blame] | 94 | FunctionPass *createHexagonCallFrameInformation(); | 
| Colin LeMahieu | 56efafc | 2015-06-15 19:05:35 +0000 | [diff] [blame] | 95 | FunctionPass *createHexagonCFGOptimizer(); | 
| Krzysztof Parzyszek | a0ecf07 | 2015-07-14 17:07:24 +0000 | [diff] [blame] | 96 | FunctionPass *createHexagonCommonGEP(); | 
|  | 97 | FunctionPass *createHexagonCopyToCombine(); | 
| Krzysztof Parzyszek | fb33824 | 2015-10-06 15:49:14 +0000 | [diff] [blame] | 98 | FunctionPass *createHexagonEarlyIfConversion(); | 
| Krzysztof Parzyszek | a0ecf07 | 2015-07-14 17:07:24 +0000 | [diff] [blame] | 99 | FunctionPass *createHexagonExpandCondsets(); | 
| Colin LeMahieu | 56efafc | 2015-06-15 19:05:35 +0000 | [diff] [blame] | 100 | FunctionPass *createHexagonExpandPredSpillCode(); | 
| Krzysztof Parzyszek | a0ecf07 | 2015-07-14 17:07:24 +0000 | [diff] [blame] | 101 | FunctionPass *createHexagonFixupHwLoops(); | 
|  | 102 | FunctionPass *createHexagonGenExtract(); | 
| Krzysztof Parzyszek | 21b53a5 | 2015-07-08 14:47:34 +0000 | [diff] [blame] | 103 | FunctionPass *createHexagonGenInsert(); | 
| Krzysztof Parzyszek | 9217220 | 2015-07-20 21:23:25 +0000 | [diff] [blame] | 104 | FunctionPass *createHexagonGenMux(); | 
| Krzysztof Parzyszek | 7587447 | 2015-07-14 19:30:21 +0000 | [diff] [blame] | 105 | FunctionPass *createHexagonGenPredicate(); | 
| Colin LeMahieu | 56efafc | 2015-06-15 19:05:35 +0000 | [diff] [blame] | 106 | FunctionPass *createHexagonHardwareLoops(); | 
| Krzysztof Parzyszek | a0ecf07 | 2015-07-14 17:07:24 +0000 | [diff] [blame] | 107 | FunctionPass *createHexagonISelDag(HexagonTargetMachine &TM, | 
|  | 108 | CodeGenOpt::Level OptLevel); | 
| Krzysztof Parzyszek | ced9941 | 2015-10-20 22:57:13 +0000 | [diff] [blame] | 109 | FunctionPass *createHexagonLoopRescheduling(); | 
| Colin LeMahieu | 56efafc | 2015-06-15 19:05:35 +0000 | [diff] [blame] | 110 | FunctionPass *createHexagonNewValueJump(); | 
| Krzysztof Parzyszek | 055c5fd | 2015-10-19 19:10:48 +0000 | [diff] [blame] | 111 | FunctionPass *createHexagonOptimizeSZextends(); | 
| Colin LeMahieu | 56efafc | 2015-06-15 19:05:35 +0000 | [diff] [blame] | 112 | FunctionPass *createHexagonPacketizer(); | 
| Krzysztof Parzyszek | a0ecf07 | 2015-07-14 17:07:24 +0000 | [diff] [blame] | 113 | FunctionPass *createHexagonPeephole(); | 
| Krzysztof Parzyszek | a0ecf07 | 2015-07-14 17:07:24 +0000 | [diff] [blame] | 114 | FunctionPass *createHexagonSplitConst32AndConst64(); | 
| Krzysztof Parzyszek | a7c5f04 | 2015-10-16 20:38:54 +0000 | [diff] [blame] | 115 | FunctionPass *createHexagonSplitDoubleRegs(); | 
| Krzysztof Parzyszek | 5b7dd0c | 2015-10-16 19:43:56 +0000 | [diff] [blame] | 116 | FunctionPass *createHexagonStoreWidening(); | 
| Alexander Kornienko | f00654e | 2015-06-23 09:49:53 +0000 | [diff] [blame] | 117 | } // end namespace llvm; | 
| Krzysztof Parzyszek | c05dff1 | 2015-03-31 13:35:12 +0000 | [diff] [blame] | 118 |  | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 119 | /// HexagonTargetMachine ctor - Create an ILP32 architecture model. | 
|  | 120 | /// | 
|  | 121 |  | 
|  | 122 | /// Hexagon_TODO: Do I need an aggregate alignment? | 
|  | 123 | /// | 
| Daniel Sanders | 3e5de88 | 2015-06-11 19:41:26 +0000 | [diff] [blame] | 124 | HexagonTargetMachine::HexagonTargetMachine(const Target &T, const Triple &TT, | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 125 | StringRef CPU, StringRef FS, | 
| Craig Topper | b545408 | 2012-03-17 09:24:09 +0000 | [diff] [blame] | 126 | const TargetOptions &Options, | 
| Eric Christopher | 0d0b360 | 2014-06-27 00:13:43 +0000 | [diff] [blame] | 127 | Reloc::Model RM, CodeModel::Model CM, | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 128 | CodeGenOpt::Level OL) | 
| Mehdi Amini | 93e1ea1 | 2015-03-12 00:07:24 +0000 | [diff] [blame] | 129 | : LLVMTargetMachine(T, "e-m:e-p:32:32-i1:32-i64:64-a:0-n32", TT, CPU, FS, | 
|  | 130 | Options, RM, CM, OL), | 
| Krzysztof Parzyszek | 73e66f3 | 2015-08-05 18:35:37 +0000 | [diff] [blame] | 131 | TLOF(make_unique<HexagonTargetObjectFile>()) { | 
|  | 132 | initAsmInfo(); | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 133 | } | 
|  | 134 |  | 
| Krzysztof Parzyszek | 73e66f3 | 2015-08-05 18:35:37 +0000 | [diff] [blame] | 135 | const HexagonSubtarget * | 
|  | 136 | HexagonTargetMachine::getSubtargetImpl(const Function &F) const { | 
|  | 137 | AttributeSet FnAttrs = F.getAttributes(); | 
|  | 138 | Attribute CPUAttr = | 
|  | 139 | FnAttrs.getAttribute(AttributeSet::FunctionIndex, "target-cpu"); | 
|  | 140 | Attribute FSAttr = | 
|  | 141 | FnAttrs.getAttribute(AttributeSet::FunctionIndex, "target-features"); | 
|  | 142 |  | 
|  | 143 | std::string CPU = !CPUAttr.hasAttribute(Attribute::None) | 
|  | 144 | ? CPUAttr.getValueAsString().str() | 
|  | 145 | : TargetCPU; | 
|  | 146 | std::string FS = !FSAttr.hasAttribute(Attribute::None) | 
|  | 147 | ? FSAttr.getValueAsString().str() | 
|  | 148 | : TargetFS; | 
|  | 149 |  | 
|  | 150 | auto &I = SubtargetMap[CPU + FS]; | 
|  | 151 | if (!I) { | 
|  | 152 | // This needs to be done before we create a new subtarget since any | 
|  | 153 | // creation will depend on the TM and the code generation flags on the | 
|  | 154 | // function that reside in TargetOptions. | 
|  | 155 | resetTargetOptions(F); | 
|  | 156 | I = llvm::make_unique<HexagonSubtarget>(TargetTriple, CPU, FS, *this); | 
|  | 157 | } | 
|  | 158 | return I.get(); | 
|  | 159 | } | 
|  | 160 |  | 
|  | 161 | TargetIRAnalysis HexagonTargetMachine::getTargetIRAnalysis() { | 
| Eric Christopher | a4e5d3c | 2015-09-16 23:38:13 +0000 | [diff] [blame] | 162 | return TargetIRAnalysis([this](const Function &F) { | 
| Krzysztof Parzyszek | 73e66f3 | 2015-08-05 18:35:37 +0000 | [diff] [blame] | 163 | return TargetTransformInfo(HexagonTTIImpl(this, F)); | 
|  | 164 | }); | 
|  | 165 | } | 
|  | 166 |  | 
|  | 167 |  | 
| Reid Kleckner | 357600e | 2014-11-20 23:37:18 +0000 | [diff] [blame] | 168 | HexagonTargetMachine::~HexagonTargetMachine() {} | 
|  | 169 |  | 
| Andrew Trick | ccb6736 | 2012-02-03 05:12:41 +0000 | [diff] [blame] | 170 | namespace { | 
|  | 171 | /// Hexagon Code Generator Pass Configuration Options. | 
|  | 172 | class HexagonPassConfig : public TargetPassConfig { | 
|  | 173 | public: | 
| Andrew Trick | f8ea108 | 2012-02-04 02:56:59 +0000 | [diff] [blame] | 174 | HexagonPassConfig(HexagonTargetMachine *TM, PassManagerBase &PM) | 
| Krzysztof Parzyszek | c05dff1 | 2015-03-31 13:35:12 +0000 | [diff] [blame] | 175 | : TargetPassConfig(TM, PM) { | 
|  | 176 | bool NoOpt = (TM->getOptLevel() == CodeGenOpt::None); | 
|  | 177 | if (!NoOpt) { | 
|  | 178 | if (EnableExpandCondsets) { | 
|  | 179 | Pass *Exp = createHexagonExpandCondsets(); | 
|  | 180 | insertPass(&RegisterCoalescerID, IdentifyingPassPtr(Exp)); | 
|  | 181 | } | 
|  | 182 | } | 
|  | 183 | } | 
| Andrew Trick | ccb6736 | 2012-02-03 05:12:41 +0000 | [diff] [blame] | 184 |  | 
|  | 185 | HexagonTargetMachine &getHexagonTargetMachine() const { | 
|  | 186 | return getTM<HexagonTargetMachine>(); | 
|  | 187 | } | 
|  | 188 |  | 
| Craig Topper | 906c2cd | 2014-04-29 07:58:16 +0000 | [diff] [blame] | 189 | ScheduleDAGInstrs * | 
|  | 190 | createMachineScheduler(MachineSchedContext *C) const override { | 
| Andrew Trick | 978674b | 2013-09-20 05:14:41 +0000 | [diff] [blame] | 191 | return createVLIWMachineSched(C); | 
|  | 192 | } | 
|  | 193 |  | 
| Krzysztof Parzyszek | 79b2433 | 2015-07-08 19:22:28 +0000 | [diff] [blame] | 194 | void addIRPasses() override; | 
| Craig Topper | 906c2cd | 2014-04-29 07:58:16 +0000 | [diff] [blame] | 195 | bool addInstSelector() override; | 
| Matthias Braun | 7e37a5f | 2014-12-11 21:26:47 +0000 | [diff] [blame] | 196 | void addPreRegAlloc() override; | 
|  | 197 | void addPostRegAlloc() override; | 
|  | 198 | void addPreSched2() override; | 
|  | 199 | void addPreEmitPass() override; | 
| Andrew Trick | ccb6736 | 2012-02-03 05:12:41 +0000 | [diff] [blame] | 200 | }; | 
|  | 201 | } // namespace | 
|  | 202 |  | 
| Andrew Trick | f8ea108 | 2012-02-04 02:56:59 +0000 | [diff] [blame] | 203 | TargetPassConfig *HexagonTargetMachine::createPassConfig(PassManagerBase &PM) { | 
|  | 204 | return new HexagonPassConfig(this, PM); | 
| Andrew Trick | ccb6736 | 2012-02-03 05:12:41 +0000 | [diff] [blame] | 205 | } | 
|  | 206 |  | 
| Krzysztof Parzyszek | 79b2433 | 2015-07-08 19:22:28 +0000 | [diff] [blame] | 207 | void HexagonPassConfig::addIRPasses() { | 
|  | 208 | TargetPassConfig::addIRPasses(); | 
| Krzysztof Parzyszek | 79b2433 | 2015-07-08 19:22:28 +0000 | [diff] [blame] | 209 | bool NoOpt = (getOptLevel() == CodeGenOpt::None); | 
| Krzysztof Parzyszek | feaf7b8 | 2015-07-09 14:51:21 +0000 | [diff] [blame] | 210 |  | 
|  | 211 | addPass(createAtomicExpandPass(TM)); | 
| Krzysztof Parzyszek | a0ecf07 | 2015-07-14 17:07:24 +0000 | [diff] [blame] | 212 | if (!NoOpt) { | 
|  | 213 | if (EnableCommGEP) | 
|  | 214 | addPass(createHexagonCommonGEP()); | 
|  | 215 | // Replace certain combinations of shifts and ands with extracts. | 
|  | 216 | if (EnableGenExtract) | 
|  | 217 | addPass(createHexagonGenExtract()); | 
|  | 218 | } | 
| Krzysztof Parzyszek | 79b2433 | 2015-07-08 19:22:28 +0000 | [diff] [blame] | 219 | } | 
|  | 220 |  | 
| Andrew Trick | ccb6736 | 2012-02-03 05:12:41 +0000 | [diff] [blame] | 221 | bool HexagonPassConfig::addInstSelector() { | 
| Bill Wendling | a3cd350 | 2013-06-19 21:36:55 +0000 | [diff] [blame] | 222 | HexagonTargetMachine &TM = getHexagonTargetMachine(); | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 223 | bool NoOpt = (getOptLevel() == CodeGenOpt::None); | 
| Jyotsna Verma | 653d883 | 2013-03-27 11:14:24 +0000 | [diff] [blame] | 224 |  | 
| Krzysztof Parzyszek | 055c5fd | 2015-10-19 19:10:48 +0000 | [diff] [blame] | 225 | if (!NoOpt) | 
|  | 226 | addPass(createHexagonOptimizeSZextends()); | 
|  | 227 |  | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 228 | addPass(createHexagonISelDag(TM, getOptLevel())); | 
| Jyotsna Verma | 653d883 | 2013-03-27 11:14:24 +0000 | [diff] [blame] | 229 |  | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 230 | if (!NoOpt) { | 
| Krzysztof Parzyszek | 7587447 | 2015-07-14 19:30:21 +0000 | [diff] [blame] | 231 | // Create logical operations on predicate registers. | 
|  | 232 | if (EnableGenPred) | 
|  | 233 | addPass(createHexagonGenPredicate(), false); | 
| Krzysztof Parzyszek | ced9941 | 2015-10-20 22:57:13 +0000 | [diff] [blame] | 234 | // Rotate loops to expose bit-simplification opportunities. | 
|  | 235 | if (EnableLoopResched) | 
|  | 236 | addPass(createHexagonLoopRescheduling(), false); | 
| Krzysztof Parzyszek | a7c5f04 | 2015-10-16 20:38:54 +0000 | [diff] [blame] | 237 | // Split double registers. | 
|  | 238 | if (!DisableHSDR) | 
|  | 239 | addPass(createHexagonSplitDoubleRegs()); | 
| Krzysztof Parzyszek | ced9941 | 2015-10-20 22:57:13 +0000 | [diff] [blame] | 240 | // Bit simplification. | 
|  | 241 | if (EnableBitSimplify) | 
|  | 242 | addPass(createHexagonBitSimplify(), false); | 
| Jyotsna Verma | 653d883 | 2013-03-27 11:14:24 +0000 | [diff] [blame] | 243 | addPass(createHexagonPeephole()); | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 244 | printAndVerify("After hexagon peephole pass"); | 
| Krzysztof Parzyszek | 21b53a5 | 2015-07-08 14:47:34 +0000 | [diff] [blame] | 245 | if (EnableGenInsert) | 
|  | 246 | addPass(createHexagonGenInsert(), false); | 
| Krzysztof Parzyszek | fb33824 | 2015-10-06 15:49:14 +0000 | [diff] [blame] | 247 | if (EnableEarlyIf) | 
|  | 248 | addPass(createHexagonEarlyIfConversion(), false); | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 249 | } | 
| Jyotsna Verma | 653d883 | 2013-03-27 11:14:24 +0000 | [diff] [blame] | 250 |  | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 251 | return false; | 
|  | 252 | } | 
|  | 253 |  | 
| Matthias Braun | 7e37a5f | 2014-12-11 21:26:47 +0000 | [diff] [blame] | 254 | void HexagonPassConfig::addPreRegAlloc() { | 
| Krzysztof Parzyszek | 5b7dd0c | 2015-10-16 19:43:56 +0000 | [diff] [blame] | 255 | if (getOptLevel() != CodeGenOpt::None) { | 
|  | 256 | if (!DisableStoreWidening) | 
|  | 257 | addPass(createHexagonStoreWidening(), false); | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 258 | if (!DisableHardwareLoops) | 
| Matthias Braun | 7e37a5f | 2014-12-11 21:26:47 +0000 | [diff] [blame] | 259 | addPass(createHexagonHardwareLoops(), false); | 
| Krzysztof Parzyszek | 5b7dd0c | 2015-10-16 19:43:56 +0000 | [diff] [blame] | 260 | } | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 261 | } | 
|  | 262 |  | 
| Matthias Braun | 7e37a5f | 2014-12-11 21:26:47 +0000 | [diff] [blame] | 263 | void HexagonPassConfig::addPostRegAlloc() { | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 264 | if (getOptLevel() != CodeGenOpt::None) | 
|  | 265 | if (!DisableHexagonCFGOpt) | 
| Eric Christopher | 5c3376a | 2015-02-02 18:46:27 +0000 | [diff] [blame] | 266 | addPass(createHexagonCFGOptimizer(), false); | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 267 | } | 
|  | 268 |  | 
| Matthias Braun | 7e37a5f | 2014-12-11 21:26:47 +0000 | [diff] [blame] | 269 | void HexagonPassConfig::addPreSched2() { | 
| Matthias Braun | 7e37a5f | 2014-12-11 21:26:47 +0000 | [diff] [blame] | 270 | addPass(createHexagonCopyToCombine(), false); | 
| Jyotsna Verma | 5eb5980 | 2013-05-07 19:53:00 +0000 | [diff] [blame] | 271 | if (getOptLevel() != CodeGenOpt::None) | 
| Matthias Braun | 7e37a5f | 2014-12-11 21:26:47 +0000 | [diff] [blame] | 272 | addPass(&IfConverterID, false); | 
| Eric Christopher | 01f875e | 2015-02-02 22:11:43 +0000 | [diff] [blame] | 273 | addPass(createHexagonSplitConst32AndConst64()); | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 274 | } | 
|  | 275 |  | 
| Matthias Braun | 7e37a5f | 2014-12-11 21:26:47 +0000 | [diff] [blame] | 276 | void HexagonPassConfig::addPreEmitPass() { | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 277 | bool NoOpt = (getOptLevel() == CodeGenOpt::None); | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 278 |  | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 279 | if (!NoOpt) | 
| Matthias Braun | 7e37a5f | 2014-12-11 21:26:47 +0000 | [diff] [blame] | 280 | addPass(createHexagonNewValueJump(), false); | 
| Sirish Pande | 4bd20c5 | 2012-05-12 05:10:30 +0000 | [diff] [blame] | 281 |  | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 282 | // Expand Spill code for predicate registers. | 
| Eric Christopher | 6ff7ed6 | 2015-02-02 18:46:31 +0000 | [diff] [blame] | 283 | addPass(createHexagonExpandPredSpillCode(), false); | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 284 |  | 
| Sirish Pande | f8e5e3c | 2012-05-03 21:52:53 +0000 | [diff] [blame] | 285 | // Create Packets. | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 286 | if (!NoOpt) { | 
|  | 287 | if (!DisableHardwareLoops) | 
| Matthias Braun | 7e37a5f | 2014-12-11 21:26:47 +0000 | [diff] [blame] | 288 | addPass(createHexagonFixupHwLoops(), false); | 
| Krzysztof Parzyszek | 9217220 | 2015-07-20 21:23:25 +0000 | [diff] [blame] | 289 | // Generate MUX from pairs of conditional transfers. | 
|  | 290 | if (EnableGenMux) | 
|  | 291 | addPass(createHexagonGenMux(), false); | 
|  | 292 |  | 
| Matthias Braun | 7e37a5f | 2014-12-11 21:26:47 +0000 | [diff] [blame] | 293 | addPass(createHexagonPacketizer(), false); | 
| Krzysztof Parzyszek | 59df52c | 2013-05-06 21:25:45 +0000 | [diff] [blame] | 294 | } | 
| Krzysztof Parzyszek | db86770 | 2015-10-19 17:46:01 +0000 | [diff] [blame] | 295 |  | 
|  | 296 | // Add CFI instructions if necessary. | 
|  | 297 | addPass(createHexagonCallFrameInformation(), false); | 
| Tony Linthicum | 1213a7a | 2011-12-12 21:14:40 +0000 | [diff] [blame] | 298 | } |