File indexing completed on 2026-05-10 08:43:28
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #ifndef LLVM_CODEGEN_EXECUTIONDOMAINFIX_H
0023 #define LLVM_CODEGEN_EXECUTIONDOMAINFIX_H
0024
0025 #include "llvm/ADT/SmallVector.h"
0026 #include "llvm/CodeGen/LoopTraversal.h"
0027 #include "llvm/CodeGen/MachineFunctionPass.h"
0028 #include "llvm/CodeGen/ReachingDefAnalysis.h"
0029 #include "llvm/CodeGen/TargetRegisterInfo.h"
0030
0031 namespace llvm {
0032
0033 class MachineInstr;
0034 class TargetInstrInfo;
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 struct DomainValue {
0052
0053 unsigned Refs = 0;
0054
0055
0056
0057
0058 unsigned AvailableDomains;
0059
0060
0061
0062
0063 DomainValue *Next;
0064
0065
0066 SmallVector<MachineInstr *, 8> Instrs;
0067
0068 DomainValue() { clear(); }
0069
0070
0071
0072 bool isCollapsed() const { return Instrs.empty(); }
0073
0074
0075 bool hasDomain(unsigned domain) const {
0076 assert(domain <
0077 static_cast<unsigned>(std::numeric_limits<unsigned>::digits) &&
0078 "undefined behavior");
0079 return AvailableDomains & (1u << domain);
0080 }
0081
0082
0083 void addDomain(unsigned domain) {
0084 assert(domain <
0085 static_cast<unsigned>(std::numeric_limits<unsigned>::digits) &&
0086 "undefined behavior");
0087 AvailableDomains |= 1u << domain;
0088 }
0089
0090
0091 void setSingleDomain(unsigned domain) {
0092 assert(domain <
0093 static_cast<unsigned>(std::numeric_limits<unsigned>::digits) &&
0094 "undefined behavior");
0095 AvailableDomains = 1u << domain;
0096 }
0097
0098
0099 unsigned getCommonDomains(unsigned mask) const {
0100 return AvailableDomains & mask;
0101 }
0102
0103
0104 unsigned getFirstDomain() const {
0105 return llvm::countr_zero(AvailableDomains);
0106 }
0107
0108
0109 void clear() {
0110 AvailableDomains = 0;
0111 Next = nullptr;
0112 Instrs.clear();
0113 }
0114 };
0115
0116 class ExecutionDomainFix : public MachineFunctionPass {
0117 SpecificBumpPtrAllocator<DomainValue> Allocator;
0118 SmallVector<DomainValue *, 16> Avail;
0119
0120 const TargetRegisterClass *const RC;
0121 MachineFunction *MF = nullptr;
0122 const TargetInstrInfo *TII = nullptr;
0123 const TargetRegisterInfo *TRI = nullptr;
0124 std::vector<SmallVector<int, 1>> AliasMap;
0125 const unsigned NumRegs;
0126
0127
0128 using LiveRegsDVInfo = std::vector<DomainValue *>;
0129 LiveRegsDVInfo LiveRegs;
0130
0131
0132
0133 using OutRegsInfoMap = SmallVector<LiveRegsDVInfo, 4>;
0134 OutRegsInfoMap MBBOutRegsInfos;
0135
0136 ReachingDefAnalysis *RDA = nullptr;
0137
0138 public:
0139 ExecutionDomainFix(char &PassID, const TargetRegisterClass &RC)
0140 : MachineFunctionPass(PassID), RC(&RC), NumRegs(RC.getNumRegs()) {}
0141
0142 void getAnalysisUsage(AnalysisUsage &AU) const override {
0143 AU.setPreservesAll();
0144 AU.addRequired<ReachingDefAnalysis>();
0145 MachineFunctionPass::getAnalysisUsage(AU);
0146 }
0147
0148 bool runOnMachineFunction(MachineFunction &MF) override;
0149
0150 MachineFunctionProperties getRequiredProperties() const override {
0151 return MachineFunctionProperties().set(
0152 MachineFunctionProperties::Property::NoVRegs);
0153 }
0154
0155 private:
0156
0157
0158 iterator_range<SmallVectorImpl<int>::const_iterator>
0159 regIndices(unsigned Reg) const;
0160
0161
0162 DomainValue *alloc(int domain = -1);
0163
0164
0165 DomainValue *retain(DomainValue *DV) {
0166 if (DV)
0167 ++DV->Refs;
0168 return DV;
0169 }
0170
0171
0172
0173 void release(DomainValue *);
0174
0175
0176
0177 DomainValue *resolve(DomainValue *&);
0178
0179
0180 void setLiveReg(int rx, DomainValue *DV);
0181
0182
0183 void kill(int rx);
0184
0185
0186 void force(int rx, unsigned domain);
0187
0188
0189
0190 void collapse(DomainValue *dv, unsigned domain);
0191
0192
0193 bool merge(DomainValue *A, DomainValue *B);
0194
0195
0196 void enterBasicBlock(const LoopTraversal::TraversedMBBInfo &TraversedMBB);
0197
0198
0199 void leaveBasicBlock(const LoopTraversal::TraversedMBBInfo &TraversedMBB);
0200
0201
0202 void processBasicBlock(const LoopTraversal::TraversedMBBInfo &TraversedMBB);
0203
0204
0205 bool visitInstr(MachineInstr *);
0206
0207
0208
0209 void processDefs(MachineInstr *, bool Kill);
0210
0211
0212 void visitSoftInstr(MachineInstr *, unsigned mask);
0213
0214
0215
0216 void visitHardInstr(MachineInstr *, unsigned domain);
0217 };
0218
0219 }
0220
0221 #endif