llvmir some opt

This commit is contained in:
邓智航
2025-12-10 17:58:17 +08:00
commit 84827838e2
103 changed files with 5838 additions and 0 deletions

View File

@@ -0,0 +1,120 @@
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;
}
}

View File

@@ -0,0 +1,71 @@
package midend.llvm.value;
import java.util.ArrayList;
import midend.llvm.type.IrType;
import midend.llvm.IrBuilder;
import midend.llvm.instr.ReturnInstr;
import midend.llvm.type.IrFuncType;
public class IrFuncValue extends IrValue {
private ArrayList<IrValue> params;
private ArrayList<IrBasicBlock> bblocks;
public IrFuncValue(String name, IrType retType) {
super(new IrFuncType(retType), name);
params = new ArrayList<>();
bblocks = new ArrayList<>();
}
public ArrayList<IrValue> getParams() {
return params;
}
public ArrayList<IrBasicBlock> getBBlocks() {
return bblocks;
}
public IrBasicBlock getBBlock(int index) {
return bblocks.get(index);
}
public void addParam(IrValue param) {
params.add(param);
}
public void addBBlock(IrBasicBlock bblock) {
bblocks.add(bblock);
}
public boolean isMain() {
return getName().equals("@main");
}
public IrType getRetType() {
return ((IrFuncType) getType()).getReturnType();
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("define dso_local " + this.getRetType() + " " + this.getName() + "(");
for (int i = 0; i < params.size(); i++) {
sb.append(params.get(i).getType() + " " + params.get(i).getName());
if (i < params.size() - 1) {
sb.append(", ");
}
}
sb.append(") {\n");
for (IrBasicBlock bblock : bblocks) {
sb.append(bblock.toString() + "\n");
}
sb.append("}\n");
return sb.toString();
}
public void checkReturn() {
IrBasicBlock currentBB = IrBuilder.getCurrentBB();
if (!currentBB.lastIsReturn()) {
ReturnInstr returnInstr = new ReturnInstr(null); // 确保没有return的情况只有void
IrBuilder.addInstr(returnInstr);
}
}
}

View File

@@ -0,0 +1,28 @@
package midend.llvm.value;
import midend.llvm.type.IrType;
import midend.llvm.constant.IrConstant;
public class IrGlobalValue extends IrValue {
private boolean isConstant;
private IrConstant initVal;
public IrGlobalValue(IrType type, String name, boolean isConstant, IrConstant initVal) {
super(type, name);
this.isConstant = isConstant;
this.initVal = initVal;
}
public boolean isConstant() {
return isConstant;
}
public IrConstant getInitVal() {
return initVal;
}
public String toString() {
return isConstant ? getName() + " = dso_local constant " + initVal.toString() :
getName() + " = dso_local global " + initVal.toString();
}
}

View File

@@ -0,0 +1,32 @@
package midend.llvm.value;
public class IrLoop {
private IrBasicBlock condBB;
private IrBasicBlock bodyBB;
private IrBasicBlock stepBB;
private IrBasicBlock followBB;
public IrLoop(IrBasicBlock condBB, IrBasicBlock bodyBB,
IrBasicBlock stepBB, IrBasicBlock followBB) {
this.condBB = condBB;
this.bodyBB = bodyBB;
this.stepBB = stepBB;
this.followBB = followBB;
}
public IrBasicBlock getCondBB() {
return condBB;
}
public IrBasicBlock getBodyBB() {
return bodyBB;
}
public IrBasicBlock getStepBB() {
return stepBB;
}
public IrBasicBlock getFollowBB() {
return followBB;
}
}

View File

@@ -0,0 +1,38 @@
package midend.llvm.value;
import java.util.ArrayList;
import midend.llvm.type.IrType;
import midend.llvm.use.IrUser;
public class IrValue {
private IrType type;
private String name;
private ArrayList<IrUser> users;
public IrValue(IrType type, String name) {
this.type = type;
this.name = name;
this.users = new ArrayList<>();
}
public IrType getType() {
return type;
}
public String getName() {
return name;
}
public ArrayList<IrUser> getUsers() {
return users;
}
public void addUser(IrUser user) {
users.add(user);
}
public String toString() {
return type.toString() + " " + name;
}
}