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