package midend.llvm.instr; import java.util.ArrayList; import java.util.StringJoiner; import midend.llvm.type.IrType; import midend.llvm.value.IrBasicBlock; import midend.llvm.value.IrValue; public class PhiInstr extends IrInstr { private ArrayList predBBs; public PhiInstr(IrType type, IrBasicBlock bblock, String name) { super(type, name, IrInstrType.PHI); this.setBBlock(bblock); this.predBBs = new ArrayList<>(bblock.getPreds()); for (IrBasicBlock bb : predBBs) { this.addUse(null); } } public ArrayList getPredBBs() { return predBBs; } public void setValueForPred(IrBasicBlock pred, IrValue value) { int index = predBBs.indexOf(pred); this.setUse(index, value); } public void deletePred(IrBasicBlock pred) { int index = predBBs.indexOf(pred); if (index != -1) { predBBs.remove(index); this.deleteUse(index); } } public void replacePred(IrBasicBlock oldPred, IrBasicBlock newPred) { //TODO: whether the function is needed } public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getName()); sb.append(" = phi "); sb.append(getType().toString()); for (int i = 0; i < this.predBBs.size(); i++) { sb.append("[ "); sb.append(getUse(i).getName()); sb.append(", %"); sb.append(this.predBBs.get(i).getName()); sb.append(" ]"); } return sb.toString(); } }