1
- #include " Block.h"
1
+ #include " Block.h"
2
2
int Block::count = 0 ;
3
3
4
4
Block::Block () {
@@ -17,10 +17,11 @@ void Block::addNext(Block* b) {
17
17
next.push_back (b);
18
18
}
19
19
20
+ /* 扫描这个基本块中的use def集合*/
20
21
void Block::useDefScan () {
21
22
for (int ii = v.size () - 1 ; ii >= 0 ;ii--) {
22
23
MidCode i = v[ii];
23
- // 正常三地址运算,注意立即数问题
24
+ // 正常三地址运算,注意立即数问题
24
25
if (i.op == MIDADD || i.op == MIDSUB || i.op == MIDMULT
25
26
|| i.op == MIDDIV || i.op == MIDLSS || i.op == MIDLEQ
26
27
|| i.op == MIDGRE || i.op == MIDGEQ || i.op == MIDEQL
@@ -36,15 +37,15 @@ void Block::useDefScan() {
36
37
use.insert (i.operand2 );
37
38
}
38
39
}
39
- // 只使用operand1
40
+ // 只使用operand1
40
41
else if (i.op == MIDPUSH || i.op == MIDRET||i.op ==MIDBNZ||i.op ==MIDBZ
41
42
||i.op ==MIDPRINTINT||i.op ==MIDPRINTCHAR) {
42
- if (!i.isImmediate1 ) {
43
+ if (!i.isImmediate1 &&i. operand1 !=- 1 ) {
43
44
def.erase (i.operand1 );
44
45
use.insert (i.operand1 );
45
46
}
46
47
}
47
- // 使用operand1并返回值,其中assign需要考虑排除-1
48
+ // 使用operand1并返回值,其中assign需要考虑排除-1
48
49
else if (i.op == MIDNEGATE || i.op == MIDASSIGN) {
49
50
use.erase (i.target );
50
51
def.insert (i.target );
@@ -54,7 +55,7 @@ void Block::useDefScan() {
54
55
}
55
56
56
57
}
57
- // 数组写操作只会使用2个操作数,但是不会对target造成影响,因为数组地址没变
58
+ // 数组写操作只会使用2个操作数,但是不会对target造成影响,因为数组地址没变
58
59
else if (i.op == MIDARRAYWRITE) {
59
60
if (!i.isImmediate1 ) {
60
61
def.erase (i.operand1 );
@@ -64,7 +65,7 @@ void Block::useDefScan() {
64
65
def.erase (i.operand2 );
65
66
use.insert (i.operand2 );
66
67
}
67
- }// 只使用target
68
+ }// 只使用target
68
69
else if (i.op == MIDREADCHAR || i.op == MIDREADINTEGER) {
69
70
use.erase (i.target );
70
71
def.insert (i.target );
@@ -73,7 +74,6 @@ void Block::useDefScan() {
73
74
}
74
75
}
75
76
76
-
77
77
bool Block::activeVariableAnalyzeEpoch () {
78
78
int oldsize = activeIn.size ();
79
79
for (Block* i : next) {
@@ -85,6 +85,68 @@ bool Block::activeVariableAnalyzeEpoch() {
85
85
86
86
}
87
87
88
+ vector<vector<int >>Block::conflictEdgeAnalyze (){
89
+ /* 冲突边的构建原则是,只要在变量定义处活跃的变量全都算是冲突*/
90
+ vector<vector<int >>res;
91
+ set<int >localActive;
92
+ localActive = activeOut;
93
+ for (int line = v.size () - 1 ; line >= 0 ; line--) {
94
+ MidCode i = v[line];
95
+ // 正常三地址运算
96
+ if (i.op == MIDADD || i.op == MIDSUB || i.op == MIDMULT
97
+ || i.op == MIDDIV || i.op == MIDLSS || i.op == MIDLEQ
98
+ || i.op == MIDGRE || i.op == MIDGEQ || i.op == MIDEQL
99
+ || i.op == MIDNEQ || i.op == MIDARRAYGET) {
100
+ localActive.erase (i.target );
101
+ if (!i.isImmediate1 ) {
102
+ localActive.insert (i.operand1 );
103
+ }
104
+ if (!i.isImmediate2 ) {
105
+ localActive.insert (i.operand2 );
106
+ }
107
+ }
108
+ // 只使用operand1
109
+ else if (i.op == MIDPUSH || i.op == MIDRET || i.op == MIDBNZ || i.op == MIDBZ
110
+ || i.op == MIDPRINTINT || i.op == MIDPRINTCHAR) {
111
+ if (!i.isImmediate1 &&i.operand1 !=-1 ) {
112
+ localActive.insert (i.operand1 );
113
+ }
114
+ }
115
+ // 使用operand1并返回值,其中assign需要考虑排除-1
116
+ else if (i.op == MIDNEGATE || i.op == MIDASSIGN) {
117
+ localActive.erase (i.target );
118
+ if (!i.isImmediate1 && i.operand1 != -1 ) {
119
+ localActive.insert (i.operand1 );
120
+ }
121
+ }
122
+ // 数组写操作只会使用2个操作数,但是不会对target造成影响,因为数组地址没变
123
+ else if (i.op == MIDARRAYWRITE) {
124
+ if (!i.isImmediate1 ) {
125
+ localActive.insert (i.operand1 );
126
+ }
127
+ if (!i.isImmediate2 ) {
128
+ localActive.insert (i.operand2 );
129
+ }
130
+ }
131
+ // 只有target
132
+ else if (i.op == MIDREADCHAR || i.op == MIDREADINTEGER) {
133
+ localActive.erase (i.target );
134
+ }
135
+ // 现在找有target的计算冲突边
136
+ if (i.op == MIDADD || i.op == MIDSUB || i.op == MIDMULT
137
+ || i.op == MIDDIV || i.op == MIDLSS || i.op == MIDLEQ
138
+ || i.op == MIDGRE || i.op == MIDGEQ || i.op == MIDEQL
139
+ || i.op == MIDNEQ || i.op == MIDARRAYGET ||
140
+ i.op == MIDNEGATE || i.op == MIDASSIGN ||
141
+ i.op == MIDREADCHAR || i.op == MIDREADINTEGER) {
142
+ for (int j : localActive) {
143
+ res.push_back ({ i.target ,j });
144
+ }
145
+ }
146
+ }
147
+ return res;
148
+ }
149
+
88
150
set<int >Block::setUnion (set<int > a, set<int > b) {
89
151
set<int >res;
90
152
for (int i : a) {
0 commit comments