blob: 62fbe71d19023a68f7827eda4a080a5b8dac2d91 [file] [log] [blame]
Tom Stellard75aadc22012-12-11 21:25:42 +00001//===-- AMDGPUTargetMachine.h - AMDGPU TargetMachine Interface --*- C++ -*-===//
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/// \file
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000011/// The AMDGPU TargetMachine interface definition for hw codgen targets.
Tom Stellard75aadc22012-12-11 21:25:42 +000012//
13//===----------------------------------------------------------------------===//
14
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000015#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
16#define LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
Tom Stellard75aadc22012-12-11 21:25:42 +000017
Matt Arsenaultc791f392014-06-23 18:00:31 +000018#include "AMDGPUIntrinsicInfo.h"
Tom Stellard75aadc22012-12-11 21:25:42 +000019#include "AMDGPUSubtarget.h"
Eugene Zelenko2bc2f332016-12-09 22:06:55 +000020#include "llvm/ADT/Optional.h"
21#include "llvm/ADT/StringMap.h"
22#include "llvm/ADT/StringRef.h"
23#include "llvm/Analysis/TargetTransformInfo.h"
24#include "llvm/Support/CodeGen.h"
25#include "llvm/Target/TargetMachine.h"
26#include <memory>
Tom Stellard75aadc22012-12-11 21:25:42 +000027
28namespace llvm {
29
Tom Stellard49f8bfd2015-01-06 18:00:21 +000030//===----------------------------------------------------------------------===//
31// AMDGPU Target Machine (R600+)
32//===----------------------------------------------------------------------===//
33
Matthias Braunbb8507e2017-10-12 22:57:28 +000034class AMDGPUTargetMachine : public LLVMTargetMachine {
Tom Stellard49f8bfd2015-01-06 18:00:21 +000035protected:
Tom Stellarde135ffd2015-09-25 21:41:28 +000036 std::unique_ptr<TargetLoweringObjectFile> TLOF;
Tom Stellard75aadc22012-12-11 21:25:42 +000037
Matt Arsenault59c0ffa2016-06-27 20:48:03 +000038 StringRef getGPUName(const Function &F) const;
39 StringRef getFeatureString(const Function &F) const;
40
Tom Stellard75aadc22012-12-11 21:25:42 +000041public:
Matt Arsenaultcc852232017-10-10 20:22:07 +000042 static bool EnableLateStructurizeCFG;
Matt Arsenaulta6801992018-07-10 14:03:41 +000043 static bool EnableFunctionCalls;
Matt Arsenaultcc852232017-10-10 20:22:07 +000044
Tom Stellard5dde1d22016-02-05 18:29:17 +000045 AMDGPUTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
Rafael Espindola8c34dd82016-05-18 22:04:49 +000046 StringRef FS, TargetOptions Options,
Rafael Espindola79e238a2017-08-03 02:16:21 +000047 Optional<Reloc::Model> RM, Optional<CodeModel::Model> CM,
Rafael Espindola8c34dd82016-05-18 22:04:49 +000048 CodeGenOpt::Level OL);
Eugene Zelenko2bc2f332016-12-09 22:06:55 +000049 ~AMDGPUTargetMachine() override;
Mehdi Amini93e1ea12015-03-12 00:07:24 +000050
Tom Stellardc5a154d2018-06-28 23:47:12 +000051 const TargetSubtargetInfo *getSubtargetImpl() const;
52 const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override = 0;
Chandler Carruth93dcdc42015-01-31 11:17:59 +000053
Aditya Nandakumara2719322014-11-13 09:26:31 +000054 TargetLoweringObjectFile *getObjFileLowering() const override {
Tom Stellarde135ffd2015-09-25 21:41:28 +000055 return TLOF.get();
Aditya Nandakumara2719322014-11-13 09:26:31 +000056 }
Stanislav Mekhanoshin81598112017-01-26 16:49:08 +000057
58 void adjustPassManager(PassManagerBuilder &) override;
Matt Arsenault0da63502018-08-31 05:49:54 +000059
Yaxun Liu8f844f32017-02-07 00:43:21 +000060 /// Get the integer value of a null pointer in the given address space.
61 uint64_t getNullPointerValue(unsigned AddrSpace) const {
Matt Arsenault0da63502018-08-31 05:49:54 +000062 return (AddrSpace == AMDGPUAS::LOCAL_ADDRESS ||
63 AddrSpace == AMDGPUAS::REGION_ADDRESS) ? -1 : 0;
Yaxun Liu8f844f32017-02-07 00:43:21 +000064 }
Tom Stellard75aadc22012-12-11 21:25:42 +000065};
66
Tom Stellard49f8bfd2015-01-06 18:00:21 +000067//===----------------------------------------------------------------------===//
Tom Stellardc65b3602015-02-11 17:11:50 +000068// R600 Target Machine (R600 -> Cayman)
69//===----------------------------------------------------------------------===//
70
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000071class R600TargetMachine final : public AMDGPUTargetMachine {
Matt Arsenault43e92fe2016-06-24 06:30:11 +000072private:
Matt Arsenault59c0ffa2016-06-27 20:48:03 +000073 mutable StringMap<std::unique_ptr<R600Subtarget>> SubtargetMap;
Tom Stellardc65b3602015-02-11 17:11:50 +000074
75public:
Tom Stellard5dde1d22016-02-05 18:29:17 +000076 R600TargetMachine(const Target &T, const Triple &TT, StringRef CPU,
Rafael Espindola8c34dd82016-05-18 22:04:49 +000077 StringRef FS, TargetOptions Options,
Rafael Espindola79e238a2017-08-03 02:16:21 +000078 Optional<Reloc::Model> RM, Optional<CodeModel::Model> CM,
79 CodeGenOpt::Level OL, bool JIT);
Tom Stellardde5b7b12015-02-11 17:11:51 +000080
81 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
Matt Arsenault43e92fe2016-06-24 06:30:11 +000082
Matt Arsenault59c0ffa2016-06-27 20:48:03 +000083 const R600Subtarget *getSubtargetImpl(const Function &) const override;
Matthias Braund6a36ae2017-05-31 18:41:23 +000084
Tom Stellardc7624312018-05-30 22:55:35 +000085 TargetTransformInfo getTargetTransformInfo(const Function &F) override;
86
Matthias Braund6a36ae2017-05-31 18:41:23 +000087 bool isMachineVerifierClean() const override {
88 return false;
89 }
Tom Stellardc65b3602015-02-11 17:11:50 +000090};
91
92//===----------------------------------------------------------------------===//
Tom Stellard49f8bfd2015-01-06 18:00:21 +000093// GCN Target Machine (SI+)
94//===----------------------------------------------------------------------===//
95
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000096class GCNTargetMachine final : public AMDGPUTargetMachine {
Matt Arsenault43e92fe2016-06-24 06:30:11 +000097private:
Tom Stellardc5a154d2018-06-28 23:47:12 +000098 AMDGPUIntrinsicInfo IntrinsicInfo;
Tom Stellard5bfbae52018-07-11 20:59:01 +000099 mutable StringMap<std::unique_ptr<GCNSubtarget>> SubtargetMap;
Tom Stellard49f8bfd2015-01-06 18:00:21 +0000100
101public:
Tom Stellard5dde1d22016-02-05 18:29:17 +0000102 GCNTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
Rafael Espindola8c34dd82016-05-18 22:04:49 +0000103 StringRef FS, TargetOptions Options,
Rafael Espindola79e238a2017-08-03 02:16:21 +0000104 Optional<Reloc::Model> RM, Optional<CodeModel::Model> CM,
105 CodeGenOpt::Level OL, bool JIT);
Tom Stellardde5b7b12015-02-11 17:11:51 +0000106
107 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
Matt Arsenault43e92fe2016-06-24 06:30:11 +0000108
Tom Stellard5bfbae52018-07-11 20:59:01 +0000109 const GCNSubtarget *getSubtargetImpl(const Function &) const override;
Matt Arsenault607a7562017-11-28 23:40:12 +0000110
Tom Stellardc7624312018-05-30 22:55:35 +0000111 TargetTransformInfo getTargetTransformInfo(const Function &F) override;
112
Tom Stellardc5a154d2018-06-28 23:47:12 +0000113 const AMDGPUIntrinsicInfo *getIntrinsicInfo() const override {
114 return &IntrinsicInfo;
115 }
116
Matt Arsenault607a7562017-11-28 23:40:12 +0000117 bool useIPRA() const override {
118 return true;
119 }
Tom Stellard49f8bfd2015-01-06 18:00:21 +0000120};
121
Eugene Zelenko2bc2f332016-12-09 22:06:55 +0000122} // end namespace llvm
Tom Stellard75aadc22012-12-11 21:25:42 +0000123
Eugene Zelenko2bc2f332016-12-09 22:06:55 +0000124#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H