mips without optimize
This commit is contained in:
248
midend/llvm/value/IrBasicBlock.java
Normal file → Executable file
248
midend/llvm/value/IrBasicBlock.java
Normal file → Executable file
@@ -1,120 +1,128 @@
|
||||
package midend.llvm.value;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
|
||||
import midend.llvm.instr.IrInstr;
|
||||
import midend.llvm.instr.ReturnInstr;
|
||||
import midend.llvm.type.IrBasicBlockType;
|
||||
|
||||
public class IrBasicBlock extends IrValue {
|
||||
private ArrayList<IrInstr> instrs;
|
||||
private IrFuncValue func;
|
||||
private ArrayList<IrBasicBlock> preds; //前驱
|
||||
private ArrayList<IrBasicBlock> succs; //后继
|
||||
private HashSet<IrBasicBlock> domied; //支配该节点
|
||||
private IrBasicBlock directDomi;
|
||||
private HashSet<IrBasicBlock> directDomies; //该节点直接支配
|
||||
private HashSet<IrBasicBlock> domiFrontier;
|
||||
|
||||
public IrBasicBlock(String name, IrFuncValue func) {
|
||||
super(new IrBasicBlockType(), name);
|
||||
this.func = func;
|
||||
instrs = new ArrayList<>();
|
||||
preds = new ArrayList<>();
|
||||
succs = new ArrayList<>();
|
||||
domied = new HashSet<>();
|
||||
directDomi = null;
|
||||
directDomies = new HashSet<>();
|
||||
domiFrontier = new HashSet<>();
|
||||
}
|
||||
|
||||
public void addInstr(IrInstr instr) {
|
||||
instrs.add(instr);
|
||||
instr.setBBlock(this);
|
||||
}
|
||||
|
||||
public IrFuncValue getFunc() {
|
||||
return func;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return instrs.isEmpty();
|
||||
}
|
||||
|
||||
public boolean isEntry() {
|
||||
return this.func.getBBlock(0) == this;
|
||||
}
|
||||
|
||||
public ArrayList<IrBasicBlock> getPreds() {
|
||||
return preds;
|
||||
}
|
||||
|
||||
public ArrayList<IrBasicBlock> getSuccs() {
|
||||
return succs;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(getName() + ":\n\t");
|
||||
for (IrInstr instr : instrs) {
|
||||
sb.append(instr.toString());
|
||||
if (instr != instrs.get(instrs.size() - 1)) {
|
||||
sb.append("\n\t");
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public boolean lastIsReturn() {
|
||||
if (instrs.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
return instrs.get(instrs.size() - 1) instanceof ReturnInstr;
|
||||
}
|
||||
|
||||
public void clearCfg() {
|
||||
this.preds.clear();
|
||||
this.succs.clear();
|
||||
domied.clear();
|
||||
directDomi = null;
|
||||
directDomies.clear();
|
||||
domiFrontier.clear();
|
||||
}
|
||||
|
||||
public ArrayList<IrInstr> getInstrs() {
|
||||
return instrs;
|
||||
}
|
||||
|
||||
public void addPred(IrBasicBlock bb) {
|
||||
this.preds.add(bb);
|
||||
}
|
||||
|
||||
public void addSucc(IrBasicBlock bb) {
|
||||
this.succs.add(bb);
|
||||
}
|
||||
|
||||
public void addDomied(IrBasicBlock bb) {
|
||||
this.domied.add(bb);
|
||||
}
|
||||
|
||||
public void addDirectDomies(IrBasicBlock bb) {
|
||||
this.directDomies.add(bb);
|
||||
}
|
||||
|
||||
public void addDomiFrontier(IrBasicBlock bb) {
|
||||
this.domiFrontier.add(bb);
|
||||
}
|
||||
|
||||
public void setDirectDomi(IrBasicBlock bb) {
|
||||
this.directDomi = bb;
|
||||
}
|
||||
|
||||
public HashSet<IrBasicBlock> getDomied() {
|
||||
return domied;
|
||||
}
|
||||
|
||||
public IrBasicBlock getDirectDomi() {
|
||||
return this.directDomi;
|
||||
}
|
||||
}
|
||||
package midend.llvm.value;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
|
||||
import backend.mips.instr.MipsLabel;
|
||||
import midend.llvm.instr.IrInstr;
|
||||
import midend.llvm.instr.ReturnInstr;
|
||||
import midend.llvm.type.IrBasicBlockType;
|
||||
|
||||
public class IrBasicBlock extends IrValue {
|
||||
private ArrayList<IrInstr> instrs;
|
||||
private IrFuncValue func;
|
||||
private ArrayList<IrBasicBlock> preds; //前驱
|
||||
private ArrayList<IrBasicBlock> succs; //后继
|
||||
private HashSet<IrBasicBlock> domied; //支配该节点
|
||||
private IrBasicBlock directDomi;
|
||||
private HashSet<IrBasicBlock> directDomies; //该节点直接支配
|
||||
private HashSet<IrBasicBlock> domiFrontier;
|
||||
|
||||
public IrBasicBlock(String name, IrFuncValue func) {
|
||||
super(new IrBasicBlockType(), name);
|
||||
this.func = func;
|
||||
instrs = new ArrayList<>();
|
||||
preds = new ArrayList<>();
|
||||
succs = new ArrayList<>();
|
||||
domied = new HashSet<>();
|
||||
directDomi = null;
|
||||
directDomies = new HashSet<>();
|
||||
domiFrontier = new HashSet<>();
|
||||
}
|
||||
|
||||
public void addInstr(IrInstr instr) {
|
||||
instrs.add(instr);
|
||||
instr.setBBlock(this);
|
||||
}
|
||||
|
||||
public IrFuncValue getFunc() {
|
||||
return func;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return instrs.isEmpty();
|
||||
}
|
||||
|
||||
public boolean isEntry() {
|
||||
return this.func.getBBlock(0) == this;
|
||||
}
|
||||
|
||||
public ArrayList<IrBasicBlock> getPreds() {
|
||||
return preds;
|
||||
}
|
||||
|
||||
public ArrayList<IrBasicBlock> getSuccs() {
|
||||
return succs;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(getName() + ":\n\t");
|
||||
for (IrInstr instr : instrs) {
|
||||
sb.append(instr.toString());
|
||||
if (instr != instrs.get(instrs.size() - 1)) {
|
||||
sb.append("\n\t");
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public boolean lastIsReturn() {
|
||||
if (instrs.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
return instrs.get(instrs.size() - 1) instanceof ReturnInstr;
|
||||
}
|
||||
|
||||
public void clearCfg() {
|
||||
this.preds.clear();
|
||||
this.succs.clear();
|
||||
domied.clear();
|
||||
directDomi = null;
|
||||
directDomies.clear();
|
||||
domiFrontier.clear();
|
||||
}
|
||||
|
||||
public ArrayList<IrInstr> getInstrs() {
|
||||
return instrs;
|
||||
}
|
||||
|
||||
public void addPred(IrBasicBlock bb) {
|
||||
this.preds.add(bb);
|
||||
}
|
||||
|
||||
public void addSucc(IrBasicBlock bb) {
|
||||
this.succs.add(bb);
|
||||
}
|
||||
|
||||
public void addDomied(IrBasicBlock bb) {
|
||||
this.domied.add(bb);
|
||||
}
|
||||
|
||||
public void addDirectDomies(IrBasicBlock bb) {
|
||||
this.directDomies.add(bb);
|
||||
}
|
||||
|
||||
public void addDomiFrontier(IrBasicBlock bb) {
|
||||
this.domiFrontier.add(bb);
|
||||
}
|
||||
|
||||
public void setDirectDomi(IrBasicBlock bb) {
|
||||
this.directDomi = bb;
|
||||
}
|
||||
|
||||
public HashSet<IrBasicBlock> getDomied() {
|
||||
return domied;
|
||||
}
|
||||
|
||||
public IrBasicBlock getDirectDomi() {
|
||||
return this.directDomi;
|
||||
}
|
||||
|
||||
public void toMips() {
|
||||
new MipsLabel(getMipsLabel());
|
||||
for (IrInstr instr : instrs) {
|
||||
instr.toMips();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user