mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 08:14:09 -08:00
When eliminating constant conditions, and removing dead branch,
also remove corresponding phi input to avoid clashes with further optimizations
This commit is contained in:
parent
3c4ec550c4
commit
8d9240df36
|
@ -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" />
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user