131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- HexagonTargetMachine.cpp - Define TargetMachine for Hexagon -------===// 2b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 3b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// The LLVM Compiler Infrastructure 4b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 5b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file is distributed under the University of Illinois Open Source 6b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// License. See LICENSE.TXT for details. 7b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 8b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===// 9b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 1031d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu// Implements the info about Hexagon target spec. 11b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 12b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===// 13b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 14b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonTargetMachine.h" 15b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "Hexagon.h" 16b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonISelLowering.h" 173e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin#include "HexagonMachineScheduler.h" 18f931f691ee23d431135481fcf23a58658824ca67Jyotsna Verma#include "HexagonTargetObjectFile.h" 19b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/Passes.h" 200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 21b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/PassManager.h" 22f3fd7ee415ec8a6475a060e29959d04d6158f45fBenjamin Kramer#include "llvm/Support/CommandLine.h" 23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Support/TargetRegistry.h" 24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Transforms/IPO/PassManagerBuilder.h" 25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Transforms/Scalar.h" 26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumusing namespace llvm; 28b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 29b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszekstatic cl:: opt<bool> DisableHardwareLoops("disable-hexagon-hwloops", 30b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek cl::Hidden, cl::desc("Disable Hardware Loops for Hexagon target")); 31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 32b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszekstatic cl::opt<bool> DisableHexagonMISched("disable-hexagon-misched", 33b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek cl::Hidden, cl::ZeroOrMore, cl::init(false), 34b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek cl::desc("Disable Hexagon MI Scheduling")); 353e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 360f680703ebb1352cccbcec8ada1e0ae7fbc26d3cJyotsna Vermastatic cl::opt<bool> DisableHexagonCFGOpt("disable-hexagon-cfgopt", 37b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek cl::Hidden, cl::ZeroOrMore, cl::init(false), 38b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek cl::desc("Disable Hexagon CFG Optimization")); 39b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek 400f680703ebb1352cccbcec8ada1e0ae7fbc26d3cJyotsna Verma 41b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// HexagonTargetMachineModule - Note that this is used on hosts that 42b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// cannot link in a library unless there are references into the 43b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// library. In particular, it seems that it is not possible to get 44b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// things to work on Win32 without this. Though it is unused, do not 45b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// remove it. 46b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumextern "C" int HexagonTargetMachineModule; 47b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumint HexagonTargetMachineModule = 0; 48b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 49b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumextern "C" void LLVMInitializeHexagonTarget() { 50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Register the target. 51b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum RegisterTargetMachine<HexagonTargetMachine> X(TheHexagonTarget); 52b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 53b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 543e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinstatic ScheduleDAGInstrs *createVLIWMachineSched(MachineSchedContext *C) { 55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return new VLIWMachineScheduler(C, make_unique<ConvergingVLIWScheduler>()); 563e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin} 573e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin 583e59040810d0e6e04269ac8f781fa44df6088458Sergei Larinstatic MachineSchedRegistry 593e59040810d0e6e04269ac8f781fa44df6088458Sergei LarinSchedCustomRegistry("hexagon", "Run Hexagon's custom scheduler", 603e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin createVLIWMachineSched); 61b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 62b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// HexagonTargetMachine ctor - Create an ILP32 architecture model. 63b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// 64b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 65b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// Hexagon_TODO: Do I need an aggregate alignment? 66b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// 67b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumHexagonTargetMachine::HexagonTargetMachine(const Target &T, StringRef TT, 68b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum StringRef CPU, StringRef FS, 691e0c9ab0d13c32e387dde95f78cf78e301ac49a7Craig Topper const TargetOptions &Options, 70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Reloc::Model RM, CodeModel::Model CM, 71b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum CodeGenOpt::Level OL) 72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), 73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Subtarget(TT, CPU, FS, *this) { 744a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola initAsmInfo(); 75b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 76b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 77843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Tricknamespace { 78843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick/// Hexagon Code Generator Pass Configuration Options. 79843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickclass HexagonPassConfig : public TargetPassConfig { 80843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickpublic: 81061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick HexagonPassConfig(HexagonTargetMachine *TM, PassManagerBase &PM) 823e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin : TargetPassConfig(TM, PM) { 83f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick // FIXME: Rather than calling enablePass(&MachineSchedulerID) below, define 84f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick // HexagonSubtarget::enableMachineScheduler() { return true; }. 85f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick // That will bypass the SelectionDAG VLIW scheduler, which is probably just 86f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick // hurting compile time and will be removed eventually anyway. 87f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick if (DisableHexagonMISched) 88f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick disablePass(&MachineSchedulerID); 89f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick else 903e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin enablePass(&MachineSchedulerID); 913e59040810d0e6e04269ac8f781fa44df6088458Sergei Larin } 92843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 93843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick HexagonTargetMachine &getHexagonTargetMachine() const { 94843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick return getTM<HexagonTargetMachine>(); 95843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick } 96843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ScheduleDAGInstrs * 98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines createMachineScheduler(MachineSchedContext *C) const override { 99f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick return createVLIWMachineSched(C); 100f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick } 101f45edcc3818757234c20d4d5975c0b992bf1f95eAndrew Trick 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool addInstSelector() override; 103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool addPreRegAlloc() override; 104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool addPostRegAlloc() override; 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool addPreSched2() override; 106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool addPreEmitPass() override; 107843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick}; 108843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick} // namespace 109843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 110061efcfb3e79899493d857f49e50d09f29037e0aAndrew TrickTargetPassConfig *HexagonTargetMachine::createPassConfig(PassManagerBase &PM) { 111061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick return new HexagonPassConfig(this, PM); 112843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick} 113843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 114843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickbool HexagonPassConfig::addInstSelector() { 115ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling HexagonTargetMachine &TM = getHexagonTargetMachine(); 116b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek bool NoOpt = (getOptLevel() == CodeGenOpt::None); 1170f680703ebb1352cccbcec8ada1e0ae7fbc26d3cJyotsna Verma 118b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek if (!NoOpt) 119b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek addPass(createHexagonRemoveExtendArgs(TM)); 1200f680703ebb1352cccbcec8ada1e0ae7fbc26d3cJyotsna Verma 121b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek addPass(createHexagonISelDag(TM, getOptLevel())); 1220f680703ebb1352cccbcec8ada1e0ae7fbc26d3cJyotsna Verma 123b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek if (!NoOpt) { 1240f680703ebb1352cccbcec8ada1e0ae7fbc26d3cJyotsna Verma addPass(createHexagonPeephole()); 125b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek printAndVerify("After hexagon peephole pass"); 126b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek } 1270f680703ebb1352cccbcec8ada1e0ae7fbc26d3cJyotsna Verma 128b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return false; 129b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 130b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 131843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickbool HexagonPassConfig::addPreRegAlloc() { 132b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek if (getOptLevel() != CodeGenOpt::None) 133b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek if (!DisableHardwareLoops) 134b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek addPass(createHexagonHardwareLoops()); 135b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return false; 136b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 137b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 138843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickbool HexagonPassConfig::addPostRegAlloc() { 139b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek const HexagonTargetMachine &TM = getHexagonTargetMachine(); 140b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek if (getOptLevel() != CodeGenOpt::None) 141b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek if (!DisableHexagonCFGOpt) 142b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek addPass(createHexagonCFGOptimizer(TM)); 143b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek return false; 144b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 145b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 146843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickbool HexagonPassConfig::addPreSched2() { 147f931f691ee23d431135481fcf23a58658824ca67Jyotsna Verma const HexagonTargetMachine &TM = getHexagonTargetMachine(); 148f931f691ee23d431135481fcf23a58658824ca67Jyotsna Verma 149a29a8965e206e689d292d7f2e42f2548770e30d3Jyotsna Verma addPass(createHexagonCopyToCombine()); 150f931f691ee23d431135481fcf23a58658824ca67Jyotsna Verma if (getOptLevel() != CodeGenOpt::None) 151f931f691ee23d431135481fcf23a58658824ca67Jyotsna Verma addPass(&IfConverterID); 152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addPass(createHexagonSplitConst32AndConst64(TM)); 153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines printAndVerify("After hexagon split const32/64 pass"); 154f931f691ee23d431135481fcf23a58658824ca67Jyotsna Verma return true; 155b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 156b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 157843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickbool HexagonPassConfig::addPreEmitPass() { 158b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek const HexagonTargetMachine &TM = getHexagonTargetMachine(); 159b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek bool NoOpt = (getOptLevel() == CodeGenOpt::None); 160b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 161b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek if (!NoOpt) 1620f680703ebb1352cccbcec8ada1e0ae7fbc26d3cJyotsna Verma addPass(createHexagonNewValueJump()); 163b33857040f63a9fdfb0c2a2ca2af67ec12cf9d02Sirish Pande 164b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Expand Spill code for predicate registers. 165b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek addPass(createHexagonExpandPredSpillCode(TM)); 166b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 167b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Split up TFRcondsets into conditional transfers. 168b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek addPass(createHexagonSplitTFRCondSets(TM)); 169b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 17026f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande // Create Packets. 171b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek if (!NoOpt) { 172b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek if (!DisableHardwareLoops) 173b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek addPass(createHexagonFixupHwLoops()); 1740f680703ebb1352cccbcec8ada1e0ae7fbc26d3cJyotsna Verma addPass(createHexagonPacketizer()); 175b072090f3975bb155304b2e7dc313997132dbd25Krzysztof Parzyszek } 17626f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande 177b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum return false; 178b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 179