实验目的:
1. 通过上机实习,加深对代码优化的理解,掌握基本块优化、循环优化的方法。
2. 掌握利用 DAG 进行基本块优化的技术。
坑....闷头写了两天总算模拟出了个能跑得起来的差不多的代码,里面还有很多地方可以优化,函数和结构都有很多....先懒着这样吧
实现代码(待改进版)
#include<bits/stdc++.h>
#define PB push_back
using namespace std;
char opera[10]={'=','+','-','*','/','_'};
int n;
int cnt;
map<string,int> mp;
//该变量或常量所对应的结点编号
map<int,int> numbermp;
//该数字对应的结点编号
/*
Solved:
1.多变量对应同一常量
2.根据变量的值计算另一个变量的值
*/
struct Tac{
string str; //四元式的完整式子
int id; //序号
int operation; //操作
string op1; //操作数1
int num1; //若操作数1为数字
string op2; //操作数2
int num2; //若操作数2为数字
string res; //结果
int ans; //若结果为数字
}t[100];
struct node{
int id; //结点序号
int operation; //操作
int type; //type=0:常量num,type=1:变量var
int num; //结点若代表常量
vector<string> var;
//若结点代表变量
int lchild; //左。右孩子序号
int rchild;
bool operator < (const node& y) const{
return id<y.id;
}
node(){
id = 0;
operation = 0;
type = 0;
num = 0;
var.clear();
lchild = 0;
rchild = 0;
}
};
vector<node> Dag;
//vector<node> nd;
void debug(){
for(int i = 1;i < n; i++){
cout<<t[i].str<<' '<<t[i].id<<' '<<t[i].op1<<' '<<opera[t[i].operation]<<' '<<t[i].op2<<' '<<t[i].res<<endl;
}
}
void superdebug(){
for(int i = 0 ; i < Dag.size();i++){
cout<<"id = "<<Dag[i].id<<" type = "<<Dag[i].type<<" num = "<<Dag[i].num;
cout<<" var_num = "<<Dag[i].var.size()<<" first_var = "<<Dag[i].var[0];
cout<<" lc = "<<Dag[i].lchild<<&