Skip to content

Commit 88dfe9e

Browse files
增加窥孔优化:取余数优化
1 parent ca297cc commit 88dfe9e

19 files changed

+275
-173
lines changed

Block.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ void Block::useDefScan() {
2626
if (i.op == MIDADD || i.op == MIDSUB || i.op == MIDMULT
2727
|| i.op == MIDDIV || i.op == MIDLSS || i.op == MIDLEQ
2828
|| i.op == MIDGRE || i.op == MIDGEQ || i.op == MIDEQL
29-
|| i.op == MIDNEQ||i.op==MIDARRAYGET) {
29+
|| i.op == MIDNEQ||i.op==MIDARRAYGET||i.op==MIDREM) {
3030
use.erase(i.target);
3131
def.insert(i.target);
3232
if (!i.isImmediate1) {
@@ -97,7 +97,7 @@ vector<vector<int>>Block::conflictEdgeAnalyze(){
9797
if (i.op == MIDADD || i.op == MIDSUB || i.op == MIDMULT
9898
|| i.op == MIDDIV || i.op == MIDLSS || i.op == MIDLEQ
9999
|| i.op == MIDGRE || i.op == MIDGEQ || i.op == MIDEQL
100-
|| i.op == MIDNEQ || i.op == MIDARRAYGET) {
100+
|| i.op == MIDNEQ || i.op == MIDARRAYGET||i.op==MIDREM) {
101101
localActive.erase(i.target);
102102
if (!i.isImmediate1) {
103103
localActive.insert(i.operand1);
@@ -190,6 +190,16 @@ void Block::eliminateDeadCode() {
190190
v=eliminator.eliminateDeadCode(v);
191191
}
192192

193+
void Block::blockOptimize() {
194+
BlockOptimization bop(activeOut);
195+
v = bop.propagationInBlock(v);
196+
}
197+
198+
void Block::peepholeOptimize() {
199+
PeepHoleOptimization opt;
200+
v = opt.peepHoleOptimization(v);
201+
}
202+
193203
set<int>Block::setUnion(set<int> a, set<int> b) {
194204
set<int>res;
195205
for (int i : a) {
@@ -258,10 +268,6 @@ ostream& operator<<(ostream& out, Block b) {
258268
return out;
259269
}
260270

261-
void Block::blockOptimize() {
262-
BlockOptimization bop(activeOut);
263-
v = bop.propagationInBlock(v);
264-
}
265271

266272
void Block::activeVariableAnalyzePerLine() {
267273
set<int>localActive = activeOut;
@@ -272,7 +278,7 @@ void Block::activeVariableAnalyzePerLine() {
272278
if (i.op == MIDADD || i.op == MIDSUB || i.op == MIDMULT
273279
|| i.op == MIDDIV || i.op == MIDLSS || i.op == MIDLEQ
274280
|| i.op == MIDGRE || i.op == MIDGEQ || i.op == MIDEQL
275-
|| i.op == MIDNEQ || i.op == MIDARRAYGET) {
281+
|| i.op == MIDNEQ || i.op == MIDARRAYGET||i.op==MIDREM) {
276282
localActive.erase(i.target);
277283
if (!i.isImmediate1) {
278284
localActive.insert(i.operand1);

Block.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include"DagMap.h"
66
#include"DeadCodeEliminator.h"
77
#include"BlockOptimization.h"
8+
#include"PeepHoleOptimization.h"
89
using namespace std;
910

1011
class Block {
@@ -34,4 +35,5 @@ class Block {
3435
void eliminateDeadCode();
3536
void blockOptimize();
3637
void activeVariableAnalyzePerLine();
38+
void peepholeOptimize();
3739
};

BlockOptimization.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ vector<MidCode>BlockOptimization::propagationInBlock(vector<MidCode>& v) {
5656
case MIDGEQ:
5757
case MIDEQL:
5858
case MIDNEQ:
59+
case MIDREM:
5960
{
6061
MidCode tmp = c;
6162
//如果两个立即数都是常量的话

C0Compiler.rar

285 KB
Binary file not shown.

C0Compiler.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@
147147
<ClCompile Include="MidCode.cpp" />
148148
<ClCompile Include="MidCodeFrameWork.cpp" />
149149
<ClCompile Include="MipsTranslator.cpp" />
150+
<ClCompile Include="PeepHoleOptimization.cpp" />
150151
<ClCompile Include="SubSymbolTable.cpp" />
151152
<ClCompile Include="SymbolTable.cpp" />
152153
</ItemGroup>
@@ -164,6 +165,7 @@
164165
<ClInclude Include="MidCodeContainer.h" />
165166
<ClInclude Include="MidCodeFramework.h" />
166167
<ClInclude Include="MipsTranslator.h" />
168+
<ClInclude Include="PeepHoleOptimization.h" />
167169
<ClInclude Include="SubSymbolTable.h" />
168170
<ClInclude Include="SymbolTable.h" />
169171
</ItemGroup>

C0Compiler.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@
104104
<ClCompile Include="BlockOptimization.cpp">
105105
<Filter>源文件\BackEnd</Filter>
106106
</ClCompile>
107+
<ClCompile Include="PeepHoleOptimization.cpp">
108+
<Filter>源文件\BackEnd</Filter>
109+
</ClCompile>
107110
</ItemGroup>
108111
<ItemGroup>
109112
<ClInclude Include="LexicalAnalyzer.h">
@@ -151,6 +154,9 @@
151154
<ClInclude Include="BlockOptimization.h">
152155
<Filter>头文件\BackEnd</Filter>
153156
</ClInclude>
157+
<ClInclude Include="PeepHoleOptimization.h">
158+
<Filter>头文件\BackEnd</Filter>
159+
</ClInclude>
154160
</ItemGroup>
155161
<ItemGroup>
156162
<Image Include="Annotation 2019-09-26 123820.jpg">

DagMap.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ void DagMap::handleMidCode(MidCode c){
114114
case MIDGEQ:
115115
case MIDEQL:
116116
case MIDNEQ:
117+
case MIDREM:
117118
case MIDARRAYGET:
118119
{
119120
DagNode* node1 = getNodeByVar(c.operand1, c.isImmediate1);
@@ -372,6 +373,7 @@ MidCode DagMap::nodeToMidCode(DagNode* node) {
372373
case MIDNEQ:
373374
case MIDARRAYGET:
374375
case MIDARRAYWRITE:
376+
case MIDREM:
375377
{
376378
MidCode res;
377379
res.op = node->op;

DeadCodeEliminator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ vector<MidCode> DeadCodeEliminator::eliminateDeadCode(vector<MidCode>& v) {
1616
if (i.op == MIDADD || i.op == MIDSUB || i.op == MIDMULT
1717
|| i.op == MIDDIV || i.op == MIDLSS || i.op == MIDLEQ
1818
|| i.op == MIDGRE || i.op == MIDGEQ || i.op == MIDEQL
19-
|| i.op == MIDNEQ || i.op == MIDARRAYGET) {
19+
|| i.op == MIDNEQ || i.op == MIDARRAYGET||i.op==MIDREM) {
2020
SymbolEntry* entry = MidCode::table->getSymbolById(i.target);
2121
if (localActive.find(i.target) == localActive.end()
2222
&& (i.target < 0 || entry->scope != "")) {

FlowGraph.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ FlowGraph::FlowGraph(MidCodeContainer& c) {
1414
Block* oldBlock = block;
1515
block = new Block(functionId);
1616
graph.push_back(oldBlock);
17-
addLink(oldBlock, block);
17+
if (!(i != 0 && (c.v[i - 1].op == MIDGOTO || c.v[i - 1].op == MIDRET))) {
18+
addLink(oldBlock, block);
19+
}
1820
}
1921
else if (i != 0 &&( c.v[i - 1].op == MIDGOTO||c.v[i-1].op==MIDRET)) {
2022
Block* oldBlock = block;
@@ -52,12 +54,20 @@ void FlowGraph::addLink(Block* from, Block* to) {
5254
}
5355

5456
void FlowGraph::optimize() {
57+
5558
activeVariableAnalyze();
5659
DAGoptimize();
60+
5761
activeVariableAnalyze();
5862
blockOptimize();
63+
5964
activeVariableAnalyze();
6065
eliminateDeadCode();
66+
67+
activeVariableAnalyze();
68+
activeVariablePerLine();
69+
peepholeOptimize();
70+
6171
activeVariableAnalyze();
6272
variableSummary();
6373
activeVariablePerLine();
@@ -124,6 +134,7 @@ void FlowGraph::variableSummary() {
124134
case MIDGEQ:
125135
case MIDEQL:
126136
case MIDNEQ:
137+
case MIDREM:
127138
if (!j.isImmediate1 && j.operand1 < -1) {
128139
tmpVariable.insert(j.operand1);
129140
}
@@ -271,4 +282,10 @@ ostream& operator<<(ostream& out, FlowGraph& f) {
271282
out << (*i);
272283
}
273284
return out;
274-
}
285+
}
286+
287+
void FlowGraph::peepholeOptimize() {
288+
for (Block* i : graph) {
289+
i->peepholeOptimize();
290+
}
291+
}

FlowGraph.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ class FlowGraph {
2525
void eliminateDeadCode();
2626
void blockOptimize();
2727
void activeVariablePerLine();
28+
void peepholeOptimize();
2829
};

0 commit comments

Comments
 (0)