1 /*========================== begin_copyright_notice ============================ 2 3 Copyright (C) 2017-2021 Intel Corporation 4 5 SPDX-License-Identifier: MIT 6 7 ============================= end_copyright_notice ===========================*/ 8 9 #ifndef __SPILLCODE_H__ 10 #define __SPILLCODE_H__ 11 #include "visa_igc_common_header.h" 12 #include "common.h" 13 #include "GraphColor.h" 14 #include <vector> 15 16 namespace vISA 17 { 18 class SpillManager 19 { 20 GlobalRA& gra; 21 G4_Kernel& kernel; 22 PointsToAnalysis& pointsToAnalysis; 23 24 // 25 // for creating insts 26 // 27 IR_Builder& builder; 28 // 29 // the current block 30 // 31 unsigned bbId; 32 // 33 // spilled live ranges 34 // 35 const LIVERANGE_LIST & spilledLRs; 36 37 // id for newly created address or flag variables 38 const uint32_t origTempDclId; 39 uint32_t tempDclId; 40 41 // The number of flag spill store inserted. 42 unsigned numFlagSpillStore; 43 44 // The number of flag spill load inserted. 45 unsigned numFlagSpillLoad; 46 47 unsigned int currCISAOffset; 48 49 void genRegMov(G4_BB* bb, 50 INST_LIST_ITER it, 51 G4_VarBase* src, 52 unsigned short sSubRegOff, 53 G4_VarBase* dst, 54 unsigned nRegs, 55 bool useNoMask); 56 G4_Declare* createNewSpillLocDeclare(G4_Declare* dcl); 57 G4_Declare* createNewTempAddrDeclare(G4_Declare* dcl); 58 G4_Declare* createNewTempFlagDeclare(G4_Declare* dcl); 59 G4_Declare* createNewTempAddrDeclare(G4_Declare* dcl, uint16_t num_reg); 60 void replaceSpilledDst(G4_BB* bb, 61 INST_LIST_ITER it, // where new insts will be inserted 62 G4_INST* inst, 63 G4_Operand ** operands_analyzed, 64 G4_Declare ** declares_created); 65 void replaceSpilledSrc(G4_BB* bb, 66 INST_LIST_ITER it, // where new insts will be inserted 67 G4_INST* inst, 68 unsigned i, 69 G4_Operand ** operands_analyzed, 70 G4_Declare ** declares_created); 71 void replaceSpilledPredicate(G4_BB* bb, 72 INST_LIST_ITER it, 73 G4_INST* inst); 74 void replaceSpilledFlagDst(G4_BB* bb, 75 INST_LIST_ITER it, 76 G4_INST* inst); 77 78 void createSpillLocations(const G4_Kernel& kernel); 79 80 public: 81 82 SpillManager(GlobalRA & g,const LIVERANGE_LIST & splrs,uint32_t startTempDclId)83 SpillManager(GlobalRA& g, const LIVERANGE_LIST & splrs, uint32_t startTempDclId) : 84 gra(g), kernel(g.kernel), pointsToAnalysis(g.pointsToAnalysis), builder(*g.kernel.fg.builder), 85 bbId(UINT_MAX), spilledLRs(splrs), origTempDclId(startTempDclId) 86 { 87 tempDclId = startTempDclId; 88 numFlagSpillStore = numFlagSpillLoad = 0; 89 } 90 void insertSpillCode(); isAnyNewTempCreated()91 bool isAnyNewTempCreated() const {return getNumTempCreated() != 0;} getNumTempCreated()92 uint32_t getNumTempCreated() const { return tempDclId - origTempDclId; } getNextTempDclId()93 uint32_t getNextTempDclId() const { return tempDclId; } 94 getNumFlagSpillStore()95 unsigned getNumFlagSpillStore() const { return numFlagSpillStore; } getNumFlagSpillLoad()96 unsigned getNumFlagSpillLoad() const { return numFlagSpillLoad; } 97 }; 98 } 99 #endif // __SPILLCODE_H__ 100