When eliminating constant conditions, and removing dead branch,

also remove corresponding phi input to avoid clashes with further
optimizations
This commit is contained in:
Alexey Andreev 2017-04-25 22:57:35 +03:00
parent 3c4ec550c4
commit 8d9240df36
2 changed files with 23 additions and 1 deletions

View File

@ -13,7 +13,7 @@
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="VM_PARAMETERS" value="-ea -Dteavm.junit.target=target/js-tests -Dteavm.junit.js.runner=htmlunit -Dteavm.junit.js.threads=1 -Dteavm.junit.minified=true -Dteavm.junit.optimized=true" />
<option name="VM_PARAMETERS" value="-ea -Dteavm.junit.target=target/js-tests -Dteavm.junit.js.threads=1 -Dteavm.junit.minified=true -Dteavm.junit.optimized=true" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$MODULE_DIR$" />
<option name="ENV_VARIABLES" />

View File

@ -17,6 +17,7 @@ package org.teavm.model.optimization;
import org.teavm.model.BasicBlock;
import org.teavm.model.Instruction;
import org.teavm.model.Phi;
import org.teavm.model.Program;
import org.teavm.model.instructions.BinaryBranchingCondition;
import org.teavm.model.instructions.BinaryBranchingInstruction;
@ -25,6 +26,7 @@ import org.teavm.model.instructions.BranchingInstruction;
import org.teavm.model.instructions.IntegerConstantInstruction;
import org.teavm.model.instructions.JumpInstruction;
import org.teavm.model.instructions.NullConstantInstruction;
import org.teavm.model.util.InstructionTransitionExtractor;
public class ConstantConditionElimination implements MethodOptimization {
private int[] constants;
@ -53,19 +55,39 @@ public class ConstantConditionElimination implements MethodOptimization {
}
boolean changed = false;
InstructionTransitionExtractor transitionExtractor = new InstructionTransitionExtractor();
for (int i = 0; i < program.basicBlockCount(); ++i) {
BasicBlock block = program.basicBlockAt(i);
Instruction insn = block.getLastInstruction();
BasicBlock target = constantTarget(insn);
if (target != null) {
block.getLastInstruction().acceptVisitor(transitionExtractor);
for (BasicBlock successor : transitionExtractor.getTargets()) {
if (successor != target) {
for (Phi phi : successor.getPhis()) {
for (int j = 0; j < phi.getIncomings().size(); ++j) {
if (phi.getIncomings().get(j).getSource() == block) {
phi.getIncomings().remove(j--);
}
}
}
}
}
JumpInstruction jump = new JumpInstruction();
jump.setTarget(target);
jump.setLocation(insn.getLocation());
block.getLastInstruction().replace(jump);
changed = true;
}
}
if (changed) {
new UnreachableBasicBlockEliminator().optimize(program);
}
return changed;
}