58 lines
1.6 KiB
Java
58 lines
1.6 KiB
Java
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<IrBasicBlock> 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<IrBasicBlock> 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();
|
|
}
|
|
}
|