Files
MY_COMPILER/midend/llvm/value/IrBasicBlock.java
邓智航 a9b8e82fd5 some opt
2025-12-25 15:07:20 +08:00

172 lines
4.2 KiB
Java
Executable File

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 void addInstr(IrInstr instr, int index) {
instrs.add(index, instr);
instr.setBBlock(this);
}
public void deleteInstr(IrInstr instr) {
instrs.remove(instr);
instr.setBBlock(null);
instr.clearUses();
instr.clearUsers();
}
public void clearAllInstrs() {
for (IrInstr instr : instrs) {
instr.setBBlock(null);
instr.clearUses();
instr.clearUsers();
}
instrs.clear();
}
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 IrInstr getFirstInstr() {
if (instrs.isEmpty()) {
return null;
}
return instrs.get(0);
}
public IrInstr getLastInstr() {
if (instrs.isEmpty()) {
return null;
}
return instrs.get(instrs.size() - 1);
}
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 HashSet<IrBasicBlock> getDirectDomies() {
return directDomies;
}
public HashSet<IrBasicBlock> getDomiFrontier() {
return domiFrontier;
}
public void toMips() {
new MipsLabel(getMipsLabel());
for (IrInstr instr : instrs) {
instr.toMips();
}
}
}