• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef MAPLEBE_INCLUDE_CG_AARCH64_AARCH64_CG_H
17 #define MAPLEBE_INCLUDE_CG_AARCH64_AARCH64_CG_H
18 
19 #include "cg.h"
20 #include "aarch64_cgfunc.h"
21 #include "aarch64_ssa.h"
22 #include "aarch64_phi_elimination.h"
23 #include "aarch64_prop.h"
24 #include "aarch64_dce.h"
25 #include "aarch64_live.h"
26 #include "aarch64_reaching.h"
27 #include "aarch64_args.h"
28 #include "aarch64_alignment.h"
29 #include "aarch64_validbit_opt.h"
30 #include "aarch64_reg_coalesce.h"
31 #include "aarch64_cfgo.h"
32 #include "aarch64_peep.h"
33 #include "aarch64_proepilog.h"
34 
35 #include "aarch64_local_schedule.h"
36 
37 namespace maplebe {
38 constexpr int64 kShortBRDistance = (8 * 1024);
39 constexpr int64 kNegativeImmLowerLimit = -4096;
40 constexpr int32 kIntRegTypeNum = 5;
41 constexpr uint32 kAlignPseudoSize = 3;
42 constexpr uint32 kInsnSize = 4;
43 constexpr uint32 kAlignMovedFlag = 31;
44 
45 /* sub Target info & implement */
46 class AArch64CG : public CG {
47 public:
AArch64CG(MIRModule & mod,const CGOptions & opts,const std::vector<std::string> & nameVec,const std::unordered_map<std::string,std::vector<std::string>> & patternMap)48     AArch64CG(MIRModule &mod, const CGOptions &opts, const std::vector<std::string> &nameVec,
49               const std::unordered_map<std::string, std::vector<std::string>> &patternMap)
50         : CG(mod, opts),
51           ehExclusiveNameVec(nameVec),
52           cyclePatternMap(patternMap),
53           keyPatternMap(allocator.Adapter()),
54           symbolPatternMap(allocator.Adapter())
55     {
56     }
57 
58     ~AArch64CG() override = default;
59 
CreateCGFunc(MIRModule & mod,MIRFunction & mirFunc,BECommon & bec,MemPool & memPool,StackMemPool & stackMp,MapleAllocator & mallocator,uint32 funcId)60     CGFunc *CreateCGFunc(MIRModule &mod, MIRFunction &mirFunc, BECommon &bec, MemPool &memPool, StackMemPool &stackMp,
61                          MapleAllocator &mallocator, uint32 funcId) override
62     {
63         return memPool.New<AArch64CGFunc>(mod, *this, mirFunc, bec, memPool, stackMp, mallocator, funcId);
64     }
65 
66     void EnrollTargetPhases(MaplePhaseManager *pm) const override;
67 
GetCyclePatternMap()68     const std::unordered_map<std::string, std::vector<std::string>> &GetCyclePatternMap() const
69     {
70         return cyclePatternMap;
71     }
72 
73     void GenerateObjectMaps(BECommon &beCommon) override;
74 
75     bool IsExclusiveFunc(MIRFunction &) override;
76 
77     void EmitGCTIBLabel(GCTIBKey *key, const std::string &gcTIBName, std::vector<uint64> &bitmapWords, uint32 rcHeader);
78 
79     void FindOrCreateRepresentiveSym(std::vector<uint64> &bitmapWords, uint32 rcHeader, const std::string &name);
80 
81     void CreateRefSymForGlobalPtn(GCTIBPattern &ptn) const;
82 
83     Insn &BuildPhiInsn(RegOperand &defOpnd, Operand &listParam) override;
84 
85     PhiOperand &CreatePhiOperand(MemPool &mp, MapleAllocator &mAllocator) override;
86 
87     std::string FindGCTIBPatternName(const std::string &name) const override;
88 
CreateLiveAnalysis(MemPool & mp,CGFunc & f)89     LiveAnalysis *CreateLiveAnalysis(MemPool &mp, CGFunc &f) const override
90     {
91         return mp.New<AArch64LiveAnalysis>(f, mp);
92     }
CreateReachingDefinition(MemPool & mp,CGFunc & f)93     ReachingDefinition *CreateReachingDefinition(MemPool &mp, CGFunc &f) const override
94     {
95         return mp.New<AArch64ReachingDefinition>(f, mp);
96     }
97     GenProEpilog *CreateGenProEpilog(CGFunc &f, MemPool &mp, MemPool *tempMemPool = nullptr) const override
98     {
99         return mp.New<AArch64GenProEpilog>(f, *tempMemPool);
100     }
CreateCGPeepHole(MemPool & mp,CGFunc & f)101     CGPeepHole *CreateCGPeepHole(MemPool &mp, CGFunc &f) const override
102     {
103         return mp.New<AArch64CGPeepHole>(f, &mp);
104     }
CreateMoveRegArgs(MemPool & mp,CGFunc & f)105     MoveRegArgs *CreateMoveRegArgs(MemPool &mp, CGFunc &f) const override
106     {
107         return mp.New<AArch64MoveRegArgs>(f);
108     }
CreateAlignAnalysis(MemPool & mp,CGFunc & f,LoopAnalysis & loop)109     AlignAnalysis *CreateAlignAnalysis(MemPool &mp, CGFunc &f, LoopAnalysis &loop) const override
110     {
111         return mp.New<AArch64AlignAnalysis>(f, mp, loop);
112     }
CreateCGSSAInfo(MemPool & mp,CGFunc & f,DomAnalysis & da,MemPool & tmp)113     CGSSAInfo *CreateCGSSAInfo(MemPool &mp, CGFunc &f, DomAnalysis &da, MemPool &tmp) const override
114     {
115         return mp.New<AArch64CGSSAInfo>(f, da, mp, tmp);
116     }
CreateLLAnalysis(MemPool & mp,CGFunc & f)117     LiveIntervalAnalysis *CreateLLAnalysis(MemPool &mp, CGFunc &f) const override
118     {
119         return mp.New<AArch64LiveIntervalAnalysis>(f, mp);
120     };
CreatePhiElimintor(MemPool & mp,CGFunc & f,CGSSAInfo & ssaInfo)121     PhiEliminate *CreatePhiElimintor(MemPool &mp, CGFunc &f, CGSSAInfo &ssaInfo) const override
122     {
123         return mp.New<AArch64PhiEliminate>(f, ssaInfo, mp);
124     }
CreateCGProp(MemPool & mp,CGFunc & f,CGSSAInfo & ssaInfo,LiveIntervalAnalysis & ll)125     CGProp *CreateCGProp(MemPool &mp, CGFunc &f, CGSSAInfo &ssaInfo, LiveIntervalAnalysis &ll) const override
126     {
127         return mp.New<AArch64Prop>(mp, f, ssaInfo, ll);
128     }
CreateCGDce(MemPool & mp,CGFunc & f,CGSSAInfo & ssaInfo)129     CGDce *CreateCGDce(MemPool &mp, CGFunc &f, CGSSAInfo &ssaInfo) const override
130     {
131         return mp.New<AArch64Dce>(mp, f, ssaInfo);
132     }
CreateValidBitOpt(MemPool & mp,CGFunc & f,CGSSAInfo & ssaInfo)133     ValidBitOpt *CreateValidBitOpt(MemPool &mp, CGFunc &f, CGSSAInfo &ssaInfo) const override
134     {
135         return mp.New<AArch64ValidBitOpt>(f, ssaInfo);
136     }
CreateLocalSchedule(MemPool & mp,CGFunc & f,ControlDepAnalysis & cda,DataDepAnalysis & dda)137     LocalSchedule *CreateLocalSchedule(MemPool &mp, CGFunc &f, ControlDepAnalysis &cda,
138                                        DataDepAnalysis &dda) const override
139     {
140         return mp.New<AArch64LocalSchedule>(mp, f, cda, dda);
141     }
CreateCFGOptimizer(MemPool & mp,CGFunc & f,LoopAnalysis & loop)142     CFGOptimizer *CreateCFGOptimizer(MemPool &mp, CGFunc &f, LoopAnalysis &loop) const override
143     {
144         return mp.New<AArch64CFGOptimizer>(f, mp, loop);
145     }
146 
147     /* Return the copy operand id of reg1 if it is an insn who just do copy from reg1 to reg2.
148      * i. mov reg2, reg1
149      * ii. add/sub reg2, reg1, 0/zero register
150      * iii. mul reg2, reg1, 1
151      */
152     bool IsEffectiveCopy(Insn &insn) const final;
153     bool IsTargetInsn(MOperator mOp) const final;
154     bool IsClinitInsn(MOperator mOp) const final;
155     bool IsPseudoInsn(MOperator mOp) const final;
156     void DumpTargetOperand(Operand &opnd, const OpndDesc &opndDesc) const final;
GetTargetMd(MOperator mOp)157     const InsnDesc &GetTargetMd(MOperator mOp) const final
158     {
159         return kMd[mOp];
160     }
161 
162     static const InsnDesc kMd[kMopLast];
163     enum : uint8 { kR8List, kR16List, kR32List, kR64List, kV64List };
164     static std::array<std::array<const std::string, kAllRegNum>, kIntRegTypeNum> intRegNames;
165     static std::array<const std::string, kAllRegNum> vectorRegNames;
166 
167 private:
168     const std::vector<std::string> &ehExclusiveNameVec;
169     const std::unordered_map<std::string, std::vector<std::string>> &cyclePatternMap;
170     MapleUnorderedMap<GCTIBKey *, GCTIBPattern *, Hasher, EqualFn> keyPatternMap;
171     MapleUnorderedMap<std::string, GCTIBPattern *> symbolPatternMap;
172 };
173 } /* namespace maplebe */
174 
175 #endif /* MAPLEBE_INCLUDE_CG_AARCH64_AARCH64_CG_H */
176