some opt
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package midend.optimize;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import midend.llvm.instr.IrInstr;
|
||||
import midend.llvm.instr.IrInstrType;
|
||||
@@ -16,7 +17,81 @@ public class CfgMake extends Optimizer {
|
||||
bb.clearCfg();
|
||||
}
|
||||
}
|
||||
deleteUselessInstrs();
|
||||
deleteUnreachedBlocks();
|
||||
makeCfg();
|
||||
for (IrFuncValue func : getIrModule().getFuncs()) {
|
||||
func.deleteDeadBlock();
|
||||
}
|
||||
makeDomination();
|
||||
makeDirectDomi();
|
||||
makeDomiFrontier();
|
||||
}
|
||||
|
||||
public void deleteUselessInstrs() {
|
||||
for (IrFuncValue func : getIrModule().getFuncs()) {
|
||||
for (IrBasicBlock bb : func.getBBlocks()) {
|
||||
ArrayList<IrInstr> toDelete = new ArrayList<>();
|
||||
boolean deleteUseless = false;
|
||||
for (IrInstr instr : bb.getInstrs()) {
|
||||
if (!deleteUseless) {
|
||||
if (instr.getInstrType() == IrInstrType.RET ||
|
||||
instr.getInstrType() == IrInstrType.BR ||
|
||||
instr.getInstrType() == IrInstrType.JUMP) {
|
||||
deleteUseless = true;
|
||||
}
|
||||
} else {
|
||||
toDelete.add(instr);
|
||||
}
|
||||
}
|
||||
for (IrInstr instr : toDelete) {
|
||||
bb.deleteInstr(instr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void deleteUnreachedBlocks() {
|
||||
for (IrFuncValue func : getIrModule().getFuncs()) {
|
||||
HashSet<IrBasicBlock> canArrive = new HashSet<>();
|
||||
IrBasicBlock entryBlock = func.getBBlock(0);
|
||||
dfsArrive(entryBlock, canArrive);
|
||||
ArrayList<IrBasicBlock> toDelete = new ArrayList<>();
|
||||
for (IrBasicBlock bb : func.getBBlocks()) {
|
||||
if (!canArrive.contains(bb)) {
|
||||
toDelete.add(bb);
|
||||
}
|
||||
}
|
||||
for (IrBasicBlock bb : toDelete) {
|
||||
func.deleteBBlock(bb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void dfsArrive(IrBasicBlock bb, HashSet<IrBasicBlock> canArrive) {
|
||||
if (!canArrive.contains(bb)) {
|
||||
canArrive.add(bb);
|
||||
}
|
||||
IrInstr lastInstr = bb.getLastInstr();
|
||||
if (lastInstr != null) {
|
||||
if (lastInstr.getInstrType() == IrInstrType.BR) {
|
||||
BranchInstr branchInstr = (BranchInstr) lastInstr;
|
||||
IrBasicBlock trueBlock = branchInstr.getTrueBB();
|
||||
IrBasicBlock falseBlock = branchInstr.getFalseBB();
|
||||
if (!canArrive.contains(trueBlock)) {
|
||||
dfsArrive(trueBlock, canArrive);
|
||||
}
|
||||
if (!canArrive.contains(falseBlock)) {
|
||||
dfsArrive(falseBlock, canArrive);
|
||||
}
|
||||
} else if (lastInstr.getInstrType() == IrInstrType.JUMP) {
|
||||
JumpInstr jumpInstr = (JumpInstr) lastInstr;
|
||||
IrBasicBlock jumpBlock = jumpInstr.getTargetBlock();
|
||||
if (!canArrive.contains(jumpBlock)) {
|
||||
dfsArrive(jumpBlock, canArrive);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void makeCfg() {
|
||||
@@ -76,8 +151,8 @@ public class CfgMake extends Optimizer {
|
||||
for (IrFuncValue func : getIrModule().getFuncs()) {
|
||||
for (IrBasicBlock bb : func.getBBlocks()) {
|
||||
for (IrBasicBlock domi : bb.getDomied()) {
|
||||
HashSet<IrBasicBlock> bbDomi = bb.getDomied();
|
||||
HashSet<IrBasicBlock> domiDomi = domi.getDomied();
|
||||
HashSet<IrBasicBlock> bbDomi = new HashSet<>(bb.getDomied());
|
||||
HashSet<IrBasicBlock> domiDomi = new HashSet<>(domi.getDomied());
|
||||
for (IrBasicBlock domiDomiBB : domiDomi) {
|
||||
if (bbDomi.contains(domiDomiBB)) {
|
||||
bbDomi.remove(domiDomiBB);
|
||||
|
||||
Reference in New Issue
Block a user