Files
MY_COMPILER/midend/llvm/value/IrBasicBlock.java
2025-12-10 17:58:17 +08:00

121 lines
2.9 KiB
Java

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;
}
}